PipHardwareConfigInit

INT64 __stdcall PipHardwareConfigInit(PGUID HardwareConfigGuid){
  HANDLE v2; 
  NTSTATUS v3; 
  PVOID v4; 
  int CachedContextBaseKey; 
  HANDLE v6; 
  NTSTATUS v7; 
  HANDLE v8; 
  NTSTATUS RegistryValue; 
  __int64 v10; 
  ULONG v11; 
  bool v12; 
  unsigned int v14; 
  int v15; 
  bool v16; 
  PVOID Data; 
  PVOID Dataa; 
  PVOID Datab; 
  UINT64 DataSize; 
  UINT64 DataSizea; 
  UINT64 DataSizeb; 
  UINT64 DataSizec; 
  UINT64 HardwareConfigIndex; 
  KEY_VALUE_FULL_INFORMATION *KeyName; 
  UNICODE_STRING KeyName_8; 
  struct _UNICODE_STRING ValueName; 
  PVOID v28; 
  UINT64 Disposition; 
  _LARGE_INTEGER BootTime; 
  HANDLE v31; 
  HANDLE Handle; 
  HANDLE KeyHandle; 
  UINT64 BootTimeBias[2]; 
  const void *v35[66]; 
  LODWORD(HardwareConfigIndex) = -1;
  *(_QWORD *)&ValueName.Length = 4063292i64;
  LODWORD(Data) = 0;
  BootTime.QuadPart = 0i64;
  BootTimeBias[0] = 0i64;
  LODWORD(Disposition) = 0;
  v31 = 0i64;
  Handle = 0i64;
  v2 = 0i64;
  KeyHandle = 0i64;
  v28 = 0i64;
  KeyName = 0i64;
  KeyName_8 = 0i64;
  ValueName.Buffer = L"\\Registry\\Machine\\System\\Setup";
  v3 = IopCreateRegistryKeyEx(&v28, 0i64, &ValueName, 0xF003Fui64, (UINT64)Data, 0i64);
  v4 = v28;
  if( v3 < 0 )
    v4 = 0i64;
  if( v4 )
  {
    *(_DWORD *)&ValueName.Length = 1703960;
    ValueName.Buffer = (wchar_t *)L"Respecialize";
    ZwDeleteValueKey(v4, &ValueName);
  }
  CachedContextBaseKey = PnpCtxGetCachedContextBaseKey(PiPnpRtlCtx, 15, (__int64 *)&KeyHandle);
  if( CachedContextBaseKey >= 0 )
  {
    CachedContextBaseKey = RtlStringFromGUID(HardwareConfigGuid, &PnpCurrentHardwareConfigurationGuidString);
    if( CachedContextBaseKey >= 0 )
    {
      v6 = KeyHandle;
      KeyName_8.Buffer = L"LastConfig";
      *(_DWORD *)&KeyName_8.Length = 1441812;
      LODWORD(DataSize) = PnpCurrentHardwareConfigurationGuidString.Length + 2;
      CachedContextBaseKey = ZwSetValueKey(
                               KeyHandle,
                               &KeyName_8,
                               0i64,
                               1ui64,
                               PnpCurrentHardwareConfigurationGuidString.Buffer,
                               DataSize);
      if( CachedContextBaseKey >= 0 )
      {
        LODWORD(Dataa) = 0;
        v7 = IopCreateRegistryKeyEx(
               &Handle,
               v6,
               &PnpCurrentHardwareConfigurationGuidString,
               0xF003Fui64,
               (UINT64)Dataa,
               &Disposition);
        v8 = Handle;
        CachedContextBaseKey = v7;
        if( v7 >= 0 )
        {
          RegistryValue = IopGetRegistryValue(Handle, (PWCHAR)L"Id", 0i64, &KeyName);
          CachedContextBaseKey = -1073741823;
          if( RegistryValue >= 0 )
          {
            if( KeyName->Type == 4 && KeyName->DataLength == 4 )
              LODWORD(HardwareConfigIndex) = *(ULONG *)((char *)&KeyName->TitleIndex + KeyName->DataOffset);
            else
              RegistryValue = -1073741823;
            ExFreePoolWithTag(KeyName, 0);
            if( RegistryValue >= 0 )
              goto LABEL_14;
          }
          LODWORD(HardwareConfigIndex) = 0;
          if( IopGetRegistryValue(v6, (PWCHAR)L"LastId", 0i64, &KeyName) >= 0 )
          {
            if( KeyName->Type == 4 && KeyName->DataLength == 4 )
              LODWORD(HardwareConfigIndex) = *(ULONG *)((char *)&KeyName->TitleIndex + KeyName->DataOffset) + 1;
            ExFreePoolWithTag(KeyName, 0);
          }
          v14 = HardwareConfigIndex;
          v15 = HardwareConfigIndex - 1;
          if( (_DWORD)HardwareConfigIndex != (_DWORD)HardwareConfigIndex - 1 )
          {
            do
            {
              v16 = PipHardwareConfigExists(v6, v14) == 0;
              v14 = HardwareConfigIndex;
              if( v16 )
                break;
              v14 = HardwareConfigIndex + 1;
              LODWORD(HardwareConfigIndex) = v14;
            }
            while( v14 != v15 );
            if( v14 != v15 )
            {
              *(_DWORD *)&KeyName_8.Length = 917516;
              KeyName_8.Buffer = (wchar_t *)L"LastId";
              LODWORD(DataSizea) = 4;
              ZwSetValueKey(v6, &KeyName_8, 0i64, 4ui64, &HardwareConfigIndex, DataSizea);
              LODWORD(DataSizec) = 4;
              KeyName_8.Buffer = (wchar_t *)L"Id";
              *(_DWORD *)&KeyName_8.Length = 393220;
              CachedContextBaseKey = ZwSetValueKey(v8, &KeyName_8, 0i64, 4ui64, &HardwareConfigIndex, DataSizec);
              if( CachedContextBaseKey >= 0 )
              {
LABEL_14:
                PnpCurrentHardwareConfigurationIndex = HardwareConfigIndex;
                KeQueryBootTimeValues((_LARGE_INTEGER *)&Handle, &BootTime, BootTimeBias);
                BootTime.QuadPart -= BootTimeBias[0];
                LODWORD(DataSizea) = 8;
                KeyName_8.Buffer = L"LastUse";
                *(_DWORD *)&KeyName_8.Length = 1048590;
                ZwSetValueKey(v8, &KeyName_8, 0i64, 3ui64, &BootTime, DataSizea);
                KeyName_8.Buffer = (wchar_t *)L"Current";
                *(_DWORD *)&KeyName_8.Length = 1048590;
                LODWORD(Datab) = 3;
                CachedContextBaseKey = IopCreateRegistryKeyEx(&v31, v6, &KeyName_8, 0xF003Fui64, (UINT64)Datab, 0i64);
                if( CachedContextBaseKey < 0
                  || (LODWORD(v28) = 260,
                      CachedContextBaseKey = PnpCtxRegQueryKeyPathName(v10, (__int64)v8, v35, (unsigned int *)&v28),
                      CachedContextBaseKey < 0) )
                {
                  v2 = v31;
                }
                else
                {
                  v2 = v31;
                  LODWORD(DataSizeb) = 2 * (_DWORD)v28 - 2;
                  CachedContextBaseKey = ZwSetValueKey(v31, &CmSymbolicLinkValueName, 0i64, 6ui64, v35, DataSizeb);
                  if( CachedContextBaseKey >= 0 )
                  {
                    if( InitSafeBootMode )
                      goto LABEL_49;
                    if( IopGetRegistryValue(v8, (PWCHAR)L"Reset", 0i64, &KeyName) >= 0 )
                    {
                      v11 = KeyName->Type == 4 && KeyName->DataLength == 4 ? *(ULONG *)((char *)&KeyName->TitleIndex
                                                                                      + KeyName->DataOffset) : 0;
                      ExFreePoolWithTag(KeyName, 0);
                    }
                    else
                    {
                      v11 = 0;
                    }
                    if( v11 )
                    {
LABEL_49:
                      if( (int)PipHardwareConfigClearStartOverrides((unsigned int)HardwareConfigIndex) >= 0 )
                      {
                        *(_DWORD *)&ValueName.Length = 786442;
                        ValueName.Buffer = (wchar_t *)L"Reset";
                        ZwDeleteValueKey(v8, &ValueName);
                      }
                    }
                    if( v4 )
                    {
                      if( (_DWORD)Disposition == 1 )
                        goto LABEL_60;
                      v12 = 0;
                      if( IopGetRegistryValue(v4, (PWCHAR)L"RespecializeStarted", 0i64, &KeyName) >= 0 )
                      {
                        if( KeyName->Type == 4 && KeyName->DataLength == 4 )
                          v12 = *(ULONG *)((char *)&KeyName->TitleIndex + KeyName->DataOffset) == 1;
                        ExFreePoolWithTag(KeyName, 0);
                        if( v12 )
                          goto LABEL_60;
                      }
                      if( IopGetRegistryValue(v8, (PWCHAR)L"Respecialize", 0i64, &KeyName) >= 0 )
                      {
                        if( KeyName->Type == 4 && KeyName->DataLength == 4 )
                          v12 = *(ULONG *)((char *)&KeyName->TitleIndex + KeyName->DataOffset) == 1;
                        ExFreePoolWithTag(KeyName, 0);
                        if( v12 )
                        {
LABEL_60:
                          if( (int)PipHardwareConfigTriggerRespecialize(v4) >= 0 )
                          {
                            *(_DWORD *)&ValueName.Length = 1703960;
                            ValueName.Buffer = (wchar_t *)L"Respecialize";
                            ZwDeleteValueKey(v8, &ValueName);
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
        if( v8 )
          ZwClose(v8);
        if( v2 )
          ZwClose(v2);
      }
    }
  }
  if( v4 )
    ZwClose(v4);
  return(unsigned int)CachedContextBaseKey;
}

Referenced by:

IopInitializePlugPlayServices