阅读:2146回复:7
!!程序死在DeviceIoControl了,为什么?
在应用层调用DeviceIoControl,程序死在DeviceIoControl了,结束任务后就运行不了应用程序了,必须重启。为什么?
此驱动是2000下vc6+2000ddk+DS2.7开发的,在2000下运行了多台机器都没有问题,在一台98上运行遇到了上述问题。 请大家多多指教,谢过了! |
|
最新喜欢:![]() |
沙发#
发布于:2004-02-17 12:28
2000下驱动到9X有问题很常见的。
通常你需要为9X和2000分别写驱动,当然这并不是一定的,这要看你的驱动具体情况和需要的功能来确定,有些时候9X和2000没有办法统一,也就是必须写不同驱动 |
|
|
板凳#
发布于:2004-02-17 12:29
我先在vc里调应用层,发现死在deviceiocontrol(同步)的调用里了,break了一下,跟踪进去发现停在_CrtDbgMode[nRptType]中。
然后用softice调驱动,发现总是在[Boost_With_Decay]和[Set_Thread_Win32_Pri]之间循环,跳不出来。 怎么回事啊? |
|
地板#
发布于:2004-02-17 12:37
把你向隅代码贴出来吧,这样恐怕一年也不知道毛病出在什么地方
|
|
|
地下室#
发布于:2004-02-17 15:24
1: 是你驱动有问题。
2: 你运行了驱动又运行驱动 再调用 DeviceIoControl |
|
|
5楼#
发布于:2004-02-18 10:09
因为程序比较大(包括应用程序,插件管理,数据管理,命令管理和驱动等),而且涉及到公司的源代码保密,所以我不便把代码贴出来,见谅!
请问AllenZh,2000下做的驱动代码在98下需要修改吗?既源代码是兼容的吗? yangmin26: “2: 你运行了驱动又运行驱动 再调用 DeviceIoControl“,这个是什么意思啊? |
|
6楼#
发布于:2004-02-18 10:52
我在98下用98ddk重编了代码也不行,如果代码没问题,可能就是inf文件的问题了。我的inf文件如下:
***********************begin******************************** ;; XCompanyUsb.INF - INF to install JD50 NUMERIC CONTROL Device ;; Copyright (c) 2001, xxxxx Corporation,LTD ;; 北京xxxxx科技有限公司 ;; Use Add New Hardware (other devices) from the Control Panel [Version] Signature="$CHICAGO$" Provider=%xxxxx% Class=USB DriverVer=21/12/2002,1.0.0 ;--------- Manufacturer and Models Sections ---------------------------------- [Manufacturer] %xxxxx%=Mfg0 [Mfg0] %EZUSB%=XCompanyUsb_DDI, USB\VID_0547&PID_0080 %XCompanyUsbDEV%=XCompanyUsb_DDI, USB\VID_0547&PID_2131 %XCompanyUsbDEV1%=XCompanyUsb_DDI, USB\VID_0547&PID_100a,USB\CLASS_FF&SUBCLASS_01&PROT_01 ;%XCompanyUsbDEV2%=XCompanyUsb_DDI, USB\VID_0547&PID_2131,USB\CLASS_FF&SUBCLASS_01&PROT_01 %XCompanyUsbDEV2%=XCompanyUsb_DDI, USB\VID_0547&PID_4a44 %XCompanyUsbDEV3%=XCompanyUsb_DDI, USB\VID_0547&PID_4b44 ;---------- DDInstall Sections ----------------------------------------------- ; --------- Windows 9X ----------------- ; Experimentation has shown that DDInstall root names greater than 19 characters ; cause problems in Windows 98 [XCompanyUsb_DDI] CopyFiles=XCompanyUsb_Files_Driver AddReg=XCompanyUsb_9X_AddReg [XCompanyUsb_9X_AddReg] HKR,,DevLoader,,*ntkern HKR,,NTMPDriver,,XCompanyUsb.sys HKR, "Parameters", "BreakOnEntry", 0x00010001, 0 HKR, "Parameters", "Control", 0x00010001, 0 ; --------- Windows NT ----------------- [XCompanyUsb_DDI.NT] CopyFiles=XCompanyUsb_Files_Driver AddReg=XCompanyUsb_NT_AddReg [XCompanyUsb_DDI.NT.Services] Addservice = XCompanyUsb, 0x00000002, XCompanyUsb_AddService [XCompanyUsb_AddService] DisplayName = %SvcDesc% ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 2 ; SERVICE_DEMAND_START ErrorControl = 1 ; SERVICE_ERROR_NORMAL ServiceBinary = %10%\System32\Drivers\XCompanyUsb.sys LoadOrderGroup = Base [XCompanyUsb_NT_AddReg] HKLM, "System\CurrentControlSet\Services\XCompanyUsb\Parameters",\ "BreakOnEntry", 0x00010001, 0 HKLM, "System\CurrentControlSet\Services\XCompanyUsb\Parameters",\ "Control", 0x00010001, 0 ; --------- Files (common) ------------- [XCompanyUsb_Files_Driver] XCompanyUsb.sys [XCompanyUsb_Files_Inf] XCompanyUsb.inf ;--------- SourceDiskNames and SourceDiskFiles Section ----------------------- [SourceDisksNames] 1=%InstallDisk%,JD_DISK1,1 [SourceDisksFiles] XCompanyUsb.sys = 1,, ;--------- DestinationDirs Section ------------------------------------------- [DestinationDirs] XCompanyUsb_Files_Driver = 10,System32\Drivers ;--------- Strings Section --------------------------------------------------- [Strings] xxxxx="北京xxxxx科技有限公司" XCompanyUsbDEV=" xxxxx数控设备――XCompanyUsb 控制卡(Anchor Chips)" XCompanyUsbDEV1=" xxxxx数控设备――XCompanyUsb 控制卡(发行版)" XCompanyUsbDEV2=" xxxxx数控设备――XCompanyUsb 控制卡(default)" XCompanyUsbDEV3=" xxxxx数控设备――XCompanyUsb 控制卡(beta)" EZUSB = "Anchor Chips EZ-USB 开发板" JDICON ="System\CurrentControlSet\Services\Class\xxxxx设备" InstallDisk = "xxxxx Nnumric Control Device Install" DeviceClassName="xxxxx设备" SvcDesc="xxxxx设备" ***********************end********************************* 在98下重编我需要修改这个inf文件吗?各位大虾救命啊! |
|
7楼#
发布于:2004-02-18 16:53
我知道了
98下最好应该异步调用,以下是Walter Oney 在大作中提到的: 那除了改变同步调用到异步调用,驱动程序中是不是也要做改动? ******************************************************** Windows 98兼容问题 -------------------------------------------------------------------------------- Windows 98从不发出IRP_MN_SURPRISE_REMOVAL请求。因此,WDM驱动程序需要把非正常的IRP_MN_REMOVE_DEVICE请求当做意外删除设备。本章介绍的代码例子考虑到了这一点,如果遇到这样的IRP它将调用AbortRequests和StopDevice。 Windows 98在调用IoReportTargetDeviceChange函数时会失败并返回STATUS_NOT_IMPLEMENTED。并且它根本就没有输出IoReportTargetDeviceChangeAsynchronous函数;因此调用该函数的驱动程序不能装到Windows 98中。参考附录A,查看如何解决这个问题以及其它不支持函数的问题。 Windows 98的结构不允许以内核模式阻塞方式来等待用户模式程序完成任务。这个事实使我难于把我的USB例子驱动程序(USBINT)连接起来。该例子驱动程序的test程序打开一个句柄并发出一个异步DeviceIoControl调用。如果你现在拔掉设备,你想会发生什么:驱动程序将收到一个IRP_MN_SURPRISE_REMOVAL,而它将取消未处理的DeviceIoControl。test程序然后关闭其句柄。这时,我们再回到驱动程序这边看看,REMOVE_DEVICE处理程序将被阻塞在IoReleaseRemoveLockAndWait调用上。当IRP_MJ_CLOSE到来时,驱动程序将释放最后获得的自旋锁并允许设备删除处理。这个过程在Windos 2000上进行得很好,但在Windows 98中会挂起,因为test程序没有运行的机会,因此也就不会关闭其句柄。(Windows 98没有SURPRISE_REMOVAL,但我们得到的REMOVE_DEVICE可以起到同样的作用) 利用QUERY_REMOVE的代码将不会挂起系统。所以,如果你的设备可以被用户热拔插,那么在Windows 98中,如果你有一个打开的句柄,就不要再获取删除自旋锁。 ******************************************************** |
|