MiChangingSubsectionProtos

NTSTATUS __stdcall MiChangingSubsectionProtos(ULONG_PTR BugCheckParameter2){
  char v1; 
  __int64 v2; 
  __int64 v3; 
  int v4; 
  NTSTATUS v5; 
  __int64 v6; 
  _SUBSECTION *v7; 
  INT64 *v8; 
  unsigned __int64 v9; 
  bool v10; 
  int v11; 
  _RTL_BALANCED_NODE *v12; 
  CHAR v13; 
  _BYTE *v14; 
  __int64 v16; 
  VOID *LockHandle; 
  char v18; 
  int v19; 

  v18 = v1;
  v3 = **(_QWORD **)&BugCheckParameter2;
  v4 = v1 & 0x10;
  v16 = **(_QWORD **)&BugCheckParameter2;
  v5 = 0;
  v19 = v4;
  v6 = v2;
  v7 = *(_SUBSECTION **)&BugCheckParameter2;
  v8 = (INT64 *)(**(_QWORD **)&BugCheckParameter2 + 72i64);
  while( 1 )
  {
    v9 = (unsigned __int8)ExAcquireSpinLockExclusive(v8);
    if( v4 )
    {
      MiUnlinkSubsectionWaitBlock(v7, (_MI_CONTROL_AREA_WAIT_BLOCK *)v6, 1ui64);
      v10 = *(_DWORD *)(v6 + 12) == 2;
      *(_DWORD *)(v6 + 8) = 0;
      if( v10 )
      {
        ExReleaseSpinLockExclusiveFromDpcLevel(v8);
        v5 = -1073740748;
        goto LABEL_33;
      }
    }
    v11 = v18 & 8;
    *(_DWORD *)(v6 + 8) = v11 != 0 ? 0x40 : 0;
    if( (v18 & 0x20) != 0 )
      *(_DWORD *)(v6 + 8) |= 0x100u;
    if( v4 )
      *(_DWORD *)(v6 + 8) |= 0x80u;
    if( v7->SubsectionBase && (v18 & 1) != 0 )
    {
      ExReleaseSpinLockExclusiveFromDpcLevel(v8);
      v5 = -1073741302;
      goto LABEL_33;
    }
    LockHandle = 0i64;
    v12 = 0i64;
    if( (v18 & 8) == 0 )
    {
      v12 = (*(_DWORD *)(v3 + 56) & 0x20) != 0 ? *(_RTL_BALANCED_NODE **)(v3 + 80) : v7->GlobalPerSessionHead.Root;
      if( v12 )
      {
        do
        {
          if( ((__int64)v12->Right & 0x40) == 0 )
            break;
          v12 = v12->Children[0];
        }
        while( v12 );
        if( v12 )
        {
          LockHandle = KeAbPreAcquire(v7, 0i64, 0i64);
          if( LockHandle )
            KeAbPreWait(LockHandle);
          v11 = v18 & 8;
        }
      }
    }
    *(_DWORD *)(v6 + 12) = 0;
    *(_WORD *)(v6 + 16) = 263;
    *(_BYTE *)(v6 + 18) = 6;
    *(_DWORD *)(v6 + 20) = 0;
    *(_QWORD *)(v6 + 32) = v6 + 24;
    *(_QWORD *)(v6 + 24) = v6 + 24;
    if( (*(_DWORD *)(v16 + 56) & 0x20) != 0 )
    {
      *(_QWORD *)v6 = *(_QWORD *)(v16 + 80);
      *(_QWORD *)(v16 + 80) = v6;
    }
    else
    {
      *(_QWORD *)v6 = v7->GlobalPerSessionHead.Root;
      v7->GlobalPerSessionHead.Root = (_RTL_BALANCED_NODE *)v6;
    }
    if( v11 )
      break;
    if( !v12 )
    {
      v14 = KeAbPreAcquire(v7, 0i64, 0i64);
      if( v14 )
        v14[26] |= 1u;
      break;
    }
    ExReleaseSpinLockExclusiveFromDpcLevel(v8);
    __writecr8(v9);
    KeWaitForGate((_KGATE *)(v6 + 16), WrVirtualMemory, v13);
    v3 = v16;
    v4 = v19;
    if( LockHandle )
    {
      KeAbPreAcquire(v7, LockHandle, 0i64);
      KeAbPostReleaseEx(v7, LockHandle);
    }
  }
  ExReleaseSpinLockExclusiveFromDpcLevel(v8);
LABEL_33:
  __writecr8(v9);
  return v5;
}

Referenced by:

MiAllocateFileExtents
MiPurgeFileOnlyPfn
MmPurgeSection