JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1798回复:9

有写过9x下面与IOS相关的驱动的朋友吗?有问题请教

楼主#
更多 发布于:2002-12-02 13:43
我现在在写一个9x下面的port driver
基本是按照Walter Oney的Ramdisk来的,差别就是没有用VToolsD
在我的Asynchronous Event Processing Routine里面遇到这样的问题
因为我只像虚拟一个存储设备出来,所以在处理AEP_DEVICE_INQUIRY的时候我会判断DCB中的DCB_unit_on_ctl单元,如果它不等于0的话我就设置AEP结构的AEP_result单元为AEP_NO_MORE_DEVICES。因为Oney的书上说了第二次进来DCB_unit_on_ctl就应该为1,然后递增。但奇怪的是我跟踪的时候发现在我的driver里面第二次进来这个单元还是0 ???这很不正常,然后我F5,就蓝屏了。

那位知道这是什么原因呢?不胜感激

========================================================

看的是侯捷翻译的版本,台湾风味的电脑书籍真的是很难懂,不习惯
I'm upgrading……
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-03 09:13
该单位的数字是根据你自己创建的DCB数量来的.你不创建DCB, 就不会递增. 每次AEP_DEVICE_INQUIRY就是给你一个机会去检查下一个能CONTROL的设备. 然后创建DCB.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-03 09:53
但是我的理解是这样的:
每次收到AEP_DEVICE_INQUIRY的时候,IOS实际上已经帮port driver创建了一个DCB,并且把这个DCB的指针放在AEP_inquiry_device结构的AEP_i_d_dcb,然后如果port driver要添加一个设备的话就会填充此DCB中的相关内容,并且把AEP.result设置为AEP_SUCCESS,否则的话设为AEP_NO_MORE_DEVICES.这样就不会再收到AEP_DEVICE_INQUIRY了.
RamDisk的代码里面也的确没有创建DCB的部分,代码如下:
USHORT OnDeviceInquiry(PAEP_inquiry_device aep)
{ // OnDeviceInquiry
PDCB dcb = (PDCB) aep->AEP_i_d_dcb;
ASSERT(dcb);
if (dcb->DCB_unit_on_ctl > 0)
return AEP_NO_MORE_DEVICES;

memcpy(dcb->DCB_vendor_id, \"WALTONEY\", 8);
memcpy(dcb->DCB_product_id, \"RAM Disk        \", 16);
memcpy(dcb->DCB_rev_level, \"0001\", 4);

return AEP_SUCCESS;
} // OnDeviceInquiry

我就是搞不懂,为什么我第二次响应AEP_DEVICE_INQUIRY的时候DCB_unit_on_ctl不变?

我开始写VxD不久,可能理解上有偏差.谢谢lu0版主的关注,希望你能解答我的疑惑
I'm upgrading……
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-12-03 14:58
我用98DDK中Checked版本的IOS.vxd替换了我原来的IOS.vxd发现了问题大概的原因

在我第一次响应AEP_DEVICE_INQUIRY之后和第一次响应AEP_CONFIG_DCB之前,IOS输出如下的调试信息:

IOS: IOS_enumerate_linear. Creating new device.
CM ERROR: Invalid device ID passed to _CONFIGMG_Create_DevNode()
CM ERROR: AssertDevNode() failed

也就是说我在AEP_DEVICE_INQUIRY中告诉IOS我要创建一个设备,但是后来由于device ID无效,IOS创建设备失败了
所以DCB_unit_on_ctl并没有增加

=======================================================

我想大致的问题就是这样的
但是为什么在创建device的时候失败呢?同样的代码,ramdisk就能够成功.我不知道该如何修改
有谁遇到过这种问题吗?
I'm upgrading……
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-04 11:11
 问题依旧没有解决,这里说说新的发现:
我在_CONFIGMG_Create_DevNode下了断点以观察传进来的Device ID
(只断AEP_DEVICE_INQUIRY之后的那次),结果如下

  RamDisk的driver:
DeviceID指向的内存是\"ESDI\\ZXYZLL\"
(我用的不是Oney原版的代码,是在本站下的ZXYZLL改写的那一版.感觉两者差别并不大)

  我的Driver:
DeviceID指向的内存是\"ESDI\\\"


我怀疑这就是所谓的Invalid device ID

但是我怎样改动才能正确呢?是改inf还是改代码?

我根本不知道这个东西是哪里指定的

试了各种方法结果都是蓝屏,我已经快疯掉了.希望高手指教
I'm upgrading……
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-04 13:28
关于AEP_DEVIDE_INQUIRY的描述原文.

If a port driver successfully completes initialization, the IOS sends a AEP_DEVICE_INQUIRY function to the driver. The IOS sets the AEP_i_d_dcb member to the address of a DCB structure called the inquiry DCB. This structure includes a zero-based unit number identifying the unit that the IOS is querying. If the given unit exists, the driver sets the DCB_product_id, DCB_vendor_id and DCB_rev_level members to appropriate values and returns AEP_SUCCESS. The IOS then sends an AEP_CONFIG_DCB function to all the layer drivers.

If the given unit does not exist, the driver returns AEP_NO_INQ_DATA to direct the IOS to inquire about the next unit. If the given unit number is greater than the maximum number of units supported by the device, the driver returns AEP_NO_MORE_DEVICES to stop the inquiry. The IOS continues to send AEP_DEVICE_INQUIRY functions until the driver returns AEP_NO_MORE_DEVICES or the IOS has sent 128 (units zero through 127) functions for the given DDB structure.

你的问题可能并不出在对AEP_DEVIDE_INQUIRY的处理上, 你的DRIVER本身的其他各项设定可能有问题.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-12-04 13:36
对,问题的确没有出在AEP_DEVIDE_INQUIRY的处理上
那里总共就三句话,不可能出什么错误的

我现在就是无法判断问题出在哪里,代码总共不到200行呢

你根据我的描述能够大致的猜测一下吗?要不我把代码发给你看看?

谢谢关注
I'm upgrading……
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-12-04 16:00
刚看了98DDK中的Ddkguide.doc发现一个严重的问题
文档上说98DDK不可以跟VC60一起用,最高只支持到VC50

~~@!~@!我用的就是VC60啊!??

我想我这边出现的莫名其妙的问题应该是编译器的问题吧?

求证一下:有曾经用VC60+DDK开发成功的例子吗?
I'm upgrading……
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-12-05 09:15
我下了一个VC42
结果也不行
看来不是编译器的问题

有没有人对_CONFIGMG_Create_DevNode这个函数很熟的啊?

我传过去的DeviceID是\"ESDI\\\",所以失败了,后面应该还有东西的!
I'm upgrading……
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-12-05 16:54
问题解决啦!
一位神秘人士解决了我的问题

其实问题很简单,在定义DCB结构的时候要按字节对齐

有的时候经验真的很重要啊!

这个问题折磨了我这么久,终于搞定了!

给分给分
I'm upgrading……
游客

返回顶部