hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
20楼#
发布于:2005-08-01 09:22
对了,还有一个问题啊,我的xxx.dll是设备接到pda上以后由系统调用的,会调用驱动的USBDeviceAttach函数,并传进来一个hDevice参数(usb设备句柄),我在这个函数中初始化和usb设备通信的一些通道,我试了一下,用应用程序也可以load驱动的dll,但是假如我调用驱动的某个testfunc,其中要用到hDevice(不一定是这个名字,就是usb设备的句柄),我怎么获取呢?如果系统和我的应用程序都load驱动dll,是不是共享dll中定义的那些全局变量?(应该不会吧:)),谢谢!!!
心若在,梦就在
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2005-08-01 16:37
呵呵,USB你是内行罗,我就是前阵你问我才粗略看了下的喔,不是请教了,我们可以讨论:)
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2005-08-01 16:48
传给你的那个hDevice是需要你保存的(作为你的驱动的全局变量),在你往下掉用的时候要把这个句柄传回去。驱动是以一般的动态连接库存在的,所以所有适合于dll的操作也可以用在驱动上。你在client驱动中得到的句柄要想和应用共享的话,你可以在dll里面实现一个函数来返回这个句柄,但在你的应用中使用之前可以用mapptrtoprocess把它映射一次(从device.exe地址空间映射到你的应用的地址空间)
根据地的兄弟们,团结就是力量
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
23楼#
发布于:2005-08-02 09:16
哦,我明白了,我现在把dll作成了那种可以共享某些数据的那种,加入了一个共享数据段data_seg,将usb设备句柄等关键变量放到共享数据段中,我从应用程序中load驱动dll,可以共享数据了。
   但是有一个很奇怪的问题,请帮我分析一下:),我在驱动中调用某个usbdi提供的传输函数,比如IssueVendorTransfer,可以正常的向设备读写数据,但是我用某个我的驱动接口函数把它简单包装后提供给应用程序调用时,就不正常了,函数不返回,我不知道是怎么回事,应用程序调用我驱动的接口函数没问题,地址找到了,并进入了我提供的接口函数,但是执行到我接口函数中调用usbdi的传输函数时,如IssueVendorTransfer就不返回了,郁闷!!
   我想了一下是不是系统加载我的dll在系统空间,应用程序加载驱动到用户空间,这样是不是有冲突,或者驱动能直接向应用程序提供接口函数么?还是必须写成流式接口那样的规范,由标准的DeviceIoControl来访问设备?谢谢
心若在,梦就在
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
24楼#
发布于:2005-08-02 13:26
地址空间都在用户态,流接口是为了让系统管理你的驱动,你如果写一个专门的应用使用的话可以不用,只要你输出你的接口函数就行了。

我是这样想的,你把CLIENT加载到你的应用地址空间,那么你在调用你的CLIENT输出的函数的时候使用的地址空间也应该是你的应用进程的地址,这时候你直接用共享的数据(那个句柄),显然这个数字是不变的,但是虽然它是共享数据,但系统是把他解释成一个地址,而不同进程拿到同一个数字(比如是0X00600000)会使用本进程的TRANSLATION TABLE去映射它,那么会得到不同的值啊,而这个地址只对DEVICE.EXE是对的,对其他进程是不对的。所以你用共享数据段来访问这个值可以,我觉得再用之前还是要把它映射一次。


对了,你倒是可以试试输出标准流接口,我记得系统管理的时候,如果你的应用通过系统标准方式(CREATEDEVICE)来访问设备,它可以帮你做地址空间切换,如果你可以自己把请求切换到DEVICE.EXE进程去也行。

以上是我的个人看法,不对的地方大家指正
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
25楼#
发布于:2005-08-02 13:36
多说一句,你这里是想让一个进程(你的应用)访问另一个进程(DEVICE.EXE)的地址空间,也就是你的应用想直接用DEVICE.EXE的虚拟地址访问数据,那么映射的时候用mapptrtoprocess这个工作需要device.exe,也就是你的client在被device.exe加载后来做这个事,现保存hdevice.然后把它映射到你的应用地址空间,再保存到共享数据区,这样,两个进程用各自的地址空间的值来访问同一个数据区。不过mapptrtoprocess需要被映射到的进程,这又需要你的进程启动后才知道,你可以设一个事件来完成你的client映射和你的应用进程启动之间的同步关系。

