PnpProcessRebalance
INT64 __fastcall PnpProcessRebalance(LIST_ENTRY *ListHead){
_LIST_ENTRY *Flink;
_LIST_ENTRY *Blink;
CHAR v4;
_ETHREAD *CurrentThread;
int v6;
UINT64 v7;
INT64 v9;
v9 = 0i64;
Flink = ListHead[1].Flink;
if( Flink )
Blink = Flink[19].Blink[2].Blink;
else
Blink = (_LIST_ENTRY *)IopRootDeviceNode;
v4 = (CHAR)ListHead[2].Flink;
if( (unsigned int)(HIDWORD(Blink[18].Blink) - 787) <= 1 )
{
ObfDereferenceObjectWithTag(Flink, 0x746C6644ui64);
return 3221225558i64;
}
else
{
if( !BYTE4(ListHead[1].Blink) && v4 && PiCollapseRebalanceRequests(ListHead) )
Blink = (_LIST_ENTRY *)IopRootDeviceNode;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
KeWaitForSingleObject(&PpRegistrySemaphore, DelayExecution, 0, 0, 0i64);
v6 = PnpRebalance((UINT64)Blink, 0i64, 0i64, v4);
KeReleaseSemaphoreEx(&PpRegistrySemaphore, 0i64, 1i64, v7);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( v6 >= 0 )
{
LODWORD(v9) = 3;
BYTE4(v9) = PnPBootDriversInitialized;
ObfReferenceObjectWithTag(*((PVOID *)IopRootDeviceNode + 4), 0x746C6644u);
return(unsigned int)PipProcessDevNodeTree((INT64)IopRootDeviceNode, (INT64)ListHead, (INT64)&v9, 0i64, 0, 1u, 0);
}
return(unsigned int)v6;
}
}Referenced by:
PnpDeviceActionWorker