gh0st源码阅读--监控代码


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();

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值