HalpDmaFreeMapRegisters

void __fastcall HalpDmaFreeMapRegisters(__int64 a1, __int64 a2, unsigned int a3){
  unsigned int v3; 
  _QWORD *v7; 
  __int64 v8; 
  unsigned __int64 v9; 
  char v10; 
  char v11; 
  unsigned __int8 CurrentIrql; 
  unsigned __int64 v13; 
  __int128 v14[3]; 
  __int64 v15; 
  _QWORD *v16; 
  v3 = 0;
  v15 = 0i64;
  v7 = (_QWORD *)a2;
  memset(v14, 0, sizeof(v14));
  if( a3 )
  {
    do
    {
      v16 = (_QWORD *)v7[1];
      v8 = v7[6];
      if( (v8 & 0x20) != 0 )
      {
        v9 = v8 & 0xFFFFFFFFFFFFFFDFui64;
        v10 = 0;
        v11 = 0;
        v7[6] = v9;
        CurrentIrql = 0;
        if( (v9 & 0xFFFFFFFFFFFFF000ui64) == 0 )
        {
          CurrentIrql = KeGetCurrentIrql();
          if( CurrentIrql > 2u )
            KeBugCheckEx(0xACu, 0x1000ui64, 0xEF03ui64, 0i64, 0i64);
          if( CurrentIrql < 2u )
          {
            CurrentIrql = KeGetCurrentIrql();
            __writecr8(2ui64);
            v11 = 1;
          }
          HalpDmaAcquireBufferMappings(2i64, v7, 1u, (__int64)v14);
          v10 = 1;
        }
        v13 = v7[6] & 0xFFFFFFFFFFFFF000ui64;
        if( v13 )
          memset(v13, 0i64);
        if( v10 )
          HalpDmaReleaseBufferMappings(v13, a2, 1u, (__int64)v14);
        if( v11 )
          __writecr8(CurrentIrql);
      }
      HalpDmaReturnPageToOwner(a1, *(_QWORD *)(a1 + 152), (unsigned __int64)v7);
      v7 = v16;
      ++v3;
    }
    while( v3 < a3 );
  }
}

Referenced by:

HalDmaAllocateCrashDumpRegistersEx
HalDmaFreeCrashDumpRegistersEx
HalpDmaFreeCrashDumpRegisters
HalpDmaProcessMapRegisterQueueV2
IoFreeMapRegistersV2
IoFreeMapRegistersV3