PiDevCfgMakeServiceBootStart
VOID __fastcall PiDevCfgMakeServiceBootStart(const WCHAR *ServiceName, INT64 a2, INT64 a3, INT64 a4){
_WORD *v4;
void *v5;
UINT64 v6;
WCHAR *v7;
unsigned __int16 v8;
__int64 v9;
char *v10;
WCHAR v11;
UINT64 DataSize;
struct _UNICODE_STRING DestinationString;
struct _UNICODE_STRING Data;
UNICODE_STRING String2;
int v16;
PVOID P;
HANDLE KeyHandle;
v16 = 4;
KeyHandle = 0i64;
P = 0i64;
*(_DWORD *)(&String2.MaximumLength + 1) = 0;
*(_QWORD *)&Data.Length = 0i64;
DestinationString = 0i64;
Data.Buffer = 0i64;
RtlInitUnicodeString(&DestinationString, ServiceName, a3);
if( PipOpenServiceEnumKeys(&DestinationString, 0x2001Fui64, &KeyHandle, 0i64, 0) < 0 )
goto LABEL_17;
if( IopGetRegistryValue(KeyHandle, (PWCHAR)L"Start", 0i64, (KEY_VALUE_FULL_INFORMATION **)&P) < 0 )
goto LABEL_14;
v4 = P;
if( !PnpValidateRegistryDword((KEY_VALUE_FULL_INFORMATION *)P) )
goto LABEL_15;
v16 = *(_DWORD *)((char *)v4 + *((unsigned int *)v4 + 2));
ExFreePoolWithTag(v5, 0);
P = 0i64;
if( (v16 & 0xFFFFFFFB) == 0 )
goto LABEL_17;
if( IopGetRegistryValue(KeyHandle, (PWCHAR)L"ImagePath", 0i64, (KEY_VALUE_FULL_INFORMATION **)&P) < 0 )
{
LABEL_14:
v4 = P;
goto LABEL_15;
}
v4 = P;
if( (unsigned int)(*((_DWORD *)P + 1) - 1) <= 1
&& PnpValidateStringData((PWCHAR)((char *)P + *((unsigned int *)P + 2)), *((unsigned int *)P + 3)) )
{
LODWORD(P) = 0;
PnpRegSzToString(v7, v6, (UINT64 *)&P);
v8 = v4[6];
v9 = *((unsigned int *)v4 + 2);
String2.Length = (unsigned __int16)P;
v10 = (char *)v4 + v9;
String2.Buffer = (wchar_t *)v10;
String2.MaximumLength = v8;
if( (unsigned __int8)RtlPrefixUnicodeString((PVOID)&PiDevCfgSystemRoot, (INT64 *)&String2) )
{
RtlInitUnicodeString(&Data, (PCWSTR)v10 + 12, v11);
LODWORD(DataSize) = Data.Length + 2;
*(_DWORD *)&DestinationString.Length = 1310738;
DestinationString.Buffer = (wchar_t *)L"ImagePath";
if( ZwSetValueKey(KeyHandle, &DestinationString, 0i64, *((unsigned int *)v4 + 1), Data.Buffer, DataSize) < 0 )
goto LABEL_15;
goto LABEL_13;
}
if( (unsigned __int8)RtlPrefixUnicodeString((PVOID)&PiDevCfgSystem32, (INT64 *)&String2) )
{
LABEL_13:
LODWORD(DataSize) = 4;
*(_DWORD *)&DestinationString.Length = 786442;
DestinationString.Buffer = (wchar_t *)L"Start";
v16 = 0;
ZwSetValueKey(KeyHandle, &DestinationString, 0i64, 4ui64, &v16, DataSize);
}
}
LABEL_15:
if( v4 )
ExFreePoolWithTag(v4, 0);
LABEL_17:
if( KeyHandle )
ZwClose(KeyHandle);
}Referenced by:
PiDevCfgConfigureDevice