LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:2108回复:11

如何多线程访问驱动程序?

楼主#
更多 发布于:2001-11-01 19:15
请问各位,我想在应用层多线程访问驱动程序,在驱动程序中对应多线程访问硬件不同的端口,但应用层到驱动层之间应该如何做?

我考虑应该解析DeviceIoControl命令,但不知道应该如何下手,特向各位大虾请教。

穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-11-03 08:54
你自己考虑一个数据结构来控制各个线程对应的端口.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-11-03 19:26
请问一下,什么地方可以找到相应的资料?


穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-11-04 14:43
通常写DRIVER DDK的文档是首要的求助对象。
而应用则借助SDK文档。VC的类库要看MSDN的VC部分的章节。
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-11-05 12:46
I See.

但是如何使用“一个数据结构来控制各个线程对应的端口”?
哪儿有相关的资料呢?

穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-11-06 09:32
我有一个较笨的方法:
你在应用程序中,使用Mutex来区别线程,

pName="mutex0";
nDevIoCtl=0x800;
do
{
nDevIoCtl++;
(*(pName+5))++;
RW_Device=CreateMutex(NULL,true,pName);
nWaitResult=GetLastError();

}while(nWaitResult == ERROR_ALREADY_EXISTS)

然后,你在驱动中对应不同的nDevIoCtl采用不同的端口即可。
我记得Mutex可区别线程,而event不行。以上方法是我的设想,你可试一下。
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-11-07 12:22
[QUOTE]原本由 blue 发表
[B]我有一个较笨的方法:
你在应用程序中,使用Mutex来区别线程,

pName="mutex0";
nDevIoCtl=0x800;
do
{
nDevIoCtl++;
(*(pName+5))++;
RW_Device=CreateMutex(NULL,true,pName);
nWaitResult=GetLastError();

}while(nWaitResult == ERROR_ALREADY_EXISTS)

然后,你在驱动中对应不同的nDevIoCtl采用不同的端口即可。
我记得Mutex可区别线程,而event不行。以上方法是我的设想,你可试一下。
 [/B][/QUOTE]

非常感谢你的回复。

你的这种方法是在应用层做多线程处理。
在通常的情况下,DeviceIoControl函数采用独占的方式,在前一个IRP没有返回之前不能处理第二个IRP,而且DeviceIoControl函数处理速度较慢。
现在我想在应用层多通道访问驱动程序。也就是说同时有N个IRP发送给驱动程序,驱动程序中分别对应N个线程处理。这样可以提升速度。


穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
Nouk
驱动中牛
驱动中牛
  • 注册日期2001-08-22
  • 最后登录2006-10-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-11-08 09:58
Mutex is hard loading and bad performance??
thx.
Taiwan's Driver Developer
xqchen
驱动牛犊
驱动牛犊
  • 注册日期2001-09-07
  • 最后登录2004-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2001-12-13 03:59
\"If hDevice was opened with the FILE_FLAG_OVERLAPPED flag, lpOverlapped must point to a valid OVERLAPPED structure. In this case, the operation is performed as an overlapped (asynchronous) operation. \"
                       --MSDN

Hope it helpful.
lms2000
驱动牛犊
驱动牛犊
  • 注册日期2001-05-19
  • 最后登录2018-05-30
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望102点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2001-12-25 23:34
可以不用系统提供的irp排队的方法,而是自己实现irp多个队列的排队,一个队列对应一个端口
在user mode DeviceIoControl可以在传入的数据结构中加入端口的信息,在IRP_MJ_DEVICE_CONTROL的处理函数中把irp根据传入的标志把irp排入不同的队列
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2002-01-02 01:26
问题读起来问题比较暧昧。
首先除非是互斥设备,driver应该是工作在多线程下的。
关于[驱动程序中分别对应N个线程处理可以提高速度]。driver执行时使用caller的线程空间。 如果线程和port的对应关系已经确定,根本就没有你的问题。

如果因为某种原因,一定要实现的话,lu0说的方法对。说到具体的实现,你可以把请求在kernel下实现排队,预先启动几个system thread作为工作线程, 他们wait 各自的排队 symaphore.. 这样可以实现一些特殊目的。

关于deviceiocontrol慢的问题,要看你是用什么IO机制,对于大数据量传输,只要你不使用bufferedio,问题没有想象得那么大。


LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-01-02 23:53
谢谢老兄的回复。

我想可能我表达的不太清楚, 我的意思是应用层如何同时多线程访问一个硬件实体。从应用层发起一个访问后,硬件还没有返回,这个时候第二个请求也能同时送入驱动程序,通过驱动送相应的硬件端口处理。

穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
游客

返回顶部