ViReleaseDmaAdapter

VOID __stdcall ViReleaseDmaAdapter(_ADAPTER_INFORMATION *AdapterInformation){
  _ADAPTER_OBJECT *Param3; 
  UINT64 *v2; 
  unsigned __int8 v4; 
  VOID **v5; 
  unsigned __int64 v6; 
  VOID **v7; 
  __int64 v8; 
  UINT64 v9; 
  ULONG_PTR v10; 
  UINT64 v11; 

  Param3 = (_ADAPTER_OBJECT *)*((_QWORD *)AdapterInformation + 2);
  v2 = (UINT64 *)(AdapterInformation + 70);
  Param3->AdapterObject.DmaHeader.DmaOperations = (_DMA_OPERATIONS *)*((_QWORD *)AdapterInformation + 6);
  v4 = KeAcquireSpinLockRaiseToDpc((UINT64 *)AdapterInformation + 35);
  v5 = (VOID **)*((_QWORD *)AdapterInformation + 33);
  *((_QWORD *)AdapterInformation + 33) = 0i64;
  v6 = v4;
  KxReleaseSpinLock(v2);
  __writecr8(v6);
  if( v5 )
  {
    v7 = v5;
    v8 = 32i64;
    do
    {
      if( *v7 )
        MmFreeContiguousMemory(*v7);
      ++v7;
      --v8;
    }
    while( v8 );
    ExFreePoolWithTag(v5, 0);
  }
  HalPutDmaAdapter(Param3);
  v10 = v9;
  if( AdapterInformation[9] > 0 && v9 && (v9 != 1 || !*((_BYTE *)AdapterInformation + 34)) )
  {
    ViHalPreprocessOptions(
      &unk_140C12D3C,
      (PSTR)"Too many outstanding reference counts(%x) for adapter %p",
      0x11ui64,
      v9,
      (UINT64)Param3,
      (UINT64)AdapterInformation,
      v11);
    VfReportIssueWithOptions(0xE6ui64, 0x11u, v10, (ULONG_PTR)Param3, (ULONG_PTR)AdapterInformation, &unk_140C12D3C);
  }
  ExFreePoolWithTag(AdapterInformation, 0);
}

Referenced by:

VfGetDmaAdapter
VfIoDeleteDevice
VfPutDmaAdapter