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