ViAllocateContiguousMemory
INT64 __fastcall ViAllocateContiguousMemory(INT64 a1){
int v2;
LARGE_INTEGER v3;
INT64 result;
unsigned int v5;
__int64 v6;
UINT64 Protect;
UINT64 PreferredNode;
LARGE_INTEGER v9;
v9.HighPart = 0;
v2 = 0xFFFF;
if( *(_BYTE *)(a1 + 203) )
{
v3.QuadPart = -1i64;
}
else
{
if( *(_BYTE *)(a1 + 200) )
{
v9.LowPart = -1;
}
else
{
if( *(_DWORD *)(a1 + 212) == 1 )
v2 = 0xFFFFFF;
v9.LowPart = v2;
}
v3 = v9;
}
*(_DWORD *)(a1 + 296) = 32;
*(_QWORD *)(a1 + 304) = a1 + 288;
RtlClearAllBits((RTL_BITMAP *)(a1 + 296));
result = (INT64)ExAllocatePoolWithTag(NonPagedPoolNx, 0x100ui64, 0x566C6148ui64);
*(_QWORD *)(a1 + 264) = result;
if( result )
{
v5 = 0;
v6 = 0i64;
do
{
LODWORD(PreferredNode) = 0x80000000;
LODWORD(Protect) = 4;
*(_QWORD *)(v6 + *(_QWORD *)(a1 + 264)) = MmAllocateContiguousNodeMemory(
0x3000ui64,
0i64,
v3,
0i64,
Protect,
PreferredNode);
if( *(_QWORD *)(v6 + *(_QWORD *)(a1 + 264)) )
{
result = 272i64;
}
else
{
RtlSetBits((RTL_BITMAP *)(a1 + 296), v5, 1ui64);
result = 276i64;
}
_InterlockedIncrement((volatile signed __int32 *)(result + a1));
++v5;
v6 += 8i64;
}
while( v5 < 0x20 );
}
return result;
}Referenced by:
ViHookDmaAdapter