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