阅读:3306回复:16
如何在应用层程序划分共享内存并在驱动程序里访问,给个解决方案
做到这里,似乎有点卡壳,没有一点总体的把握。
哪位大侠能介绍一下如何在应用程序中划分这个内存,在NDIS中间驱动中又如何访问这段内存么?越详细越好。 前面的帖子我看了一些,有些了解,但是我还是希望能专门讲一讲。多谢了! [编辑 - 5/19/03 by ruberman] [编辑 - 5/20/03 by ruberman] |
|
最新喜欢:amei |
沙发#
发布于:2003-05-20 11:01
自己顶一个。
|
|
板凳#
发布于: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; |
|
|
地板#
发布于:2003-05-20 15:16
在应用程序里: 这好像是在驱动中分派的内存吧,我需要在应用程序中分配阿。 |
|
地下室#
发布于:2003-05-20 15:44
没什么大区别吧
这样就能在驱动和程序间共享内存了啊。 |
|
|
5楼#
发布于:2003-05-20 15:53
没什么大区别吧 是这样的,我这里需要应用程序先运行,然后搜集相关信息存在共向内存区,然后驱动加载,去利用这些共享内存区的信息。 |
|
6楼#
发布于:2003-05-20 16:06
驱动加载了以后你再用deviceiocontrol把这些信息传递给driver不就行了么?
|
|
|
7楼#
发布于:2003-05-20 16:26
驱动加载了以后你再用deviceiocontrol把这些信息传递给driver不就行了么?
那么需要事件来通知应用程序驱动已经加载么?对不起各位,我对这方面实在是了解不多,多谢指导。 |
|
8楼#
发布于:2003-05-20 16:31
驱动不是你的程序加载的??????
PS:头像好看吧,快说“好看”,不然。。。。。。。 |
|
|
9楼#
发布于:2003-05-20 16:36
驱动不是你的程序加载的?????? 我先运行应用程序,然后自己手动加载驱动程序。 你头像好看.....haha... |
|
10楼#
发布于:2003-05-20 16:43
那也可以啊
HANDLE hWdm; //驱动句柄 hWdm = CreateFile(\"\\\\\\\\.\\\\XXXXX\", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL ); 然后用deviceiocontrol传 |
|
|
11楼#
发布于:2003-05-20 16:51
ndis驱动也可以么?据说中间层驱动不算WDM的...
还有,好多代码看不懂阿,能给解释一下否?多谢! |
|
12楼#
发布于:2003-05-20 16:53
中间层驱动当然是一个wdm的驱动了。
|
|
|
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大侠给的这些代码我还是很不了解的.它有什么作用? 其次,我们说到了驱动的加载,请问可以在应用程序里自动加载驱动呢?如果可以,那应该如何加载? 再次,就是我问的共享内存的问题. 问题扩大了,分数不会吝啬的,请大侠详解. |
|
14楼#
发布于:2003-05-20 17:20
首先,我不是大侠(我要是大侠就好了,就不为工作发愁了),我所有关于DDk的代码都是这两天做毕业设计的时候才接触、学会使用的,建议你搜索gjpland,fracker两位大大的帖子,里面有很多有用的东东,(fracker最近灌水比较多。。。。。)
第二,关于程序加载驱动,请搜索“Win2K 下动态加载驱动程序”这篇文章,里面有详细的源代码下载。 第三,关于解释的事,如果你看了这些文章还看不懂我贴的代码的话,建议你先下载“win2000驱动程序设计指南”,“WindowsWDM设备驱动程序开发指南”这两本书看看,论坛里有。 记住,欲速则不达,抱着一颗急噪的心是很难写好程序的。 |
|
|
15楼#
发布于:2003-05-21 10:39
那也可以啊 \\\\\\\\.\\\\XXXXX lpFileName String,要打开的文件的名字 那么那几个斜线是什么意思呢? |
|
16楼#
发布于:2003-05-21 14:33
不用理会斜线是什么意思,照抄就可以了,应用程序会自动的去搜索具有相同名字的设备对象的
|
|