Badwood
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2208回复:11

实现两个设备

楼主#
更多 发布于:2001-06-19 23:08
我使用DriverStudio开发驱动程序,想在一个驱动程序中实现两个
设备,但是其向导只能生成一个设备的驱动程序,我能添加一个设备
类(C++类),但是却无法使手工添加的类工作(注:我想Win32程序可
以通过CreateFile打开两个不同名字的设备),不知道那位愿意指教
一番?
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-06-20 08:19
关注这样的问题.从来没有看到过这样的driver,不知道是否可以实现.
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
wangbo
驱动牛犊
驱动牛犊
  • 注册日期2001-06-11
  • 最后登录2002-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-06-20 09:41
向导生成的不是只有一个设备的驱动程序,PnP管理器每找到一个设备都调用AddDevice例程一次,在AddDevice中又构造了一个设备对象。
  你可以试试在向导中选择Symbolic link 假设名字为Win32Device,
你在Win32下用CreateFile打开设备句柄时参数必须为Win32Device0
如果你有好几个设备,类推Win32Device1,Win32Device2...
  我以前做的时候在应用程序中定义了也设备句柄的数组,因为我不知道用户究竟插了几块卡,我们当时用的工控机最多只有7个PCI插槽,所以我定义了一个7个元素的句柄数组,在应用程序中看CreateFile的返回结果就知道了用户究竟是插了几块卡。其实考虑应用程序的通用性应该定义远远大于7个元素的数组,要是用户自己去买了10个PCI插槽的机器,再插上10块卡,靠,那就有3块卡接收不到数据。当时真的很菜!不过我的系统是整个卖给用户,用户不懂也懒得去动,所以现在还没有人发现这个问题。
神仙?妖怪? 谢谢!
Badwood
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-06-20 12:29
我说的不是这个问题。
我只是在书上看到可以在同一个驱动程序中创建一个以上的设备,
在CreateFile中使用不同的名字(如DeviceA和DeviceB)打开,
这两个设备的功能完全不同。不知道是否是我理解错误了。还请高
手指正。
wangbo
驱动牛犊
驱动牛犊
  • 注册日期2001-06-11
  • 最后登录2002-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-06-20 12:57
如果你的两个设备功能完全不同的话,就得有两组不同的Vid,Did,我想应该也可以,定义两个设备扩展,写两个函数XCreatedevice(),YCreatedevice(),在这两个函数中去调用iocreatedevice()分别创建两个设备对象,你可以试试看!不知道在WDM中是不是这样,NT4.0应该可以。
神仙?妖怪? 谢谢!
Badwood
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-06-20 20:16
根据<Writing Windows WDM Device Drivers>一书所说,
一个驱动程序可以创建两个不同的设备,大概是用:
IoCreateSymbolicLink创建对win32程序可见的设备名吧,
可是我不知道怎么样使用DriverStudio来实现.
wangbo
驱动牛犊
驱动牛犊
  • 注册日期2001-06-11
  • 最后登录2002-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-06-21 22:49
你说的是符号连接,不知道你是要在WIN32出现两个设备名对应一个实际的设备,还是要在一个驱动程序中管理两个功能完全不同的物理设备,说清楚点好吗?
神仙?妖怪? 谢谢!
Badwood
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-06-21 23:38
这么说吧,我们作的硬件是一张ISA卡,没有中断,没有DMA什么都没有,
连系统都监测不到,但是它占用了系统的0xD000段的4K内存地址.该卡
上有两个独立部分的电路(两个单片机),每个部分占用2K地址.而且工
作起来相互独立.我想作一个驱动程序来管理这张卡.希望对win32程序
提供两个独立的设备,使用独立的方法访问,如同有两张卡一般.
               请指教
hongbo
驱动牛犊
驱动牛犊
  • 注册日期2001-06-27
  • 最后登录2009-02-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2001-09-26 10:29
我现在开发一个USB的驱动程序,要求支持多个相同的设备,怎样才能分别对这两个设备进行操作呢?怎两个设备在WDM下是靠什么区别的呢?请各位大侠指教!
前进是我的唯一追求!
hong
驱动小牛
驱动小牛
  • 注册日期2001-09-19
  • 最后登录2005-12-16
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2001-09-27 04:27
in WDM driver, you can do this way:
1) set a device counter begin with 0;
2) in side AddDevice() function,create device name as Device+the counter, it will be Device0, Device1,...
then call
IoCreateDevice(
DriverObject,
xsize,
&devname,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&fdo);
(make sure every time when AddDevice() is called, the counter is updated.)
3) then you can use Device0, Device1,... in CreateFile()

go & try
hongbo
驱动牛犊
驱动牛犊
  • 注册日期2001-06-27
  • 最后登录2009-02-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2001-09-27 09:37
非常感谢你的建议,现在我面临这样一个问题:
我的程序是用driverwork编写的,现在这两个设备都已经能够被识别出来了,这两个相同的设备怎样才能都执行同一个IRP呢?

程序中的AddDevice是在每次有新设备加入时自动调用的,而且也创建了多个设备,这是我的程序源码:
NTSTATUS UsbMiniDriver::AddDevice(PDEVICE_OBJECT Pdo)
{
Tracer << "Into AddDevice\n";

UsbMiniDevice* pDevice =
new (NonPagedPool) UsbMiniDevice(Pdo, m_Unit);

if (pDevice)
{
NTSTATUS status = pDevice->ConstructorStatus();

if ( !NT_SUCCESS(status) )
{
Tracer << "Error "<< (ULONG)m_Unit << "\n";
delete pDevice;
}
else
m_Unit++;
return status;
}
else
{
Tracer << "Error creating device UsbMini"<< (ULONG)m_Unit << "\n";
return STATUS_INSUFFICIENT_RESOURCES;
}
}

我开发的项目是USB的读卡器装置,现在需要驱动支持多个读卡器在同一台PC上,遇到的问题是PC启动后,当前IRP栈中已压入一判断卡插拔的IRP,使用多个读卡器后,IRP栈中压入的始终为最后一个读卡器的IRP,这时插拔前面读卡器中的卡片,IRP就没有执行,问我怎样才能在多个读卡器中插拔任意卡都使最后一个IRP工作呢?有对此熟悉的帮帮忙吧!这个问题快急死我了!

我猜测是前面一个读卡器的IRP被压入堆栈后,又压入后面的IRP,所以仅执行最后一个读卡器,怎样才能操作前面的读卡器也让后压入的irp也动作呢?这两个IRP有什么区别呢?

我不知道我是否讲清楚了,大伙试着帮帮忙吧!

前进是我的唯一追求!
hong
驱动小牛
驱动小牛
  • 注册日期2001-09-19
  • 最后登录2005-12-16
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2001-09-28 23:16
If you got two devices working fine, the next step is your application. you need to get two handles in your application to point to these two devices  and use them repectively.
may u explain some more about your application structure?
游客

返回顶部