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