ObpProcessRemoveObjectQueue
_FIRMWARE_TYPE __fastcall ObpProcessRemoveObjectQueue(){
_ADAPTER_OBJECT *NextSession;
_ADAPTER_OBJECT *v1;
int v2;
__int128 **v3;
int v4;
unsigned int v5;
__int64 v6;
unsigned int v7;
int v8;
int *v9;
int v10;
__int64 v11;
_OBJECT_HEADER *v12;
_HANDLE_REVOCATION_INFO *v13;
_OBJECT_HEADER *HandleCount;
signed __int64 v15;
unsigned __int64 v16;
unsigned int v17;
unsigned __int64 v18;
signed __int32 v20[10];
__int128 *v21;
__int128 *v22;
_KAPC_STATE ApcState;
if( !qword_140C13150 )
{
v16 = __rdtsc();
v17 = 41929663 * ((((unsigned __int64)HIDWORD(v16) << 32) | (unsigned int)v16) >> 4);
qword_140C13150 = v17;
if( !v17 )
qword_140C13150 = 1i64;
v18 = __rdtsc();
qword_140C13158 = (41929663 * (unsigned int)((((unsigned __int64)HIDWORD(v18) << 32) | (unsigned int)v18) >> 4)) ^ 0xC24i64;
qword_140C13160 = KiQueryUnbiasedInterruptTime(1u) + 41929663 * (__rdtsc() >> 4) % 0x12A05F2000i64 + 288000000000i64;
}
if( KiQueryUnbiasedInterruptTime(1u) >= qword_140C13160 )
{
v21 = &xmmword_140CFBC20;
v22 = &xmmword_140CFBA60;
NextSession = (_ADAPTER_OBJECT *)MmGetNextSession(0i64);
v1 = NextSession;
if( NextSession )
{
if( MmAttachSession(NextSession, &ApcState) >= 0 )
{
if( !qword_140C13168 )
qword_140C13168 = *(&SbiVmbusArrivalEvent + 731);
if( (_DWORD)xmmword_140CFBA70 && (_BYTE)KdDebuggerNotPresent )
{
v2 = 0;
v3 = &v22;
v4 = 2;
do
{
v5 = 0;
v6 = *(_QWORD *)*v3;
v7 = *((_DWORD *)*v3 + 4);
v8 = v2 + v6 + (unsigned int)*v3;
if( v7 )
{
v9 = *(int **)*v3;
do
{
v10 = *v9;
++v5;
v11 = *v9++;
v8 = v5 * ((v10 + *(_DWORD *)((v11 >> 4) + v6)) ^ v8);
}
while( v5 < v7 );
}
--v3;
v2 += 2 * v8;
--v4;
}
while( v4 );
if( v2 != qword_140C13168 && !qword_140C13120 )
{
v20[8] = -2071986176;
qword_140C13120 = (unsigned int)__ROL4__(-2071986176, 233);
xmmword_140C13128 = 0i64;
qword_140C13138 = 266i64;
qword_140C13140 = v6;
}
}
MmDetachSession(v1, &ApcState);
}
MmQuitNextSession(v1);
}
if( qword_140C13120 )
{
if( (VOID(__stdcall *)(_KDPC *, PVOID, PVOID, PVOID))`ObpTraceDeferredDeletionWorker'::`2'::ObjectEventList.DeferredRoutine != KiScanQueues )
KeInitializeDpc(
&`ObpTraceDeferredDeletionWorker'::`2'::ObjectEventList,
KiScanQueues,
&`ObpTraceDeferredDeletionWorker'::`2'::ObjectEventList);
qword_140C13148 = 3878784i64;
KeInsertQueueDpc((UINT64)&`ObpTraceDeferredDeletionWorker'::`2'::ObjectEventList, 0i64, 0i64);
}
qword_140C13160 = KiQueryUnbiasedInterruptTime(1u) + 41929663 * (__rdtsc() >> 4) % 0x12A05F2000i64 + 288000000000i64;
}
while( 1 )
{
v12 = (_OBJECT_HEADER *)_InterlockedExchange64(&qword_140C25870, 1i64);
do
{
v13 = OBJECT_HEADER_TO_HANDLE_REVOCATION_INFO(v12);
if( v13 )
ObpHandleRevocationBlockRemoveObject(v13);
if( ObpTraceFlags )
ObpDeregisterObject(v12);
HandleCount = (_OBJECT_HEADER *)v12->HandleCount;
ObpRemoveObjectRoutine(v12, 1u);
v12 = HandleCount;
}
while( HandleCount && HandleCount != (_OBJECT_HEADER *)1 );
if( qword_140C25870 == 1i64 )
{
v15 = _InterlockedCompareExchange64(&qword_140C25870, 0i64, 1i64);
if( v15 == 1 )
break;
}
}
_InterlockedOr(v20, 0);
if( stru_140C25868._bf_0 )
LODWORD(v15) = ExfUnblockPushLock(&stru_140C25868._bf_0, 0i64);
return(int)v15;
}Referenced by:
No references.