HalpDmaAllocateScatterPagesFromScatterPoolV3
__int64 __fastcall HalpDmaAllocateScatterPagesFromScatterPoolV3(
__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;
__int64 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;
}
if( a3 > *(_DWORD *)(a2 + 32) )
{
a3 = 0;
if( !a4 )
a3 = *(_DWORD *)(a2 + 32);
}
if( !a3 )
goto LABEL_3;
v14 = *(_QWORD *)(a2 + 24);
v15 = v14;
v16 = a3;
do
{
v17 = v15;
v15 = *(_QWORD *)(v15 + 8);
--v16;
}
while( v16 );
*(_QWORD *)(v17 + 8) = 0i64;
*(_DWORD *)(a2 + 32) -= a3;
*(_QWORD *)(a2 + 24) = v15;
if( a5 )
*(_DWORD *)(v9 + 208) -= a3;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
result = v14;
*a6 = a3;
return result;
}Referenced by:
HalpDmaAllocateScatterPagesFromScatterPool