MiCaptureAllocateMapExtendedParameters

INT64 __stdcall MiCaptureAllocateMapExtendedParameters(volatile VOID *Address, ULONGLONG ullMultiplicand, VOID *a3){
  int v3; 
  int v4; 
  char v5; 
  UINT64 v6; 
  NTSTATUS v8; 
  UINT64 v10; 
  int v11; 
  char *v12; 
  int v13; 
  int v14; 
  int v15; 
  unsigned __int64 v16; 
  int v17; 
  int v18; 
  int v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  unsigned __int64 v23; 
  ULONGLONG pullResult; 
  __int64 v25; 
  volatile VOID *v26; 
  char *v27; 
  unsigned __int64 v28; 
  INT64 result; 
  v4 = v3;
  v5 = (char)a3;
  v6 = (unsigned int)ullMultiplicand;
  pullResult = 0i64;
  memset(result, 0i64);
  if( (_DWORD)v6 )
  {
    if( Address )
    {
      v10 = v6;
      v8 = RtlULongLongMult(v6, 0x10ui64, &pullResult);
      if( v8 >= 0 )
      {
        v11 = 0;
        if( v5 )
          ProbeForWrite((VOID *)Address, pullResult, 8ui64);
        v26 = Address;
        v12 = (char *)Address + 16 * v10;
        v27 = v12;
        while( Address < v12 )
        {
          v13 = (unsigned __int8)*(_DWORD *)Address;
          if( (unsigned int)(v13 - 1) > 4 || *(_QWORD *)Address >= 0x100ui64 )
            return(unsigned int)-1073741811;
          v14 = 1 << v13;
          if( ((1 << v13) & v4) == 0 )
            return(unsigned int)-1073741811;
          if( (v14 & v11) != 0 )
            return(unsigned int)-1073741811;
          v11 |= v14;
          v15 = v13 - 1;
          if( v15 )
          {
            v17 = v15 - 1;
            if( v17 )
            {
              v18 = v17 - 1;
              if( v18 )
              {
                v19 = v18 - 1;
                if( v19 )
                {
                  if( v19 != 1 )
                    return(unsigned int)-1073741811;
                  v20 = *((_QWORD *)Address + 1);
                  *(_QWORD *)(result + 56) = v20;
                  if( (v20 & 0xFFFFFFFFFFFFFFC0ui64) != 0 )
                    return(unsigned int)-1073741811;
                }
                else
                {
                  *(_QWORD *)(result + 40) = *((_QWORD *)Address + 1);
                  *(_BYTE *)(result + 48) = 1;
                }
              }
              else
              {
                v21 = *((_QWORD *)Address + 1);
                *(_QWORD *)(result + 24) = v21;
                if( !v21 )
                  return(unsigned int)-1073741811;
              }
            }
            else
            {
              v25 = 0i64;
              v22 = *((_QWORD *)Address + 1);
              v25 = v22;
              if( (unsigned __int64)v22 > 0xFFFFFFFF )
              {
                v23 = v22;
                if( v22 < 0 )
                {
                  v22 &= ~0x8000000000000000ui64;
                  v25 = v22;
                  *(_BYTE *)(result + 49) = 1;
                  v23 = v22;
                }
                if( v23 > 0xFFFFFFFF )
                  return(unsigned int)-1073741811;
              }
              *(_DWORD *)(result + 32) = v22;
              if( (_DWORD)v22 == -1 )
                return(unsigned int)-1073741811;
              *(_DWORD *)(result + 32) = v22 + 1;
            }
          }
          else
          {
            v16 = *((_QWORD *)Address + 1);
            v28 = v16;
            if( v5 )
            {
              if( (v16 & 7) != 0 )
                ExRaiseDatatypeMisalignment();
              if( v16 + 24 > 0x7FFFFFFF0000i64 || v16 + 24 < v16 )
                MEMORY[0x7FFFFFFF0000] = 0;
            }
            *(_QWORD *)result = *(_QWORD *)v16;
            *(_QWORD *)(result + 8) = *(_QWORD *)(v16 + 8);
            *(_QWORD *)(result + 16) = *(_QWORD *)(v16 + 16);
          }
          Address = (char *)Address + 16;
          v26 = Address;
        }
        *(_DWORD *)(result + 52) = v11;
        return 0;
      }
    }
    else
    {
      return(unsigned int)-1073741811;
    }
  }
  else
  {
    return Address != 0i64 ? 0xC000000D : 0;
  }
  return(unsigned int)v8;
}

Referenced by:

MiAllocateUserPhysicalPages
MiMapViewOfSectionExCommon
MmAllocateVirtualMemory