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