PopCompleteNotifyTransitionCommon
NTSTATUS __fastcall PopCompleteNotifyTransitionCommon(INT64 a1, INT64 *a2, INT64 a3, DEVICE_OBJECT *a4){
__int64 *v4;
INT64 v5;
__int64 v6;
char v8;
unsigned int v9;
INT64 v10;
_PO_DEVICE_NOTIFY_ORDER *v11;
INT64 v12;
__int64 v13;
INT64 **v14;
INT64 v15;
INT64 **v16;
INT64 v17;
INT64 *v18;
INT64 i;
UINT64 v20;
NTSTATUS result;
INT64 v22;
INT64 **v23;
INT64 *j;
INT64 *v25;
struct _KLOCK_QUEUE_HANDLE LockHandle;
int v28;
v28 = a3;
v4 = (__int64 *)*(a2 - 19);
v5 = a1;
memset(&LockHandle, 0, sizeof(LockHandle));
v6 = 0i64;
if( (PVOID)*(a2 - 18) != IopRootDeviceNode )
v6 = *(a2 - 18);
v8 = 0;
v9 = 0;
KeAcquireInStackQueuedSpinLock((UINT64 *)DevState + 1, &LockHandle);
v11 = (_PO_DEVICE_NOTIFY_ORDER *)(v5 + 48);
v12 = *a2;
v13 = 9i64 * *((unsigned __int8 *)a2 + 56);
v14 = (INT64 **)a2[1];
if( *(INT64 **)(*a2 + 8) != a2 || *v14 != a2 )
goto LABEL_47;
*v14 = (INT64 *)v12;
*(_QWORD *)(v12 + 8) = v14;
if( !*(_BYTE *)(v5 + 464) )
{
v15 = v5 + 104 + 8 * v13;
v16 = *(INT64 ***)(v15 + 8);
if( *v16 == (INT64 *)v15 )
{
*a2 = v15;
a2[1] = (INT64)v16;
*v16 = a2;
*(_QWORD *)(v15 + 8) = a2;
--v11->OrderLevel[(unsigned __int64)v13 / 9].ActiveCount;
if( v6
&& PopReadyParentSleep(
(_PO_DEVICE_NOTIFY *)(v6 + 160),
(_PO_DEVICE_NOTIFY_ORDER *)(v5 + 48),
*((_BYTE *)a2 + 56)) )
{
v9 = 1;
}
v17 = a2[4];
if( (INT64 *)v17 != a2 + 4 )
{
do
{
if( PopReadyParentSleep(*(_PO_DEVICE_NOTIFY **)(v17 + 40), v11, *((_BYTE *)a2 + 56)) )
++v9;
v17 = *(_QWORD *)v17;
}
while( (INT64 *)v17 != a2 + 4 );
v5 = a1;
}
while( v4 )
{
PopPrepChildWake((_PO_DEVICE_NOTIFY *)(v4 + 20), v11);
v4 = (__int64 *)*v4;
}
v18 = a2 + 2;
for( i = a2[2]; (INT64 *)i != v18; i = *v25 )
PopPrepChildWake(*(_PO_DEVICE_NOTIFY **)(i - 8), v11);
if( v28 >= 0 )
goto LABEL_15;
if( a4 && *(_BYTE *)v5 == 3 )
PopDiagTraceDriverVeto(a4, a2);
if( v28 >= 0 || *(_BYTE *)(v5 + 466) || v28 == -1073741637 && *(_BYTE *)(v5 + 467) || *(int *)(v5 + 448) < 0 )
{
LABEL_15:
v8 = 0;
}
else
{
*(_DWORD *)(v5 + 448) = v28;
v8 = 1;
*(_QWORD *)(v5 + 456) = a2[8];
}
goto LABEL_16;
}
LABEL_47:
__fastfail(3u);
}
v22 = v5 + 72 + 8 * v13;
v23 = *(INT64 ***)(v22 + 8);
if( *v23 != (INT64 *)v22 )
goto LABEL_47;
*a2 = v22;
a2[1] = (INT64)v23;
*v23 = a2;
*(_QWORD *)(v22 + 8) = a2;
++v11->OrderLevel[(unsigned __int64)v13 / 9].ActiveCount;
while( v4 )
{
LOBYTE(v10) = *((_BYTE *)a2 + 56);
if( (unsigned __int8)PopReadyChildWake((_PO_DEVICE_NOTIFY *)(v4 + 20), (_PO_DEVICE_NOTIFY_ORDER *)(v5 + 48), v10) )
++v9;
v4 = (__int64 *)*v4;
}
for( j = (INT64 *)a2[2]; j != a2 + 2; j = (INT64 *)*j )
{
LOBYTE(v10) = *((_BYTE *)a2 + 56);
if( (unsigned __int8)PopReadyChildWake((_PO_DEVICE_NOTIFY *)*(j - 1), (_PO_DEVICE_NOTIFY_ORDER *)(v5 + 48), v10) )
++v9;
}
LABEL_16:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
result = KiIrqlFlags;
__writecr8(LockHandle.OldIrql);
if( v8 )
return KeSetEvent(*(PRKEVENT *)(v5 + 24), 0);
if( v9 )
return KeReleaseSemaphoreEx(*(KSEMAPHORE **)(v5 + 32), 0i64, v9, v20);
return result;
}Referenced by:
PopCompleteDirectedPowerTransitionCallback
PopSystemIrpCompletion