MiCaptureAllocateMapExtendedParameters
NTSTATUS __stdcall MiCaptureAllocateMapExtendedParameters(VOID *Address, ULONGLONG ullMultiplicand, VOID *a3){
int v3;
int v4;
char v5;
ULONGLONG v6;
int v8;
ULONGLONG 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;
UINT64 pullResult;
__int64 v25;
VOID *v26;
char *v27;
unsigned __int64 v28;
_QWORD *v29;
v4 = v3;
v5 = (char)a3;
v6 = (unsigned int)ullMultiplicand;
pullResult = 0i64;
memset(v29, 0i64, 0x48u);
if( !(_DWORD)v6 )
return Address != 0i64 ? 0xC000000D : 0;
if( !Address )
return -1073741811;
v10 = v6;
v8 = RtlULongLongMult(v6, 0x10ui64, &pullResult);
if( v8 >= 0 )
{
v11 = 0;
if( v5 )
ProbeForWrite((UINT64)Address, pullResult, 8i64);
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 -1073741811;
v14 = 1 << v13;
if( ((1 << v13) & v4) == 0 )
return -1073741811;
if( (v14 & v11) != 0 )
return -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 -1073741811;
v20 = *((_QWORD *)Address + 1);
v29[7] = v20;
if( (v20 & 0xFFFFFFFFFFFFFFC0ui64) != 0 )
return -1073741811;
}
else
{
v29[5] = *((_QWORD *)Address + 1);
*((_BYTE *)v29 + 48) = 1;
}
}
else
{
v21 = *((_QWORD *)Address + 1);
v29[3] = v21;
if( !v21 )
return -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 *)v29 + 49) = 1;
v23 = v22;
}
if( v23 > 0xFFFFFFFF )
return -1073741811;
}
*((_DWORD *)v29 + 8) = v22;
if( (_DWORD)v22 == -1 )
return -1073741811;
*((_DWORD *)v29 + 8) = 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;
}
*v29 = *(_QWORD *)v16;
v29[1] = *(_QWORD *)(v16 + 8);
v29[2] = *(_QWORD *)(v16 + 16);
}
Address = (char *)Address + 16;
v26 = Address;
}
*((_DWORD *)v29 + 13) = v11;
return 0;
}
return v8;
}Referenced by:
MiAllocateUserPhysicalPages
MiMapViewOfSectionExCommon
MmAllocateVirtualMemory