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