tjm
tjm
驱动小牛
驱动小牛
  • 注册日期2002-05-18
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1745回复:11

wdm之间的通信

楼主#
更多 发布于:2002-08-21 12:45
如果两个WDM DRIVER不相关,不在同一个栈中,它们之间能否相互加载,相互通信。如何做?
先谢了!

最新喜欢:

juventusjuvent...
xqchen
驱动牛犊
驱动牛犊
  • 注册日期2001-09-07
  • 最后登录2004-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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 );
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-10-12 16:57
可以在一个驱动中直接导出接口供另一个驱动使用,在需要导出的函数前面加上__declspec(dllexport)即可,然后在另一个驱动中引入该lib文件...
Evilly
驱动牛犊
驱动牛犊
  • 注册日期2004-07-09
  • 最后登录2005-04-07
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-10-12 13:38
IoGetDeviceObjectPointer,这个函数我用过,就是没成功,返回值也不是正常的stat返回值(ddk文档中没有说明)
但是用zwcreatefile.....iogetre***device,成功了,

但是我还是觉得使用IoGetDeviceObjectPointer要好些,有没有谁贴一段IoGetDeviceObjectPointer函数的代码?
tjm
tjm
驱动小牛
驱动小牛
  • 注册日期2002-05-18
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-10 00:27
ds
archim
驱动牛犊
驱动牛犊
  • 注册日期2001-08-18
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-06 09:20
1.  2个WDM驱动程序在AddDevice例程中分别调用IoCreateDevice创建各自的SymbolicName。

2.  在合适的时机调用IoGetDeviceObjectPointer得到对方的DeviceObject的指针。

3.  在需要进行通讯的时候,调用IoBuildDeviceIoControlRequest
或者IoAllocateIrp创建一个IRP,然后调用IoCallDriver进行通讯。
archim
nshao
驱动牛犊
驱动牛犊
  • 注册日期2002-06-29
  • 最后登录2004-09-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-06 02:24
大家有用named pipe file system吗?
看看NPFS.SYS,如果你的project能用上, 应该是比较简单和安全的
WindThruEars
驱动老牛
驱动老牛
  • 注册日期2002-11-17
  • 最后登录2004-07-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-08-25 07:29
Maybe you can use PnP callback with custom interface to synchronize load between two drivers. Refer to IoRegisterPlugPlayNotification / IoReportTargetDeviceChange
我是假耳朵
tjm
tjm
驱动小牛
驱动小牛
  • 注册日期2002-05-18
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-08-25 00:14
感谢各位。
这两天没来。
请问如果两个程序不相关,如何使用IoCalldriver如何得到另个DRIVER的Object?
ZwCreate()还需要看看。
以前在VXD中可以输出一个服务,供其他程序调用,不知在WDM中还有这种办法吗?
对于各种办法,哪个效率高?我的两个驱动相互通信很频繁,但数据不多。
另外,
问题是两部分,如何在驱动中,动态加载另个驱动?
LIUTANG
驱动大牛
驱动大牛
  • 注册日期2001-03-30
  • 最后登录2020-12-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望58点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2002-08-21 23:34
DDK里有很多函数只能在NT内核里使用,98下不支持,很郁闷
Iamme
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-08-21 13:33
Zw系列例程
就与Win32应用访问驱动差不多
Go,go ahead
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2002-08-21 12:51
IoCallDriver
游客

返回顶部