PopPowerRequestCallbackWorker
VOID __stdcall PopPowerRequestCallbackWorker(VOID *Context){
_QWORD *v1;
__int64 v2;
int v3;
char *v4;
__int64 v5;
char v6;
_KLOCK_QUEUE_HANDLE LockHandle;
char PendingCallbacks[8];
memset(&LockHandle, 0, sizeof(LockHandle));
while( 1 )
{
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C23628 + 751, &LockHandle);
if( (_UNKNOWN *)*(&stru_140C23628 + 753) == (_UNKNOWN *)((char *)&stru_140C23628 + 6024) )
{
v2 = 0i64;
v3 = 0;
*(&stru_140C23628 + 6017) = 0;
}
else
{
v1 = *(_QWORD **)(*(&stru_140C23628 + 754) + 8i64);
if( (_UNKNOWN *)**(&stru_140C23628 + 754) != (_UNKNOWN *)((char *)&stru_140C23628 + 6024)
|| *v1 != *(&stru_140C23628 + 754) )
{
__fastfail(3u);
}
v2 = *(&stru_140C23628 + 754) - 56i64;
*(&stru_140C23628 + 754) = *(_QWORD *)(*(&stru_140C23628 + 754) + 8i64);
v3 = 0;
*v1 = (char *)&stru_140C23628 + 6024;
v4 = (char *)(v2 + 72);
v5 = 6i64;
do
{
v6 = *v4;
PendingCallbacks[(_QWORD)v4 - v2 - 72] = *v4;
if( v6 )
{
*v4 = 0;
++v3;
}
++v4;
--v5;
}
while( v5 );
*(_BYTE *)(v2 + 78) = 0;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( !v2 )
break;
if( v3 )
PopPowerRequestExecuteCallbacks(PendingCallbacks, *(unsigned int *)(v2 + 28), *(unsigned int *)(v2 + 16));
ObfDereferenceObjectWithTag((VOID *)v2, 0x72506F50ui64);
}
}Referenced by:
PoClearPowerRequestInternal
PoSetPowerRequestInternal