dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:3183回复:19

驱动程序之间共享内存

楼主#
更多 发布于:2001-07-06 14:09
以前在驱动之间共享内存用了很多办法(nt/2k),并且作的很复杂,这几天很是清闲,研究了一下walter oney的代码(generic.sys的代码),试了一下,发现驱动之间共享内存可以做得很简单,方法如下:
  1.定义一个全局变量
     PVOID _declspec(dllexport) sharedmemory =NULL;

  2.在程序中分配此内存并在适当的时候给其赋值:
     sharedmemory =
     (PVOID)ExAllocatePool(NonPagedPool,sizeofmemory);
..........................................................
     RtlCopyMemory(sharedmemory,"i am dazzy!",16);
  3.在另一个驱动程序中作如下声明:
    PVOID extern _declspec(dllimport) sharedmemory;
  4.用DbgPrint()打印此值:
   #if DBG
          DbgPrint("The share memory is %s",sharedmemory);
   #endif
   5.很如我意:
      在driverstudio带的Monitor打印出了:
       The share memory is i am dazzy!
   6.准备在下一个驱动项目里正式加入来测试
      欢迎大家在驱动里进行测试!
    

最新喜欢:

aasa2aasa2 chilichili
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
沙发#
发布于:2001-07-06 14:37
感谢dazzy版主倾力奉献!
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
halley
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2002-10-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-07-06 16:21
_declspec(dllexport)
_declspec(dllimport)
这两个东西我怎么在ddk中查不到?
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-07-10 23:14
首先谢谢dazzy斑竹,使我茅塞顿开。

To:halley
请查阅MSDN。
穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
shilo
驱动牛犊
驱动牛犊
  • 注册日期2001-04-29
  • 最后登录2003-03-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-07-13 10:31
在App和driver之间是否可以共享内存?
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-07-13 12:15
当然可以。

论坛上有相关的帖子,请查一下。
穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
horsedo
驱动小牛
驱动小牛
  • 注册日期2001-11-29
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-10-17 11:10
以前在驱动之间共享内存用了很多办法(nt/2k),并且作的很复杂,这几天很是清闲,研究了一下walter oney的代码(generic.sys的代码),试了一下,发现驱动之间共享内存可以做得很简单,方法如下:
  1.定义一个全局变量
     PVOID _declspec(dllexport) sharedmemory =NULL;

  2.在程序中分配此内存并在适当的时候给其赋值:
     sharedmemory =
     (PVOID)ExAllocatePool(NonPagedPool,sizeofmemory);
