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