void UIScreenItem::DrawNextScreenDiff()
{
bool bIsReDraw = false;
int nHeadLength = 1 + 1 + sizeof(POINT) + sizeof(BYTE);
LPVOID lpFirstScreen = m_lpScreenDIB;
LPVOID lpNextScreen = m_pContext->m_DeCompressionBuffer.GetBuffer(nHeadLength);
DWORD dwBytes = m_pContext->m_DeCompressionBuffer.GetBufferLen() - nHeadLength;
if (dwBytes > 0)
bIsReDraw = true;
//这段落代码就是不停的迭代,首先是偏移量,然后是长度,以此类推,直到把所有的数据读完。
__asm
{
mov ebx, [dwBytes]
mov esi, [lpNextScreen]
jmp CopyEnd
CopyNextBlock:
mov edi, [lpFirstScreen]
lodsd // 把lpNextScreen的第一个双字节,放到eax中,就是DIB中改变区域的偏移
add edi, eax <span style="white-space:pre"> </span>// lpFirstScreen偏移eax
lodsd // 把lpNextScreen的下一个双字节,放到eax中, 就是改变区域的大小
mov ecx, eax
sub ebx, 8 // ebx 减去 两个dword
sub ebx, ecx // ebx 减去DIB数据的大小
rep movsb // 拷贝数据,根所ecx中的内容来决定循环后的次数,这里应当是拷贝到edx所指的地方
CopyEnd:
cmp ebx, 0 // 是否写入完毕,ebx中的是所有的字节数
jnz CopyNextBlock
}
if (bIsReDraw)
Invalidate();
}
gh0st源码阅读--监控代码
最新推荐文章于 2021-11-09 21:17:36 发布