阅读:1524回复:6
关于OpenEvent的小问题
我通过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为空了.莫名中...... |
|
沙发#
发布于:2005-01-31 10:09
你在用户空间调用DeviceIoControl去生成事件,在内核中应该是调用的IoCreateNotificationEvent,它生成或者打开一个事件。
你如果打开了一个事件,而没有关闭,那它作为一个内核对象是一直存在的,直到被关闭。 从deviceiocontrol退到app时发现STONE_EXE_RUN为空了,是什么意思,你有没有在什么地方关闭它? |
|
|
板凳#
发布于:2005-01-31 11:47
你在用户空间调用DeviceIoControl去生成事件,在内核中应该是调用的IoCreateNotificationEvent,它生成或者打开一个事件。 应该和那个没关系吧。 我试过了,好像是循环里出的问题。 我去掉循环那段,然后多次启动这个app发现openEvent是返回都不未空。 原先在那个循环里关闭app,第二次启动后openEvent就返回空了。 |
|
地板#
发布于:2005-01-31 14:13
在内核空间生成的事件(Kernel Mode Event)在用户空间是不能Reset的,应该就是这个原因。
|
|
|
地下室#
发布于:2005-01-31 16:10
在内核空间生成的事件(Kernel Mode Event)在用户空间是不能Reset的,应该就是这个原因。 不能reset? 那setEvent()呢? |
|
5楼#
发布于:2005-01-31 17:29
应该也一样的。
如果需要在内核向用户空间传递一个事件,可以在内核create event对象,在产生事件的例程里,连续调用KeSetEvent、KeReset,在用户空间通过循环wait进行处理。 |
|
|
6楼#
发布于:2005-01-31 21:37
应该也一样的。 您好像说的不太对,我试过,在app里进行reset和set都没有问题的. 我想是不是因为在app循环时强行推出产生的影响啊? |
|