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