阅读:1743回复:11
wdm之间的通信
如果两个WDM DRIVER不相关,不在同一个栈中,它们之间能否相互加载,相互通信。如何做?
先谢了! |
|
最新喜欢:![]() |
沙发#
发布于:2002-08-21 12:51
IoCallDriver
|
|
板凳#
发布于:2002-08-21 13:33
Zw系列例程
就与Win32应用访问驱动差不多 |
|
|
地板#
发布于:2002-08-21 23:34
DDK里有很多函数只能在NT内核里使用,98下不支持,很郁闷
|
|
地下室#
发布于:2002-08-25 00:14
感谢各位。
这两天没来。 请问如果两个程序不相关,如何使用IoCalldriver如何得到另个DRIVER的Object? ZwCreate()还需要看看。 以前在VXD中可以输出一个服务,供其他程序调用,不知在WDM中还有这种办法吗? 对于各种办法,哪个效率高?我的两个驱动相互通信很频繁,但数据不多。 另外, 问题是两部分,如何在驱动中,动态加载另个驱动? |
|
5楼#
发布于:2002-08-25 07:29
Maybe you can use PnP callback with custom interface to synchronize load between two drivers. Refer to IoRegisterPlugPlayNotification / IoReportTargetDeviceChange
|
|
|
6楼#
发布于:2002-10-06 02:24
大家有用named pipe file system吗?
看看NPFS.SYS,如果你的project能用上, 应该是比较简单和安全的 |
|
7楼#
发布于:2002-10-06 09:20
1. 2个WDM驱动程序在AddDevice例程中分别调用IoCreateDevice创建各自的SymbolicName。
2. 在合适的时机调用IoGetDeviceObjectPointer得到对方的DeviceObject的指针。 3. 在需要进行通讯的时候,调用IoBuildDeviceIoControlRequest 或者IoAllocateIrp创建一个IRP,然后调用IoCallDriver进行通讯。 |
|
|
8楼#
发布于:2002-12-10 00:27
ds
|
|
9楼#
发布于:2004-10-12 13:38
IoGetDeviceObjectPointer,这个函数我用过,就是没成功,返回值也不是正常的stat返回值(ddk文档中没有说明)
但是用zwcreatefile.....iogetre***device,成功了, 但是我还是觉得使用IoGetDeviceObjectPointer要好些,有没有谁贴一段IoGetDeviceObjectPointer函数的代码? |
|
10楼#
发布于:2004-10-12 16:57
可以在一个驱动中直接导出接口供另一个驱动使用,在需要导出的函数前面加上__declspec(dllexport)即可,然后在另一个驱动中引入该lib文件...
|
|
11楼#
发布于:2004-10-14 00:12
#define CALLEE_NAME _T"CALLEE"
#define IOCTL_INTER_WDM xxxx // defined by yourself, and share definition between caller and callee DWORD inBuffer, outBuffer; // can be any type UNICODE_STRING uniNtNameString; PIRP pIrp; KEVENT event; IO_STATUS_BLOCK IoStatusBlock; PDEVICE_OBJECT pDevObj; PFILE_OBJECT pCallee = NULL; // ptr to the Callee file object RtlInitUnicodeString( &uniNtNameString, CALLEE_NAME); KeInitializeEvent( &event, NotificationEvent, FALSE ); // Try to open Callee's device object. status = IoGetDeviceObjectPointer( &uniNtNameString, FILE_ALL_ACCESS, &pCallee, // File Object &pDevObj); // Device Object if( !NT_SUCCESS( status ) ) { return FALSE; } // Build irp to send to Callee pIrp = IoBuildDeviceIoControlRequest( IOCTL_INTER_WDM, pDevObj, &inBuffer, sizeof( inBuffer ), &outBuffer, sizeof( outBuffer ), TRUE, &event, &IoStatusBlock ); if( !pIrp ) { ObDereferenceObject( pCallee ); return FALSE; } status = IoCallDriver( pDevObj, pIrp ); if( NT_SUCCESS( status ) ) { // Wait for IRP to complete status = KeWaitForSingleObject( &event, Executive, KernelMode, FALSE, NULL ); } if( !NT_SUCCESS( status ) ) { ObDereferenceObject( pCallee ); return FALSE; } ObDereferenceObject( pCallee ); |
|