HalFreeCommonBufferThin

VOID __fastcall HalFreeCommonBufferThin(INT64 a1, INT64 a2, VOID *a3, VOID *a4){
  void *v4; 
  unsigned __int64 v6; 
  INT64 v7; 
  unsigned __int64 v8; 
  _QWORD *v9; 
  UINT64 v10; 
  unsigned __int8 v11; 
  unsigned __int64 v12; 
  unsigned __int8 v13; 
  __int64 v14; 
  unsigned __int64 v15; 
  __int64 v16; 
  UINT64 *v17; 
  unsigned __int8 v18; 
  __int64 v19; 
  unsigned __int64 v20; 
  MDL *v21; 
  v4 = a4;
  LOBYTE(v6) = KeGetCurrentIrql();
  v7 = *(_QWORD *)(a1 + 504);
  v8 = 0i64;
  v9 = 0i64;
  KeAcquireSpinLockRaiseToDpc(&HalpDmaDomainListLock, a2);
  v12 = v11;
  if( !v7 )
    goto LABEL_19;
  KeAcquireSpinLockRaiseToDpc((UINT64 *)(v7 + 96), v10);
  v10 = v7 + 80;
  v6 = v13;
  v8 = *(_QWORD *)(v7 + 80);
  if( (*(_BYTE *)(v7 + 88) & 1) != 0 && v8 )
    v8 ^= v10;
  while( v8 )
  {
    v14 = *(_QWORD *)(v8 + 24);
    if( *(void **)(v14 + 24) == v4 )
      break;
    if( *(_QWORD *)(v14 + 24) <= (unsigned __int64)v4 )
      v15 = *(_QWORD *)(v8 + 8);
    else
      v15 = *(_QWORD *)v8;
    if( (*(_BYTE *)(v7 + 88) & 1) != 0 && v15 )
      v8 ^= v15;
    else
      v8 = v15;
  }
  if( v8 )
  {
    v9 = (_QWORD *)v8;
  }
  else
  {
    KxReleaseSpinLock((UINT64 *)(v7 + 96));
    __writecr8(v6);
    v7 = 0i64;
  }
  if( !v7 )
  {
LABEL_19:
    v16 = HalpDmaDomainList;
    if( (__int64 *)HalpDmaDomainList != &HalpDmaDomainList )
    {
      while( 1 )
      {
        v17 = (UINT64 *)(v16 + 96);
        v7 = v16;
        KeAcquireSpinLockRaiseToDpc((UINT64 *)(v16 + 96), v10);
        v6 = v18;
        v8 = *(_QWORD *)(v16 + 80);
        if( (*(_BYTE *)(v16 + 88) & 1) != 0 && v8 )
          v8 ^= v16 + 80;
        if( v8 )
        {
          do
          {
            v19 = *(_QWORD *)(v8 + 24);
            if( *(VOID **)(v19 + 24) == a4 )
              break;
            v20 = *(_QWORD *)(v19 + 24) <= (unsigned __int64)a4 ? *(_QWORD *)(v8 + 8) : *(_QWORD *)v8;
            if( (*(_BYTE *)(v16 + 88) & 1) != 0 && v20 )
              v8 ^= v20;
            else
              v8 = v20;
          }
          while( v8 );
          v17 = (UINT64 *)(v16 + 96);
          if( v8 )
            break;
        }
        KxReleaseSpinLock(v17);
        __writecr8(v6);
        v16 = *(_QWORD *)v16;
        if( (__int64 *)v16 == &HalpDmaDomainList )
          goto LABEL_38;
      }
      v9 = (_QWORD *)v8;
    }
    if( !v7 )
    {
LABEL_38:
      KxReleaseSpinLock(&HalpDmaDomainListLock);
      __writecr8(v12);
      return;
    }
    v4 = a4;
  }
  HalpIommuDomainUnmapLogicalRange(*(PVOID *)(v7 + 40), a3);
  HalpDomainLaDelete(v7, (UINT64)a3);
  RtlRbRemoveNode((unsigned __int64 *)(v7 + 80), v8);
  KxReleaseSpinLock((UINT64 *)(v7 + 96));
  __writecr8((unsigned __int8)v6);
  KxReleaseSpinLock(&HalpDmaDomainListLock);
  __writecr8(v12);
  HalpDmaDereferenceDomainObject((PVOID)v7);
  v21 = (MDL *)v9[3];
  ExFreePoolWithTag(v9, 0);
  MmUnmapLockedPages(v4, v21);
  MiFreePagesFromMdl(v21, 0i64);
}

Referenced by:

No references.