stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1612回复:19

怎样使一个UserMode下的进程读写driver的一个Buffer?

楼主#
更多 发布于:2005-01-13 10:55

大致是这样:
在驱动程序的一个routine里可以得到四个参数:
inBuffer
inBufferLength
outBuffer
outBufferLength

那么怎么样让一个外部的进程读到inbuffer和inbufferlength,然后写outBuffer和outBufferLength

我觉得问题归根到底是说:
User Mode 下的进程如何和Kernal Mode下的driver共同操作同一个buffer?

望高手指教,谢谢。


fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-13 11:55
有很多办法了,就是应用程序与驱动之间的通讯问题。
共享内存,或者用DeviceIoControl来读取。
在交流中学习。。。
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2005-01-13 12:02
或者用ReadFile WriteFile也可以
---内核开发合作或提供基础技术服务QQ:22863668 ---
qwdrv
驱动大牛
驱动大牛
  • 注册日期2004-03-19
  • 最后登录2005-12-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-13 13:02
哪里的buffer?内核的?用户的?
还有,ReadFile,WriteFile是怎么用的?
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-13 13:17
情况是这样:
buffer是kernal里的,在一个driver的某个routine里可以得到,
但是我觉得不能用deviceIOControl因为那个时候已经有一个io挂着等待我填充这个buffer后返回。
所以我觉得用readFile或writeFile也许是不能在user mode里的进程无法直接拿到这个buffer的时候的一个不错的方法。
是不是就是使driver和外部的那个进程同事操作一个文件来交换数据啊?
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-13 13:18
有很多办法了,就是应用程序与驱动之间的通讯问题。
共享内存,或者用DeviceIoControl来读取。


如何才能共享那个内存呢?
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-13 13:35
用下面几个API在内核开辟共享内存
ExAllocatePool()

IoAllocateMdl()

MmBuildMdlForNonPagedPool()

MmMapLockedPages()
在交流中学习。。。
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-13 13:44
用下面几个API在内核开辟共享内存
ExAllocatePool()

IoAllocateMdl()

MmBuildMdlForNonPagedPool()

MmMapLockedPages()


那么开出来的空间在外部的用户进程中如何拿到呢,有api接口吗?
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2005-01-13 14:30
MmMapLockedPages() 以后可以影射到用户地址空间的指针,通过DEVICEIOCONTROL来拿到应用层使用即可.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2005-01-13 14:31
其实简单的说就是不同的线性地址同样的物理地址,对于物理地址来说无所谓......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-01-13 14:42
MmMapLockedPages() 以后可以影射到用户地址空间的指针,通过DEVICEIOCONTROL来拿到应用层使用即可.


我说了,我不能用deviceiocontrol,因为当时我正在处理一个io,需要填充了buffer后才从那个io返回。

我把问题说的再清楚一点,就是driver对那个外部进程来说就是个master而那个外部进程是一个slaver, driver设置一个event来告诉外部进程现在来拿那个buffer并wait在那里,外部进程往buffer里写入东西后通知driver好让driver走下去。

现在我想知道外部进程怎么得到那个buffer,大家有办法吗,有User Mode 下的API可以调用吗?
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-01-13 15:32
你为什么就不能在这之前就把那个内核buffer的指针先拿到呢,而非要等用的时候才去取?
在交流中学习。。。
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-01-13 15:54
你为什么就不能在这之前就把那个内核buffer的指针先拿到呢,而非要等用的时候才去取?


你是不是指先在外部进程中通过发一个特殊的IO_CTRL_CODE来进入driver并拿到所想要的任何指针,并在外部进程中保存这些指针。
在要用的时候就可以随时拿来用。

从kernal里传来的指针能直接在user进程中用吗,指向的是原来的那个地方吗?
如果是的就太好了 :)
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-01-13 17:01
[quote]你为什么就不能在这之前就把那个内核buffer的指针先拿到呢,而非要等用的时候才去取?


你是不是指先在外部进程中通过发一个特殊的IO_CTRL_CODE来进入driver并拿到所想要的任何指针,并在外部进程中保存这些指针。
在要用的时候就可以随时拿来用。
[/quote]

就是如此。
在交流中学习。。。
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-01-13 17:09
[quote][quote]你为什么就不能在这之前就把那个内核buffer的指针先拿到呢,而非要等用的时候才去取?


你是不是指先在外部进程中通过发一个特殊的IO_CTRL_CODE来进入driver并拿到所想要的任何指针,并在外部进程中保存这些指针。
在要用的时候就可以随时拿来用。
[/quote]

就是如此。 [/quote]

不是的吧,地址空间应该是不一样的啊
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2005-01-14 09:34
设备为直接内存访问,用writefile 进行数据的读写
琢磨悟真知
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-01-14 10:19
其实也不必非得用户端发送I/O控制码才分配这块内存,驱动启动后分配这块内存做缓冲也可以吗,另外,deviceiocontrol也可以做成异步的,在驱动的完成历程中再给出相应。
用下面几个API在内核开辟共享内存
ExAllocatePool()

IoAllocateMdl()

MmBuildMdlForNonPagedPool()

MmMapLockedPages()
其实简单的说就是不同的线性地址同样的物理地址,对于物理地址来说无所谓......

说白了,就是生成两个页表项指向同一块物理地址页。
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-01-14 16:04
设备为直接内存访问,用writefile 进行数据的读写


大哥能不能说的清楚一点
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-01-14 16:12
[quote][quote]你为什么就不能在这之前就把那个内核buffer的指针先拿到呢,而非要等用的时候才去取?


你是不是指先在外部进程中通过发一个特殊的IO_CTRL_CODE来进入driver并拿到所想要的任何指针,并在外部进程中保存这些指针。
在要用的时候就可以随时拿来用。
[/quote]

就是如此。 [/quote]
没问题的,我就是这样做的。
在交流中学习。。。
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-01-14 16:24
[quote][quote][quote]你为什么就不能在这之前就把那个内核buffer的指针先拿到呢,而非要等用的时候才去取?


你是不是指先在外部进程中通过发一个特殊的IO_CTRL_CODE来进入driver并拿到所想要的任何指针,并在外部进程中保存这些指针。
在要用的时候就可以随时拿来用。
[/quote]

就是如此。 [/quote]
没问题的,我就是这样做的。 [/quote]

有没有相关的代码可以给我看看,我只要要在kernal里和user里和这个交互相关的代码。你是不是用了什么特殊的routine?
游客

返回顶部