HalpFlushMapBuffers
VOID __stdcall HalpFlushMapBuffers(
_ADAPTER_OBJECT *ChildAdapter,
VOID *MdlAddress,
_HALP_DMA_TRANSLATION_ENTRY *TranslationBase,
UINT64 Length,
INT64 WriteToDevice,
INT64 DeferFlushing){
unsigned int v6;
NTSTATUS AdapterCacheAlignment;
_HALP_DMA_TRANSLATION_ENTRY *Next;
__int16 v10;
unsigned int v11;
unsigned __int64 v12;
unsigned int v13;
unsigned int v14;
_HALP_DMA_TRANSLATION_ENTRY *v15;
char v16;
unsigned __int8 CurrentIrql;
unsigned __int8 v18;
unsigned int v19;
unsigned __int64 v20;
unsigned __int64 v21;
int v22;
unsigned int v23;
_MDL *MapRegisterMdl;
unsigned int v25;
unsigned __int64 v26;
unsigned int v27;
int v28;
unsigned int v29;
_MDL *v30;
unsigned int v31;
NTSTATUS v33;
v6 = Length;
AdapterCacheAlignment = HalpDmaGetAdapterCacheAlignment(ChildAdapter);
v11 = v10 & 0xFFF;
v33 = AdapterCacheAlignment;
v12 = 0i64;
v13 = v6;
v14 = v11;
v15 = Next;
v16 = 1;
CurrentIrql = KeGetCurrentIrql();
v18 = CurrentIrql;
if( v6 )
{
while( 1 )
{
v19 = v13;
if( v13 >= 4096 - v14 )
v19 = 4096 - v14;
v20 = (unsigned __int64)v15->u.VirtualAddress & 0xFFFFFFFFFFFFF000ui64;
if( v12 )
{
if( v20 != v12 + 4096 )
break;
}
v15 = v15->Next;
v12 = v20;
v14 = 0;
v13 -= v19;
if( !v13 )
goto LABEL_9;
}
v16 = 0;
LABEL_9:
Next = TranslationBase;
}
if( v16 )
{
v21 = ((unsigned __int64)Next->u.VirtualAddress & 0xFFFFFFFFFFFFF000ui64) + v11;
if( !(_BYTE)WriteToDevice && !ChildAdapter->CacheCoherent )
{
v22 = ~(AdapterCacheAlignment - 1);
v23 = v21 - (v22 & v21);
v21 -= v23;
v6 = v22 & (AdapterCacheAlignment + v23 + v6 - 1);
}
if( CurrentIrql <= 2u )
v18 = KeAcquireSpinLockRaiseToDpc(&ChildAdapter->MapRegisterMdlLock);
MapRegisterMdl = ChildAdapter->MapRegisterMdl;
MapRegisterMdl->Next = 0i64;
MapRegisterMdl->MdlFlags = 0;
MapRegisterMdl->StartVa = (void *)(v21 & 0xFFFFFFFFFFFFF000ui64);
MapRegisterMdl->Size = 8 * ((((v21 & 0xFFF) + 4095 + v6) >> 12) + 6);
MapRegisterMdl->ByteOffset = v21 & 0xFFF;
MapRegisterMdl->ByteCount = v6;
MmBuildMdlForNonPagedPool(ChildAdapter->MapRegisterMdl);
if( !(_BYTE)DeferFlushing )
KeFlushIoBuffers(ChildAdapter->MapRegisterMdl, (_BYTE)WriteToDevice == 0, 1u);
if( CurrentIrql <= 2u )
{
KxReleaseSpinLock(&ChildAdapter->MapRegisterMdlLock);
__writecr8(v18);
}
}
else
{
for( ; v6; v6 -= v31 )
{
v25 = v6;
if( v6 >= 4096 - v11 )
v25 = 4096 - v11;
v31 = v25;
v26 = ((unsigned __int64)Next->u.VirtualAddress & 0xFFFFFFFFFFFFF000ui64) + v11;
v27 = v25;
if( !(_BYTE)WriteToDevice && !ChildAdapter->CacheCoherent )
{
v28 = ~(v33 - 1);
v29 = v26 - (v28 & v26);
v26 -= v29;
v27 = v28 & (v25 + v33 + v29 - 1);
}
if( CurrentIrql <= 2u )
v18 = KeAcquireSpinLockRaiseToDpc(&ChildAdapter->MapRegisterMdlLock);
v30 = ChildAdapter->MapRegisterMdl;
v30->Next = 0i64;
v30->MdlFlags = 0;
v30->StartVa = (void *)(v26 & 0xFFFFFFFFFFFFF000ui64);
v30->Size = 8 * ((((v26 & 0xFFF) + 4095 + v27) >> 12) + 6);
v30->ByteOffset = v26 & 0xFFF;
v30->ByteCount = v27;
MmBuildMdlForNonPagedPool(ChildAdapter->MapRegisterMdl);
if( !(_BYTE)DeferFlushing )
KeFlushIoBuffers(ChildAdapter->MapRegisterMdl, (_BYTE)WriteToDevice == 0, 1u);
if( CurrentIrql <= 2u )
{
KxReleaseSpinLock(&ChildAdapter->MapRegisterMdlLock);
__writecr8(v18);
}
v11 = 0;
Next = TranslationBase->Next;
TranslationBase = Next;
}
}
}Referenced by:
HalpDmaSyncMapBuffers