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.