本论坛为只读模式,仅供查阅,不能注册新用户,不能发帖/回帖,有问题可发邮件 xikug.xp (^) gmail.com
查看: 3117|回复: 3

求助KeWaitForSingleObject [复制链接]

Rank: 1

发表于 2010-6-15 23:48:08 |显示全部楼层
我写的一个监控的过滤函数中出了个奇怪的问题。
NTSTATUS FakeNtLoadDriver( __in PUNICODE_STRING DriverServiceName)
{

    memcpy(g_DeviceExtension->ShareMemoryInfo.pSharedMemeory,DriverServiceName->Buffer,256);
    KeSetEvent(g_DeviceExtension->DriverMonitorInfo.pNotifyEvent,0,false);
    KeWaitForSingleObject(g_DeviceExtension->DriverMonitorInfo.pNotifyEvent,Executive,KernelMode,false,NULL);
    if (!strcmp((PCHAR)g_DeviceExtension->ShareMemoryInfo.pSharedMemeory,"STOP"))
    {
        return STATUS_ACCESS_DENIED;
    }
    return ((NTLOADDRIVER)pSysCallFilterInfo->SavedSSDTTable[97])(DriverServiceName);
}
我在过滤函数中KsSetEvent置应用层传来的事件,然后应用层收到事件后判断再SetEvent置这个事件激活内核等待,但是问题出现了,应用层收到内核事件后,激活内核等待线程,可以激活的线程并不从KeWaitForSingleObject后执行而是又重入了这个函数,这是怎么回事?
我看到Windbg 打印了个信息是什么,work thread exit and Apcs is disabled......跟这个有关么?
希望大家帮下我,弄了半天了不懂为什么额....先谢谢各位了!

Rank: 1

发表于 2010-6-16 03:04:55 |显示全部楼层
LONG
  KeSetEvent(
    IN PRKEVENT  Event,
    IN KPRIORITY  Increment,
    IN BOOLEAN  Wait
    );

Wait
Specifies whether the call to KeSetEvent is to be followed immediately by a call to one of the KeWaitXxx routines.

KeSetEvent(g_DeviceExtension->DriverMonitorInfo.pNotifyEvent,0,false);

Are you a Liar?

Rank: 1

发表于 2010-6-16 13:12:43 |显示全部楼层
Liar? ....没必要吧,我是在windbg中一步步调试跟出的结果,我下的FakeNtLoadDriver的断点,应用层程序也是单步调试的,我先是单步过了驱动的KeWaitForSingleObject然后running了,然后在我应用程序单步过了SetEvent,结果windbg是响应了,但是停在FakeNtLoadDriver的断点上。具体就是这样,不知道我表述的详细不,这是什么原因啊?

Rank: 1

发表于 2010-6-16 13:25:49 |显示全部楼层
额好像是我的疏忽....不好意思,忘在KeWaitForSingleObject下断点了。可是为什么加载驱动调用了两次NtLoadDriver?跟过了KeWaitForSingleObject后面,F5又断到NtLoadDriver了,而且都是加载的同一个驱动呀
您需要登录后才可以回帖 登录 | 立即加入

Archiver|手机版|第8个男人 - 论坛为只读模式,仅供查阅

GMT+8, 2019-6-26 15:04 , Processed in 0.021862 second(s), 8 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部