PipInitComputerIds
NTSTATUS __stdcall PipInitComputerIds(_LOADER_PARAMETER_BLOCK *LoaderBlock){
BYTE *v2;
unsigned int v3;
GUID *v4;
int v5;
HANDLE v6;
NTSTATUS ComputerId;
_LARGE_INTEGER *v8;
_LARGE_INTEGER v9;
unsigned int HighPart;
BYTE *v11;
BYTE *v12;
BYTE *Struct;
unsigned __int8 *v14;
unsigned __int8 *v15;
NTSTATUS String;
NTSTATUS v17;
NTSTATUS v18;
NTSTATUS v19;
NTSTATUS v20;
BYTE *v21;
__int64 v22;
unsigned __int8 *v23;
NTSTATUS v24;
NTSTATUS v25;
BYTE *v26;
__int64 v27;
unsigned __int8 *v28;
NTSTATUS v29;
NTSTATUS v30;
NTSTATUS v31;
BYTE *v32;
WCHAR v33;
unsigned int v34;
int v35;
unsigned int v36;
struct _UNICODE_STRING *p_UnicodeString;
unsigned int v38;
struct _UNICODE_STRING *v39;
PCWSTR *v40;
WCHAR *v41;
__int64 v42;
wchar_t *Buffer;
HANDLE v44;
unsigned int v45;
UNICODE_STRING **v46;
WCHAR v47;
int v48;
struct _UNICODE_STRING *v49;
__int64 v50;
__int128 *v51;
unsigned int v52;
struct _UNICODE_STRING *v53;
__int64 v54;
__int128 *v55;
__int128 *v56;
__int64 v57;
struct _UNICODE_STRING *v58;
__int64 v59;
struct _UNICODE_STRING *v60;
__int128 *v61;
__int64 v62;
struct _UNICODE_STRING *v63;
__int128 *v64;
__int64 v65;
struct _UNICODE_STRING *v66;
__int128 *v67;
WCHAR v68;
int v69;
__int64 v70;
struct _UNICODE_STRING *v71;
UINT64 *v72;
wchar_t *PoolWithTag;
wchar_t *v74;
wchar_t *v75;
unsigned __int16 v76;
wchar_t *v77;
unsigned __int64 v78;
__int64 v79;
const wchar_t *v80;
signed __int64 v81;
__int64 v82;
unsigned __int64 v83;
_UNICODE_STRING *v84;
__int64 v85;
__int64 v86;
HANDLE v87;
PVOID Data;
PVOID Dataa;
UINT64 DataSize;
unsigned int v92;
BYTE *v93;
struct _UNICODE_STRING ValueName_8;
int v95;
HANDLE Handle;
HANDLE KeyHandle;
PVOID v98;
unsigned int v99;
PVOID v100;
struct _UNICODE_STRING DestinationString;
__int64 v102;
struct _UNICODE_STRING v103;
UINT64 StringCount[2];
__int128 v105;
__int128 v106;
struct _UNICODE_STRING *p_DestinationString;
struct _UNICODE_STRING UnicodeString;
struct _UNICODE_STRING v109;
struct _UNICODE_STRING v110;
struct _UNICODE_STRING v111;
struct _UNICODE_STRING v112;
struct _UNICODE_STRING v113;
struct _UNICODE_STRING v114;
struct _UNICODE_STRING v115;
struct _UNICODE_STRING v116;
struct _UNICODE_STRING v117;
int v118[60];
wchar_t SourceString;
wchar_t pszDest[8];
v102 = 0i64;
v2 = 0i64;
KeyHandle = 0i64;
v3 = 0;
Handle = 0i64;
v98 = 0i64;
v95 = 0;
v99 = 0;
v100 = 0i64;
DestinationString = 0i64;
p_DestinationString = 0i64;
v103 = 0i64;
*(_OWORD *)StringCount = 0i64;
v105 = 0i64;
v106 = 0i64;
ValueName_8 = 0i64;
memset((INT64)&UnicodeString, 0i64);
v5 = PipHardwareConfigOpenKey(v4, 0xF003Fui64, &KeyHandle);
v6 = KeyHandle;
ComputerId = v5;
if( v5 >= 0 )
{
PnpCtxRegDeleteTree(PiPnpRtlCtx, (char *)KeyHandle, L"ComputerIds");
*(_DWORD *)&ValueName_8.Length = 1572886;
LODWORD(Data) = 0;
ValueName_8.Buffer = L"ComputerIds";
ComputerId = IopCreateRegistryKeyEx(&Handle, v6, &ValueName_8, 0xF003Fui64, (UINT64)Data, 0i64);
if( ComputerId >= 0 )
{
PnpCtxRegDeleteTree(PiPnpRtlCtx, (char *)v6, L"ProductIds");
*(_DWORD *)&ValueName_8.Length = 1441812;
ValueName_8.Buffer = L"ProductIds";
LODWORD(Dataa) = 0;
ComputerId = IopCreateRegistryKeyEx(&v98, v6, &ValueName_8, 0xF003Fui64, (UINT64)Dataa, 0i64);
if( ComputerId >= 0 )
{
v8 = *(_LARGE_INTEGER **)(*((_QWORD *)LoaderBlock + 30) + 56i64);
if( !v8 || (v9 = v8[2], !v9.QuadPart) )
{
ComputerId = -1073741637;
goto LABEL_147;
}
HighPart = v8[1].HighPart;
v92 = HighPart;
MmMapIoSpaceEx(v9, HighPart, 2ui64);
v93 = v11;
v12 = v11;
if( !v11 )
{
ComputerId = -1073741670;
v2 = 0i64;
LABEL_161:
v3 = HighPart;
goto LABEL_147;
}
Struct = PipSmBiosFindStruct(1, 0, v11, HighPart);
v14 = Struct;
if( Struct )
{
v15 = Struct + 5;
if( Struct + 5 <= &Struct[Struct[1]] )
{
String = PipSmBiosGetString((__int64)Struct, Struct[4], (__int64)v12, HighPart, &UnicodeString);
ComputerId = String;
if( String == -1073741275 )
{
ComputerId = 0;
}
else if( String < 0 )
{
goto LABEL_160;
}
}
if( v14 + 27 <= &v14[v14[1]] )
{
v17 = PipSmBiosGetString((__int64)v14, v14[26], (__int64)v12, HighPart, &v109);
ComputerId = v17;
if( v17 == -1073741275 )
{
ComputerId = 0;
}
else if( v17 < 0 )
{
goto LABEL_160;
}
}
if( v14 + 6 <= &v14[v14[1]] )
{
v18 = PipSmBiosGetString((__int64)v14, *v15, (__int64)v12, HighPart, &v110);
ComputerId = v18;
if( v18 == -1073741275 )
{
ComputerId = 0;
}
else if( v18 < 0 )
{
goto LABEL_160;
}
}
if( v14 + 26 <= &v14[v14[1]] )
{
v19 = PipSmBiosGetString((__int64)v14, v14[25], (__int64)v12, HighPart, &v111);
ComputerId = v19;
if( v19 == -1073741275 )
{
ComputerId = 0;
}
else if( v19 < 0 )
{
goto LABEL_160;
}
}
if( v14 + 7 <= &v14[v14[1]] )
{
v20 = PipSmBiosGetString((__int64)v14, v14[6], (__int64)v12, HighPart, &v117);
ComputerId = v20;
if( v20 == -1073741275 )
{
ComputerId = 0;
}
else if( v20 < 0 )
{
goto LABEL_160;
}
}
}
v21 = PipSmBiosFindStruct(2, 10, v12, HighPart);
v22 = (__int64)v21;
if( v21 )
{
v23 = v21 + 5;
if( v21 + 5 <= &v21[v21[1]] )
{
v24 = PipSmBiosGetString((__int64)v21, v21[4], (__int64)v12, HighPart, &v114);
ComputerId = v24;
if( v24 == -1073741275 )
{
ComputerId = 0;
}
else if( v24 < 0 )
{
goto LABEL_160;
}
}
if( v22 + 6 <= v22 + (unsigned __int64)*(unsigned __int8 *)(v22 + 1) )
{
v25 = PipSmBiosGetString(v22, *v23, (__int64)v12, HighPart, &v115);
ComputerId = v25;
if( v25 == -1073741275 )
{
ComputerId = 0;
}
else if( v25 < 0 )
{
goto LABEL_160;
}
}
}
v26 = PipSmBiosFindStruct(0, 0, v12, HighPart);
v27 = (__int64)v26;
if( !v26 )
goto LABEL_40;
v28 = v26 + 5;
if( v26 + 5 <= &v26[v26[1]] )
{
v29 = PipSmBiosGetString((__int64)v26, v26[4], (__int64)v12, HighPart, &v112);
ComputerId = v29;
if( v29 == -1073741275 )
{
ComputerId = 0;
}
else if( v29 < 0 )
{
goto LABEL_160;
}
}
if( v27 + 6 > v27 + (unsigned __int64)*(unsigned __int8 *)(v27 + 1) )
goto LABEL_37;
v30 = PipSmBiosGetString(v27, *v28, (__int64)v12, HighPart, &v113);
ComputerId = v30;
if( v30 == -1073741275 )
{
ComputerId = 0;
goto LABEL_37;
}
if( v30 >= 0 )
{
LABEL_37:
if( v27 + 9 > v27 + (unsigned __int64)*(unsigned __int8 *)(v27 + 1) )
goto LABEL_40;
v31 = PipSmBiosGetString(v27, *(_BYTE *)(v27 + 8), (__int64)v12, HighPart, &v116);
ComputerId = v31;
if( v31 == -1073741275 )
{
ComputerId = 0;
goto LABEL_40;
}
if( v31 >= 0 )
{
LABEL_40:
v32 = PipSmBiosFindStruct(3, 0, v12, HighPart);
v34 = 0;
if( v32 && v32 + 6 <= &v32[v32[1]] )
{
v35 = v32[5] & 0x7F;
v95 = v35;
}
else
{
v35 = v95;
}
if( v35 )
{
ValueName_8.Buffer = L"EnclosureType";
LODWORD(DataSize) = 4;
*(_DWORD *)&ValueName_8.Length = 1835034;
ZwSetValueKey(KeyHandle, &ValueName_8, 0i64, 4ui64, &v95, DataSize);
}
v36 = 0;
p_UnicodeString = &UnicodeString;
do
{
if( p_UnicodeString->Buffer && !p_UnicodeString->Length )
RtlFreeAnsiString(&UnicodeString + v36);
++v36;
++p_UnicodeString;
}
while( v36 < 0xA );
v38 = 0;
v39 = &UnicodeString;
v40 = (PCWSTR *)off_1400082A0;
do
{
RtlInitUnicodeString(&ValueName_8, *v40, v33);
if( v39->Length )
{
if( (int)PnpUnicodeStringToWstr((WCHAR **)&v100, 0i64, &UnicodeString + v38) >= 0 )
{
v41 = (WCHAR *)v100;
v42 = -1i64;
do
++v42;
while( *((_WORD *)v100 + v42) );
LODWORD(DataSize) = 2 * v42 + 2;
ZwSetValueKey(KeyHandle, &ValueName_8, 0i64, 1ui64, v100, DataSize);
PnpUnicodeStringToWstrFree(v41, &UnicodeString + v38);
}
v34 = 0;
}
else
{
ZwDeleteValueKey(KeyHandle, &ValueName_8);
}
++v38;
++v40;
++v39;
}
while( v38 < 0xA );
Buffer = UnicodeString.Buffer;
v44 = Handle;
v45 = v99;
if( !UnicodeString.Buffer )
{
LABEL_122:
PoolWithTag = (wchar_t *)ExAllocatePoolWithTag(PagedPool, 112 * v45 + 2, 0x6E697050ui64);
v74 = PoolWithTag;
if( PoolWithTag )
{
v75 = PoolWithTag;
ValueName_8.Buffer = PoolWithTag;
v76 = 112 * v45 + 2;
ValueName_8.MaximumLength = v76;
if( v45 )
{
v98 = L"ComputerMetadata\\";
do
{
v77 = 0i64;
ValueName_8.Length = 0;
v78 = 0i64;
ComputerId = 0;
if( (ValueName_8.MaximumLength & 1) != 0 || v76 == 0xFFFF )
{
ComputerId = -1073741811;
}
else
{
if( v75 || !v76 )
{
v77 = v75;
v78 = (unsigned __int64)v76 >> 1;
}
else
{
ComputerId = -1073741811;
}
if( ComputerId < 0 )
goto LABEL_145;
v79 = 0i64;
if( v78 )
{
v80 = L"ComputerMetadata\\";
v81 = (char *)v77 - (_BYTE *)v98;
v82 = 0x7FFFi64;
v83 = v78;
ComputerId = 0;
do
{
if( !v82 )
break;
if( *v80 == (_WORD)v102 )
break;
*(const wchar_t *)((char *)v80 + v81) = *v80;
--v82;
++v80;
++v79;
--v83;
}
while( v83 );
if( !v83 && v82 && *v80 )
ComputerId = -2147483643;
v77 += v79;
LOWORD(v78) = v78 - v79;
}
else
{
ComputerId = v77 != 0i64 ? -2147483643 : -1073741811;
}
ValueName_8.Length = 2 * v79;
if( ((ComputerId + 0x80000000) & 0x80000000) != 0 || ComputerId == -2147483643 )
{
ValueName_8.Length = 0;
ValueName_8.MaximumLength = 2 * v78;
ValueName_8.Buffer = v77;
}
}
if( ComputerId < 0 )
goto LABEL_145;
ComputerId = RtlStringFromGUIDEx((const _GUID *const)&v118[4 * v34], &ValueName_8, 0);
if( ComputerId < 0 )
goto LABEL_145;
ComputerId = RtlUpcaseUnicodeString(&ValueName_8, &ValueName_8, 0);
if( ComputerId < 0 )
goto LABEL_145;
v75 = ValueName_8.Buffer + 39;
v76 = ValueName_8.MaximumLength - 78;
ValueName_8.Buffer += 39;
++v34;
ValueName_8.MaximumLength -= 78;
}
while( v34 < v45 );
}
if( ComputerId >= 0 )
{
*v75 = 0;
++ValueName_8.Buffer;
ComputerId = PnpSetObjectProperty(
PiPnpRtlCtx,
(__int64)L"{00000000-0000-0000-FFFF-FFFFFFFFFFFF}",
5u,
0i64,
0i64,
(__int64)&DEVPKEY_Device_HardwareIds,
8210,
(__int64)v74,
112 * v45 + 2,
0);
}
LABEL_145:
ExFreePoolWithTag(v74, 0);
}
else
{
ComputerId = -1073741670;
}
goto LABEL_146;
}
v46 = (UNICODE_STRING **)v98;
if( v110.Buffer && v112.Buffer && v113.Buffer )
{
RtlStringCchPrintfW(pszDest, 8ui64, (WCHAR *)L"%02x&%02x");
ComputerId = v48;
if( v48 < 0 )
goto LABEL_146;
RtlInitUnicodeString(&DestinationString, pszDest, v47);
if( v111.Buffer )
{
StringCount[0] = (UINT64)&UnicodeString;
v49 = &v110;
StringCount[1] = (UINT64)&v109;
v50 = 4i64;
v51 = &v105;
do
{
*(_QWORD *)v51 = v49++;
v51 = (__int128 *)((char *)v51 + 8);
--v50;
}
while( v50 );
p_DestinationString = &DestinationString;
ComputerId = PipCreateComputerId(v44, v46, (UINT64)StringCount, (GUID *)7);
v45 = 1;
if( ComputerId < 0 )
goto LABEL_146;
}
StringCount[0] = (UINT64)&UnicodeString;
StringCount[1] = (UINT64)&v109;
*(_QWORD *)&v105 = &v110;
*((_QWORD *)&v105 + 1) = &v112;
*(_QWORD *)&v106 = &v113;
*((_QWORD *)&v106 + 1) = &DestinationString;
v52 = v45 + 1;
ComputerId = PipCreateComputerId(v44, v46, (UINT64)StringCount, (GUID *)6);
if( ComputerId < 0 )
goto LABEL_146;
StringCount[0] = (UINT64)&UnicodeString;
StringCount[1] = (UINT64)&v110;
*(_QWORD *)&v105 = &v112;
*((_QWORD *)&v105 + 1) = &v113;
*(_QWORD *)&v106 = &DestinationString;
v45 = v52 + 1;
ComputerId = PipCreateComputerId(v44, v46, (UINT64)StringCount, (GUID *)5);
if( ComputerId < 0 )
goto LABEL_146;
Buffer = UnicodeString.Buffer;
}
if( !Buffer )
goto LABEL_122;
if( v110.Buffer )
{
if( v111.Buffer )
{
if( v114.Buffer )
{
if( v115.Buffer )
{
StringCount[0] = (UINT64)&UnicodeString;
v53 = &v110;
v54 = 2i64;
StringCount[1] = (UINT64)&v109;
v55 = &v105;
do
{
*(_QWORD *)v55 = v53++;
v55 = (__int128 *)((char *)v55 + 8);
--v54;
}
while( v54 );
v56 = &v106;
v57 = 2i64;
v58 = &v114;
do
{
*(_QWORD *)v56 = v58++;
v56 = (__int128 *)((char *)v56 + 8);
--v57;
}
while( v57 );
++v45;
ComputerId = PipCreateComputerId(v44, v46, (UINT64)StringCount, (GUID *)6);
if( ComputerId < 0 )
goto LABEL_146;
}
}
v59 = 2i64;
StringCount[0] = (UINT64)&UnicodeString;
v60 = &v110;
StringCount[1] = (UINT64)&v109;
v61 = &v105;
do
{
*(_QWORD *)v61 = v60++;
v61 = (__int128 *)((char *)v61 + 8);
--v59;
}
while( v59 );
++v45;
ComputerId = PipCreateComputerId(v44, v46, (UINT64)StringCount, (GUID *)4);
if( ComputerId < 0 )
goto LABEL_146;
}
StringCount[0] = (UINT64)&UnicodeString;
StringCount[1] = (UINT64)&v109;
*(_QWORD *)&v105 = &v110;
++v45;
ComputerId = PipCreateComputerId(v44, v46, (UINT64)StringCount, (GUID *)3);
if( ComputerId < 0 )
goto LABEL_146;
Buffer = UnicodeString.Buffer;
}
if( !Buffer )
goto LABEL_122;
if( v111.Buffer )
{
if( v114.Buffer )
{
if( v115.Buffer )
{
v62 = 2i64;
StringCount[0] = (UINT64)&UnicodeString;
v63 = &v114;
StringCount[1] = (UINT64)&v111;
v64 = &v105;
do
{
*(_QWORD *)v64 = v63++;
v64 = (__int128 *)((char *)v64 + 8);
--v62;
}
while( v62 );
++v45;
ComputerId = PipCreateComputerId(v44, v46, (UINT64)StringCount, (GUID *)4);
if( ComputerId < 0 )
goto LABEL_146;
}
}
StringCount[0] = (UINT64)&UnicodeString;
StringCount[1] = (UINT64)&v111;
++v45;
ComputerId = PipCreateComputerId(v44, v46, (UINT64)StringCount, (GUID *)2);
if( ComputerId < 0 )
goto LABEL_146;
Buffer = UnicodeString.Buffer;
}
if( !Buffer )
goto LABEL_122;
if( v110.Buffer )
{
if( v114.Buffer )
{
if( v115.Buffer )
{
StringCount[0] = (UINT64)&UnicodeString;
StringCount[1] = (UINT64)&v110;
*(_QWORD *)&v105 = &v114;
*((_QWORD *)&v105 + 1) = &v115;
++v45;
ComputerId = PipCreateComputerId(v44, v46, (UINT64)StringCount, (GUID *)4);
if( ComputerId < 0 )
goto LABEL_146;
}
}
StringCount[0] = (UINT64)&UnicodeString;
StringCount[1] = (UINT64)&v110;
++v45;
ComputerId = PipCreateComputerId(v44, v46, (UINT64)StringCount, (GUID *)2);
if( ComputerId < 0 )
goto LABEL_146;
Buffer = UnicodeString.Buffer;
}
if( !Buffer )
goto LABEL_122;
if( v109.Buffer )
{
if( v115.Buffer )
{
if( v114.Buffer )
{
v65 = 2i64;
StringCount[0] = (UINT64)&UnicodeString;
v66 = &v114;
StringCount[1] = (UINT64)&v109;
v67 = &v105;
do
{
*(_QWORD *)v67 = v66++;
v67 = (__int128 *)((char *)v67 + 8);
--v65;
}
while( v65 );
++v45;
ComputerId = PipCreateComputerId(v44, v46, (UINT64)StringCount, (GUID *)4);
if( ComputerId < 0 )
goto LABEL_146;
}
}
StringCount[0] = (UINT64)&UnicodeString;
StringCount[1] = (UINT64)&v109;
++v45;
ComputerId = PipCreateComputerId(v44, v46, (UINT64)StringCount, (GUID *)2);
if( ComputerId < 0 )
goto LABEL_146;
Buffer = UnicodeString.Buffer;
}
if( !Buffer )
goto LABEL_122;
if( v95 )
{
RtlStringCchPrintfW(&SourceString, 4ui64, (WCHAR *)L"%x");
ComputerId = v69;
if( v69 < 0 )
goto LABEL_146;
RtlInitUnicodeString(&v103, &SourceString, v68);
StringCount[0] = (UINT64)&UnicodeString;
StringCount[1] = (UINT64)&v103;
++v45;
ComputerId = PipCreateComputerId(v44, 0i64, (UINT64)StringCount, (GUID *)2);
if( ComputerId < 0 )
goto LABEL_146;
Buffer = UnicodeString.Buffer;
}
if( !Buffer )
goto LABEL_122;
if( !v115.Buffer )
goto LABEL_187;
if( !v114.Buffer )
goto LABEL_187;
v70 = 2i64;
StringCount[0] = (UINT64)&UnicodeString;
v71 = &v114;
v72 = &StringCount[1];
do
{
*v72++ = (UINT64)v71++;
--v70;
}
while( v70 );
++v45;
ComputerId = PipCreateComputerId(v44, 0i64, (UINT64)StringCount, (GUID *)3);
if( ComputerId >= 0 )
{
LABEL_187:
StringCount[0] = (UINT64)&UnicodeString;
++v45;
ComputerId = PipCreateComputerId(v44, 0i64, (UINT64)StringCount, (GUID *)1);
if( ComputerId >= 0 )
goto LABEL_122;
}
LABEL_146:
v3 = v92;
v2 = v93;
goto LABEL_147;
}
}
LABEL_160:
v2 = v12;
goto LABEL_161;
}
}
}
LABEL_147:
v84 = &UnicodeString;
v85 = 10i64;
do
{
RtlFreeAnsiString(v84++);
--v85;
}
while( v85 );
v87 = Handle;
if( v2 )
MmUnmapIoSpace(v2, v3);
if( v87 )
ZwClose(v87);
if( KeyHandle )
PnpCtxRegCloseKey(v86, KeyHandle);
return ComputerId;
}Referenced by:
IopInitializeBootDrivers