HalpMapTransferV2
_LARGE_INTEGER __stdcall HalpMapTransferV2(
_ADAPTER_OBJECT *ChildAdapter,
_MDL *Mdl,
VOID *MapRegisterBase,
VOID *CurrentVa,
UINT8 DeferFlushing,
UINT64 WriteToDevice,
UINT8 a7){
UINT64 *Length;
_LARGE_INTEGER result;
bool v12;
char v13;
__int64 v14;
unsigned int v15;
__int64 v16;
INT64 v17;
_LARGE_INTEGER LogicalAddressOut;
_KLOCK_QUEUE_HANDLE LockHandle;
_QWORD *DeferFlushinga;
Length = (UINT64 *)DeferFlushing;
result.QuadPart = 0i64;
LogicalAddressOut.QuadPart = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
if( *(_DWORD *)DeferFlushing )
{
v12 = !ChildAdapter || ChildAdapter->MasterDevice;
DeferFlushinga = (_QWORD *)*((_QWORD *)MapRegisterBase + 7);
if( ChildAdapter && ChildAdapter->ScatterGather )
{
v13 = WriteToDevice;
LOBYTE(v17) = WriteToDevice;
HalpDmaMapScatterTransferV2(
ChildAdapter,
Mdl,
(_HALP_DMA_TRANSLATION_ENTRY *)MapRegisterBase,
CurrentVa,
Length,
v17,
&LogicalAddressOut);
}
else
{
v13 = WriteToDevice;
LOBYTE(v17) = WriteToDevice;
HalpDmaMapContiguousTransferV2(
ChildAdapter,
Mdl,
(_HALP_DMA_TRANSLATION_ENTRY *)MapRegisterBase,
CurrentVa,
Length,
v17,
&LogicalAddressOut);
}
v15 = *(_DWORD *)Length;
if( !v12 )
{
if( !v13 )
{
if( ChildAdapter->IgnoreCount )
HalpDmaZeroMapBuffers(v14, DeferFlushinga, (unsigned __int16)CurrentVa & 0xFFF, v15);
}
KeAcquireInStackQueuedSpinLock(&ChildAdapter->MasterAdapter->AdapterObject.SpinLock, &LockHandle);
LOBYTE(v16) = v13;
(*(void(__fastcall **)(void *, _MDL *, __int64, VOID *, _LARGE_INTEGER, unsigned int))(DmaDispatch + 40))(
ChildAdapter->ChannelAdapter,
Mdl,
v16,
CurrentVa,
LogicalAddressOut,
v15);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}
return LogicalAddressOut;
}
return result;
}Referenced by:
IoMapTransferInternal