HalpDmaAllocateScatterPagesFromContiguousPoolV3
__int64 __fastcall HalpDmaAllocateScatterPagesFromContiguousPoolV3(
__int64 a1,
__int64 a2,
ULONG a3,
char a4,
char a5,
ULONG *a6){
__int64 v9;
unsigned int v10;
unsigned int v11;
__int64 result;
ULONG v13;
struct _RTL_BITMAP *v14;
__int64 v15;
__int64 v16;
ULONG v17;
ULONG v18;
unsigned int ClearBitsAndSet;
__int64 v20;
struct _KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
v9 = 0i64;
KeAcquireInStackQueuedSpinLock((UINT64 *)(a2 + 120), &LockHandle);
if( a5 )
{
v10 = *(_DWORD *)(a2 + 200);
v9 = a2;
v11 = *(_DWORD *)(a2 + 204);
if( v10 <= v11 )
{
LABEL_3:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
LABEL_4:
*a6 = 0;
return 0i64;
}
v13 = v10 - v11;
if( a3 > v13 )
a3 = v13;
}
if( a4 )
{
v14 = *(struct _RTL_BITMAP **)(a2 + 16);
if( v14->SizeOfBitMap - RtlNumberOfSetBits(v14) < a3 )
goto LABEL_3;
}
v15 = 0i64;
v16 = 0i64;
v17 = 0;
v18 = 0;
if( a3 )
{
do
{
ClearBitsAndSet = RtlFindClearBitsAndSet(*(PRTL_BITMAP *)(a2 + 16), 1u, v18);
if( ClearBitsAndSet == -1 )
break;
v20 = HalpDmaIndexToTranslationEntry(a2, ClearBitsAndSet, 0i64);
if( v15 )
*(_QWORD *)(v16 + 8) = v20;
else
v15 = v20;
++v17;
v16 = v20;
}
while( v17 < a3 );
if( v16 )
*(_QWORD *)(v16 + 8) = 0i64;
}
if( a5 )
*(_DWORD *)(v9 + 200) -= v17;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( !v17 )
goto LABEL_4;
result = v15;
*a6 = v17;
return result;
}Referenced by:
HalpDmaAllocateScatterPagesFromContiguousPool