HalpDmaAcquireBufferMappings
unsigned __int64 __fastcall HalpDmaAcquireBufferMappings(__int64 a1, _QWORD *a2, unsigned int a3, __int64 a4){
unsigned __int64 result;
__int64 v5;
unsigned int v6;
_QWORD *v8;
_QWORD *v9;
__int64 Number;
__int64 v11;
_MDL *v12;
int v13;
_MDL *v14;
__int64 v15;
PSLIST_ENTRY v16;
char v17;
bool v18;
PSLIST_ENTRY v19;
unsigned __int64 v20;
unsigned __int64 v21;
__int64 v22;
unsigned int v23;
int v24;
__int64 *v25;
__int64 v26;
int v27;
unsigned int v28;
UINT64 v29;
UINT64 Priority;
_KLOCK_QUEUE_HANDLE LockQueue;
result = 0i64;
v5 = a3;
v6 = 0;
v8 = a2;
memset(&LockQueue, 0, sizeof(LockQueue));
if( a3 )
{
do
{
result = a2[6] & 0xFFFFFFFFFFFFF000ui64;
if( !result )
break;
a2 = (_QWORD *)a2[1];
++v6;
}
while( v6 < a3 );
}
if( v6 == a3 )
{
*(_QWORD *)a4 = 0i64;
return result;
}
v9 = v8;
Number = KeGetCurrentPrcb()->Number;
v11 = (unsigned int)Number;
v12 = (_MDL *)*((_QWORD *)qword_140C53C60 + Number);
v13 = 0;
v14 = v12 + 1;
if( (_DWORD)v5 )
{
v15 = v5;
do
{
if( (v9[6] & 0xFFFFFFFFFFFFF000ui64) == 0 )
{
++v13;
v14->Next = (_MDL *)(*v9 >> 12);
v14 = (_MDL *)((char *)v14 + 8);
}
v9 = (_QWORD *)v9[1];
--v15;
}
while( v15 );
}
v16 = 0i64;
v12->StartVa = 0i64;
v17 = 1;
v12->ByteOffset = 0;
v18 = byte_140C53C58 == 0;
v12->ByteCount = v13 << 12;
if( !v18 )
{
v16 = (PSLIST_ENTRY)*((_QWORD *)qword_140C53C68 + v11);
goto LABEL_32;
}
v19 = RtlpInterlockedPopEntrySList(&ListHead);
if( v19 )
{
*((_DWORD *)&v19[1].Next + 3) = 0;
v16 = v19;
LABEL_31:
_InterlockedIncrement((volatile signed __int32 *)&v16[1].Next + 2);
*(_QWORD *)(a4 + 24) = 0i64;
*(_QWORD *)(a4 + 32) = v16 + 2;
KxAcquireQueuedSpinLock((_KSPIN_LOCK_QUEUE *)(a4 + 24), (UINT64 *)&v16[2]);
LABEL_32:
result = (unsigned __int64)MmMapLockedPagesWithReservedMapping(v16[1].Next, 0x206C6148ui64, v12, MmCached);
v20 = result;
if( !result )
KeBugCheckEx(0xACu, (PVOID)0x1000, (PVOID)0xEF02, 0i64, 0i64);
goto LABEL_16;
}
LODWORD(Priority) = 1073741856;
LODWORD(v29) = 0;
result = (unsigned __int64)MmMapLockedPagesSpecifyCache(v12, 0, MmCached, 0i64, v29, Priority);
v20 = result;
if( !result )
{
LockQueue.LockQueue.Next = 0i64;
LockQueue.LockQueue.Lock = &qword_140CF2310;
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, &qword_140CF2310);
v23 = 1;
v24 = *(_DWORD *)(*(_QWORD *)qword_140C53C68 + 24i64);
if( (unsigned int)dword_140CF6278 > 1 )
{
v25 = (__int64 *)((char *)qword_140C53C68 + 8);
do
{
v26 = *v25;
v27 = v24;
++v25;
v24 = *(_DWORD *)(v26 + 24);
v28 = v23;
if( v24 >= v27 )
v28 = (unsigned int)v16;
++v23;
LODWORD(v16) = v28;
if( v24 >= v27 )
v24 = v27;
}
while( v23 < dword_140CF6278 );
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
v16 = (PSLIST_ENTRY)*((_QWORD *)qword_140C53C68 + (unsigned int)v16);
goto LABEL_31;
}
v17 = 0;
LABEL_16:
v21 = v20;
if( (_DWORD)v5 )
{
v22 = v5;
do
{
result = v8[6];
if( (result & 0xFFFFFFFFFFFFF000ui64) == 0 )
{
result = v21 | v8[6] & 0xFEFi64 | 0x10;
v8[6] = result;
v21 += 4096i64;
}
v8 = (_QWORD *)v8[1];
--v22;
}
while( v22 );
}
*(_QWORD *)a4 = v12;
*(_QWORD *)(a4 + 8) = v20;
*(_QWORD *)(a4 + 16) = v16;
*(_BYTE *)(a4 + 48) = v17;
return result;
}Referenced by:
HalpDmaFreeMapRegisters
HalpDmaSyncMapBuffers
HalpDmaZeroMapBuffers