首页
社区
课程
招聘
[求助]关于r0和r3通信和同步的问题
发表于: 2016-4-7 16:08 6846

[求助]关于r0和r3通信和同步的问题

2016-4-7 16:08
6846
比如我在ring0注册了一个PsSetxxx(LoadImage,CreateThread,CreateProcess)NotifyRoutine回调之后,一旦回调被调用,我就像某数字一样在ring3弹个MessageBox告知你某模块加载了、某线程创建了。。。

目前我的思路是用event和ring3通信
驱动层:

VOID LoadImageCallback(...)
{

LoadImageNotify_Callback *buffer = (LoadImage_Callback *)LoadImageNotify.SharedMem;//ring0申请的共享内存,在DispatchIoctl中MmMapLockedPagesSpecifyCache获取其UserMode的地址丢给ring3
		buffer->ProcessId = (__int32)ProcessId;//就传一个PID
			KeSetEvent(LoadImageNotify.obEvent, 0, FALSE);//LoadImageNotify.obEvent是ring3传过来并ObReferenceObjectByHandle得到的

}



应用层:
void LoadImageThread(void)
{
	DWORD MyProcessId = GetCurrentProcessId();
	while (!m_StopThread)
	{
		WaitForSingleObject(m_hLoadImageNotifyEvent, INFINITE);
		DWORD dwProcessId = m_LoadImageNotify->ProcessId;
		if(dwProcessId != MyProcessId)
		{
			MessageBox(NULL, L"load image", L"warning", MB_YESNO);
		}
	}
}

m_hLoadImageNotifyEvent来自ring3 CreateEvent(NULL, FALSE, FALSE, NULL);

1、目前这种方式确实能够监视到dll加载、进程创建等行为

2、如果碰到同时加载多个dll的情况下(比如CreateThread x N,里面各种LoadLibrary),是不是会出现回调同时被调用n次,导致共享内存被修改n次(因为没有加锁),导致应用层n次取到同样的数据?

3、为了防止2的情况,我是不是应该在回调开始的地方KeWaitForSingleObject某个event一下,直到上一个数据被应用层取完才允许他继续运行?

4、如果我用一个新的event实现了3的思路,那么万一应用层正好在读取数据(比如m_LoadImageNotify->ProcessId)的时候意外退出了,没有给那个新的event设置信号告知驱动我已读完数据,那驱动再下一次执行loadimage回调的时候,岂不是永远阻塞在最开头的KeWaitForSingleObject上了?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 35
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
可以通过互斥信号量的方式解决这一问题。
2017-9-5 17:27
0
雪    币: 174
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
大表哥出版本吗?
2019-11-19 02:38
0
游客
登录 | 注册 方可回帖
返回
//