PiQueryResourceRequirements
__int64 __fastcall PiQueryResourceRequirements(__int64 a1){
DEVICE_OBJECT *v2;
NTSTATUS ResourceRequirements;
int *v4;
unsigned int v5;
int v6;
int v7;
BOOL v8;
HANDLE v9;
_ETHREAD *CurrentThread;
PVOID v12;
UINT64 DataSize;
struct _UNICODE_STRING ValueName;
HANDLE KeyHandle;
PVOID Data;
v2 = *(DEVICE_OBJECT **)(a1 + 32);
Data = 0i64;
ValueName = 0i64;
KeyHandle = 0i64;
ResourceRequirements = PpIrpQueryResourceRequirements(v2, (IO_RESOURCE_REQUIREMENTS_LIST **)&Data);
v4 = (int *)Data;
v5 = ResourceRequirements;
if( ResourceRequirements < 0 )
v4 = 0i64;
Data = v4;
if( v4 )
v6 = *v4;
else
v6 = 0;
if( (*(_DWORD *)(a1 + 396) & 0x2000) != 0 && *(_DWORD *)(a1 + 404) == 9
|| (*(_DWORD *)(a1 + 396) & 0x2000) != 0 && (*(_DWORD *)(a1 + 404) == 3 || *(_DWORD *)(a1 + 404) == 19) )
{
goto LABEL_19;
}
v7 = CmOpenDeviceRegKey(
PiPnpRtlCtx,
*(const wchar_t **)(a1 + 48),
20,
0,
983103,
v4 != 0i64,
(__int64)&KeyHandle,
0i64);
v9 = KeyHandle;
if( v7 < 0 )
v9 = 0i64;
KeyHandle = v9;
if( v9 )
{
*(_DWORD *)&ValueName.Length = 2359330;
ValueName.Buffer = (wchar_t *)L"BasicConfigVector";
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
LOBYTE(v8) = 1;
ExAcquireResourceSharedLite(&PnpRegistryDeviceResource, v8);
v12 = Data;
if( Data )
{
LODWORD(DataSize) = v6;
ZwSetValueKey(KeyHandle, &ValueName, 0i64, 0xAui64, Data, DataSize);
ExAcquireFastMutex(&PiResourceListLock);
*(_QWORD *)(a1 + 440) = v12;
KeReleaseGuardedMutex(&PiResourceListLock);
PipSetDevNodeFlags(a1, 512);
Data = 0i64;
}
else
{
ZwDeleteValueKey(KeyHandle, &ValueName);
}
ExReleaseResourceLite(&PnpRegistryDeviceResource);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
v4 = (int *)Data;
LABEL_19:
v9 = KeyHandle;
}
if( v4 )
{
ExFreePoolWithTag(v4, 0);
v9 = KeyHandle;
}
if( v9 )
ZwClose(v9);
return v5;
}Referenced by:
PiProcessNewDeviceNode