阅读:3183回复:19
驱动程序之间共享内存
以前在驱动之间共享内存用了很多办法(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.准备在下一个驱动项目里正式加入来测试 欢迎大家在驱动里进行测试! |
|
沙发#
发布于:2001-07-06 14:37
感谢dazzy版主倾力奉献!
|
|
|
板凳#
发布于:2001-07-06 16:21
_declspec(dllexport)
_declspec(dllimport) 这两个东西我怎么在ddk中查不到? |
|
地板#
发布于:2001-07-10 23:14
首先谢谢dazzy斑竹,使我茅塞顿开。
To:halley 请查阅MSDN。 |
|
|
地下室#
发布于:2001-07-13 10:31
在App和driver之间是否可以共享内存?
|
|
5楼#
发布于:2001-07-13 12:15
当然可以。
论坛上有相关的帖子,请查一下。 |
|
|
6楼#
发布于:2002-10-17 11:10
以前在驱动之间共享内存用了很多办法(nt/2k),并且作的很复杂,这几天很是清闲,研究了一下walter oney的代码(generic.sys的代码),试了一下,发现驱动之间共享内存可以做得很简单,方法如下: 可是我这么用的,2000DDK下编译提示: unresolved externals |
|
7楼#
发布于:2002-10-17 12:23
[quote]以前在驱动之间共享内存用了很多办法(nt/2k),并且作的很复杂,这几天很是清闲,研究了一下walter oney的代码(generic.sys的代码),试了一下,发现驱动之间共享内存可以做得很简单,方法如下: 可是我这么用的,2000DDK下编译提示: unresolved externals [/quote] 编译第二个驱动时在第二个驱动的Source文件中加入第一个驱动的LIB文件。 |
|
|
8楼#
发布于:2002-10-17 12:34
这个的原理就相当于把驱动程序当动态连接库使用。同样对函数也可用。
还可以这样用: source文件中 TARGETTYPE=EXPORT_DRIVER 同时建立一个def文件: LIBRARY Export.SYS EXPORTS ExportSymbols1 ... 在其他的驱动中同样很简单可以访问变量和函数。 |
|
|
9楼#
发布于:2002-10-17 12:42
啊,才发现是一年多以前的帖子呢!呵呵。
|
|
|
10楼#
发布于:2002-10-17 15:54
啊,才发现是一年多以前的帖子呢!呵呵。 呵呵,多谢!我在98和2000下试过sys之间的共享内存可以 98下的VXD和sys 用这个方法不行啊!98DDK编译提示: unresolved external symbol _imp_PGlobal |
|
11楼#
发布于:2002-10-18 09:15
[quote][quote]以前在驱动之间共享内存用了很多办法(nt/2k),并且作的很复杂,这几天很是清闲,研究了一下walter oney的代码(generic.sys的代码),试了一下,发现驱动之间共享内存可以做得很简单,方法如下: 可是我这么用的,2000DDK下编译提示: unresolved externals [/quote] 编译第二个驱动时在第二个驱动的Source文件中加入第一个驱动的LIB文件。 [/quote] 我这么处理 的时候,在第二个驱动中可以用SOFTICE跟踪看到共享内存的内容,可是在第二个驱动的源文件中对这个指针的指向的内存进行操作时,编译不成功,提示: \'void *\': unknown size 大侠请指教,分数重新开贴给,呵呵! |
|
12楼#
发布于:2002-10-18 09:28
我这么处理 的时候,在第二个驱动中可以用SOFTICE跟踪看到共享内存的内容,可是在第二个驱动的源文件中对这个指针的指向的内存进行操作时,编译不成功,提示: 你肯定是这样用了,sharedmemory++之类的。因为sharedmemory是VOID指针,当然不能那样操作,这样: PUCHAR pUchar = (PUCHAR)sharedmemory; pUchar++等操作就可以了。 这是基本的C++语法问题哦! |
|
|
13楼#
发布于:2002-10-18 09:40
果然!惭愧, :(
例外98下VXD怎么应用一个WDM驱动分配的内存呢, 好像通过vtoolsd 的 NtKernInternalDeviceIoControl 可以发送IOCTL到这个WDM驱动得到指针,有更方便的做法吗,谢谢! |
|
14楼#
发布于:2002-10-18 09:44
果然!惭愧, :( 什么意思?前面不都是讨论的这个问题吗? |
|
|
15楼#
发布于:2002-10-18 09:53
[quote]果然!惭愧, :( 什么意思?前面不都是讨论的这个问题吗? [/quote] 我在98下VXD的makefile中加入第一个驱动的lib文件,我是这么加的TARGETLIBS = CryptAG.lib 98DDK编译提示: unresolved external symbol _imp_PGlobal 不知道是不是应用库的方式不对还是别的问题 |
|
16楼#
发布于:2002-10-18 09:54
[quote]果然!惭愧, :( 什么意思?前面不都是讨论的这个问题吗? [/quote] 我在98下VXD的makefile中加入第一个驱动的lib文件,我是这么加的TARGETLIBS = CryptAG.lib 98DDK编译提示: unresolved external symbol _imp_PGlobal 不知道是不是引用库的方式不对还是别的问题 |
|
17楼#
发布于:2002-11-05 10:25
这个的原理就相当于把驱动程序当动态连接库使用。同样对函数也可用。 我是这么做的: 第一个 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驱动来取得函数指针的 |
|
18楼#
发布于:2002-11-05 12:39
拷,这么老的贴子也翻炒上来了。
以前在白云黄鹤时就讨论得很深了。 |
|
|
19楼#
发布于:2002-11-05 14:33
拷,这么老的贴子也翻炒上来了。 拷什么拷,看您老是不削于回答吧, 上面的申明改为 extern \"C\" __declspec(dllimport) int _stdcall CryptoEncrypt... 就行了 |
|