PpDevCfgInit
NTSTATUS __stdcall PpDevCfgInit(){
CHAR v0;
WCHAR *v1;
int ObjectProperties;
int v3;
CHAR v4;
HPNPCTX *v5;
NTSTATUS SyncNodesUpdated;
PI_DM_OBJECT *v8;
VOID *CreateEnum;
UINT64 MatchingChangeStamp;
UINT8 *MatchingChangeStampa;
VOID *MatchingChangeStampb;
VOID *CheckStamp;
WCHAR *v14;
_DEVPROPKEY *PropertyKey;
CHAR v16[4];
int v17;
int v18;
UINT64 RegType;
int Data;
_HANDLE Handle[2];
VOID *ServiceHandle;
_UNICODE_STRING ServiceKeyName;
UINT64 PropertyCount[16];
v17 = 0;
v18 = 0;
v0 = 0;
v16[0] = 0;
v16[1] = 0;
*(_DWORD *)(&ServiceKeyName.MaximumLength + 1) = 0;
ServiceHandle = 0i64;
*(_QWORD *)Handle = 0i64;
Data = 0;
LODWORD(RegType) = 0;
memset(PropertyCount, 0i64, 0x78u);
LODWORD(MatchingChangeStamp) = 3;
PropertyCount[0] = (UINT64)DEVPKEY_DriverDatabase_ConfigMode;
LODWORD(PropertyCount[1]) = 7;
PropertyCount[2] = (UINT64)&v17;
LODWORD(PropertyCount[3]) = 4;
PropertyCount[5] = (UINT64)DEVPKEY_DriverDatabase_ConfigOptions;
LODWORD(PropertyCount[6]) = 7;
PropertyCount[7] = (UINT64)&v18;
PropertyCount[10] = (UINT64)&DEVPKEY_DriverDatabase_Updated;
PropertyCount[12] = (UINT64)v16;
LODWORD(PropertyCount[8]) = 4;
LODWORD(PropertyCount[11]) = 17;
LODWORD(PropertyCount[13]) = 1;
ObjectProperties = PiDevCfgQueryObjectProperties(
v1,
(PNP_OBJECT_TYPE)L"SYSTEM",
(VOID *)7,
0i64,
(UINT64)PropertyCount,
MatchingChangeStamp);
if( ObjectProperties >= 0 )
{
if( SLODWORD(PropertyCount[4]) >= 0 )
v17 = (v17 & 3) != 0 ? v17 : 0;
else
v17 = 3;
v3 = v18;
*(_DWORD *)&ServiceKeyName.Length = 1835034;
if( SLODWORD(PropertyCount[9]) < 0 )
v3 = 0;
v18 = v3;
v4 = v16[0];
if( SLODWORD(PropertyCount[14]) < 0 )
v4 = 0;
v16[0] = v4;
ServiceKeyName.Buffer = L"DeviceInstall";
if( PipOpenServiceEnumKeys(&ServiceKeyName, 0x20019ui64, &ServiceHandle, 0i64, 0) >= 0 )
{
LODWORD(CreateEnum) = 131097;
if( PnpCtxRegOpenKey(
*(&stru_140CF2E80 + 607),
ServiceHandle,
(WCHAR *)L"Parameters",
0i64,
(UINT64)CreateEnum,
(VOID **)Handle) >= 0 )
{
HIDWORD(RegType) = 4;
if( PnpCtxRegQueryValue(
v5,
*(VOID **)Handle,
(WCHAR *)L"DriverUpdatesPending",
&RegType,
&Data,
(UINT64 *)((char *)&RegType + 4)) >= 0
&& RegType == 0x400000004i64
&& Data )
{
LODWORD(CheckStamp) = 0;
LODWORD(MatchingChangeStampa) = 0;
ZwUpdateWnfStateData(
&WNF_PNPC_DEVICE_INSTALL_REQUESTED,
0i64,
0i64,
0i64,
0i64,
(UINT64)MatchingChangeStampa,
(UINT64)CheckStamp);
}
ZwClose(Handle[0]);
}
ZwClose((_HANDLE)ServiceHandle);
PiDevCfgFlags |= 2u;
}
PiDevCfgMode = v17;
PiDevCfgOptions = v18;
if( v17 )
{
if( (PiDevCfgFlags & 2) == 0 || (v18 & 0x20) != 0 )
{
SyncNodesUpdated = PiDrvDbQuerySyncNodesUpdated(0, &v16[1]);
v0 = v16[1];
if( SyncNodesUpdated >= 0 )
{
if( v16[1] )
PiDevCfgFlags |= 1u;
}
}
if( v16[0] == -1 )
PiDevCfgFlags |= 1u;
}
if( (PiDevCfgFlags & 1) != 0 )
{
if( !RtlIsStateSeparationEnabled() || (ObjectProperties = PiDrvDbEnumNodes(), ObjectProperties >= 0) )
{
ObjectProperties = PiDmEnumObjectsWithCallback(
1,
(INT64)PiDevCfgInitDeviceCallback,
0i64,
v8,
CreateEnum,
MatchingChangeStampa,
CheckStamp);
if( ObjectProperties >= 0 )
{
if( v16[0] == -1 )
{
LODWORD(PropertyKey) = 0;
LODWORD(v14) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
0i64,
(const PNP_OBJECT_TYPE)L"SYSTEM",
(WCHAR *)7,
0i64,
MatchingChangeStampb,
(UINT64)&DEVPKEY_DriverDatabase_Updated,
v14,
0i64,
PropertyKey);
}
if( v0 )
PiDrvDbQuerySyncNodesUpdated(1, 0i64);
}
}
}
}
return ObjectProperties;
}Referenced by:
IopInitializePlugPlayServices