关于设置事件对象,这个用DDK怎么写?
我以前用DS写的WIN2000下的ISA卡的驱动,写成NT式的,运行挺正常的,但在关机的时候每次都蓝屏,没办法,现在想改用DDK来写,但在这个地方遇到了麻烦:
我以前在DEVICEIOCTL里应用层用缓冲方式传递事件对象到驱动层,DS是这么写的:
HANDLE hEvent=*(HANDLE*)I.IoctlBuffer();
m_pEvent=new(NonPagedPool)KEvent(hEvent);
其中m_pEvent是类KEvent的一个对象。
现在写成DDK形式的:第一行写成以下形式:
HANDLE hEvent=*(HANDLE*)Irp->AssociatedIrp.SystemBuffer;
但第二行,怎么写?
问题点数:0、回复次数:6Top
1 楼ArthurTu(猫王)回复于 2003-12-03 20:15:46 得分 0
ObReferenceObjectByHandle
Top
2 楼ilovedrv(zzy)回复于 2003-12-04 09:06:52 得分 0
在应用中创建事件,然后通过ioctl传给驱动,驱动中ObReferenceObjectByHandle来引用该事件对象。
这样应用和驱动中都可以检查和修改事件状态。
应用程序:
HANDLE m_hCommEvent = CreateEvent(NULL,
false,
false,
NULL);
// download event object to device driver,
// m_hCommDevice is the device object
DeviceIoControl(m_hCommDevice,
IO_REFERENCE_EVENT,
(LPVOID) m_hCommEvent,
0,
NULL,
0,
dwReturn,
NULL);
在需要的地方等待
while(true)
{
WaitForSingleObject(m_hCommEvent, INFINITE);
// After this function, the event is set to
// non signaled. Get information and deal with it.
}
驱动程序:
case IO_REFERENCE_EVENT:
hEvent = (HANDLE) irpStack->
Parameters.DeviceIoControl.Type3InputBuffer;
status = ObReferenceObjectByHandle(hEvent,
GENERIC_ALL,
NULL,
KernelMode,
&gpEventObject,
&objHandleInfo);
the gpEventObject is a PRKEVENT object, so we can use KeEventXXX and KeWaitForXXX to operate it.
当事件发生时,置信号
KeSetEvent(gpEventObject, 0, FALSE);
当不再需要事件对象时:
case IO_DEREFERENCE_EVENT:
if(gpEventObject)
ObDereferenceObject(gpEventObject);Top
3 楼ArthurTu(猫王)回复于 2003-12-04 15:22:31 得分 0
DeviceIoControl(m_hCommDevice,
IO_REFERENCE_EVENT,
(LPVOID) m_hCommEvent,
0, //0? should be sizeof(HANDLE)
NULL,
0,
dwReturn, // should be &dwReturn, if it's not a pointer
NULL);
???
Top
4 楼ilovedrv(zzy)回复于 2003-12-04 16:08:16 得分 0
to ArthurTu(猫王)
惭愧,我也是从别处文档直接拷贝,没有细看。Top
5 楼anothervip(Never ending... ...)回复于 2003-12-06 14:20:18 得分 0
学习Top
6 楼ygangy(还是多去海边走走舒服)回复于 2004-01-04 12:04:20 得分 0
upTop




