PipEnumerateCompleted
__int64 __fastcall PipEnumerateCompleted(__int64 a1){
_DEVICE_NODE *v2;
_DWORD *v3;
__int64 i;
LIST_ENTRY *Children;
LIST_ENTRY *v6;
_PNP_DEVNODE_STATE *v7;
__int64 v8;
char v9;
unsigned int v10;
__int64 v11;
__int64 v12;
__int64 v14;
LIST_ENTRY *j;
DEVICE_OBJECT *ChildPdo;
PVOID P;
P = 0i64;
v2 = *(_DEVICE_NODE **)(a1 + 8);
if( *(_QWORD *)(a1 + 528) )
{
while( v2 )
{
PipClearDevNodeFlags(v2, 0x10ui64);
v2 = *(_DEVICE_NODE **)v2;
}
}
else
{
while( v2 )
{
if( *(PDRIVER_OBJECT *)(*((_QWORD *)v2 + 4) + 8i64) == PiSwDeviceDriverObject )
PipClearDevNodeFlags(v2, 0x10ui64);
v2 = *(_DEVICE_NODE **)v2;
}
}
v3 = *(_DWORD **)(a1 + 528);
if( v3 )
{
for( i = 0i64; (unsigned int)i < *v3; i = (unsigned int)(i + 1) )
{
PipProcessEnumeratedChildDevice(a1, *(_QWORD *)(*(_QWORD *)(a1 + 528) + 8 * i + 8));
v3 = *(_DWORD **)(a1 + 528);
}
ExFreePoolWithTag(v3, 0);
*(_QWORD *)(a1 + 528) = 0i64;
}
PiSwLock();
Children = PiSwFindChildren((UNICODE_STRING *)(a1 + 40));
v6 = Children;
if( Children )
{
for( j = Children->Flink; j != v6; j = j->Flink )
{
ChildPdo = PiSwGetChildPdo(*(DEVICE_OBJECT **)(a1 + 32), j);
if( ChildPdo )
PipProcessEnumeratedChildDevice(a1, (ULONG_PTR)ChildPdo);
}
}
PiSwUnlock();
v8 = *(_QWORD *)(a1 + 8);
v9 = 0;
if( v8 )
{
do
{
v14 = *(_QWORD *)v8;
if( (*(_DWORD *)(v8 + 396) & 0x10010) == 0 )
{
PipSetDevNodeFlags(v8, 0x10000);
PnpRequestDeviceRemoval(v8, 1, 24, 0);
v9 = 1;
}
v8 = v14;
}
while( v14 );
}
PipSetDevNodeState((_DEVICE_NODE *)a1, DeviceNodeStarted, v7);
if( !v9 || (PVOID)a1 == IopRootDeviceNode )
v10 = 0;
else
v10 = -1073741106;
PiPnpRtlBeginOperation((__int64 **)&P);
PnpRaiseNtPlugPlayDevicePropertyChangeEvent(v11, *((_QWORD *)IopRootDeviceNode + 6), 15);
PnpRaiseNtPlugPlayDevicePropertyChangeEvent(v12, *((_QWORD *)IopRootDeviceNode + 6), 20);
if( P )
PiPnpRtlEndOperation(P);
return v10;
}Referenced by:
PipProcessDevNodeTree