HalpDmaFreeMapRegisters
VOID __stdcall HalpDmaFreeMapRegisters(
_ADAPTER_OBJECT *ChildAdapterObject,
_HALP_DMA_TRANSLATION_ENTRY *Translation,
UINT64 a3){
unsigned int v3;
unsigned int v4;
_HALP_DMA_TRANSLATION_ENTRY *v7;
union {void *VirtualAddress;struct {unsigned __int64 BoundToMaster : 1;unsigned __int64 BoundToScatterPool : 1;unsigned __int64 OwnedByMaster : 1;unsigned __int64 OwnedByScatterPool : 1;unsigned __int64 TemporaryMapping : 1;unsigned __int64 ZeroBuffer : 1;unsigned __int64 Address : 58;} Flags;} v8;
unsigned __int64 v9;
char v10;
char v11;
unsigned __int8 CurrentIrql;
VOID *v13;
INT64 v14[2];
__int128 v15;
__int128 i;
__int64 v17;
_HALP_DMA_TRANSLATION_ENTRY *Next;
v3 = 0;
v17 = 0i64;
v4 = a3;
v7 = Translation;
*(_OWORD *)v14 = 0i64;
v15 = 0i64;
for( i = 0i64; v3 < v4; ++v3 )
{
Next = v7->Next;
v8.VirtualAddress = (void *)v7->u;
if( ((__int64)v8.VirtualAddress & 0x20) != 0 )
{
v9 = (unsigned __int64)v8.VirtualAddress & 0xFFFFFFFFFFFFFFDFui64;
v10 = 0;
v11 = 0;
v7->u.VirtualAddress = (void *)v9;
CurrentIrql = 0;
if( (v9 & 0xFFFFFFFFFFFFF000ui64) == 0 )
{
CurrentIrql = KeGetCurrentIrql();
if( CurrentIrql > 2u )
KeBugCheckEx(0xACu, (PVOID)0x1000, (PVOID)0xEF03, 0i64, 0i64);
if( CurrentIrql < 2u )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v11 = 1;
}
HalpDmaAcquireBufferMappings(2i64, v7, 1u, (__int64)v14);
v10 = 1;
}
v13 = (VOID *)((unsigned __int64)v7->u.VirtualAddress & 0xFFFFFFFFFFFFF000ui64);
if( v13 )
memset(v13, 0i64, 0x1000u);
if( v10 )
HalpDmaReleaseBufferMappings((INT64)v13, (INT64)Translation, 1ui64, (INT64)v14);
if( v11 )
__writecr8(CurrentIrql);
}
HalpDmaReturnPageToOwner(ChildAdapterObject, ChildAdapterObject->MasterAdapter, v7);
v7 = Next;
}
}Referenced by:
HalDmaAllocateCrashDumpRegistersEx
HalDmaFreeCrashDumpRegistersEx
HalpDmaFreeCrashDumpRegisters
HalpDmaProcessMapRegisterQueueV2
IoFreeMapRegistersV2
IoFreeMapRegistersV3