MiAllocateVirtualMemoryPrepare

INT64 __fastcall MiAllocateVirtualMemoryPrepare(
        VOID *a1,
        INT64 a2,
        UINT64 a3,
        UINT64 a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        CHAR a8,
        INT64 a9,
        INT64 a10,
        INT64 a11,
        INT64 a12,
        INT64 a13){
  unsigned __int64 v13; 
  INT64 v14; 
  _QWORD *v16; 
  int v17; 
  INT64 v18; 
  INT64 v19; 
  int v20; 
  unsigned int v21; 
  LARGE_INTEGER *v22; 
  KENLISTMENT *v23; 
  int v24; 
  int v25; 
  INT64 v26; 
  __int64 v27; 
  unsigned __int64 v28; 
  int v29; 
  int v30; 
  _QWORD *v31; 
  unsigned __int64 v32; 
  __int64 v33; 
  unsigned __int64 v34; 
  __int64 v35; 
  INT64 v36; 
  unsigned __int64 v37; 
  __int64 v38; 
  unsigned __int64 v39; 
  unsigned __int64 v40; 
  int v41; 
  unsigned int v42; 
  char v43; 
  __int64 v44; 
  int v45; 
  _QWORD *v46; 
  INT64 result; 
  __int64 v48; 
  bool v49; 
  bool v50; 
  __int64 v51; 
  _QWORD *v52; 
  PVOID Object; 
  INT64 v54; 
  int v55; 
  UINT64 ZeroBits; 
  ZeroBits = a3;
  v13 = a2;
  v14 = a12;
  v54 = a2;
  Object = 0i64;
  v16 = (_QWORD *)*((_QWORD *)KeGetCurrentThread() + 23);
  v52 = v16;
  *(_QWORD *)(a12 + 96) = v16;
  if( a1 != (VOID *)-1i64 )
  {
    v25 = ObpReferenceObjectByHandleWithTag(
            (ULONG_PTR)a1,
            8,
            (__int64)PsProcessType,
            a8,
            0x6D566D4Du,
            (__int64)&Object,
            0i64,
            0i64);
    if( v25 < 0 )
      goto LABEL_88;
    v16 = Object;
    v52 = Object;
  }
  v17 = a5;
  v18 = (unsigned int)a5;
  v19 = (unsigned int)a9;
  *(_QWORD *)(v14 + 88) = v16;
  v20 = a6;
  v21 = a6 & 0xFFF807FF;
  *(_QWORD *)(v14 + 32) = a4;
  LODWORD(a6) = v21;
  v55 = v20 & 0x7F800;
  v25 = MiValidateAllocationType(v18, v19, v21);
  if( v25 >= 0 )
  {
    if( !v24 || (v25 = xHalUnmaskInterrupt(v23, v22), v25 >= 0) )
    {
      if( (v17 & 0x1000) != 0 && !v13 )
        v17 |= 0x2000u;
      v26 = a7;
      if( *(_QWORD *)(a7 + 24)
        && (v17 & 0x20400000) != 0x20000000
        && ((v17 & 0x20400000) != 541065216 || (*(_BYTE *)(a7 + 56) & 2) == 0) )
      {
        goto LABEL_73;
      }
      v27 = *(_QWORD *)(a7 + 56);
      if( (v27 & 0x20) != 0 )
        goto LABEL_73;
      v28 = 0x10000i64;
      v29 = v17 & 0x20400000;
      if( (v17 & 0x20400000) == 0x20000000 )
        v28 = 0x200000i64;
      v30 = v27 & 0x1A;
      LODWORD(a12) = v30;
      if( (v27 & 0x1A) != 0 )
      {
        if( ((v30 - 1) & v30) != 0 )
          goto LABEL_73;
        if( (v30 & 2) != 0 )
        {
          v49 = v29 == 541065216;
        }
        else
        {
          if( (v30 & 0x10) != 0 )
          {
            if( (KeFeatureBits & 0x2000000000i64) == 0 )
            {
              v25 = -1073741637;
              goto LABEL_88;
            }
            if( v29 == 0x400000 )
              goto LABEL_73;
            v28 = 0x40000000i64;
          }
          else if( (v30 & 8) != 0 )
          {
            v28 = 0x200000i64;
          }
          v49 = v29 == 0x20000000;
        }
        if( v49 )
          goto LABEL_14;
        if( v29 != 0x400000 )
          goto LABEL_73;
      }
      else
      {
        if( (v27 & 4) != 0 )
          goto LABEL_73;
        if( v29 != 0x400000 )
        {
LABEL_14:
          if( ((v17 & 0x2000) == 0 || v13) && (*(_QWORD *)a7 || *(_QWORD *)(a7 + 8) || *(_QWORD *)(a7 + 16)) )
            goto LABEL_73;
          if( ZeroBits )
          {
            v25 = MiValidateZeroBits(&ZeroBits);
            if( v25 < 0 )
              goto LABEL_88;
            v31 = v52;
            if( (v17 & 0x2000) != 0 && !v13 )
              *(_QWORD *)(v26 + 8) = MiGetUserReservationHighestAddress((INT64)v52, ZeroBits);
            v29 = v17 & 0x20400000;
            v30 = a12;
          }
          else
          {
            v31 = v52;
          }
          if( (v17 & 0x40000) != 0 )
          {
            *(_DWORD *)(v14 + 60) |= 0x8000000u;
          }
          else
          {
            if( (v17 & 0x4000) == 0 )
              goto LABEL_22;
            if( *(_QWORD *)v26 || *(_QWORD *)(v26 + 8) || *(_QWORD *)(v26 + 16) )
              goto LABEL_73;
            *(_DWORD *)(v14 + 60) |= 0x4000000u;
          }
          if( (v17 & 0x4000) != 0 )
          {
            if( !v30 && v29 != 0x20000000 )
              goto LABEL_23;
            goto LABEL_24;
          }
LABEL_22:
          if( (v17 & 0x2000) == 0 )
          {
LABEL_23:
            v28 = 4096i64;
            goto LABEL_24;
          }
          if( (v17 & 0x40000000) != 0 )
          {
            if( ((v29 - 0x20000000) & 0xFFBFFFFF) == 0 )
              goto LABEL_73;
            goto LABEL_23;
          }
LABEL_24:
          v32 = *(_QWORD *)(v26 + 16);
          if( v32 )
          {
            if( v32 < v28
              || ((v32 - 1) & v32) != 0
              || v32 >= 0x7FFFFFFF0000i64
              || (v17 & 0x40000000) != 0 && v32 != 4096 )
            {
              goto LABEL_73;
            }
          }
          else
          {
            *(_QWORD *)(v26 + 16) = v28;
          }
          if( !a4 || (v17 & 0x2000) != 0 && ((v29 - 0x20000000) & 0xFFBFFFFF) == 0 && ((v28 - 1) & a4) != 0 )
            goto LABEL_73;
          v33 = 0x7FFFFFFEFFFFi64;
          if( v13 > 0x7FFFFFFEFFFFi64 || 0x7FFFFFFF0000i64 - v13 < a4 )
            goto LABEL_73;
          v34 = v13 + a4;
          if( (v17 & 0x2000) == 0 )
          {
            if( v17 == 0x80000 || v17 == 0x1000000 )
            {
              v48 = ~(v28 - 1);
              v13 = v48 & (v28 + v13 - 1);
              v34 &= v48;
              if( v13 >= v34 )
              {
                v25 = -1073741800;
                goto LABEL_88;
              }
            }
            else
            {
              v35 = ~(v28 - 1);
              v13 &= v35;
              v34 = v35 & (v28 + v34 - 1);
            }
LABEL_34:
            v36 = v54;
            v37 = v34 - v13;
            if( v54 )
              *(_QWORD *)v26 = v13;
            else
              v13 = *(_QWORD *)v26;
            v38 = *(_QWORD *)(v26 + 16);
            v39 = v13;
            if( ((v38 - 1) & v13) == 0 )
            {
              v40 = *(_QWORD *)(v26 + 8);
              if( v40 )
              {
                if( v40 <= 0x7FFFFFFEFFFFi64 )
                {
                  v39 = v13;
                  if( (((_WORD)v40 + 1) & 0xFFF) == 0 )
                    goto LABEL_41;
                }
              }
              else
              {
                if( (v17 & 0x2000) != 0 && !v36 && (v17 & 0x4000) == 0 )
                {
                  if( (unsigned __int64)(v31[187] - 1i64) < 0x7FFFFFFEFFFFi64 )
                    v33 = v31[187] - 1i64;
                  v41 = a12;
                  v40 = v33;
                  *(_QWORD *)(v26 + 8) = v33;
                  if( v41 && (v41 & 2) == 0 )
                  {
                    if( (v41 & 8) != 0 )
                    {
                      v51 = -2097152i64;
LABEL_131:
                      v40 = (v33 & v51) - 1;
                      *(_QWORD *)(v26 + 8) = v40;
                      goto LABEL_42;
                    }
                    if( (v41 & 0x10) != 0 )
                    {
                      v51 = -1073741824i64;
                      goto LABEL_131;
                    }
                  }
LABEL_42:
                  if( v39 < v40 && v40 - v39 + 1 >= v37 && (v17 & 0x7F) == 0 )
                  {
                    v42 = *(_DWORD *)(v26 + 32);
                    if( v42 <= (unsigned __int16)KeNumberNodes )
                    {
                      v43 = *(_BYTE *)(v26 + 49);
                      if( v43 != 1 || v41 || (v17 & 0x20400000) == 0x20000000 )
                      {
                        *(_BYTE *)(v14 + 56) = v43;
                        *(_BYTE *)(v14 + 104) = a8;
                        *(_DWORD *)(v14 + 60) |= a9;
                        *(_DWORD *)(v14 + 76) = a10;
                        *(_QWORD *)(v14 + 80) = a11;
                        *(_QWORD *)(v14 + 112) = *(_QWORD *)(v26 + 40);
                        v44 = *(_QWORD *)(v26 + 56);
                        *(_QWORD *)(v14 + 8) = v40;
                        v45 = a6;
                        *(_QWORD *)(v14 + 120) = v44;
                        v46 = (_QWORD *)a13;
                        *(_DWORD *)(v14 + 44) = v45;
                        *(_DWORD *)(v14 + 48) = v55;
                        *v46 = Object;
                        result = 0i64;
                        *(_QWORD *)v14 = v39;
                        *(_QWORD *)(v14 + 16) = v38;
                        *(_QWORD *)(v14 + 24) = v37;
                        *(_DWORD *)(v14 + 40) = v17 & 0xFFFBBFFF;
                        *(_DWORD *)(v14 + 52) = v42;
                        return result;
                      }
                    }
                  }
                  goto LABEL_73;
                }
                if( v13 + v37 >= v13 )
                {
                  v40 = v13 + v37 - 1;
                  *(_QWORD *)(v26 + 8) = v40;
                  if( v40 <= 0x7FFFFFFEFFFFi64 )
                  {
LABEL_41:
                    v41 = a12;
                    goto LABEL_42;
                  }
                }
              }
            }
LABEL_73:
            v25 = -1073741811;
            goto LABEL_88;
          }
          if( (v17 & 0x40000000) != 0 )
          {
            v50 = (((unsigned __int16)v13 | (unsigned __int16)a4) & 0xFFF) == 0;
          }
          else
          {
            if( (v17 & 0x4000) == 0 )
            {
              v13 &= -(__int64)v28;
              if( ((v29 - 0x20000000) & 0xFFBFFFFF) != 0 )
                v34 = (v34 + 4095) & 0xFFFFFFFFFFFFF000ui64;
              else
                v34 = v13 + a4;
              goto LABEL_34;
            }
            v50 = ((a4 | v13) & (v28 - 1)) == 0;
          }
          if( !v50 )
            goto LABEL_73;
          goto LABEL_34;
        }
      }
      if( (v27 & 0xFFFFFFFFFFFFFFF0ui64) != 0 )
        goto LABEL_73;
      goto LABEL_14;
    }
  }
LABEL_88:
  if( Object )
    ObfDereferenceObjectWithTag(Object, 0x6D566D4Dui64);
  return(unsigned int)v25;
}

Referenced by:

MiAllocateVirtualMemoryCommon
MmAllocateVirtualMemory
NtAllocateVirtualMemory