PiDevCfgInitDeviceContext

__int64 __fastcall PiDevCfgInitDeviceContext(const wchar_t *a1, __int64 a2, __int64 *a3){
  char *v6; 
  __int64 v7; 
  DEVPROPKEY **v8; 
  __int64 *v9; 
  __int64 v10; 
  int ObjectProperties; 
  WCHAR v12; 
  unsigned int v13; 
  int *v14; 
  UINT64 v16; 
  INT64 result; 
  char v18; 
  char v19; 
  memset((INT64)a3, 0i64);
  a3[1] = (__int64)a1;
  if( a2 )
  {
    a3[2] = a2;
  }
  else
  {
    ObjectProperties = CmOpenDeviceRegKey(PiPnpRtlCtx, a1, 16, 0, 983103, 0, (__int64)(a3 + 2), 0i64);
    if( ObjectProperties < 0 )
    {
LABEL_13:
      PiDevCfgFreeDeviceContext((INT64)a3);
      return(unsigned int)ObjectProperties;
    }
    *(_DWORD *)a3 |= 0x80000000;
  }
  memset((INT64)&result, 0i64);
  v6 = &v18;
  v7 = 3i64;
  v8 = off_140D2C778;
  v9 = a3 + 3;
  do
  {
    v10 = (__int64)*v8++;
    *((_QWORD *)v6 + 1) = v9;
    v9 += 2;
    *((_QWORD *)v6 - 1) = v10;
    *(_DWORD *)v6 = 8210;
    *((_DWORD *)v6 + 5) = 6;
    v6 += 40;
    --v7;
  }
  while( v7 );
  LODWORD(v16) = 3;
  ObjectProperties = PiDevCfgQueryObjectProperties((INT64)v6, a3[1], 1ui64, a3[2], (INT64)&result, v16);
  if( ObjectProperties < 0 )
    goto LABEL_13;
  v13 = 0;
  v14 = (int *)&v19;
  do
  {
    if( *v14 < 0 )
      RtlInitUnicodeString((PUNICODE_STRING)&a3[2 * v13 + 3], 0i64, v12);
    ++v13;
    v14 += 10;
  }
  while( v13 < 3 );
  return(unsigned int)ObjectProperties;
}

Referenced by:

PiDevCfgInitDeviceCallback
PiDevCfgProcessDevice
PiDevCfgProcessDeviceCallback
PpDevCfgCheckDeviceNeedsUpdate
PpDevCfgProcessDeviceExtensions
PpDevCfgProcessDeviceOperations
PpDevCfgProcessDeviceReset