PiDevCfgFindDeviceMigrationNode
NTSTATUS __stdcall PiDevCfgFindDeviceMigrationNode(
PI_DEVCFG_MIGRATION_CONTEXT *MigrationContext,
PI_DEVCFG_DEVICE_CONTEXT *DeviceContext,
VOID *MigrationNodesKeyHandle,
UINT64 DefaultMatchFlags,
PI_DEVCFG_MIGRATION_NODE **MigrationNodeResult){
unsigned int v5;
_PI_DEVCFG_MIGRATION_NODE v7;
_PI_DEVCFG_MIGRATION_NODE **v8;
int v9;
unsigned int v10;
_KEY_VALUE_FULL_INFORMATION *v11;
_UNICODE_STRING *v12;
UINT64 i;
WCHAR v14;
NTSTATUS v15;
_PI_DEVCFG_MIGRATION_NODE *v16;
_PI_DEVCFG_MIGRATION_NODE **v17;
__int64 v18;
const wchar_t *v19;
int v20;
const WCHAR **v21;
__int64 v22;
__int64 v23;
__int64 *v24;
int *v25;
INT64 v26;
INT64 v27;
__int16 v28;
_PI_DEVCFG_MIGRATION_NODE *v29;
bool v30;
bool v31;
const WCHAR *v32;
__int64 v33;
__int64 v34;
int v35;
PI_DEVCFG_QUERY_PROPERTY_PARAM *v36;
__int64 v37;
WCHAR *v38;
PI_DEVCFG_QUERY_PROPERTY_PARAM *v39;
__int64 v40;
WCHAR *v41;
_PI_DEVCFG_MIGRATION_CONTEXT *v42;
__int64 v43;
WCHAR *v44;
WCHAR *v45;
_UNICODE_STRING *p_UnicodeString;
__int64 v47;
unsigned __int64 v48;
bool v49;
_PI_DEVCFG_MIGRATION_NODE **v50;
_PI_DEVCFG_MIGRATION_NODE *v51;
_PI_DEVCFG_MIGRATION_NODE **v52;
unsigned int *v53;
_PI_DEVCFG_MIGRATION_NODE *v54;
_PI_DEVCFG_MIGRATION_NODE ***v55;
_PI_DEVCFG_MIGRATION_NODE *v56;
__int64 v57;
UINT64 *ResultLength;
INT64 v60;
INT64 v61;
UINT64 *v62;
INT64 v63;
_PI_DEVCFG_MIGRATION_NODE *v64;
_PI_DEVCFG_MIGRATION_NODE *v65;
_KEY_VALUE_FULL_INFORMATION *Information;
int v67;
int v68;
int v69;
unsigned int v70;
int Data;
_PI_DEVCFG_MIGRATION_CONTEXT *MigrationContexta;
_PI_DEVCFG_MIGRATION_NODE *v73;
_UNICODE_STRING String2;
_UNICODE_STRING DestinationString;
_UNICODE_STRING UnicodeString;
PI_DEVCFG_DEVICE_CONTEXT *v77;
_UNICODE_STRING v78;
_UNICODE_STRING DriverPackageId;
VOID *KeyHandle;
_UNICODE_STRING ValueName;
INT64 v82[10];
PI_DEVCFG_MIGRATION_NODE **v83;
_GUID Guid;
__int128 KeyInformation;
__int128 v86;
__int64 v87;
v5 = 0;
MigrationContexta = MigrationContext;
v63 = (unsigned int)DefaultMatchFlags;
v83 = MigrationNodeResult;
v77 = DeviceContext;
v87 = 0i64;
KeyHandle = MigrationNodesKeyHandle;
v65 = (_PI_DEVCFG_MIGRATION_NODE *)&v64;
v73 = 0i64;
v64 = (_PI_DEVCFG_MIGRATION_NODE *)&v64;
v7 = DefaultMatchFlags;
HIDWORD(v62) = 0;
v68 = 0;
v8 = 0i64;
v67 = 0;
KeyInformation = 0i64;
*(_QWORD *)&String2.Length = 0i64;
v86 = 0i64;
String2.Buffer = 0i64;
Guid = 0i64;
*(_QWORD *)&DestinationString.Length = 0i64;
DestinationString.Buffer = 0i64;
*(_QWORD *)&DriverPackageId.Length = 0i64;
DriverPackageId.Buffer = 0i64;
*(_QWORD *)&v78.Length = 0i64;
v78.Buffer = 0i64;
*(_QWORD *)&UnicodeString.Length = 0i64;
UnicodeString.Buffer = 0i64;
ValueName = 0i64;
Data = 0;
v9 = NtQueryKey(
MigrationNodesKeyHandle,
KeyCachedInformation,
&KeyInformation,
0x28ui64,
(UINT64 *)((char *)&v63 + 4));
if( v9 >= 0 )
{
if( !DWORD1(v86) )
goto LABEL_145;
v10 = HIDWORD(v86) + 2 * (DWORD2(v86) + 13);
v69 = v10;
Information = (_KEY_VALUE_FULL_INFORMATION *)ExAllocatePoolWithTag(1ui64, v10, 1667526736i64);
v11 = Information;
if( !Information )
{
LABEL_4:
v9 = -1073741670;
goto LABEL_146;
}
v12 = (_UNICODE_STRING *)*((_QWORD *)MigrationContext + 5);
if( !v12 || (v9 = RtlGUIDFromString(v12, &Guid), v9 >= 0) )
{
for( i = 0i64; ; i = v5 )
{
LODWORD(ResultLength) = v10;
v70 = v5;
LODWORD(v62) = ZwEnumerateValueKey(
KeyHandle,
i,
KeyValueFullInformation,
v11,
(UINT64)ResultLength,
(UINT64 *)((char *)&v63 + 4));
v9 = (int)v62;
if( (_DWORD)v62 == -2147483622 )
{
v9 = 0;
LODWORD(v62) = 0;
LABEL_117:
ExFreePoolWithTag(v11, 0);
if( v9 < 0 )
break;
v50 = (_PI_DEVCFG_MIGRATION_NODE **)v64;
if( v64 == (_PI_DEVCFG_MIGRATION_NODE *)&v64 )
goto LABEL_145;
LABEL_119:
v51 = v50[23];
if( v51 != (_PI_DEVCFG_MIGRATION_NODE *)-1i64 )
{
if( !v8 || v8[23] > v51 )
goto LABEL_127;
if( v8[23] != v51 )
goto LABEL_128;
if( BYTE6(qword_140C50A2C) && *((_DWORD *)v50 + 44) && !*((_DWORD *)v8 + 44) )
{
LABEL_127:
v8 = v50;
}
else
{
*((_DWORD *)v8 + 4) |= 2u;
*((_DWORD *)v50 + 4) |= 2u;
}
}
LABEL_128:
v50 = (_PI_DEVCFG_MIGRATION_NODE **)*v50;
if( v50 == &v64 )
{
if( v8 )
{
if( ((_DWORD)v8[2] & 2) != 0 )
{
v52 = (_PI_DEVCFG_MIGRATION_NODE **)v64;
Data = 1;
if( v64 != (_PI_DEVCFG_MIGRATION_NODE *)&v64 )
{
do
{
if( ((_DWORD)v52[2] & 2) != 0 && v52[23] == v8[23] )
{
*(_DWORD *)&ValueName.Length = 1310738;
ValueName.Buffer = (wchar_t *)L"Duplicate";
LODWORD(v60) = 4;
ZwSetValueKey(v52[5], &ValueName, 0i64, 4ui64, &Data, v60);
}
v52 = (_PI_DEVCFG_MIGRATION_NODE **)*v52;
}
while( v52 != &v64 );
v9 = (int)v62;
}
}
else if( IopGetRegistryValue(v8[5], (PWCHAR)L"Duplicate", 0i64, &Information) >= 0 )
{
if( PnpValidateRegistryDword((__int64)Information) && *(unsigned int *)((char *)v53 + v53[2]) )
*((_DWORD *)v8 + 4) |= 2u;
ExFreePoolWithTag(v53, 0);
}
v54 = *v8;
if( *((_PI_DEVCFG_MIGRATION_NODE ***)*v8 + 1) == v8 )
{
v55 = (_PI_DEVCFG_MIGRATION_NODE ***)v8[1];
if( *v55 == v8 )
{
*v55 = (_PI_DEVCFG_MIGRATION_NODE **)v54;
*((_QWORD *)v54 + 1) = v55;
*v83 = (PI_DEVCFG_MIGRATION_NODE *)v8;
break;
}
}
LABEL_150:
__fastfail(3u);
}
LABEL_145:
v9 = -1073741275;
break;
}
goto LABEL_119;
}
if( (_DWORD)v62 == -2147483643 )
{
ExFreePoolWithTag(v11, 0);
v10 = HIDWORD(v63) + 2;
v69 = HIDWORD(v63) + 2;
Information = (_KEY_VALUE_FULL_INFORMATION *)ExAllocatePoolWithTag(
1ui64,
(unsigned int)(HIDWORD(v63) + 2),
1667526736i64);
v11 = Information;
if( !Information )
goto LABEL_4;
--v5;
goto LABEL_18;
}
if( (int)v62 < 0 )
goto LABEL_117;
if( PnpValidateRegistryDword((__int64)v11) )
v7 = *(ULONG *)((char *)&v11->TitleIndex + v11->DataOffset);
v11->Name[(unsigned __int64)v11->NameLength >> 1] = v14;
if( CmIsRootEnumeratedDevice(v11->Name) )
goto LABEL_17;
v15 = PiDevCfgQueryDeviceMigrationNode(MigrationContexta, v11->Name, &v73);
LODWORD(v62) = v15;
v9 = v15;
if( v15 == -1073741772 )
{
v73 = 0i64;
PiDevCfgClearDeviceMigrationNode(MigrationContexta, v11->Name);
LABEL_17:
v7 = v63;
goto LABEL_18;
}
if( v15 < 0 )
goto LABEL_117;
v16 = v73;
v73[45] = v7;
v17 = (_PI_DEVCFG_MIGRATION_NODE **)v65;
if( *(_PI_DEVCFG_MIGRATION_NODE ***)v65 != &v64 )
goto LABEL_150;
v18 = (__int64)v77;
*(_QWORD *)v16 = &v64;
*((_QWORD *)v16 + 1) = v17;
*v17 = v16;
v19 = *(const wchar_t **)(v18 + 8);
v65 = v16;
v20 = 0;
if( !wcsicmp(*((const wchar_t **)v16 + 4), v19) )
v20 = 0x10000000;
if( (v16[45] & 0x10000000) != 0 && (v20 & 0x10000000) == 0 )
v16[4] |= 1u;
v21 = (const WCHAR **)(v16 + 14);
v22 = v18 - (_QWORD)v16;
v23 = 2i64;
v24 = &qword_140983868;
v25 = &v68;
do
{
PiDevCfgGetMigrationDeviceIdScore(*v21, *(const WCHAR **)((char *)v21 + v22 - 24));
*(_WORD *)v25 = v28;
if( v28 != -1 )
v20 |= *(_DWORD *)v24;
v21 += 2;
v25 = (int *)((char *)v25 + 2);
v24 = (__int64 *)((char *)v24 + 4);
--v23;
}
while( v23 );
v29 = v73;
if( (v73[45] & 0x10000) != 0 )
{
if( (v20 & 0x10000) == 0 )
goto LABEL_36;
v30 = (v20 & 0x11000) == 0;
v31 = (v73[45] & 0x1000) != 0;
}
else
{
v30 = (v73[45] & 0x1000) != 0;
v31 = (v20 & 0x1000) == 0;
}
if( v30 && v31 )
LABEL_36:
v73[4] |= 1u;
v32 = (const WCHAR *)*((_QWORD *)v29 + 18);
v33 = (__int64)v77;
if( v32 && *((_QWORD *)v77 + 8) )
{
while( 1 )
{
if( !*v32 )
goto LABEL_47;
if( PnpMultiSzContainsString(*(WCHAR **)(v33 + 64), v32, v26) )
break;
v34 = -1i64;
do
++v34;
while( v32[v34] );
v32 += v34 + 1;
}
v20 |= 0x200u;
*((_QWORD *)v29 + 19) = v32;
}
LABEL_47:
if( (v29[45] & 0x200) != 0 && (v20 & 0x200) == 0 )
v29[4] |= 1u;
v35 = HIDWORD(v62);
if( *((_QWORD *)v29 + 16) )
{
if( (WORD2(v62) & 0x100) == 0 )
{
memset(v82, 0i64, sizeof(v82));
v36 = *(PI_DEVCFG_QUERY_PROPERTY_PARAM **)(v33 + 16);
v37 = *(_QWORD *)(v33 + 8);
v82[0] = (INT64)&DEVPKEY_Device_LocationInfo;
v82[2] = (INT64)&DestinationString;
LODWORD(v60) = 1;
LODWORD(v82[1]) = 18;
HIDWORD(v82[3]) = 6;
LODWORD(v62) = PiDevCfgQueryObjectProperties(v38, v37, (VOID *)1, v36, (UINT64)v82, v60);
v9 = (int)v62;
if( (int)v62 < 0 )
goto LABEL_116;
if( SLODWORD(v82[4]) < 0 )
RtlInitUnicodeString(&DestinationString, 0i64);
v35 = HIDWORD(v62) | 0x100;
HIDWORD(v62) |= 0x100u;
}
if( DestinationString.Buffer
&& !RtlCompareUnicodeString((const _UNICODE_STRING *)(v29 + 30), &DestinationString, 1u) )
{
v20 |= 0x100u;
}
}
if( (v20 & 0x300) == 0 && (v29[45] & 0x100) != 0 )
v29[4] |= 1u;
if( (v35 & 0x30) == 0 )
{
memset(v82, 0i64, sizeof(v82));
v39 = *(PI_DEVCFG_QUERY_PROPERTY_PARAM **)(v33 + 16);
v40 = *(_QWORD *)(v33 + 8);
v82[0] = (INT64)&DEVPKEY_Device_Capabilities;
v82[2] = (INT64)&v67;
v82[5] = (INT64)&DEVPKEY_Device_BusReportedDeviceDesc;
v82[7] = (INT64)&String2;
LODWORD(v60) = 2;
LODWORD(v82[1]) = 7;
LODWORD(v82[3]) = 4;
LODWORD(v82[6]) = 18;
HIDWORD(v82[8]) = 6;
LODWORD(v62) = PiDevCfgQueryObjectProperties(v41, v40, (VOID *)1, v39, (UINT64)v82, v60);
v9 = (int)v62;
if( (int)v62 < 0 )
goto LABEL_116;
if( SLODWORD(v82[9]) < 0 )
RtlInitUnicodeString(&String2, 0i64);
v35 |= 0x30u;
HIDWORD(v62) = v35;
}
if( (((unsigned __int8)v67 ^ *((_BYTE *)v29 + 96)) & 0x10) != 0 )
{
if( (v29[45] & 0x10) != 0 || (v67 & 0x10) != 0 )
v29[4] |= 1u;
}
else
{
v20 |= 0x10u;
}
if( *((_QWORD *)v29 + 14) )
{
if( !String2.Buffer || RtlCompareUnicodeString((const _UNICODE_STRING *)(v29 + 26), &String2, 1u) )
goto LABEL_76;
LABEL_75:
v20 |= 0x20u;
goto LABEL_76;
}
if( !String2.Buffer )
goto LABEL_75;
LABEL_76:
if( (v29[45] & 0x20) != 0 && (v20 & 0x20) == 0 )
v29[4] |= 1u;
if( *((_QWORD *)v29 + 21) )
{
if( (v35 & 2) == 0 )
{
v42 = MigrationContexta;
v43 = *((_QWORD *)MigrationContexta + 6);
if( v43 )
{
v44 = *(WCHAR **)(v43 + 8);
if( v44 )
{
if( PiDevCfgGetDriverPackageId(v44, &DriverPackageId, v26, v27, (INT64)ResultLength, v60, v62, v63) >= 0 )
{
memset(v82, 0i64, sizeof(v82));
v82[0] = (INT64)&DEVPKEY_DriverPackage_OriginalInfName;
LODWORD(v61) = 1;
v82[2] = (INT64)&UnicodeString;
LODWORD(v82[1]) = 18;
HIDWORD(v82[3]) = 6;
LODWORD(v62) = PiDevCfgQueryObjectProperties(
v45,
(PNP_OBJECT_TYPE)DriverPackageId.Buffer,
(VOID *)8,
0i64,
(UINT64)v82,
v61);
v9 = (int)v62;
if( (int)v62 < 0 )
{
LABEL_116:
v11 = Information;
goto LABEL_117;
}
if( SLODWORD(v82[4]) < 0 )
RtlInitUnicodeString(&UnicodeString, 0i64);
v42 = MigrationContexta;
}
p_UnicodeString = &UnicodeString;
if( !UnicodeString.Buffer )
p_UnicodeString = (_UNICODE_STRING *)*((_QWORD *)v42 + 6);
v78 = *p_UnicodeString;
}
}
HIDWORD(v62) = v35 | 2;
}
if( v78.Buffer && !RtlCompareUnicodeString((const _UNICODE_STRING *)v29 + 10, &v78, 1u) )
v20 |= 2u;
}
if( (v29[45] & 2) != 0 && (v20 & 2) == 0 )
v29[4] |= 1u;
v47 = *((_QWORD *)v29 + 10) - *(_QWORD *)&Guid.Data1;
if( !v47 )
v47 = *((_QWORD *)v29 + 11) - *(_QWORD *)Guid.Data4;
if( v47 )
{
if( (v29[45] & 1) != 0 )
v29[4] |= 1u;
}
else
{
v20 |= 1u;
}
v48 = (HIWORD(v68) | ((unsigned __int64)(unsigned __int16)v68 << 16)) << 16;
*((_QWORD *)v29 + 23) = v48;
if( (v20 & 0x10000000) == 0 )
{
v48 |= 0xF000000000000000ui64;
*((_QWORD *)v29 + 23) = v48;
}
if( (v20 & 0x200) == 0 )
{
v48 |= 0xF000ui64;
*((_QWORD *)v29 + 23) = v48;
}
if( (v20 & 0x100) == 0 )
{
v48 |= 0x100ui64;
*((_QWORD *)v29 + 23) = v48;
}
if( (v20 & 0x20) == 0 )
{
v48 |= 0x20ui64;
*((_QWORD *)v29 + 23) = v48;
}
if( (v20 & 0x10) == 0 )
{
v48 |= 0x10ui64;
*((_QWORD *)v29 + 23) = v48;
}
if( (v20 & 2) == 0 )
{
v48 |= 2ui64;
*((_QWORD *)v29 + 23) = v48;
}
v11 = Information;
v49 = (v20 & 1) == 0;
v7 = v63;
v10 = v69;
v5 = v70;
if( v49 )
*((_QWORD *)v29 + 23) = v48 | 1;
LABEL_18:
++v5;
}
}
}
LABEL_146:
while( 1 )
{
v56 = v64;
if( v64 == (_PI_DEVCFG_MIGRATION_NODE *)&v64 )
break;
if( *((_PI_DEVCFG_MIGRATION_NODE ***)v64 + 1) != &v64 )
goto LABEL_150;
v57 = *(_QWORD *)v64;
if( *(_PI_DEVCFG_MIGRATION_NODE **)(*(_QWORD *)v64 + 8i64) != v64 )
goto LABEL_150;
v64 = *(_PI_DEVCFG_MIGRATION_NODE **)v64;
*(_QWORD *)(v57 + 8) = &v64;
PiDevCfgFreeDeviceMigrationNode(v56);
}
RtlFreeAnsiString(&String2);
RtlFreeAnsiString(&DestinationString);
RtlFreeAnsiString(&DriverPackageId);
RtlFreeAnsiString(&UnicodeString);
return v9;
}Referenced by:
PiDevCfgMigrateDevice