PiDevCfgQueryDriverConfiguration

NTSTATUS __stdcall PiDevCfgQueryDriverConfiguration(PI_DEVCFG_DRIVER_NODE *DriverNode){
  PI_DEVCFG_DRIVER_NODE v1; 
  int ObjectProperties; 
  _KEXCEPTION_FRAME *v4; 
  int v5; 
  WCHAR *v6; 
  WCHAR *v7; 
  WCHAR *v8; 
  PI_DEVCFG_QUERY_PROPERTY_PARAM *v9; 
  __int64 v10; 
  char Long; 
  PI_DEVCFG_DRIVER_NODE v13; 
  __int64 v14; 
  __int64 v15; 
  UINT64 arg28; 
  _MMPTE EndPxe; 
  _UNICODE_STRING DestinationString; 
  UINT64 PropertyCount[56]; 

  v1 = DriverNode[46];
  LOWORD(EndPxe.u.Long) = 0;
  *(_QWORD *)&DestinationString.Length = 0i64;
  DestinationString.Buffer = 0i64;
  if( (v1 & 0x20) != 0 )
  {
    v4 = (_KEXCEPTION_FRAME *)*((_QWORD *)DriverNode + 4);
  }
  else
  {
    ObjectProperties = PiDevCfgBuildDriverConfigurationId(DriverNode, (_UNICODE_STRING *)(DriverNode + 98));
    if( ObjectProperties < 0 )
      goto LABEL_43;
    if( !*((_QWORD *)DriverNode + 3) )
      goto LABEL_44;
    v4 = (_KEXCEPTION_FRAME *)*((_QWORD *)DriverNode + 4);
  }
  if( !v4 )
    goto LABEL_44;
  memset(PropertyCount, 0i64, sizeof(PropertyCount));
  LODWORD(PropertyCount[4]) = 0x1000000;
  LODWORD(PropertyCount[11]) = 117440512;
  LODWORD(PropertyCount[1]) = 288;
  LODWORD(PropertyCount[18]) = 117440512;
  PropertyCount[2] = (UINT64)L"Service";
  LODWORD(PropertyCount[25]) = 0x4000000;
  LODWORD(PropertyCount[8]) = 304;
  PropertyCount[9] = (UINT64)L"LowerFilters";
  LODWORD(PropertyCount[15]) = 304;
  PropertyCount[16] = (UINT64)L"UpperFilters";
  LODWORD(PropertyCount[32]) = 117440512;
  PropertyCount[23] = (UINT64)L"ConfigFlags";
  LODWORD(PropertyCount[29]) = 304;
  PropertyCount[24] = (UINT64)(DriverNode + 96);
  LODWORD(PropertyCount[39]) = 117440512;
  PropertyCount[30] = (UINT64)L"IncludedInfs";
  LODWORD(PropertyCount[36]) = 304;
  PropertyCount[37] = (UINT64)L"IncludedConfigs";
  LODWORD(PropertyCount[46]) = 0x4000000;
  PropertyCount[44] = (UINT64)L"Reboot";
  LODWORD(PropertyCount[43]) = 288;
  PropertyCount[45] = (UINT64)(DriverNode + 97);
  PropertyCount[3] = (UINT64)(DriverNode + 72);
  PropertyCount[10] = (UINT64)(DriverNode + 76);
  PropertyCount[17] = (UINT64)(DriverNode + 80);
  LODWORD(PropertyCount[22]) = 292;
  PropertyCount[31] = (UINT64)(DriverNode + 84);
  PropertyCount[38] = (UINT64)(DriverNode + 88);
  LOBYTE(v5) = RtlpQueryRegistryValues((_KTRAP_FRAME *)0xC0000000i64, v4);
  ObjectProperties = v5;
  if( v5 == -1073741772 )
    goto LABEL_44;
  if( v5 < 0 )
    goto LABEL_43;
  if( *((_WORD *)DriverNode + 152) <= 2u && *((_QWORD *)DriverNode + 39) )
    RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 19);
  if( *((_WORD *)DriverNode + 160) <= 2u && *((_QWORD *)DriverNode + 41) )
    RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 20);
  if( *((_WORD *)DriverNode + 168) <= 2u && *((_QWORD *)DriverNode + 43) )
    RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 21);
  if( *((_WORD *)DriverNode + 176) <= 2u && *((_QWORD *)DriverNode + 45) )
    RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 22);
  if( (DriverNode[46] & 0x20) != 0 )
  {
    v13 = DriverNode[26];
    if( (v13 & 4) == 0 && *((_QWORD *)DriverNode + 37) )
    {
      RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 18);
      v13 = DriverNode[26];
    }
    if( (v13 & 2) == 0 )
    {
      if( *((_QWORD *)DriverNode + 39) )
        RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 19);
      if( *((_QWORD *)DriverNode + 41) )
        RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 20);
    }
  }
  v6 = (WCHAR *)*((_QWORD *)DriverNode + 37);
  if( !v6 || !*((_WORD *)DriverNode + 144) )
    goto LABEL_26;
  ObjectProperties = PiDevCfgVerifyService(v6, (UINT8 *)&EndPxe.u.Long + 1, (UINT64 *)DriverNode + 51);
  if( ObjectProperties < 0 )
  {
LABEL_44:
    ObjectProperties = -1073740653;
    goto LABEL_43;
  }
  if( BYTE1(EndPxe.u.Long) )
    DriverNode[46] |= 0x10u;
