MiSectionDelete
VOID __stdcall MiSectionDelete(VOID *Object){
unsigned int v2;
_CONTROL_AREA *v3;
__int64 v4;
__int64 v5;
union {unsigned int LongFlags;_MMSECTION_FLAGS Flags;} v6;
UINT64 v7;
_ETHREAD *CurrentThread;
v2 = *((_WORD *)Object + 29) & 1;
v3 = MiSectionControlArea((_SECTION *)Object);
if( *(_QWORD *)(v4 + 24) )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(&stru_140C4C6D0, 0i64);
RtlAvlRemoveNode((UINT64 *)&stru_140C4C6C8, (INT64 *)Object);
if( (_InterlockedExchangeAdd64(&stru_140C4C6D0._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&stru_140C4C6D0);
KeAbPostRelease(&stru_140C4C6D0);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
v5 = *((_QWORD *)Object + 5);
if( (v5 & 3) != 0 )
HalPutDmaAdapter((PADAPTER_OBJECT)(v5 & 0xFFFFFFFFFFFFFFFCui64));
v6.LongFlags = (unsigned int)v3->u;
if( (v6.LongFlags & 0x20) == 0 && (*((_DWORD *)Object + 14) & 0x8000000) != 0 && v3->FilePointer.Value )
{
_InterlockedAdd(&v3->u2.WritableUserReferences, 0xFFFFFFFF);
v6.LongFlags = (unsigned int)v3->u;
}
if( (v6.LongFlags & 0x4000000) != 0 )
{
v7 = (*((_DWORD *)Object + 15) >> 12) & 0x7FFFF;
if( (_DWORD)v7 == 0x7FFFF )
v7 = 0xFFFFFFFFi64;
MiDereferencePerSessionProtos(v3, v7);
}
MiDereferenceControlAreaBySection(v3, v2);
}Referenced by:
No references.