HalDmaFreeCrashDumpRegistersEx

NTSTATUS __fastcall HalDmaFreeCrashDumpRegistersEx(INT64 a1, INT64 a2){
  __int64 v3; 
  int v4; 
  int v5; 
  __int64 v7; 
  char v8; 
  _DWORD *v9; 
  char v10; 
  _QWORD *v12; 
  __int64 v13; 
  _QWORD *v14; 
  _HALP_DMA_TRANSLATION_ENTRY *v15; 
  __int64 v16; 
  INT64 v17; 

  if( !a1 || (unsigned int)a2 > 1 )
    return -1073741811;
  v3 = (int)a2;
  v4 = *(_DWORD *)(a1 + 4i64 * (int)a2 + 272);
  if( !v4 )
    return -1073741823;
  v5 = v4 - 1;
  *(_DWORD *)(a1 + 4i64 * (int)a2 + 272) = v5;
  if( !v5 )
  {
    v7 = 2i64;
    if( *(_DWORD *)(a1 + 4i64 * (int)a2 + 264) )
    {
      v15 = *(_HALP_DMA_TRANSLATION_ENTRY **)(a1 + 8i64 * (int)a2 + 248);
      if( v15 )
      {
        v15->NextMapping = v15;
        v15 = *(_HALP_DMA_TRANSLATION_ENTRY **)(a1 + 8 * v3 + 248);
      }
      if( *(_DWORD *)(a1 + 512) == 2 )
      {
        _mm_lfence();
        v16 = *(_QWORD *)(a1 + 8 * v3 + 248);
        v17 = *(_QWORD *)(a1 + 504);
        HalpIommuDomainUnmapLogicalRange(*(PVOID *)(v17 + 40), *(PVOID *)(v16 + 24));
        HalpDomainLaDelete(v17, *(_QWORD *)(v16 + 24));
        v15 = *(_HALP_DMA_TRANSLATION_ENTRY **)(a1 + 8 * v3 + 248);
      }
      HalpDmaFreeMapRegisters((_ADAPTER_OBJECT *)a1, v15, *(unsigned int *)(a1 + 4 * v3 + 264));
      *(_QWORD *)(a1 + 8 * v3 + 248) = 0i64;
      *(_DWORD *)(a1 + 4 * v3 + 264) = 0;
    }
    v8 = 1;
    v9 = (_DWORD *)(a1 + 272);
    do
    {
      v10 = 0;
      if( *v9++ == 0 )
        v10 = v8;
      v8 = v10;
      --v7;
    }
    while( v7 );
    if( v10 )
    {
      v12 = (_QWORD *)(a1 + 280);
      v13 = *v12;
      if( *(_QWORD **)(*v12 + 8i64) != v12 || (v14 = (_QWORD *)v12[1], (_QWORD *)*v14 != v12) )
        __fastfail(3u);
      *v14 = v13;
      *(_QWORD *)(v13 + 8) = v14;
    }
  }
  return 0;
}

Referenced by:

No references.