HalpDmaCommitScatterMapBuffers
_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaCommitScatterMapBuffers(
_HALP_DMA_ADAPTER_OBJECT *Adapter,
VOID *VirtualAddress,
UINT64 PhysicalAddress,
UINT64 PageCount,
_MDL *Mdl){
_MDL *v8;
unsigned __int64 v9;
_HALP_DMA_TRANSLATION_ENTRY *result;
_HALP_DMA_TRANSLATION_ENTRY *v11;
unsigned __int8 IsMasterAdapter;
_HALP_DMA_TRANSLATION_ENTRY *v13;
__int64 v14;
UINT64 v15;
_MDL *Next;
unsigned __int64 v17;
_HALP_DMA_TRANSLATION_ENTRY *v18;
_KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
if( Mdl )
{
v8 = Mdl + 1;
v9 = (((LODWORD(Mdl->StartVa) + Mdl->ByteOffset) & 0xFFF) + (unsigned __int64)Mdl->ByteCount + 4095) >> 12;
}
else
{
LODWORD(v9) = PageCount;
v8 = 0i64;
}
result = HalpDmaGetTranslationEntries(Adapter, HalpDmaNonContiguousMapBuffer, (unsigned int)v9);
v11 = result;
if( result )
{
IsMasterAdapter = Adapter->IsMasterAdapter;
v13 = result;
if( (_DWORD)v9 )
{
v14 = (unsigned int)v9;
do
{
v15 = PhysicalAddress;
if( Mdl )
{
Next = v8->Next;
v8 = (_MDL *)((char *)v8 + 8);
v15 = (_QWORD)Next << 12;
}
else
{
PhysicalAddress += 4096i64;
}
v13->PhysicalAddress = v15;
if( VirtualAddress )
{
v17 = (unsigned __int64)VirtualAddress | (__int64)v13->u.VirtualAddress & 0xFFF;
VirtualAddress = (char *)VirtualAddress + 4096;
}
else
{
v17 = (unsigned __int64)v13->u.VirtualAddress;
}
v13->u.VirtualAddress = (void *)((4i64 * (IsMasterAdapter & 1)) | v17 & 0xFFFFFFFFFFFFFFFAui64 | IsMasterAdapter & 1 | 0xA);
v13 = v13->Next;
--v14;
}
while( v14 );
}
KeAcquireInStackQueuedSpinLock(&Adapter->SpinLock, &LockHandle);
v18 = HalpDmaPrependTranslations(v11, (_HALP_DMA_TRANSLATION_ENTRY *)(unsigned int)v9);
Adapter->NumberOfFreeScatterBuffers += v9;
Adapter->ScatterBufferListHead = v18;
if( IsMasterAdapter )
LODWORD(Adapter[1].ContiguousTranslationEnd.Buffer) += v9;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
return v11;
}
return result;
}Referenced by:
HalpDmaAllocateLocalScatterPool
HalpDmaGrowScatterMapBuffers