HalpFlushMapBuffers

void __fastcall HalpFlushMapBuffers(__int64 a1, __int64 a2, __int64 a3, unsigned int a4, char a5, char a6){
  int AdapterCacheAlignment; 
  __int64 v9; 
  __int16 v10; 
  unsigned int v11; 
  unsigned __int64 v12; 
  UINT64 v13; 
  unsigned int v14; 
  __int64 v15; 
  char v16; 
  unsigned __int8 CurrentIrql; 
  unsigned __int8 v18; 
  unsigned int v19; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  unsigned int v22; 
  unsigned __int8 v23; 
  __int64 v24; 
  unsigned int v25; 
  unsigned __int64 v26; 
  unsigned int v27; 
  unsigned int v28; 
  unsigned __int8 v29; 
  __int64 v30; 
  unsigned int v31; 
  int v33; 
  AdapterCacheAlignment = HalpDmaGetAdapterCacheAlignment(a1);
  v11 = v10 & 0xFFF;
  v33 = AdapterCacheAlignment;
  v12 = 0i64;
  v13 = a4;
  v14 = v11;
  v15 = v9;
  v16 = 1;
  CurrentIrql = KeGetCurrentIrql();
  v18 = CurrentIrql;
  if( a4 )
  {
    while( 1 )
    {
      v19 = v13;
      if( (unsigned int)v13 >= 4096 - v14 )
        v19 = 4096 - v14;
      v20 = *(_QWORD *)(v15 + 48) & 0xFFFFFFFFFFFFF000ui64;
      if( v12 )
      {
        if( v20 != v12 + 4096 )
          break;
      }
      v15 = *(_QWORD *)(v15 + 8);
      v12 = v20;
      v14 = 0;
      v13 = (unsigned int)v13 - v19;
      if( !(_DWORD)v13 )
        goto LABEL_9;
    }
    v16 = 0;
LABEL_9:
    v9 = a3;
  }
  if( v16 )
  {
    v21 = (*(_QWORD *)(v9 + 48) & 0xFFFFFFFFFFFFF000ui64) + v11;
    if( !a5 && !*(_BYTE *)(a1 + 437) )
    {
      v13 = (unsigned int)~(AdapterCacheAlignment - 1);
      v22 = v21 - (v13 & v21);
      v21 -= v22;
      a4 = v13 & (AdapterCacheAlignment + v22 + a4 - 1);
    }
    if( CurrentIrql <= 2u )
    {
      KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 304), v13);
      v18 = v23;
    }
    v24 = *(_QWORD *)(a1 + 296);
    *(_QWORD *)v24 = 0i64;
    *(_WORD *)(v24 + 10) = 0;
    *(_QWORD *)(v24 + 32) = v21 & 0xFFFFFFFFFFFFF000ui64;
    *(_WORD *)(v24 + 8) = 8 * ((((v21 & 0xFFF) + 4095 + a4) >> 12) + 6);
    *(_DWORD *)(v24 + 44) = v21 & 0xFFF;
    *(_DWORD *)(v24 + 40) = a4;
    MmBuildMdlForNonPagedPool(*(_MDL **)(a1 + 296));
    if( !a6 )
      KeFlushIoBuffers(*(_MDL **)(a1 + 296), a5 == 0, 1u);
    if( CurrentIrql <= 2u )
    {
      KxReleaseSpinLock((UINT64 *)(a1 + 304));
      __writecr8(v18);
    }
  }
  else
  {
    for( ; a4; a4 -= v31 )
    {
      v25 = a4;
      if( a4 >= 4096 - v11 )
        v25 = 4096 - v11;
      v31 = v25;
      v26 = (*(_QWORD *)(v9 + 48) & 0xFFFFFFFFFFFFF000ui64) + v11;
      v27 = v25;
      if( !a5 && !*(_BYTE *)(a1 + 437) )
      {
        v13 = (unsigned int)~(v33 - 1);
        v28 = v26 - (v13 & v26);
        v26 -= v28;
        v27 = v13 & (v25 + v33 + v28 - 1);
      }
      if( CurrentIrql <= 2u )
      {
        KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 304), v13);
        v18 = v29;
      }
      v30 = *(_QWORD *)(a1 + 296);
      *(_QWORD *)v30 = 0i64;
      *(_WORD *)(v30 + 10) = 0;
      *(_QWORD *)(v30 + 32) = v26 & 0xFFFFFFFFFFFFF000ui64;
      *(_WORD *)(v30 + 8) = 8 * ((((v26 & 0xFFF) + 4095 + v27) >> 12) + 6);
      *(_DWORD *)(v30 + 44) = v26 & 0xFFF;
      *(_DWORD *)(v30 + 40) = v27;
      MmBuildMdlForNonPagedPool(*(_MDL **)(a1 + 296));
      if( !a6 )
        KeFlushIoBuffers(*(_MDL **)(a1 + 296), a5 == 0, 1u);
      if( CurrentIrql <= 2u )
      {
        KxReleaseSpinLock((UINT64 *)(a1 + 304));
        __writecr8(v18);
      }
      v11 = 0;
      v9 = *(_QWORD *)(a3 + 8);
      a3 = v9;
    }
  }
}

Referenced by:

HalpDmaSyncMapBuffers