MmManagePartitionNodeInformation

NTSTATUS __stdcall MmManagePartitionNodeInformation(INT64 a1, UINT64 *a2, CHAR a3){
  void *v5; 
  NTSTATUS v6; 
  __int64 v7; 
  __int64 v8; 
  VOID *Pool; 
  __int64 *v10; 
  _EX_PUSH_LOCK *v11; 
  __int64 *v12; 
  unsigned int v13; 
  _EX_PUSH_LOCK *v14; 
  _ETHREAD *CurrentThread; 
  __int64 v17; 
  void *v19; 

  v5 = 0i64;
  v19 = 0i64;
  if( *((_DWORD *)a2 + 1) || (v7 = *(unsigned int *)a2, (_DWORD)v7 != (unsigned __int16)KeNumberNodes) )
  {
    v6 = -1073741811;
    goto LABEL_20;
  }
  v8 = 72 * v7;
  v17 = 72 * v7;
  if( a3 )
  {
    Pool = MiAllocatePool(64i64, 72 * v7, 0x694E694Dui64);
    v5 = Pool;
    v19 = Pool;
    if( !Pool )
    {
      v6 = -1073741670;
      goto LABEL_20;
    }
    v10 = (__int64 *)Pool;
    LODWORD(v7) = *(_DWORD *)a2;
  }
  else
  {
    v10 = (__int64 *)a2[1];
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v11 = *(_EX_PUSH_LOCK **)(*(_QWORD *)a1 + 16i64);
  if( (_DWORD)v7 )
  {
    v12 = v10 + 7;
    v13 = 0;
    do
    {
      memset(v12 - 7, 0i64, 0x48u);
      --CurrentThread->Tcb.SpecialApcDisable;
      ExAcquirePushLockSharedEx(v11 + 537, 0i64);
      *(v12 - 7) = v11[522]._bf_0;
      *(v12 - 5) = v11[516]._bf_0;
      *(v12 - 6) = v11[517]._bf_0;
      *(v12 - 3) = v11[268]._bf_0;
      *(v12 - 4) = v11[269]._bf_0;
      *(v12 - 1) = v11[134]._bf_0;
      *(v12 - 2) = v11[135]._bf_0;
      v12[1] = v11->_bf_0;
      *v12 = v11[1]._bf_0;
      v14 = v11 + 537;
      if( _InterlockedCompareExchange64(&v11[537]._bf_0, 0i64, 17i64) != 17 )
      {
        ExfReleasePushLockShared(v14);
        v14 = v11 + 537;
      }
      KeAbPostRelease(v14);
      KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
      if( *(v12 - 5)
         + ((*v12 + v12[1]) << 18)
         + *(v12 - 6)
         + 16 * (*(v12 - 3) + *(v12 - 4) + 32 * (*(v12 - 1) + *(v12 - 2))) <= (unsigned __int64)*(v12 - 7) )
      {
        ++v13;
        v11 += 568;
        v12 += 9;
      }
    }
    while( v13 < *(_DWORD *)a2 );
    v5 = v19;
    v8 = v17;
  }
  if( a3 )
  {
    ProbeForWrite(a2[1], v8, 8i64);
    memmove((VOID *)a2[1], v10, v8);
  }
  v6 = 0;
LABEL_20:
  if( v5 )
    ExFreePoolWithTag(v5, 0);
  return v6;
}

Referenced by:

NtManagePartition