阅读:1612回复:19
怎样使一个UserMode下的进程读写driver的一个Buffer?大致是这样: 在驱动程序的一个routine里可以得到四个参数: inBuffer inBufferLength outBuffer outBufferLength 那么怎么样让一个外部的进程读到inbuffer和inbufferlength,然后写outBuffer和outBufferLength 我觉得问题归根到底是说: User Mode 下的进程如何和Kernal Mode下的driver共同操作同一个buffer? 望高手指教,谢谢。 |
|
沙发#
发布于:2005-01-13 11:55
有很多办法了,就是应用程序与驱动之间的通讯问题。
共享内存,或者用DeviceIoControl来读取。 |
|
|
驱动老牛
|
板凳#
发布于:2005-01-13 12:02
或者用ReadFile WriteFile也可以
|
|
地板#
发布于:2005-01-13 13:02
哪里的buffer?内核的?用户的?
还有,ReadFile,WriteFile是怎么用的? |
|
地下室#
发布于:2005-01-13 13:17
情况是这样:
buffer是kernal里的,在一个driver的某个routine里可以得到, 但是我觉得不能用deviceIOControl因为那个时候已经有一个io挂着等待我填充这个buffer后返回。 所以我觉得用readFile或writeFile也许是不能在user mode里的进程无法直接拿到这个buffer的时候的一个不错的方法。 是不是就是使driver和外部的那个进程同事操作一个文件来交换数据啊? |
|
5楼#
发布于:2005-01-13 13:18
有很多办法了,就是应用程序与驱动之间的通讯问题。 如何才能共享那个内存呢? |
|
6楼#
发布于:2005-01-13 13:35
用下面几个API在内核开辟共享内存
ExAllocatePool() IoAllocateMdl() MmBuildMdlForNonPagedPool() MmMapLockedPages() |
|
|
7楼#
发布于:2005-01-13 13:44
用下面几个API在内核开辟共享内存 那么开出来的空间在外部的用户进程中如何拿到呢,有api接口吗? |
|
8楼#
发布于:2005-01-13 14:30
MmMapLockedPages() 以后可以影射到用户地址空间的指针,通过DEVICEIOCONTROL来拿到应用层使用即可.
|
|
|
9楼#
发布于:2005-01-13 14:31
其实简单的说就是不同的线性地址同样的物理地址,对于物理地址来说无所谓......
|
|
|
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可以调用吗? |
|
11楼#
发布于:2005-01-13 15:32
你为什么就不能在这之前就把那个内核buffer的指针先拿到呢,而非要等用的时候才去取?
|
|
|
12楼#
发布于:2005-01-13 15:54
你为什么就不能在这之前就把那个内核buffer的指针先拿到呢,而非要等用的时候才去取? 你是不是指先在外部进程中通过发一个特殊的IO_CTRL_CODE来进入driver并拿到所想要的任何指针,并在外部进程中保存这些指针。 在要用的时候就可以随时拿来用。 从kernal里传来的指针能直接在user进程中用吗,指向的是原来的那个地方吗? 如果是的就太好了 :) |
|
13楼#
发布于:2005-01-13 17:01
[quote]你为什么就不能在这之前就把那个内核buffer的指针先拿到呢,而非要等用的时候才去取? 你是不是指先在外部进程中通过发一个特殊的IO_CTRL_CODE来进入driver并拿到所想要的任何指针,并在外部进程中保存这些指针。 在要用的时候就可以随时拿来用。 [/quote] 就是如此。 |
|
|
14楼#
发布于:2005-01-13 17:09
[quote][quote]你为什么就不能在这之前就把那个内核buffer的指针先拿到呢,而非要等用的时候才去取? 你是不是指先在外部进程中通过发一个特殊的IO_CTRL_CODE来进入driver并拿到所想要的任何指针,并在外部进程中保存这些指针。 在要用的时候就可以随时拿来用。 [/quote] 就是如此。 [/quote] 不是的吧,地址空间应该是不一样的啊 |
|
15楼#
发布于:2005-01-14 09:34
设备为直接内存访问,用writefile 进行数据的读写
|
|
|
16楼#
发布于:2005-01-14 10:19
其实也不必非得用户端发送I/O控制码才分配这块内存,驱动启动后分配这块内存做缓冲也可以吗,另外,deviceiocontrol也可以做成异步的,在驱动的完成历程中再给出相应。
用下面几个API在内核开辟共享内存 ExAllocatePool() IoAllocateMdl() MmBuildMdlForNonPagedPool() MmMapLockedPages() 其实简单的说就是不同的线性地址同样的物理地址,对于物理地址来说无所谓...... 说白了,就是生成两个页表项指向同一块物理地址页。 |
|
|
17楼#
发布于:2005-01-14 16:04
设备为直接内存访问,用writefile 进行数据的读写 大哥能不能说的清楚一点 |
|
18楼#
发布于:2005-01-14 16:12
[quote][quote]你为什么就不能在这之前就把那个内核buffer的指针先拿到呢,而非要等用的时候才去取? 你是不是指先在外部进程中通过发一个特殊的IO_CTRL_CODE来进入driver并拿到所想要的任何指针,并在外部进程中保存这些指针。 在要用的时候就可以随时拿来用。 [/quote] 就是如此。 [/quote] 没问题的,我就是这样做的。 |
|
|
19楼#
发布于:2005-01-14 16:24
[quote][quote][quote]你为什么就不能在这之前就把那个内核buffer的指针先拿到呢,而非要等用的时候才去取? 你是不是指先在外部进程中通过发一个特殊的IO_CTRL_CODE来进入driver并拿到所想要的任何指针,并在外部进程中保存这些指针。 在要用的时候就可以随时拿来用。 [/quote] 就是如此。 [/quote] 没问题的,我就是这样做的。 [/quote] 有没有相关的代码可以给我看看,我只要要在kernal里和user里和这个交互相关的代码。你是不是用了什么特殊的routine? |
|