VfFreeMapRegisters

VOID __stdcall VfFreeMapRegisters(ULONG_PTR DmaAdapter, VOID *MapRegisterBase, UINT64 NumberOfMapRegisters){
  __int64 v4; 
  unsigned int v5; 
  _DMA_ADAPTER *v6; 
  char v7; 
  void(__fastcall *RealDmaOperation)(_DMA_ADAPTER *, VOID *, _QWORD); 
  INT64 v9; 
  void(__fastcall *v10)(_DMA_ADAPTER *, VOID *, _QWORD); 
  _LIST_ENTRY *AdapterInformationInternal; 
  _VF_WAIT_CONTEXT_BLOCK *v12; 
  _VF_WAIT_CONTEXT_BLOCK *v13; 
  _MAP_REGISTER_FILE *v14; 

  v4 = 0i64;
  v5 = NumberOfMapRegisters;
  v6 = *(_DMA_ADAPTER **)&DmaAdapter;
  v7 = 0;
  RealDmaOperation = (void(__fastcall *)(_DMA_ADAPTER *, VOID *, _QWORD))ViGetRealDmaOperation(DmaAdapter, 0x38ui64);
  LOBYTE(v9) = 1;
  v10 = RealDmaOperation;
  AdapterInformationInternal = ViGetAdapterInformationInternal(v6, v9);
  if( AdapterInformationInternal )
  {
    VF_ASSERT_IRQL(2u);
    v4 = (__int64)MapRegisterBase;
    if( MapRegisterBase == (VOID *)-559026163i64 )
    {
      MapRegisterBase = 0i64;
      v7 = 1;
      v4 = 0i64;
    }
    else if( MapRegisterBase && *(_DWORD *)MapRegisterBase == -1393569779 )
    {
      MapRegisterBase = (VOID *)*((_QWORD *)MapRegisterBase + 6);
    }
  }
  v10(v6, MapRegisterBase, v5);
  if( AdapterInformationInternal )
  {
    if( v7 == 1 )
      v4 = -559026163i64;
    v12 = ViRemoveChannelWcb((_ADAPTER_INFORMATION *)AdapterInformationInternal, (_MAP_REGISTER_FILE *)v4, 0i64);
    v13 = v12;
    if( v12 )
    {
      SUBTRACT_MAP_REGISTERS((_ADAPTER_INFORMATION *)AdapterInformationInternal, (unsigned int)v12[12]);
      v14 = (_MAP_REGISTER_FILE *)*((_QWORD *)v13 + 12);
      if( v14 )
        ViFreeMapRegisterFile((_ADAPTER_INFORMATION *)AdapterInformationInternal, v14);
      ExFreeToNPagedLookasideList(&ViHalWaitBlockLookaside, v13);
    }
  }
}

Referenced by:

No references.