HalpDmaAcquireBufferMappings
int __fastcall HalpDmaAcquireBufferMappings(__int64 a1, _QWORD *a2, unsigned int a3, __int64 a4){
unsigned __int64 v4;
__int64 v5;
unsigned int v6;
_QWORD *v8;
_QWORD *v9;
__int64 v10;
__int64 v11;
struct _MDL *v12;
int v13;
struct _MDL *v14;
__int64 v15;
PSLIST_ENTRY v16;
char v17;
bool v18;
PSLIST_ENTRY v19;
WORK_QUEUE_TYPE v20;
void *v21;
WORK_QUEUE_TYPE v22;
void *v23;
unsigned __int64 v24;
unsigned __int64 v25;
__int64 v26;
unsigned int v27;
int v28;
__int64 *v29;
__int64 v30;
int v31;
unsigned int v32;
_BYTE LockHandle[56];
LODWORD(v4) = 0;
v5 = a3;
v6 = 0;
v8 = a2;
memset(LockHandle, 0, 24);
if( a3 )
{
do
{
v4 = a2[6] & 0xFFFFFFFFFFFFF000ui64;
if( !v4 )
break;
a2 = (_QWORD *)a2[1];
++v6;
}
while( v6 < a3 );
}
if( v6 == a3 )
{
*(_QWORD *)a4 = 0i64;
return v4;
}
v9 = v8;
v10 = *((unsigned int *)KeGetCurrentPrcb() + 9);
v11 = (unsigned int)v10;
v12 = *(struct _MDL **)(qword_140C53C60 + 8 * v10);
v13 = 0;
v14 = v12 + 1;
if( (_DWORD)v5 )
{
v15 = v5;
do
{
if( (v9[6] & 0xFFFFFFFFFFFFF000ui64) == 0 )
{
++v13;
v14->Next = (_MDL *)(*v9 >> 12);
v14 = (struct _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_140C53C68 + 8 * v11);
goto LABEL_32;
}
v19 = RtlpInterlockedPopEntrySList((PSLIST_HEADER)&xmmword_140CF6260);
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((PIO_WORKITEM)(a4 + 24), (PIO_WORKITEM_ROUTINE)&v16[2], v20, v21);
LABEL_32:
LODWORD(v4) = MmMapLockedPagesWithReservedMapping(v16[1].Next, 0x206C6148ui64, v12, MmCached);
v24 = v4;
if( !v4 )
KeBugCheckEx(0xACu, 0x1000ui64, 0xEF02ui64, 0i64, 0i64);
goto LABEL_16;
}
v4 = (unsigned __int64)MmMapLockedPagesSpecifyCache(v12, 0, MmCached, 0i64, 0, 0x40000020u);
v24 = v4;
if( !v4 )
{
*(_QWORD *)LockHandle = 0i64;
*(_QWORD *)&LockHandle[8] = qword_140CF2310;
KxAcquireQueuedSpinLock((PIO_WORKITEM)LockHandle, qword_140CF2310, v22, v23);
v27 = 1;
v28 = *(_DWORD *)(*(_QWORD *)qword_140C53C68 + 24i64);
if( (unsigned int)dword_140CF6278 > 1 )
{
v29 = (__int64 *)(qword_140C53C68 + 8);
do
{
v30 = *v29;
v31 = v28;
++v29;
v28 = *(_DWORD *)(v30 + 24);
v32 = v27;
if( v28 >= v31 )
v32 = (unsigned int)v16;
++v27;
LODWORD(v16) = v32;
if( v28 >= v31 )
v28 = v31;
}
while( v27 < dword_140CF6278 );
}
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
v16 = *(PSLIST_ENTRY *)(qword_140C53C68 + 8i64 * (unsigned int)v16);
goto LABEL_31;
}
v17 = 0;
LABEL_16:
v25 = v24;
if( (_DWORD)v5 )
{
v26 = v5;
do
{
v4 = v8[6];
if( (v4 & 0xFFFFFFFFFFFFF000ui64) == 0 )
{
v4 = v25 | v8[6] & 0xFEFi64 | 0x10;
v8[6] = v4;
v25 += 4096i64;
}
v8 = (_QWORD *)v8[1];
--v26;
}
while( v26 );
}
*(_QWORD *)a4 = v12;
*(_QWORD *)(a4 + 8) = v24;
*(_QWORD *)(a4 + 16) = v16;
*(_BYTE *)(a4 + 48) = v17;
return v4;
}Referenced by:
HalpDmaFreeMapRegisters
HalpDmaSyncMapBuffers
HalpDmaZeroMapBuffers