PiDevCfgCheckDeviceNeedsUpdate
INT64 __fastcall PiDevCfgCheckDeviceNeedsUpdate(INT64 a1, UINT64 *a2){
UINT64 *v2;
unsigned int v4;
int DeviceDriver;
__int64 v6;
const wchar_t *v7;
INT64 v8;
INT64 v9;
WCHAR v10;
union _LARGE_INTEGER v11;
INT64 v12;
INT64 v13;
wchar_t *Buffer;
__int64 v15;
INT64 v16;
wchar_t *v17;
wchar_t *v18;
_QWORD *v19;
__int128 **v20;
INT64 v21;
int v22;
INT64 v23;
__int64 *v24;
__int64 *v25;
__int64 *v26;
__int64 **v27;
__int64 **v28;
__int64 v29;
__int128 *v30;
INT64 v31;
__int128 *v32;
NTSTATUS v33;
INT64 v34;
INT64 v35;
_QWORD *v36;
UINT64 v38;
__int64 *v39;
INT64 v40;
__int64 v41;
__int128 v42;
int v43;
int v44;
union _LARGE_INTEGER v45;
int v46;
struct _UNICODE_STRING DestinationString;
struct _UNICODE_STRING UnicodeString;
struct _UNICODE_STRING v49;
struct _UNICODE_STRING v50;
HANDLE Handle;
UNICODE_STRING DriverPackageId;
UINT64 *v53;
INT64 result;
int v55;
struct _UNICODE_STRING *p_DestinationString;
int v57;
int v58;
const DEVPROPKEY *v59;
int v60;
union _LARGE_INTEGER *v61;
int v62;
int v63;
const DEVPROPKEY *v64;
int v65;
struct _UNICODE_STRING *p_UnicodeString;
int v67;
int v68;
const DEVPROPKEY *v69;
int v70;
struct _UNICODE_STRING *v71;
int v72;
int v73;
v53 = a2;
v2 = a2;
*(_DWORD *)a2 = 0;
v44 = 0;
*(_QWORD *)&DestinationString.Length = 0i64;
DestinationString.Buffer = 0i64;
v46 = 1;
v45.QuadPart = 0i64;
v4 = 0;
*(_QWORD *)&UnicodeString.Length = 0i64;
UnicodeString.Buffer = 0i64;
v41 = 0i64;
*(_QWORD *)&v49.Length = 0i64;
v49.Buffer = 0i64;
v42 = 0i64;
*(_QWORD *)&v50.Length = 0i64;
v50.Buffer = 0i64;
Handle = 0i64;
v40 = 0i64;
v43 = 0;
*(_QWORD *)&DriverPackageId.Length = 0i64;
DriverPackageId.Buffer = 0i64;
DeviceDriver = PiDevCfgFindDeviceDriver(a1, 0i64, &v40);
if( (int)(DeviceDriver + 0x80000000) < 0 || DeviceDriver == -1073740656 )
{
v6 = *(_QWORD *)(a1 + 16);
v7 = *(const wchar_t **)(a1 + 8);
v43 = 4;
if( (int)CmGetDeviceRegProp(PiPnpRtlCtx, v7, v6, 11, (__int64)&v46, (__int64)&v44, (__int64)&v43, 0) < 0
|| v46 != 4
|| v43 != 4 )
{
v44 = 0;
}
memset((INT64)&result, 0i64);
v8 = *(_QWORD *)(a1 + 16);
result = (INT64)&DEVPKEY_Device_DriverInfPath;
LODWORD(v38) = 4;
p_DestinationString = &DestinationString;
v55 = 18;
v59 = &DEVPKEY_Device_DriverDate;
v57 = 6;
v61 = &v45;
v64 = &DEVPKEY_Device_DriverVersion;
p_UnicodeString = &UnicodeString;
v69 = &DEVPKEY_Device_ExtendedConfigurationIds;
v71 = &v49;
v67 = 6;
v72 = 6;
v9 = *(_QWORD *)(a1 + 8);
v60 = 16;
v62 = 8;
v65 = 18;
v70 = 8210;
DeviceDriver = PiDevCfgQueryObjectProperties(18i64, v9, 1ui64, v8, (INT64)&result, v38);
if( DeviceDriver >= 0 )
{
if( v58 < 0 )
RtlInitUnicodeString(&DestinationString, 0i64, v10);
v11 = v45;
if( v63 < 0 )
v11.QuadPart = 0i64;
v45 = v11;
if( v68 < 0 )
RtlInitUnicodeString(&UnicodeString, 0i64, v10);
if( v73 < 0 )
RtlInitUnicodeString(&v49, 0i64, v10);
if( !UnicodeString.Buffer || (v39 = &v41, swscanf_s(UnicodeString.Buffer, (PWCHAR)L"%hu.%hu.%hu.%hu") != 4) )
v41 = 0i64;
if( !CmIsRootEnumeratedDevice(*(PCWSTR *)(a1 + 8)) )
goto LABEL_33;
memset((INT64)&result, 0i64);
v12 = *(_QWORD *)(a1 + 16);
v13 = *(_QWORD *)(a1 + 8);
result = (INT64)DEVPKEY_Device_Owners;
LODWORD(v39) = 1;
p_DestinationString = &v50;
v55 = 8210;
v57 = 6;
DeviceDriver = PiDevCfgQueryObjectProperties(1i64, v13, 1ui64, v12, (INT64)&result, (UINT64)v39);
if( DeviceDriver < 0 )
goto LABEL_90;
if( v58 < 0 )
goto LABEL_33;
Buffer = v50.Buffer;
if( !v50.Buffer || v50.Length <= 2u )
goto LABEL_33;
if( !*v50.Buffer )
goto LABEL_31;
while( 1 )
{
DeviceDriver = PnpOpenObjectRegKey(PiPnpRtlCtx, (__int64)Buffer, 9u, 131097, 0, (__int64)&Handle);
if( DeviceDriver >= 0 )
break;
DeviceDriver = 0;
v15 = -1i64;
do
++v15;
while( Buffer[v15] );
Buffer += v15 + 1;
if( !*Buffer )
goto LABEL_31;
}
ZwClose(Handle);
if( *Buffer )
{
LABEL_33:
v16 = v40;
}
else
{
LABEL_31:
v16 = v40;
if( !v40 )
v4 = PnpBootMode != 0 ? 0x40000 : 2;
}
if( (v44 & 0x40) == 0 && (v17 = DestinationString.Buffer) != 0i64 )
{
if( v16 && RtlEqualUnicodeString((UNICODE_STRING *)(v16 + 40), &DestinationString, 1u) )
{
if( *(_QWORD *)(v16 + 112) != v45.QuadPart || *(_QWORD *)(v16 + 120) != v41 )
goto LABEL_76;
v18 = v49.Buffer;
v19 = (_QWORD *)(v16 + 208);
if( v49.Buffer )
{
if( (_QWORD *)*v19 != v19 )
{
v20 = (__int128 **)&v42;
*((_QWORD *)&v42 + 1) = &v42;
*(_QWORD *)&v42 = &v42;
if( !*v49.Buffer )
goto LABEL_61;
while( *(_QWORD *)(v16 + 208) != v16 + 208 )
{
RtlFreeAnsiString(&DestinationString);
v22 = PiDevCfgSplitDriverConfigurationId(v18, (PLARGE_INTEGER)&DestinationString, v21);
v16 = v40;
if( v22 < 0 )
break;
v23 = v40 + 208;
v24 = *(__int64 **)(v40 + 208);
if( v24 == (__int64 *)(v40 + 208) )
break;
do
{
v25 = v24;
if( RtlEqualUnicodeString((UNICODE_STRING *)(v24 + 5), &DestinationString, 1u) )
break;
v24 = (__int64 *)*v24;
v25 = 0i64;
}
while( v24 != (__int64 *)v23 );
if( !v25 || v25[14] != v45.QuadPart || v25[15] != v41 )
break;
v26 = (__int64 *)*v25;
if( *(__int64 **)(*v25 + 8) != v25
|| (v27 = (__int64 **)v25[1], *v27 != v25)
|| (*v27 = v26,
v26[1] = (__int64)v27,
v28 = (__int64 **)*((_QWORD *)&v42 + 1),
**((__int128 ***)&v42 + 1) != &v42) )
{
LABEL_68:
__fastfail(3u);
}
v25[1] = *((_QWORD *)&v42 + 1);
*v25 = (__int64)&v42;
*v28 = v25;
v29 = -1i64;
*((_QWORD *)&v42 + 1) = v25;
do
++v29;
while( v18[v29] );
v16 = v40;
v18 += v29 + 1;
if( !*v18 )
{
v20 = (__int128 **)v42;
goto LABEL_61;
}
}
v20 = (__int128 **)v42;
if( !*v18 )
{
LABEL_61:
if( *(_QWORD *)(v16 + 208) == v16 + 208 )
goto LABEL_63;
}
v4 |= 0x20u;
LABEL_63:
while( v20 != (__int128 **)&v42 )
{
if( v20[1] != &v42 )
goto LABEL_68;
v30 = *v20;
if( *((__int128 ***)*v20 + 1) != v20 )
goto LABEL_68;
*(_QWORD *)&v42 = *v20;
*((_QWORD *)v30 + 1) = &v42;
v31 = v40 + 208;
v32 = *(__int128 **)(v40 + 216);
if( *(_QWORD *)v32 != v40 + 208 )
goto LABEL_68;
*v20 = (__int128 *)v31;
v20[1] = v32;
*(_QWORD *)v32 = v20;
*(_QWORD *)(v31 + 8) = v20;
v20 = (__int128 **)v42;
v16 = v40;
}
v2 = v53;
goto LABEL_78;
}
}
else if( (_QWORD *)*v19 == v19 )
{
if( !PnpBootMode )
{
LABEL_89:
*(_DWORD *)v2 = v4;
goto LABEL_90;
}
v4 |= 0x40000u;
goto LABEL_78;
}
LABEL_76:
v4 |= 0x20u;
goto LABEL_78;
}
if( !PnpBootMode )
goto LABEL_76;
if( (PiDevCfgFlags & 2) == 0 )
goto LABEL_76;
v4 |= 0x40000u;
if( v16 )
{
v33 = PiDevCfgGetDriverPackageId(v17, &DriverPackageId);
v16 = v40;
if( v33 < 0 )
goto LABEL_76;
}
}
else if( v16 )
{
goto LABEL_76;
}
LABEL_78:
if( PnpBootMode && v16 && (v4 & 0x20) != 0 )
{
DeviceDriver = PiDevCfgQueryDriverConfiguration(v16);
if( DeviceDriver >= 0 )
{
v34 = v40;
v35 = v40 + 208;
v36 = *(_QWORD **)(v40 + 208);
while( v36 != (_QWORD *)v35 )
{
DeviceDriver = PiDevCfgQueryDriverConfiguration(v34);
if( DeviceDriver < 0 )
break;
v34 = v40;
v36 = (_QWORD *)*v36;
v35 = v40 + 208;
}
}
if( DeviceDriver == -1073740653 )
{
DeviceDriver = 0;
v4 = v4 & 0xFFFBFFDF | 0x40000;
}
else if( DeviceDriver < 0 )
{
goto LABEL_90;
}
}
goto LABEL_89;
}
}
LABEL_90:
RtlFreeAnsiString(&DestinationString);
RtlFreeAnsiString(&UnicodeString);
RtlFreeAnsiString(&v49);
RtlFreeAnsiString(&DriverPackageId);
RtlFreeAnsiString(&v50);
if( v40 )
PiDevCfgFreeDriverNode(v40);
return(unsigned int)DeviceDriver;
}Referenced by:
PiDevCfgInitDeviceCallback
PiDevCfgProcessDeviceCallback
PpDevCfgCheckDeviceNeedsUpdate