ViCopyBackModifiedBuffer

NTSTATUS __stdcall ViCopyBackModifiedBuffer(MDL *Mdl, PVOID BufferVa, PVOID Source, PVOID Original, UINT64 Length){
  UINT64 v5; 
  SIZE_T v10; 
  _BYTE *v11; 
  UINT64 v12; 
  UINT8 *v13; 
  SIZE_T i; 
  _MDL *Next; 
  UINT64 v16; 
  char *v17; 
  UINT64 ByteCount; 
  UINT8 *MdlBufferSa; 
  UINT64 v20; 
  UINT64 v21; 
  UINT64 v22; 
  v5 = Length;
  if( !Length )
    return 0;
  v10 = RtlCompareMemory(Source, Original, Length);
  if( Length > v10 )
  {
    v11 = (char *)Original + Length - 1;
    do
    {
      if( v11[(_BYTE *)Source - (_BYTE *)Original] != *v11 )
        break;
      --v5;
      --v11;
    }
    while( v5 > v10 );
  }
  if( v5 == v10 )
    return 0;
  v12 = v5 - v10;
  v13 = (UINT8 *)Source + v10;
  for( i = LODWORD(Mdl->StartVa) + Mdl->ByteCount + Mdl->ByteOffset - (unsigned int)BufferVa; v10 >= i; i = Next->ByteCount )
  {
    Next = Mdl->Next;
    if( !Mdl->Next )
      break;
    v10 -= i;
    BufferVa = (char *)Next->StartVa + Next->ByteOffset;
    Mdl = Mdl->Next;
  }
  v16 = i - v10;
  v17 = (char *)BufferVa + v10;
  ByteCount = v12;
  if( Mdl->Next )
    ByteCount = v16;
  while( 1 )
  {
    MdlBufferSa = (UINT8 *)ViGetMdlBufferSa(Mdl, v17);
    if( !MdlBufferSa )
      break;
    if( !Mdl->Next )
    {
      memmove(MdlBufferSa, v13, v12);
      return 0;
    }
    v20 = v12;
    if( ByteCount <= v12 )
      v20 = ByteCount;
    memmove(MdlBufferSa, v13, v20);
    Mdl = Mdl->Next;
    v21 = v12;
    v22 = v12 - v20;
    v12 = 0i64;
    v13 += v20;
    v17 = (char *)Mdl->StartVa + Mdl->ByteOffset;
    ByteCount = Mdl->ByteCount;
    if( v20 <= v21 )
      v12 = v22;
    if( !v12 )
      return 0;
  }
  return -1073741823;
}

Referenced by:

ViFlushDoubleBuffer