stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1524回复:6

关于OpenEvent的小问题

楼主#
更多 发布于:2005-01-30 21:02
我通过deviceiocontrol命令driver建立了两个event对象.
退回到app后通过openEvent我可以打开他们.

可是当我推出app,并重新启动app后,发现第二次在app里做openevent的时候返回为空.请问这是为什么啊?

下面是我的app代码:
#include <stdio.h>
#include <string.h>

#define IOCTL_CREATE_BEE  CTL_CODE(FILE_DEVICE_SMARTCARD,3001,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define EVENT_EXE_RUN     L"STONE_EXE_RUN"
#define EVENT_EXE_RETURN  L"STONE_EXE_RETURN"

HANDLE          hDevice;
HANDLE          hEventExeRun;
HANDLE          hEventExeReturn;

BOOLEAN         result;
DWORD           ReturnBytes      = 0;
DWORD           errorCode;

void main(void)
{
    hDevice = CreateFile("\\\\.\\SCREADER0",
                              GENERIC_READ | GENERIC_WRITE,
                              0,
                              NULL,
                              OPEN_EXISTING,
                              FILE_ATTRIBUTE_NORMAL,
                              NULL
                              );
    DeviceIoControl (hDevice,
                     (DWORD)IOCTL_CREATE_BEE,
                     NULL,
                     0,
                     NULL,
                     0          &ReturnBytes,
                     0
                     );
           // event STONE_EXE_RUN and STONE_EXE_RETURN are created in kernel.
if(hDevice)
{
if(!CloseHandle(hDevice))
printf("fail to close device\n");
else
printf("map address got and handle closed\n")
}
///////////////////////////////

    hEventExeRun  = OpenEventW(EVENT_ALL_ACCESS, NULL, EVENT_EXE_RUN);
    if (hEventExeRun == NULL)
    {
       printf("EVENT_EXE_RUN has not been created by driver! Something wrong with driver.\n");
  getch();
       return;
}
    hEventExeReturn  = OpenEventW(EVENT_ALL_ACCESS, NULL, EVENT_EXE_RETURN);
    if (hEventExeReturn == NULL)
    {
       printf("EVENT_EXE_RETURN has not been created by driver! Something wrong with driver.\n");
  getch();
       return;
}
while(hEventExeRun != NULL)
{
WaitForSingleObject(hEventExeRun,INFINITE);

//do sth here.

result = ResetEvent(hEventExeRun);
if (result == FALSE)
{
printf("reset event -- EVENT_EXE_RUN failed!\n");
getch();
return;
}
result = SetEvent(hEventExeReturn);// to make the driver goes on
if (result == FALSE)
{
printf("set event -- EVENT_EXE_RETURN failed!\n");
getch();
return;
}
}
}
我是在它走循环的时候退出的,第二次启动它就发现driver那端两个event不为空,从deviceiocontrol退到app时发现STONE_EXE_RUN为空了.莫名中......
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-31 10:09
你在用户空间调用DeviceIoControl去生成事件,在内核中应该是调用的IoCreateNotificationEvent,它生成或者打开一个事件。
你如果打开了一个事件,而没有关闭,那它作为一个内核对象是一直存在的,直到被关闭。
从deviceiocontrol退到app时发现STONE_EXE_RUN为空了,是什么意思,你有没有在什么地方关闭它?
在交流中学习。。。
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-31 11:47
你在用户空间调用DeviceIoControl去生成事件,在内核中应该是调用的IoCreateNotificationEvent,它生成或者打开一个事件。
你如果打开了一个事件,而没有关闭,那它作为一个内核对象是一直存在的,直到被关闭。
从deviceiocontrol退到app时发现STONE_EXE_RUN为空了,是什么意思,你有没有在什么地方关闭它?


应该和那个没关系吧。
我试过了,好像是循环里出的问题。
我去掉循环那段,然后多次启动这个app发现openEvent是返回都不未空。
原先在那个循环里关闭app,第二次启动后openEvent就返回空了。
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-31 14:13
在内核空间生成的事件(Kernel Mode Event)在用户空间是不能Reset的,应该就是这个原因。
在交流中学习。。。
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-31 16:10
在内核空间生成的事件(Kernel Mode Event)在用户空间是不能Reset的,应该就是这个原因。


不能reset?
那setEvent()呢?
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-31 17:29
应该也一样的。
如果需要在内核向用户空间传递一个事件,可以在内核create event对象,在产生事件的例程里,连续调用KeSetEvent、KeReset,在用户空间通过循环wait进行处理。
在交流中学习。。。
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-31 21:37
应该也一样的。
如果需要在内核向用户空间传递一个事件,可以在内核create event对象,在产生事件的例程里,连续调用KeSetEvent、KeReset,在用户空间通过循环wait进行处理。


您好像说的不太对,我试过,在app里进行reset和set都没有问题的.
我想是不是因为在app循环时强行推出产生的影响啊?
游客

返回顶部