ViCopyBackModifiedBuffer

NTSTATUS __stdcall ViCopyBackModifiedBuffer(PVOID Mdl, VOID *BufferVa, VOID *Source, VOID *Original, _SIZE_T Length){
  _SIZE_T *v5; 
  _SIZE_T *v10; 
  _BYTE *v11; 
  unsigned __int64 v12; 
  char *v13; 
  unsigned __int64 i; 
  _QWORD *v15; 
  unsigned __int64 v16; 
  char *v17; 
  unsigned __int64 v18; 
  VOID *MdlBufferSa; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 

  v5 = *(_SIZE_T **)&Length;
  if( !*(_QWORD *)&Length )
    return 0;
  v10 = RtlCompareMemory(Source, Original, Length);
  if( *(_QWORD *)&Length > (unsigned __int64)v10 )
  {
    v11 = (char *)Original + *(_QWORD *)&Length - 1;
    do
    {
      if( v11[(_BYTE *)Source - (_BYTE *)Original] != *v11 )
        break;
      v5 = (_SIZE_T *)((char *)v5 - 1);
      --v11;
    }
    while( v5 > v10 );
  }
  if( v5 == v10 )
    return 0;
  v12 = (char *)v5 - (char *)v10;
  v13 = (char *)Source + (_QWORD)v10;
  for( i = (unsigned int)(*((_DWORD *)Mdl + 8) + *((_DWORD *)Mdl + 10) + *((_DWORD *)Mdl + 11) - (_DWORD)BufferVa);
        (unsigned __int64)v10 >= i;
        i = *((unsigned int *)v15 + 10) )
  {
    v15 = *(_QWORD **)Mdl;
    if( !*(_QWORD *)Mdl )
      break;
    v10 = (_SIZE_T *)((char *)v10 - i);
    BufferVa = (VOID *)(v15[4] + *((unsigned int *)v15 + 11));
    Mdl = *(PVOID *)Mdl;
  }
  v16 = i - (_QWORD)v10;
  v17 = (char *)BufferVa + (_QWORD)v10;
  v18 = v12;
  if( *(_QWORD *)Mdl )
    v18 = v16;
  while( 1 )
  {
    MdlBufferSa = ViGetMdlBufferSa((ULONG_PTR)Mdl, v17);
    if( !MdlBufferSa )
      break;
    if( !*(_QWORD *)Mdl )
    {
      memmove(MdlBufferSa, v13, v12);
      return 0;
    }
    v20 = v12;
    if( v18 <= v12 )
      v20 = v18;
    memmove(MdlBufferSa, v13, v20);
    Mdl = *(PVOID *)Mdl;
    v21 = v12;
    v22 = v12 - v20;
    v12 = 0i64;
    v13 += v20;
    v17 = (char *)(*((_QWORD *)Mdl + 4) + *((unsigned int *)Mdl + 11));
    v18 = *((unsigned int *)Mdl + 10);
    if( v20 <= v21 )
      v12 = v22;
    if( !v12 )
      return 0;
  }
  return -1073741823;
}

Referenced by:

ViFlushDoubleBuffer