PiDevCfgProcessDevice
__int64 __fastcall PiDevCfgProcessDevice(__int64 a1, __int64 a2, char a3){
_UNICODE_STRING *v5;
int v6;
bool v7;
int v8;
int inited;
char v10;
int v11;
bool v12;
int v13;
int v14;
unsigned int v15;
const wchar_t *v16;
INT64 v17;
int v18;
int v19;
WCHAR *v20;
__int64 v21;
INT64 v22;
INT64 v24;
const wchar_t *v25;
char v26;
int v27;
char v28;
unsigned __int64 v29;
__int64 v30;
__int64 v31;
__int64 v32;
int v33;
__int64 a5;
UINT64 a6;
INT64 a6a;
INT64 a6b;
INT64 a6c;
INT64 a8;
INT64 a8a;
INT64 a8b;
INT64 a10;
INT64 a10a;
INT64 a11;
INT64 a11a;
ULONG a7;
int v47;
int v48;
int v49;
INT64 v50;
INT64 v51;
__int64 v52;
struct _UNICODE_STRING UnicodeString;
WCHAR a9[4];
struct _UNICODE_STRING DestinationString;
INT64 result[10];
INT64 v57;
int v58;
struct _UNICODE_STRING *p_UnicodeString;
int v60;
int v61;
const INT64 *v62;
int v63;
struct _UNICODE_STRING *p_DestinationString;
int v65;
int v66;
char v67;
INT64 v69;
v5 = 0i64;
memset((INT64)result, 0i64);
*(_QWORD *)&UnicodeString.Length = 0i64;
v6 = 0;
v48 = 1;
v7 = 0;
UnicodeString.Buffer = 0i64;
v8 = 0;
*(_QWORD *)&DestinationString.Length = 0i64;
DestinationString.Buffer = 0i64;
v51 = 0i64;
LODWORD(v69) = 0;
LODWORD(v50) = 0;
v67 = 0;
v47 = 0;
v52 = 0i64;
a7 = 0;
*(_QWORD *)a9 = 0i64;
LOBYTE(v49) = 0;
if( !*(_QWORD *)(a1 + 48) )
{
inited = -1073741808;
goto LABEL_51;
}
v5 = (_UNICODE_STRING *)(a1 + 40);
PnpDiagnosticTraceObject(&KMPnPEvt_DeviceConfig_Start, (_UNICODE_STRING *)(a1 + 40));
inited = PiDevCfgInitDeviceContext(*(const wchar_t **)(a1 + 48), a2, result);
if( inited >= 0 )
{
v10 = result[0];
if( (a3 & 1) != 0 )
{
v10 = LOBYTE(result[0]) | 1;
LODWORD(result[0]) |= 1u;
}
if( !a2 )
a2 = result[2];
if( (v10 & 1) != 0 || PnpBootMode )
goto LABEL_8;
memset((INT64)&v57, 0i64);
LODWORD(a6) = 2;
v58 = 8210;
v63 = 8210;
v24 = *(_QWORD *)(a1 + 48);
v57 = (INT64)&DEVPKEY_Device_PendingConfigurationIds;
v60 = 6;
p_UnicodeString = &UnicodeString;
v62 = &DEVPKEY_Device_RequestConfigurationIds;
p_DestinationString = &DestinationString;
v65 = 6;
inited = PiDevCfgQueryObjectProperties(6i64, v24, 1ui64, a2, (INT64)&v57, a6);
if( inited >= 0 )
{
if( v61 < 0 )
RtlInitUnicodeString(&UnicodeString, 0i64, 0);
if( v66 < 0 )
RtlInitUnicodeString(&DestinationString, 0i64, 0);
if( UnicodeString.Buffer && !*UnicodeString.Buffer )
{
v8 = -1073740656;
v7 = 1;
goto LABEL_15;
}
LABEL_8:
inited = PiDevCfgFindDeviceDriver((INT64)result, UnicodeString.Buffer, &v51);
if( inited >= 0 )
{
if( DestinationString.Buffer )
{
inited = PiDevCfgRequestDriverConfigurations((__int64)result, v51);
}
else
{
v11 = PiDevCfgConfigureDevice(a1, (__int64)result, v51, (int *)&v69, &v50);
inited = v11;
if( v11 >= 0 )
{
v6 = v69;
v67 = 1;
}
v12 = ((v11 + 1073740653) & 0xFFFFFFFD) == 0;
v13 = (unsigned __int8)v49;
if( !v12 )
v13 = 1;
v49 = v13;
}
}
LABEL_15:
if( UnicodeString.Buffer && (v51 || v7) )
{
LODWORD(a11) = 0;
LODWORD(a10) = 0;
LODWORD(a8) = 0;
PiDevCfgSetObjectProperty(
PiPnpRtlCtx,
result,
*(WCHAR **)(a1 + 48),
1ui64,
a2,
a6,
(INT64)&DEVPKEY_Device_PendingConfigurationIds,
a8,
0i64,
a10,
a11);
}
if( DestinationString.Buffer )
goto LABEL_45;
if( !UnicodeString.Buffer )
{
if( v7 )
goto LABEL_91;
if( v51 )
{
if( *(int *)(v51 + 412) >= 0 )
{
LABEL_21:
if( v67 )
{
if( PnpBootMode || (a3 & 2) != 0 )
v6 |= 0x40000u;
v14 = *(_DWORD *)(a1 + 704);
if( (v6 & 0x40) != 0 )
v15 = v14 & 0xFFFFFFFE;
else
v15 = v14 | 1;
*(_DWORD *)(a1 + 704) = v15;
}
v16 = *(const wchar_t **)(a1 + 48);
a7 = 4;
if( (int)CmGetDeviceRegProp(PiPnpRtlCtx, v16, a2, 11, (__int64)&v48, (__int64)&v69, (__int64)&a7, 0) < 0
|| v48 != 4
|| a7 != 4 )
{
LODWORD(v69) = 0;
}
v18 = *(_DWORD *)(a1 + 396) & 0x2000;
if( inited < 0 )
{
if( v18 )
{
v33 = *(_DWORD *)(a1 + 404);
if( v33 == 1 || v33 == 18 )
PipSetDevNodeProblem(a1, v33, inited);
}
}
else
{
LODWORD(v69) = v69 & 0xFFF7FB9F;
v6 &= ~0x20u;
if( v18 )
{
v17 = 1i64;
if( *(_DWORD *)(a1 + 404) == 1
|| (v29 = *(unsigned int *)(a1 + 404), (unsigned int)v29 <= 0x38)
&& (v30 = 0x100000010040000i64, _bittest64(&v30, v29)) )
{
PipClearDevNodeProblem(a1, (const WCHAR *)1, 0i64);
}
}
if( ((*(_DWORD *)(a1 + 300) - 770) & 0xFFFFFFEF) == 0 )
{
v19 = *(_DWORD *)(a1 + 396);
if( (v19 & 0x6000) != 0 )
{
if( (v19 & 0x2000) != 0 && *(_DWORD *)(a1 + 404) == 14 && (v50 & 0x70) == 0 )
{
PipClearDevNodeProblem(a1, (const WCHAR *)v17, 0i64);
PipClearDevNodeUserFlags(a1, 4);
}
}
else if( (v50 & 0x70) == 0 || PnpBootMode )
{
if( (v6 & 0x40) != 0 )
PipSetDevNodeProblem(a1, 28, v8);
}
else
{
v31 = 0i64;
if( (v50 & 0x10) != 0 )
{
v31 = 128i64;
v32 = 128i64;
v52 = 128i64;
}
else
{
v32 = v52;
}
if( (v50 & 0x20) != 0 )
{
v32 = v31 | 0x10;
v52 = v31 | 0x10;
v31 |= 0x10ui64;
}
if( (v50 & 0x40) != 0 )
{
v32 = v31 | 0x200;
v52 = v31 | 0x200;
}
PnpUpdateRebootRequiredReason(*(_QWORD *)(a1 + 48), v17, v32);
PipSetDevNodeProblem(a1, 14, -1073741102);
PipSetDevNodeUserFlags(a1, 4);
}
}
if( v47 && (v6 & 0x40) != 0 )
{
LODWORD(a11) = 0;
LODWORD(a10) = 4;
LODWORD(a8a) = 23;
PiDevCfgSetObjectProperty(
PiPnpRtlCtx,
result,
*(WCHAR **)(a1 + 48),
1ui64,
a2,
a6a,
(INT64)&DEVPKEY_Device_InstallError,
a8a,
(WCHAR *)&v47,
a10,
a11);
}
else if( (result[0] & 1) == 0 )
{
LODWORD(a11) = 0;
LODWORD(a10) = 0;
LODWORD(a8a) = 0;
PiDevCfgSetObjectProperty(
PiPnpRtlCtx,
result,
*(WCHAR **)(a1 + 48),
1ui64,
a2,
a6a,
(INT64)&DEVPKEY_Device_InstallError,
a8a,
0i64,
a10,
a11);
}
}
if( v67 || v6 )
{
LODWORD(v69) = v6 | v69;
PiDevCfgSetDeviceRegProp(4i64, (__int64)result, 11, 4, (__int64)&v69, 4);
if( v67 )
{
LODWORD(a11) = 0;
LODWORD(a10) = 8;
v20 = *(WCHAR **)(a1 + 48);
*(_QWORD *)a9 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
LODWORD(a8a) = 16;
PiDevCfgSetObjectProperty(
PiPnpRtlCtx,
result,
v20,
1ui64,
a2,
a6b,
(INT64)&DEVPKEY_Device_InstallDate,
a8a,
a9,
a10,
a11);
if( (unsigned int)PnpGetObjectProperty(
PiPnpRtlCtx,
*(_QWORD *)(a1 + 48),
1i64,
a2,
0i64,
(__int64)DEVPKEY_Device_FirstInstallDate,
&v48,
0i64,
0,
&a7,
0) != -1073741789
|| a7 != 8 )
{
LODWORD(a11a) = 0;
LODWORD(a10a) = 8;
LODWORD(a8b) = 16;
PiDevCfgSetObjectProperty(
PiPnpRtlCtx,
result,
*(WCHAR **)(a1 + 48),
1ui64,
a2,
a6c,
(INT64)DEVPKEY_Device_FirstInstallDate,
a8b,
a9,
a10a,
a11a);
}
}
}
LABEL_45:
if( (_BYTE)v49 )
{
v21 = *(_QWORD *)(a1 + 48);
a7 = 8;
if( (int)PnpGetObjectProperty(
PiPnpRtlCtx,
v21,
1i64,
a2,
0i64,
(__int64)DEVPKEY_Device_RebootRequiredReason,
&v48,
(unsigned __int64)&v52,
8,
&a7,
0) >= 0
&& v48 == 9
&& a7 == 8 )
{
v22 = v52;
}
else
{
v22 = 0i64;
v52 = 0i64;
}
LODWORD(a5) = inited;
PiDevCfgLogDeviceConfigured(a1, (INT64)result, v51, (unsigned int)v50, a5, v22, (INT64)a9);
}
goto LABEL_49;
}
v7 = 1;
v8 = *(_DWORD *)(v51 + 412);
}
else
{
if( inited != -1073740656 || (PiDevCfgMode & 2) == 0 )
goto LABEL_21;
if( !PnpBootMode || (*(_DWORD *)(a1 + 560) & 0x100) != 0 )
{
if( CmIsRootEnumeratedDevice(*(PCWSTR *)(a1 + 48)) )
{
v25 = *(const wchar_t **)(a1 + 48);
a7 = 4;
if( (int)CmGetDeviceRegProp(PiPnpRtlCtx, v25, a2, 11, (__int64)&v48, (__int64)&v69, (__int64)&a7, 0) >= 0
&& v48 == 4
&& a7 == 4 )
{
v26 = v69;
}
else
{
v26 = 0;
LODWORD(v69) = 0;
}
v7 = (v26 & 0x20) != 0;
}
else
{
v7 = 1;
}
}
else
{
v6 = 32;
}
if( CmIsRootEnumeratedDevice(*(PCWSTR *)(a1 + 48)) )
{
if( (int)PiDevCfgMigrateRootDevice(a1, (__int64)result, &v69) >= 0 )
{
v6 |= v69;
if( (v69 & 1) != 0 )
{
v7 = 0;
v6 &= ~0x20u;
}
}
}
v8 = -1073740656;
}
}
if( !v7 )
goto LABEL_21;
LABEL_91:
v27 = PiDevCfgConfigureDevice(a1, (__int64)result, 0i64, (int *)&v69, &v50);
inited = v27;
if( v27 >= 0 )
{
v6 = v69;
v67 = 1;
switch( v8 )
{
case -1073740656:
v47 = -536870360;
break;
case -1073740655:
v47 = -536870320;
break;
case -1073740654:
v47 = -536870319;
break;
case -1073740653:
v47 = -536870318;
break;
case -1073740652:
v47 = -536870375;
break;
}
}
v12 = ((v27 + 1073740653) & 0xFFFFFFFD) == 0;
v28 = v49;
if( !v12 )
v28 = 1;
LOBYTE(v49) = v28;
goto LABEL_21;
}
}
LABEL_49:
if( v51 )
PiDevCfgFreeDriverNode(v51);
LABEL_51:
RtlFreeAnsiString(&UnicodeString);
RtlFreeAnsiString(&DestinationString);
PiDevCfgFreeDeviceContext((INT64)result);
if( v5 )
PnpDiagnosticTraceObjectWithStatus(&KMPnPEvt_DeviceConfig_Stop, v5, (unsigned int)inited);
return(unsigned int)inited;
}Referenced by:
PpDevCfgProcessDevice