ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
阅读:3306回复:16

如何在应用层程序划分共享内存并在驱动程序里访问,给个解决方案

楼主#
更多 发布于:2003-05-19 23:31
做到这里,似乎有点卡壳,没有一点总体的把握。
哪位大侠能介绍一下如何在应用程序中划分这个内存,在NDIS中间驱动中又如何访问这段内存么?越详细越好。
前面的帖子我看了一些,有些了解,但是我还是希望能专门讲一讲。多谢了!

[编辑 -  5/19/03 by  ruberman]

[编辑 -  5/20/03 by  ruberman]

最新喜欢:

ameiamei
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-20 11:01
自己顶一个。
king229
驱动中牛
驱动中牛
  • 注册日期2003-04-29
  • 最后登录2012-04-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-20 13:30
在应用程序里:
PVOID psharememory;
TCHAR szOutputBuffer[*];
DeviceIoControl(m_hDevice, IO_GET_SHAREMEMORY_ADDR, NULL, NULL, szOutputBuffer, sizeof(szOutputBuffer), &dwReturn, NULL )
psharememory = *((PVOID *)szOutputBuffer);
在驱动里
PVOID SystemVirtualAddress, UserVirtualAddress;
PMDL Mdl;

SystemVirtualAddress = ExAllocatePool(NonPagedPool, 1024);
Mdl = IoAllocateMdl(SystemVirtualAddress, 1024, FALSE, FALSE, NULL);
MmBuildMdlForNonPagedPool(Mdl);


case IO_GET_SHAREMEMORY_ADDR:
// 将分配的内存映射到用户进程地址空间,并返回地址。
try
{
UserVirtualAddress = MmMapLockedPages(Mdl, UserMode);
*((PVOID *)(Irp>AssociatedIrp.SystemBuffer))=UserVirtualAddress;
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = sizeof(PVOID);
}
except(EXCEPTION_EXECUTE_HANDLER){}
break;
鬼啊~~~~~~~~
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-20 15:16
在应用程序里:
PVOID psharememory;
TCHAR szOutputBuffer[*];
DeviceIoControl(m_hDevice, IO_GET_SHAREMEMORY_ADDR, NULL, NULL, szOutputBuffer, sizeof(szOutputBuffer), &dwReturn, NULL )
psharememory = *((PVOID *)szOutputBuffer);
在驱动里
PVOID SystemVirtualAddress, UserVirtualAddress;
PMDL Mdl;

SystemVirtualAddress = ExAllocatePool(NonPagedPool, 1024);
Mdl = IoAllocateMdl(SystemVirtualAddress, 1024, FALSE, FALSE, NULL);
MmBuildMdlForNonPagedPool(Mdl);


case IO_GET_SHAREMEMORY_ADDR:
// 将分配的内存映射到用户进程地址空间,并返回地址。
try
{
UserVirtualAddress = MmMapLockedPages(Mdl, UserMode);
*((PVOID *)(Irp>AssociatedIrp.SystemBuffer))=UserVirtualAddress;
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = sizeof(PVOID);
}
except(EXCEPTION_EXECUTE_HANDLER){}
break;
 

这好像是在驱动中分派的内存吧,我需要在应用程序中分配阿。
king229
驱动中牛
驱动中牛
  • 注册日期2003-04-29
  • 最后登录2012-04-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-20 15:44
没什么大区别吧
这样就能在驱动和程序间共享内存了啊。
鬼啊~~~~~~~~
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-20 15:53
没什么大区别吧
这样就能在驱动和程序间共享内存了啊。

是这样的,我这里需要应用程序先运行,然后搜集相关信息存在共向内存区,然后驱动加载,去利用这些共享内存区的信息。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-05-20 16:06
驱动加载了以后你再用deviceiocontrol把这些信息传递给driver不就行了么?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-05-20 16:26
驱动加载了以后你再用deviceiocontrol把这些信息传递给driver不就行了么?

那么需要事件来通知应用程序驱动已经加载么?对不起各位,我对这方面实在是了解不多,多谢指导。
king229
驱动中牛
驱动中牛
  • 注册日期2003-04-29
  • 最后登录2012-04-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-05-20 16:31
驱动不是你的程序加载的??????

PS:头像好看吧,快说“好看”,不然。。。。。。。
鬼啊~~~~~~~~
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-05-20 16:36
驱动不是你的程序加载的??????

PS:头像好看吧,快说“好看”,不然。。。。。。。

我先运行应用程序,然后自己手动加载驱动程序。
你头像好看.....haha...
king229
驱动中牛
驱动中牛
  • 注册日期2003-04-29
  • 最后登录2012-04-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-05-20 16:43
那也可以啊
HANDLE  hWdm; //驱动句柄
hWdm = CreateFile(\"\\\\\\\\.\\\\XXXXX\",
                         GENERIC_WRITE | GENERIC_READ,
                         0,
                         NULL,
                         OPEN_EXISTING,
                         FILE_FLAG_OVERLAPPED,
                         NULL
                         );
然后用deviceiocontrol传
鬼啊~~~~~~~~
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-05-20 16:51
ndis驱动也可以么?据说中间层驱动不算WDM的...
还有,好多代码看不懂阿,能给解释一下否?多谢!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-05-20 16:53
中间层驱动当然是一个wdm的驱动了。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-05-20 17:03
发表于: 2003/5/20 - 16:43
那也可以啊
HANDLE hWdm; //驱动句柄
hWdm = CreateFile(\"\\\\\\\\.\\\\XXXXX\",
GENERIC_WRITE | GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL
);
然后用deviceiocontrol传

 
我感觉问题越来越多了,呵呵,可能是我太笨.:(
首先,上面king大侠给的这些代码我还是很不了解的.它有什么作用?
其次,我们说到了驱动的加载,请问可以在应用程序里自动加载驱动呢?如果可以,那应该如何加载?
再次,就是我问的共享内存的问题.

问题扩大了,分数不会吝啬的,请大侠详解.
king229
驱动中牛
驱动中牛
  • 注册日期2003-04-29
  • 最后登录2012-04-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-05-20 17:20
首先,我不是大侠(我要是大侠就好了,就不为工作发愁了),我所有关于DDk的代码都是这两天做毕业设计的时候才接触、学会使用的,建议你搜索gjpland,fracker两位大大的帖子,里面有很多有用的东东,(fracker最近灌水比较多。。。。。)
第二,关于程序加载驱动,请搜索“Win2K 下动态加载驱动程序”这篇文章,里面有详细的源代码下载。
第三,关于解释的事,如果你看了这些文章还看不懂我贴的代码的话,建议你先下载“win2000驱动程序设计指南”,“WindowsWDM设备驱动程序开发指南”这两本书看看,论坛里有。
记住,欲速则不达,抱着一颗急噪的心是很难写好程序的。
鬼啊~~~~~~~~
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-05-21 10:39
那也可以啊
HANDLE  hWdm; //驱动句柄
hWdm = CreateFile(\"\\\\\\\\.\\\\XXXXX\",
                         GENERIC_WRITE | GENERIC_READ,
                         0,
                         NULL,
                         OPEN_EXISTING,
                         FILE_FLAG_OVERLAPPED,
                         NULL
                         );
然后用deviceiocontrol传

\\\\\\\\.\\\\XXXXX
lpFileName String,要打开的文件的名字
那么那几个斜线是什么意思呢?
zuozi
驱动牛犊
驱动牛犊
  • 注册日期2003-03-24
  • 最后登录2004-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-05-21 14:33
不用理会斜线是什么意思,照抄就可以了,应用程序会自动的去搜索具有相同名字的设备对象的
游客

返回顶部