PiQueryResourceRequirements
NTSTATUS __stdcall PiQueryResourceRequirements(_DEVICE_NODE *DeviceNode){
_DEVICE_OBJECT *PhysicalDeviceObject;
NTSTATUS v3;
_IO_RESOURCE_REQUIREMENTS_LIST *v4;
NTSTATUS v5;
unsigned int ListSize;
NTSTATUS v7;
VOID *v8;
_ETHREAD *CurrentThread;
_OBJECT_TYPE *v11;
_IO_RESOURCE_REQUIREMENTS_LIST *v12;
UINT64 DesiredAccess;
UINT64 Create;
_UNICODE_STRING ValueName;
VOID *KeyHandle;
_IO_RESOURCE_REQUIREMENTS_LIST *Requirements;
PhysicalDeviceObject = DeviceNode->PhysicalDeviceObject;
Requirements = 0i64;
ValueName = 0i64;
KeyHandle = 0i64;
v3 = PpIrpQueryResourceRequirements(PhysicalDeviceObject, &Requirements);
v4 = Requirements;
v5 = v3;
if( v3 < 0 )
v4 = 0i64;
Requirements = v4;
if( v4 )
ListSize = v4->ListSize;
else
ListSize = 0;
if( (DeviceNode->Flags & 0x2000) != 0 && DeviceNode->Problem == 9
|| (DeviceNode->Flags & 0x2000) != 0 && (DeviceNode->Problem == 3 || DeviceNode->Problem == 19) )
{
goto LABEL_19;
}
LODWORD(DesiredAccess) = 983103;
v7 = CmOpenDeviceRegKey(
*(&stru_140CF2E80 + 607),
DeviceNode->InstancePath.Buffer,
CM_KEY_TYPE_DEVICE_LOGCONF,
0i64,
DesiredAccess,
v4 != 0i64,
&KeyHandle,
0i64);
v8 = KeyHandle;
if( v7 < 0 )
v8 = 0i64;
KeyHandle = v8;
if( v8 )
{
*(_DWORD *)&ValueName.Length = 2359330;
ValueName.Buffer = (wchar_t *)L"BasicConfigVector";
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite((UINT64)&PnpReplaceEvent + 6688, 1);
v12 = Requirements;
if( Requirements )
{
LODWORD(Create) = ListSize;
ZwSetValueKey(KeyHandle, &ValueName, 0i64, 0xAui64, Requirements, Create);
ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 6336));
DeviceNode->ResourceRequirements = v12;
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
PipSetDevNodeFlags(DeviceNode, 0x200ui64);
Requirements = 0i64;
}
else
{
ZwDeleteValueKey(KeyHandle, &ValueName, v11);
}
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
v4 = Requirements;
LABEL_19:
v8 = KeyHandle;
}
if( v4 )
{
ExFreePoolWithTag(v4, 0);
v8 = KeyHandle;
}
if( v8 )
ZwClose((_HANDLE)v8);
return v5;
}Referenced by:
PiProcessNewDeviceNode