能力值:
( LV4,RANK:50 )
|
-
-
2 楼
1 先读后写
2 在调用历程中这样处理:
初始化事件,一般防到OBJECT中
设置回调
调用下一层处理
if(调用正确)
{
返回
}
else if(pending)
{
等待事件
}
回调函数:
设置事件
这样达到穿性话。此类问题建议到驱网去问问比较好
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
谢谢楼上,我到那去看看,不过你说的我还不太明白
1.先读后写,是指先发个读的IRP再发一个写的IRP吗?
2.这个完全没看明白,你说的好像是客户实现串行的过程,我想明白的是驱动内部实现串行的过程,也就是IoStartPacket和IoStartNextPacket的简单原理
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
AssociatedIrp.SystemBuffe 并不是你说的: 先发个读的IRP再发一个写的IRP;
是一个IRP;
你用 DeviceIoControl 向驱动提供输入和输出缓冲区, 然后在驱动里获得输入与输出缓冲区的大小, 你就知道了;
第二个问题没看明白,可能是我莱;
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
发觉我乱说了, 输入与输出缓冲区的大小又说明什么问题呢? 什么都说明不了, 最多是可以说明是同一个IRP的;
晕, 我才发觉, 这个问题我也不理解得很透彻, 应该是这样的:
设 DeviceIoControl 同时提供了输入与输出缓冲区, I/O管理器产生IRP, 记录了用户程序提供的输入与输出缓冲区的大小, 并根据此要素来找到一片空白内存区域(这个就是AssociatedIrp.SystemBuffe), 然后把用户程序提供的输入数据复制进去, 告诉驱动程序这片内存区域的指针, 驱动程序先把数据读出来, 如果需要, 再向这片内存区域写入数据(控制长度是不是必要的?我也没试过,当然还是控制好), IRP返回, I/O管理器再把这片内存区域的数据复制到用户程序的输出缓冲区里; -> 这个过程只适合"缓冲区读写方式"
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
谢谢楼上,"缓冲区读写方式"是明白了,那如果是直接读取方式估计应该是要发两次IRP了,IRP结构中的MdlAddress只有一份,并且MdlAddress传进来时标识的就是用户地址,
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
两次??
读的时候,I/O管理器创建一个MDL来描述用户模式缓冲区的锁定内存页,然后往下层驱动发送,
下层返回时会把数据拷贝到此内存中,然后I/O管理器会把这些数据复制到用户空间的buffer中;
写的时候过程是类似的。
不知道你说的两次是什么意思?
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
读的时候,I/O管理器创建一个MDL来描述用户模式缓冲区的锁定内存页,然后往下层驱动发送,
下层返回时会把数据拷贝到此内存中,然后I/O管理器会把这些数据复制到用户空间的buffer中;
写的时候过程是类似的。
=============================================
你为全上只有输出缓冲区,如果同时有输入缓冲区怎么办?
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
有这本书的电子图书吗....我只有源代码,没有书,郁闷.....
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
很明显, 楼主你没有认真读书, 不认真读书, 碰上一点不明白的就上网问是不行的, 认真读读书,多思考一下, 其实《Windows驱动开发技术详解》这本书都说得很明白, 只是你不够认真, 不留意;
|
|
|