阅读:2035回复:7
用SetupDixxx函数Remove Cdrom---》reboot?
用SetupDiRemoveDevice能够移走CDROM但是如果光驱中有盘的话多移几次就会提示重新启动,如果这时你硬是要从驱动中把CDROM remove掉的话就会出现不安全拔插。但是虚拟光驱软件却能实现这个功能。
想请教各位还有别的函数能remove cdrom吗?SetupDi XXXX函数为什么会需要重新启动(remove不掉)。而同样的问题在harddisk中并不会出现。 |
|
沙发#
发布于:2004-05-11 12:40
我想动态热拔插真实光驱,此光驱是接在SCSI Card上的,公司要求实现这个功能。
FSCTL_DISMOUNT_VOLUME我试过没有用,它只是暂时的DISMOUNT,一旦你closeHandle就重新加载FSD,如果你不CloseHandle就Remove那更加容易出现非安全拔插。 你可以在你接在主板的光驱中放入光盘,然后在设备管理其中将其remove,多做几次(remove,rescan...),系统就会提示你重新启动,这时CDROM已经充devnode中移走,但是你仍然能从资源管理器访问此cdrom。如果这种情况出现了,那你就不能充驱动中把CDROM移走,如果移走就是非安全拔插。 2k下有这个问题,xp下没有这个问题(调用它的stetupdiremovedevice不会提示你重新启动)。 |
|
板凳#
发布于:2004-05-11 12:26
虽然我没有试过slwqw所提的方法,但是我想这样它会导致surprised remove对话框的出现。 在发出RESCAN_BUS请求之前,先发出FSCTL_DISMOUNT_VOLUME请求卸载光驱上的FSD,应该不会有什么事吧? 另外,我弄不明白你到底想做什么?你是想动态插拔虚拟光驱?还是动态插拔真实的光驱?如果是真实的光驱,你这样做到底有何意义? |
|
地板#
发布于:2004-05-11 12:00
虽然我没有试过slwqw所提的方法,但是我想这样它会导致surprised remove对话框的出现。
因为,我想你要Remove一个CDROM就应该先从上层将CDROM移走,再在驱动中移走。 如果你直接从驱动的移走CDROM就会出现问题。假设这个时候你光驱中有盘,并且文件系统已经加载,这时就会出错。 现在问题是我不是不能移走光驱,而是不能安全的移走光驱(如果你的光驱中自从你机器启动后就没有放过光盘即从来没有加载过文件系统那么先调用setupdiremovexx函数后在从驱动中移走cdrom是不会出错的)。 :再详细说说我的问题 我想请教如何实现CDROM的热拔插。就像虚拟光驱软件中随时动态的添加和删除CDROM。 用SetupDixxxx函数能够移走CDROM但是如果光驱中有盘的话就有可能需要重新启动,如果这时你硬是要从驱动中(miniport Driver)把CDROM remove掉的话,然后通过ScsiPortNotification通知port Driver后就会出现不安全拔插。 但是虚拟光驱软件却做到了这一点,不知道是怎么实现的。而同样的问题在remove harddisk中并不会出现。 我猜,系统remove 时发的irp_mn_remove_query命令是某个驱动拒绝了它,可能是file system。以为我在setupdi.log中发现了如下log 设备安装函数: DIF_REMOVE。 卸载 SCSI\\CDROM&VEN_LG&PROD_CD-ROM_CRD-8402B&REV_2.00\\4&283BF443&1&000 时的查询删除被 SCSI\\CdRom&Ven_LG&Prod_CD-ROM_CRD-8402B&Rev_2.00\\4&283bf443&1&000 否决(否决类型 5) 设备需要重新启动: 查询删除失败(卸载) CfgMgr32 代码: 23。 设备删除。 |
|
地下室#
发布于:2004-05-11 11:38
提一个建议:你直接在Miniport里边更改Inqury返回的结果不就行了?比如现在有3个虚拟光驱,TargetId分别是:0,1,2。现在想把1号光驱删除,置内部标志表明1号光驱已经被删除。在WIN32 APP中发RESCAN_BUS请求,这时候系统会重新发Inquiry命令到Miniport。检查如果TargetId等于1,则返回MEDIA_NOT_IN_DEVICE,这样一来那个虚拟光驱不就消失了吗?
|
|
5楼#
发布于:2004-05-11 09:58
谢谢版主。我将根据你的提示再看看。
我其实也不是做的虚拟光驱软件,而是MINIPORT driver。只是在hotswap CDROM时会遇到surprised remove问题,而有些同样使用miniport driver的虚拟光驱软件却能做到随意添加删除CDROM(DAEMON TOOLSN能做到,而CD SPACE却不能做到)。 对于WDM驱动类的虚拟光驱软件就更加容易做到了,只要用IoDeleteDevice即可,而miniport中不能调用这个函数。 |
|
6楼#
发布于:2004-05-11 09:40
不知道别人的虚拟光驱怎么弄的,我的是在driver里面响应scsi re-scan的时候进行+-的,没有用到你说的这个函数。
所以,似乎虚拟和实体的光驱在这个问题上可能不能类比哦 |
|
|
7楼#
发布于:2004-04-28 17:00
怎么到现在还没有人说两句啊。
|
|