PiDevCfgQueryDeviceMigrationNode
NTSTATUS __stdcall PiDevCfgQueryDeviceMigrationNode(
PI_DEVCFG_MIGRATION_CONTEXT *MigrationContext,
WCHAR *DeviceInstanceId,
PI_DEVCFG_MIGRATION_NODE **MigrationNodeResult){
unsigned int v3;
VOID *v5;
__int64 v6;
int v7;
VOID **PoolWithTag;
VOID **v9;
__m128i v10;
__m128i v11;
__m128i si128;
__m128i v13;
__m128i v14;
_KEXCEPTION_FRAME *v15;
int v16;
_QWORD *v17;
_WORD *v18;
_UNICODE_STRING *v19;
VOID *Handle;
_UNICODE_STRING GuidString;
PI_DEVCFG_MIGRATION_NODE **v23;
__int64 v24[70];
v3 = 0;
v23 = MigrationNodeResult;
Handle = 0i64;
v5 = (VOID *)*((_QWORD *)MigrationContext + 1);
*(_QWORD *)&GuidString.Length = 0i64;
GuidString.Buffer = 0i64;
if( *(&stru_140CF2E80 + 607) )
v6 = *(_QWORD *)(*(&stru_140CF2E80 + 607) + 224i64);
else
v6 = 0i64;
v7 = SysCtxRegOpenKey(v6, v5, DeviceInstanceId, 0, 0x20019u, &Handle);
if( v7 >= 0 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0xC0ui64, 1667526736i64);
v9 = PoolWithTag;
v10 = _mm_unpacklo_epi64((__m128i)(unsigned __int64)PoolWithTag, (__m128i)(unsigned __int64)PoolWithTag);
if( !PoolWithTag )
{
v7 = -1073741670;
goto LABEL_32;
}
memset(PoolWithTag, 0i64, 0xB8u);
v9[23] = (VOID *)-1i64;
if( !RtlCreateUnicodeString((INT64)(v9 + 3), (INT8 *)DeviceInstanceId) )
{
v7 = -1073741670;
LABEL_31:
PiDevCfgFreeDeviceMigrationNode((_PI_DEVCFG_MIGRATION_NODE *)v9);
goto LABEL_32;
}
v9[5] = Handle;
Handle = 0i64;
memset(v24, 0i64, sizeof(v24));
v11 = _mm_loadu_si128((const __m128i *)&PiDevCfgSystemRoot + 1);
si128 = _mm_load_si128((const __m128i *)&_xmm);
v13 = _mm_load_si128((const __m128i *)&_xmm);
v24[2] = v11.m128i_i64[0];
v24[9] = _mm_srli_si128(v11, 8).m128i_u64[0];
LODWORD(v24[4]) = _mm_cvtsi128_si32(si128);
v24[16] = (__int64)L"ClassGuid";
v24[17] = (__int64)&GuidString;
v24[23] = (__int64)L"Capabilities";
v24[24] = (__int64)(v9 + 12);
v24[30] = (__int64)L"BusDeviceDesc";
v24[37] = (__int64)L"LocationInfo";
v24[44] = (__int64)L"LocationPaths";
v24[45] = (__int64)(v9 + 17);
v24[51] = (__int64)L"DriverInfName";
v14 = _mm_add_epi64(
_mm_slli_epi64(
_mm_add_epi64(_mm_unpacklo_epi32(_mm_load_si128((const __m128i *)&_xmm), (__m128i)0i64), (__m128i)_xmm),
4u),
v10);
v24[58] = (__int64)L"Present";
v24[3] = v14.m128i_i64[0];
LODWORD(v24[1]) = _mm_cvtsi128_si32(v13);
LODWORD(v24[18]) = 0x1000000;
LODWORD(v24[15]) = 288;
LODWORD(v24[25]) = 0x4000000;
LODWORD(v24[22]) = 288;
LODWORD(v24[32]) = 0x1000000;
LODWORD(v24[29]) = 288;
LODWORD(v24[39]) = 0x1000000;
LODWORD(v24[36]) = 288;
LODWORD(v24[53]) = 0x1000000;
v15 = (_KEXCEPTION_FRAME *)v9[5];
LODWORD(v24[50]) = 288;
LODWORD(v24[60]) = 0x4000000;
LODWORD(v24[57]) = 288;
v24[59] = (__int64)(v9 + 22);
LODWORD(v24[11]) = _mm_cvtsi128_si32(_mm_srli_si128(si128, 4));
v24[10] = _mm_srli_si128(v14, 8).m128i_u64[0];
LODWORD(v24[8]) = _mm_cvtsi128_si32(_mm_srli_si128(v13, 4));
v24[31] = (__int64)(v9 + 13);
v24[38] = (__int64)(v9 + 15);
LODWORD(v24[46]) = 117440512;
LODWORD(v24[43]) = 304;
v24[52] = (__int64)(v9 + 20);
LOBYTE(v16) = RtlpQueryRegistryValues((_KTRAP_FRAME *)0xC0000000i64, v15);
v7 = v16;
if( v16 < 0 )
goto LABEL_31;
if( !GuidString.Buffer || RtlGUIDFromString(&GuidString, (_GUID *)v9 + 5) < 0 )
{
v7 = -1073741772;
goto LABEL_31;
}
v17 = v9 + 7;
do
{
if( *((_WORD *)v17 - 4) <= 2u && *v17 )
RtlFreeAnsiString((_UNICODE_STRING *)&v9[2 * v3 + 6]);
++v3;
v17 += 2;
}
while( v3 < 2 );
if( !*((_WORD *)v9 + 52) && v9[14] )
RtlFreeAnsiString((_UNICODE_STRING *)(v9 + 13));
if( !*((_WORD *)v9 + 60) && v9[16] )
RtlFreeAnsiString((_UNICODE_STRING *)(v9 + 15));
v18 = v9[18];
if( v18 && !PnpValidateMultiSzData(v18, *((unsigned __int16 *)v9 + 68)) )
RtlFreeAnsiString(v19);
if( !*((_WORD *)v9 + 80) && v9[21] )
RtlFreeAnsiString((_UNICODE_STRING *)v9 + 10);
*v23 = (PI_DEVCFG_MIGRATION_NODE *)v9;
}
LABEL_32:
if( Handle )
ZwClose((_HANDLE)Handle);
RtlFreeAnsiString(&GuidString);
return v7;
}Referenced by:
PiDevCfgFindDeviceMigrationNode
PiDevCfgMigrateDevice