shuzhibuaa
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2147回复:7

!!程序死在DeviceIoControl了,为什么?

楼主#
更多 发布于:2004-02-17 10:49
在应用层调用DeviceIoControl,程序死在DeviceIoControl了,结束任务后就运行不了应用程序了,必须重启。为什么?

此驱动是2000下vc6+2000ddk+DS2.7开发的,在2000下运行了多台机器都没有问题,在一台98上运行遇到了上述问题。

请大家多多指教,谢过了!

最新喜欢:

sunmaculasunmac...
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-02-17 12:28
2000下驱动到9X有问题很常见的。
通常你需要为9X和2000分别写驱动,当然这并不是一定的,这要看你的驱动具体情况和需要的功能来确定,有些时候9X和2000没有办法统一,也就是必须写不同驱动
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
shuzhibuaa
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-02-17 12:29
我先在vc里调应用层,发现死在deviceiocontrol(同步)的调用里了,break了一下,跟踪进去发现停在_CrtDbgMode[nRptType]中。
然后用softice调驱动,发现总是在[Boost_With_Decay]和[Set_Thread_Win32_Pri]之间循环,跳不出来。

怎么回事啊?
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-02-17 12:37
把你向隅代码贴出来吧,这样恐怕一年也不知道毛病出在什么地方
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
yangmin26
驱动小牛
驱动小牛
  • 注册日期2003-02-22
  • 最后登录2012-11-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-02-17 15:24
1: 是你驱动有问题。
2: 你运行了驱动又运行驱动 再调用 DeviceIoControl
YM KILL YOU
shuzhibuaa
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-02-18 10:09
因为程序比较大(包括应用程序,插件管理,数据管理,命令管理和驱动等),而且涉及到公司的源代码保密,所以我不便把代码贴出来,见谅!

请问AllenZh,2000下做的驱动代码在98下需要修改吗?既源代码是兼容的吗?

yangmin26:
“2: 你运行了驱动又运行驱动 再调用 DeviceIoControl“,这个是什么意思啊?


shuzhibuaa
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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文件吗?各位大虾救命啊!
shuzhibuaa
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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中,如果你有一个打开的句柄,就不要再获取删除自旋锁。

********************************************************
游客

返回顶部