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.