PnpSaveDeviceCapabilities

__int64 __fastcall PnpSaveDeviceCapabilities(__int64 a1, _DWORD *a2, char a3){
  int v5; 
  NTSTATUS v6; 
  VOID *v7; 
  bool v8; 
  UINT8 *p_PropertyBuffer; 
  bool v10; 
  UINT8 *v11; 
  __int64 v13; 
  UINT64 CmRegPropType; 
  UINT64 CmRegPropTypea; 
  UINT64 CmRegPropTypeb; 
  UINT64 PropertySize; 
  UINT64 PropertySizea; 
  UINT64 PropertySizeb; 
  UINT64 Flags; 
  UINT64 Flagsa; 
  UINT64 Flagsb; 
  VOID *BaseKeyHandle; 
  unsigned int PropertyBuffer; 

  PropertyBuffer = 0;
  BaseKeyHandle = 0i64;
  v5 = a3 != 0 ? 0x20000 : 0;
  v6 = PnpDeviceObjectToDeviceInstance(*(_QWORD *)(a1 + 32), &BaseKeyHandle, 983103);
  if( v6 >= 0 )
  {
    if( (*(_DWORD *)(a1 + 396) & 0x40) != 0 )
    {
      v13 = *(_QWORD *)(a1 + 720);
      if( !v13 || (*(_BYTE *)(v13 + 16) & 4) == 0 )
        a2[1] &= ~0x200u;
    }
    v7 = BaseKeyHandle;
    *(_DWORD *)(a1 + 560) = a2[1];
    LODWORD(Flags) = v5;
    LODWORD(PropertySize) = 4;
    PropertyBuffer = (a2[1] & 0x3FC | (a2[1] >> 13) & 8 | ((a2[1] & 0xC000 | (a2[1] >> 4) & 0x10000u) >> 4)) >> 2;
    LODWORD(CmRegPropType) = 4;
    CmSetDeviceRegProp(
      *(&stru_140CF2E80 + 607),
      *(WCHAR **)(a1 + 48),
      v7,
      CM_REG_PROP_CAPABILITIES,
      CmRegPropType,
      (UINT8 *)&PropertyBuffer,
      PropertySize,
      Flags);
    LODWORD(Flagsa) = v5;
    v8 = a2[3] != -1;
    PropertyBuffer = a2[3];
    p_PropertyBuffer = (UINT8 *)&PropertyBuffer;
    if( PropertyBuffer == -1 )
      p_PropertyBuffer = 0i64;
    LODWORD(CmRegPropTypea) = 4;
    LODWORD(PropertySizea) = v8 ? 4 : 0;
    CmSetDeviceRegProp(
      *(&stru_140CF2E80 + 607),
      *(WCHAR **)(a1 + 48),
      BaseKeyHandle,
      CM_REG_PROP_UI_NUMBER,
      CmRegPropTypea,
      p_PropertyBuffer,
      PropertySizea,
      Flagsa);
    LODWORD(Flagsb) = v5;
    v10 = a2[2] != -1;
    PropertyBuffer = a2[2];
    v11 = (UINT8 *)&PropertyBuffer;
    if( PropertyBuffer == -1 )
      v11 = 0i64;
    LODWORD(CmRegPropTypeb) = 4;
    LODWORD(PropertySizeb) = v10 ? 4 : 0;
    CmSetDeviceRegProp(
      *(&stru_140CF2E80 + 607),
      *(WCHAR **)(a1 + 48),
      BaseKeyHandle,
      CM_REG_PROP_ADDRESS,
      CmRegPropTypeb,
      v11,
      PropertySizeb,
      Flagsb);
  }
  if( BaseKeyHandle )
    ZwClose((_HANDLE)BaseKeyHandle);
  return(unsigned int)v6;
}

Referenced by:

PiProcessNewDeviceNode
PnpQueryAndSaveDeviceNodeCapabilities