..........................................................
     RtlCopyMemory(sharedmemory,\"i am dazzy!\",16);
  3.在另一个驱动程序中作如下声明:
    PVOID extern _declspec(dllimport) sharedmemory;
  4.用DbgPrint()打印此值:
   #if DBG
          DbgPrint(\"The share memory is %s\",sharedmemory);
   #endif
   5.很如我意:
      在driverstudio带的Monitor打印出了:
       The share memory is i am dazzy!
   6.准备在下一个驱动项目里正式加入来测试
      欢迎大家在驱动里进行测试!
    

可是我这么用的,2000DDK下编译提示:
unresolved externals
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-10-17 12:23
[quote]以前在驱动之间共享内存用了很多办法(nt/2k),并且作的很复杂,这几天很是清闲,研究了一下walter oney的代码(generic.sys的代码),试了一下,发现驱动之间共享内存可以做得很简单,方法如下:
  1.定义一个全局变量
     PVOID _declspec(dllexport) sharedmemory =NULL;

  2.在程序中分配此内存并在适当的时候给其赋值:
     sharedmemory =
     (PVOID)ExAllocatePool(NonPagedPool,sizeofmemory);
..........................................................
     RtlCopyMemory(sharedmemory,\"i am dazzy!\",16);
  3.在另一个驱动程序中作如下声明:
    PVOID extern _declspec(dllimport) sharedmemory;
  4.用DbgPrint()打印此值:
   #if DBG
          DbgPrint(\"The share memory is %s\",sharedmemory);
   #endif
   5.很如我意:
      在driverstudio带的Monitor打印出了:
       The share memory is i am dazzy!
   6.准备在下一个驱动项目里正式加入来测试
      欢迎大家在驱动里进行测试!
    

可是我这么用的,2000DDK下编译提示:
unresolved externals
 [/quote]
编译第二个驱动时在第二个驱动的Source文件中加入第一个驱动的LIB文件。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-10-17 12:34
这个的原理就相当于把驱动程序当动态连接库使用。同样对函数也可用。
还可以这样用:
source文件中
TARGETTYPE=EXPORT_DRIVER

同时建立一个def文件:
LIBRARY     Export.SYS
EXPORTS
ExportSymbols1
           ...
在其他的驱动中同样很简单可以访问变量和函数。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-10-17 12:42
啊,才发现是一年多以前的帖子呢!呵呵。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
horsedo
驱动小牛
驱动小牛
  • 注册日期2001-11-29
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2002-10-17 15:54
啊,才发现是一年多以前的帖子呢!呵呵。
 

呵呵,多谢!我在98和2000下试过sys之间的共享内存可以
98下的VXD和sys 用这个方法不行啊!98DDK编译提示:
unresolved external symbol _imp_PGlobal
horsedo
驱动小牛
驱动小牛
  • 注册日期2001-11-29
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2002-10-18 09:15
[quote][quote]以前在驱动之间共享内存用了很多办法(nt/2k),并且作的很复杂,这几天很是清闲,研究了一下walter oney的代码(generic.sys的代码),试了一下,发现驱动之间共享内存可以做得很简单,方法如下:
  1.定义一个全局变量
     PVOID _declspec(dllexport) sharedmemory =NULL;

  2.在程序中分配此内存并在适当的时候给其赋值:
     sharedmemory =
     (PVOID)ExAllocatePool(NonPagedPool,sizeofmemory);
..........................................................
     RtlCopyMemory(sharedmemory,\"i am dazzy!\",16);
  3.在另一个驱动程序中作如下声明:
    PVOID extern _declspec(dllimport) sharedmemory;
  4.用DbgPrint()打印此值:
   #if DBG
          DbgPrint(\"The share memory is %s\",sharedmemory);
   #endif
   5.很如我意:
      在driverstudio带的Monitor打印出了:
       The share memory is i am dazzy!
   6.准备在下一个驱动项目里正式加入来测试
      欢迎大家在驱动里进行测试!
    

可是我这么用的,2000DDK下编译提示:
unresolved externals
 [/quote]
编译第二个驱动时在第二个驱动的Source文件中加入第一个驱动的LIB文件。 [/quote]
我这么处理 的时候,在第二个驱动中可以用SOFTICE跟踪看到共享内存的内容,可是在第二个驱动的源文件中对这个指针的指向的内存进行操作时,编译不成功,提示:
\'void *\': unknown size
大侠请指教,分数重新开贴给,呵呵!
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-10-18 09:28
我这么处理 的时候,在第二个驱动中可以用SOFTICE跟踪看到共享内存的内容,可是在第二个驱动的源文件中对这个指针的指向的内存进行操作时,编译不成功,提示:
\'void *\': unknown size
大侠请指教,分数重新开贴给,呵呵!

你肯定是这样用了,sharedmemory++之类的。因为sharedmemory是VOID指针,当然不能那样操作,这样:
PUCHAR pUchar = (PUCHAR)sharedmemory;
pUchar++等操作就可以了。
这是基本的C++语法问题哦!
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
horsedo
驱动小牛
驱动小牛
  • 注册日期2001-11-29
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2002-10-18 09:40
果然!惭愧, :(
例外98下VXD怎么应用一个WDM驱动分配的内存呢,
好像通过vtoolsd 的 NtKernInternalDeviceIoControl 可以发送IOCTL到这个WDM驱动得到指针,有更方便的做法吗,谢谢!
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-10-18 09:44
果然!惭愧, :(
例外98下VXD怎么应用一个WDM驱动分配的内存呢,
好像通过vtoolsd 的 NtKernInternalDeviceIoControl 可以发送IOCTL到这个WDM驱动得到指针,有更方便的做法吗,谢谢!

什么意思?前面不都是讨论的这个问题吗?
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
horsedo
驱动小牛
驱动小牛
  • 注册日期2001-11-29
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2002-10-18 09:53
[quote]果然!惭愧, :(
例外98下VXD怎么应用一个WDM驱动分配的内存呢,
好像通过vtoolsd 的 NtKernInternalDeviceIoControl 可以发送IOCTL到这个WDM驱动得到指针,有更方便的做法吗,谢谢!

什么意思?前面不都是讨论的这个问题吗? [/quote]
我在98下VXD的makefile中加入第一个驱动的lib文件,我是这么加的TARGETLIBS = CryptAG.lib
98DDK编译提示:
unresolved external symbol _imp_PGlobal
不知道是不是应用库的方式不对还是别的问题

horsedo
驱动小牛
驱动小牛
  • 注册日期2001-11-29
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2002-10-18 09:54
[quote]果然!惭愧, :(
例外98下VXD怎么应用一个WDM驱动分配的内存呢,
好像通过vtoolsd 的 NtKernInternalDeviceIoControl 可以发送IOCTL到这个WDM驱动得到指针,有更方便的做法吗,谢谢!

什么意思?前面不都是讨论的这个问题吗? [/quote]
我在98下VXD的makefile中加入第一个驱动的lib文件,我是这么加的TARGETLIBS = CryptAG.lib
98DDK编译提示:
unresolved external symbol _imp_PGlobal
不知道是不是引用库的方式不对还是别的问题

horsedo
驱动小牛
驱动小牛
  • 注册日期2001-11-29
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
17楼#
发布于:2002-11-05 10:25
这个的原理就相当于把驱动程序当动态连接库使用。同样对函数也可用。
还可以这样用:
source文件中
TARGETTYPE=EXPORT_DRIVER

同时建立一个def文件:
LIBRARY     Export.SYS
EXPORTS
ExportSymbols1
           ...
在其他的驱动中同样很简单可以访问变量和函数。

我是这么做的: 第一个 sys的 source 文件中TARGETPATHLIB=$(DDK_LIB_DEST)
TARGETTYPE=EXPORT_DRIVER
DLLDEF=CryptAG.def
并且建立他的 .def 文件:
LIBRARY     CryptAG.SYS

EXPORTS
    CryptoEncrypt
    CryptoDecrypt
第二个驱动的 source 文件:
TARGETLIBS=$(DDK_LIB_PATH)\\CryptAG.lib
在程序中
__declspec(dllimport) int _stdcall CryptoEncrypt(IN ULONG ChannelNO, IN char * Src, IN ULONG SrcLength,
IN char * Dst, IN ULONG DstLength);
说明后直接调用这个函数编译提示:
error LNK2001: unresolved external symbol \"__declspec(dllimport) int __stdcall CryptoEncrypt(unsigned long,char *,unsigned long,char *,unsigned long)\" (__imp_?CryptoEncrypt@@YGHKPADK0K@Z)
不知道我哪儿做错了呢? 大侠请指教
例外上一贴的我后来是从 vxd 发送 ioctl 到WDM驱动来取得函数指针的









minsoft
驱动小牛
驱动小牛
  • 注册日期2001-07-30
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-11-05 12:39
拷,这么老的贴子也翻炒上来了。
以前在白云黄鹤时就讨论得很深了。
少了e,就少了全部
horsedo
驱动小牛
驱动小牛
  • 注册日期2001-11-29
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
19楼#
发布于:2002-11-05 14:33
拷,这么老的贴子也翻炒上来了。
以前在白云黄鹤时就讨论得很深了。

拷什么拷,看您老是不削于回答吧,
上面的申明改为
extern \"C\" __declspec(dllimport) int _stdcall CryptoEncrypt...
就行了
游客

返回顶部