HalpDmaAllocateScatterPagesFromScatterPoolV2
__int64 __fastcall HalpDmaAllocateScatterPagesFromScatterPoolV2(
__int64 a1,
__int64 a2,
unsigned int a3,
char a4,
char a5,
unsigned int *a6){
__int64 v9;
unsigned int v10;
unsigned int v11;
__int64 result;
unsigned int v13;
unsigned int v14;
__int64 v15;
__int64 v16;
__int64 v17;
struct _KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
v9 = 0i64;
KeAcquireInStackQueuedSpinLock((UINT64 *)(a2 + 120), &LockHandle);
if( a5 )
{
v10 = *(_DWORD *)(a2 + 208);
v9 = a2;
v11 = *(_DWORD *)(a2 + 212);
if( v10 <= v11 )
{
LABEL_3:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
*a6 = 0;
return 0i64;
}
v13 = v10 - v11;
if( a3 > v13 )
a3 = v13;
}
v14 = *(_DWORD *)(a2 + 32);
if( a3 > v14 )
{
a3 = 0;
if( !a4 )
a3 = *(_DWORD *)(a2 + 32);
}
if( !a3 )
goto LABEL_3;
v15 = *(_QWORD *)(a2 + 24);
v16 = v15;
v17 = a3;
do
{
v16 = *(_QWORD *)(v16 + 8);
--v17;
}
while( v17 );
*(_QWORD *)(a2 + 24) = v16;
*(_DWORD *)(a2 + 32) = v14 - a3;
if( a5 )
*(_DWORD *)(v9 + 208) -= a3;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
result = v15;
*a6 = a3;
return result;
}Referenced by:
HalpDmaAllocateScatterPagesFromScatterPool