HalpDmaReleaseBufferMappings
void __fastcall HalpDmaReleaseBufferMappings(__int64 a1, __int64 a2, unsigned int a3, __int64 a4){
__int64 v4;
void *v7;
__int64 v8;
__int64 v9;
v4 = a3;
if( *(_QWORD *)a4 )
{
v7 = *(void **)(a4 + 8);
if( *(_BYTE *)(a4 + 48) )
{
MmUnmapReservedMapping(v7, 0x206C6148u, *(PMDL *)a4);
if( !byte_140C53C58 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)(a4 + 24));
v8 = *(_QWORD *)(a4 + 16);
if( _InterlockedExchangeAdd((volatile signed __int32 *)(v8 + 24), 0xFFFFFFFF) == 1
&& !_InterlockedCompareExchange((volatile signed __int32 *)(v8 + 28), 1, 0) )
{
RtlpInterlockedPushEntrySList((PSLIST_HEADER)&xmmword_140CF6260, (PSLIST_ENTRY)v8);
}
}
}
else
{
MmUnmapLockedPages(v7, *(PMDL *)a4);
}
if( (_DWORD)v4 )
{
v9 = v4;
do
{
if( (*(_BYTE *)(a2 + 48) & 0x10) != 0 )
*(_QWORD *)(a2 + 48) = *(_DWORD *)(a2 + 48) & 0xFEF;
a2 = *(_QWORD *)(a2 + 8);
--v9;
}
while( v9 );
}
}
}Referenced by:
HalpDmaFreeMapRegisters
HalpDmaSyncMapBuffers
HalpDmaZeroMapBuffers