哎,好像越来越复杂了,如果标准流接口可以完成我们刚才说的问题,你还是用系统方式做吧,这样清晰,简便,而且不用自己同步,createfile的时候可以指定是否共享等等。
根据地的兄弟们,团结就是力量
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
26楼#
发布于:2005-08-02 14:42
哈哈,大哥回复真神速啊,我看懂了你说的意思,不同的进程空间的映射地址会出问题,呵呵,我总是想走捷径,因为这个驱动就是给一个应用写的,:),我还是好好看一下流式接口驱动规范把:)))

   谢谢你的建议
心若在,梦就在
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
27楼#
发布于:2005-08-02 15:49
嘿嘿,神速哇,还是很有敬业精神吧:)))

你那个东西做成流接口框架需要好好设计喔,还有就是我刚想了一下,那样的话估计也要自己映射地址,你好好看看吧,GOOD LUCK
根据地的兄弟们,团结就是力量
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
28楼#
发布于:2005-08-03 10:23
wxl_50685330大哥,请帮我分析一下哈,我看了那个系统下面的那个usb打印机的驱动,是流式的,感觉看一点懂了,USBDeviceAttach等三个函数还是要提供的,就是在USBInstallDriver函数中对\\USB\\ClientDriver加入驱动名字和前缀也可以加一些附加信息,如camera.dll,前缀CAM,然后在USBDeviceAttach函数中,加入ActivateDevice调用,这个函数会在\\drivers\\Active下添加驱动的信息,并可以将驱动需要的一些设备句柄等写入注册表,然后由XXX_init函数调用时取出那些设备句柄信息。
     我把自己的驱动改了一下,现在USBInstallDriver函数调用后\\USB\\ClientDriver下加入了我驱动的名字和前缀,但是在USBDeviceAttach函数中调用ActivateDevice函数时,返回错误,我用GetLastError查看,错误码1,函数不正确,不知道怎么回事,大家遇到过这种情况么?谢谢
心若在,梦就在
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
29楼#
发布于:2005-08-03 14:02
我查看了msdn上关于ActivateDevice函数的帮助,上面说这个API是打包在操作系统里的,好象根据不同的OEM厂商来提供的,有的系统会不支持这个API,是不是我的pda上的CE不支持这个API?我觉得不会把,我看了操作系统版本是4.21。
     还有很不方便调试,我看有些帖子,很多人都在开发板上做啊,什么是开发板啊,我直接在Acer的pda上做的,不会真的是OEM厂商把某些API禁止了吧,还有,用PB是不是可以自己编译CE系统啊?好不好上手啊,应该比较复杂吧。:)
心若在,梦就在
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
30楼#
发布于:2005-08-03 14:47
我最早不就说了在产品上弄会比较麻烦的嘛,不过也不是完全不可能,至少你用消息框可以输出信息,那么基本的调试信息可以得到就可以调了。你现在再用开发板恐怕来不及了。

    那个是标准的api,都支持的,没问题。

    你看看你的参数,好多都把第一个参数写错了,前面不要加hkey_local_machine哈,直接从drivers开始,并且是wchar的串,写路径写成\\
根据地的兄弟们,团结就是力量
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
31楼#
发布于:2005-08-03 15:24
参数应该没问题,我是从Drivers开始的:)
#define CLASS_NAME_SZ    TEXT("Camera_Class")
#define CLIENT_REGKEY_SZ TEXT("Drivers\\USB\\ClientDrivers\\Camera_Class")
API支持就好,但是GetLastError返回1,ERROR_INVALID_FUNCTION,描述是Incorrect function,函数不正确,不知道怎么回事?这个错误也没有更详细的解释:(
WCHAR wsSubClassRegKey[sizeof(CLIENT_REGKEY_SZ)+16] = CLIENT_REGKEY_SZ;
pUsbCam->hStreamDevice = ActivateDevice( wsSubClassRegKey,(DWORD)pUsbCam );
心若在,梦就在
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
32楼#
发布于:2005-08-03 15:26
哎??复制过来就变了呵呵,
#define CLASS_NAME_SZ    TEXT("Camera_Class")
#define CLIENT_REGKEY_SZ TEXT("Drivers\\USB\\ClientDrivers\\Camera_Class")
心若在,梦就在
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
33楼#
发布于:2005-08-03 15:27
上边的宏定义是有两个斜杠的,晕,一提交就只有一个了:)))
心若在,梦就在
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
34楼#
发布于:2005-08-03 16:39
:)那你试试ACIVATEDEVICEEX呢,你的注册表怎么写的?
根据地的兄弟们,团结就是力量
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
35楼#
发布于:2005-08-03 17:03
:))我试了,也是返回错误1呵呵,我的注册表是这样写的
Drivers\\USB\\LoadClients下面是设备的一些识别信息,用RegisterClientSettings函数写入
#define DRIVER_SETTINGS \
       sizeof(USB_DRIVER_SETTINGS),  \
       USB_NO_INFO,   \
       USB_NO_INFO,   \
       USB_NO_INFO,   \
       0xff,   \
       0xff,   \
       0xff,   \
       USB_NO_INFO,   \
       USB_NO_INFO,   \
       USB_NO_INFO