LABEL_26:
  v7 = (WCHAR *)*((_QWORD *)DriverNode + 39);
  if( !v7 )
    goto LABEL_77;
  while( *v7 )
  {
    ObjectProperties = PiDevCfgVerifyService(v7, 0i64, 0i64);
    if( ObjectProperties < 0 )
    {
      ObjectProperties = -1073740653;
      break;
    }
    v14 = -1i64;
    do
      ++v14;
    while( v7[v14] );
    v7 += v14 + 1;
  }
  if( ObjectProperties >= 0 )
  {
LABEL_77:
    v8 = (WCHAR *)*((_QWORD *)DriverNode + 41);
    if( !v8 )
      goto LABEL_28;
    while( *v8 )
    {
      ObjectProperties = PiDevCfgVerifyService(v8, 0i64, 0i64);
      if( ObjectProperties < 0 )
      {
        ObjectProperties = -1073740653;
        break;
      }
      v15 = -1i64;
      do
        ++v15;
      while( v8[v15] );
      v8 += v15 + 1;
    }
    if( ObjectProperties >= 0 )
    {
LABEL_28:
      if( (DriverNode[46] & 0x20) != 0 )
      {
LABEL_42:
        DriverNode[46] |= 1u;
        goto LABEL_43;
      }
      memset(PropertyCount, 0i64, 0xA0u);
      v9 = (PI_DEVCFG_QUERY_PROPERTY_PARAM *)*((_QWORD *)DriverNode + 2);
      v10 = *((_QWORD *)DriverNode + 8);
      PropertyCount[0] = (UINT64)DEVPKEY_DriverPackage_ClassGuid;
      LODWORD(arg28) = 4;
      LODWORD(PropertyCount[1]) = 13;
      PropertyCount[5] = (UINT64)&DEVPKEY_DriverPackage_ProviderName;
      PropertyCount[10] = (UINT64)DEVPKEY_DriverPackage_NeedsReconfig;
      PropertyCount[12] = (UINT64)&EndPxe;
      PropertyCount[2] = (UINT64)(DriverNode + 60);
      PropertyCount[15] = (UINT64)DEVPKEY_DriverPackage_GroupIds;
      PropertyCount[17] = (UINT64)&DestinationString;
      LODWORD(PropertyCount[3]) = 16;
      LODWORD(PropertyCount[6]) = 18;
      PropertyCount[7] = (UINT64)(DriverNode + 68);
      HIDWORD(PropertyCount[8]) = 6;
      LODWORD(PropertyCount[11]) = 17;
      LODWORD(PropertyCount[13]) = 1;
      LODWORD(PropertyCount[16]) = 8210;
      HIDWORD(PropertyCount[18]) = 6;
      ObjectProperties = PiDevCfgQueryObjectProperties((WCHAR *)6, v10, (VOID *)8, v9, (UINT64)PropertyCount, arg28);
      if( ObjectProperties >= 0 )
      {
        if( SLODWORD(PropertyCount[4]) < 0 )
        {
          *((_OWORD *)DriverNode + 15) = 0i64;
        }
        else
        {
          ObjectProperties = RtlStringFromGUIDEx((_GUID *)DriverNode + 15, (_UNICODE_STRING *)DriverNode + 16, 1u);
          if( ObjectProperties < 0 )
            goto LABEL_43;
        }
        if( SLODWORD(PropertyCount[9]) < 0 )
          RtlInitUnicodeString((PUNICODE_STRING)DriverNode + 17, 0i64);
        Long = EndPxe.u.Long;
        if( SLODWORD(PropertyCount[14]) < 0 )
          Long = 0;
        LOBYTE(EndPxe.u.Long) = Long;
        if( Long == -1 )
          DriverNode[46] |= 0x40u;
        if( SLODWORD(PropertyCount[19]) < 0 )
          RtlInitUnicodeString(&DestinationString, 0i64);
        if( DestinationString.Buffer && DestinationString.Length > 2u )
          DriverNode[46] |= 0x80u;
        ObjectProperties = PiDevCfgQueryIncludedDriverConfigurations(DriverNode);
        if( ObjectProperties >= 0 )
          goto LABEL_42;
      }
    }
  }
LABEL_43:
  RtlFreeAnsiString(&DestinationString);
  return ObjectProperties;
}

Referenced by:

PiDevCfgCheckDeviceNeedsUpdate
PiDevCfgConfigureDevice
PiDevCfgQueryIncludedDriverConfigurations
PiDevCfgRequestDriverConfigurations
PpDevCfgProcessDeviceExtensions