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