#endif

Drivers\\USB\\ClientDrivers下面是设备ID什么的,由RegisterClientDriverID写入设备ID,再由GetSetKeyValues写入驱动名称和设备名前缀,Drivers\\USB\\ClientDrivers下面有Camera_Class,子键Prefix是CAM,子键DLL是xxx.dll。

不知道有没有问题啊,这些都是在USBInstallDriver函数中做的,已经写入注册表了(用Remote Registor Editor看过),然后我在USBDeviceAttach函数中初始化设备结构,用ActivateDevice函数传给xxx_init,这个思路不知道有没有问题,请大家指点:)
心若在,梦就在
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
36楼#
发布于:2005-08-04 14:01
:) 哦,我知道哪里出错了,现在ActivateDevice已经可以正确执行了,并写在\Drivers\Active下面记录了我驱动的信息。
     ActivateDevice可以由驱动中调用,比如我在USBDeviceAttach函数中调用它,设备插上后,系统调用我驱动的USBDeviceAttach函数,这样也同时调用了ActivateDevice函数,如果成功的话,应用程序就可以用CreateFile来打开设备文件了:),同时ActivateDevice也可以由应用程序调用,调用成功后就可以用CreateFile来打开设备文件,:)
     ActivateDevice调用后,系统会自动调用驱动dll提供的xxx_init函数,并把ActivateDevice中使用的注册表地址给它,让xxx_init去取设备句柄等信息,我就是没有提供xxx_init函数,所以我调用ActivateDevice函数后,系统找不到xxx_init所以失败了:)
心若在,梦就在
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
37楼#
发布于:2005-08-04 15:24
.....天,不是吧......:)你不是说你在做流借口驱动的嘛,你没仔细看流借口驱动的要求啊?

对了,你在你的驱动里面去调用activedevice干什么啊?你要启动什么驱动?

我又想了一下,前面我们说的那些繁琐的地址间转换用流接口驱动应该都可以避免,你把你得驱动输出流接口,然后上层应用来装载一次并打开(如你所说那样),这样可以通过coredll调用驱动从而帮你做地址空间转换。
根据地的兄弟们,团结就是力量
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
38楼#
发布于:2005-08-04 16:43
呵呵,我是做流接口驱动阿,而且是usb设备的流接口驱动,你说的很对,写成流接口可以避免繁琐的地址转换问题,这些都由系统来自动作了,:)))很方便哈哈,我照着那个打印机的例子改的,现在写一个应用已经可以打开设备,并和设备通信了,用CreateFile和DeviceIOControl等API函数,呵呵,幸福阿
    usb设备写成流接口的,USBDeviceAttach,USBInstallDriver,USBUnInstallDriver三个函数还是要提供阿,然后提供一系列的xxx_init,xxx_open等函数,设备插上后,安装驱动后,会调用驱动的USBDeviceAttach函数,我在USBDeviceAttach函数中调用activedevice函数将USBDeviceAttach传进来的设备句柄等信息作为第二个参数来调用activedevice函数,activedevice会在\Drivers\Active下面生成usb设备已经被加载的信息,然后自动调用我写的xxx_init函数,成功返回后,就可以在应用中用CreateFile来打开设备文件了:))))
心若在,梦就在
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
39楼#
发布于:2005-08-05 08:50
还有一个疑惑,msdn上说可以在Applications中调用ActivateDevice函数,怎么调用呢,第二个参数放什么东西呢?设备句柄应用程序怎么能获取呢?:)),是不是我理解有误?
心若在,梦就在
游客

返回顶部