WDM驱动开发过程遇到的一些问题解决的方法集锦

1、SoftICE在机器启动时有时会出问题,Setting里选择boot,不按ESC就进不了系统,这种情况据说可能是和系统安装的虚拟光驱有冲突(高版本会有冲突),安装虚拟光驱的3.47版本没问题。导致这种问题的还有因素很多。
2、编译程序时出下面错误
.../driver/PCiDriverDevice.h(60) : error C2504: 'KDriverManagedQueueEx' : base class undefined
这是因为我用的是WDM模式,而这个基类是不支持WDM的,它的功能相同的替代类是KDriverManagedQueueCsq类
因此我把原来继承KDriverManagedQueueEx类的派生类改为从KDriverManagedQueueCsq派生就好了,其他代码不用改,因为这两个基类实现的功能完全相同。
3、inttypes.h是解决类型定义的跨平台问题的一个文件,在不同的平台下编译出不同的定义(所用的类型都用宏定义的话就可以跨平台了)。
具体到测试程序中遇到的UINT8,UINT16未定义的问题,
error C2065: 'UINT16' : undeclared identifier
从而会连带出几十个错误,就是因为工程包含的是MFC的basetsd.h,而MFC的这个文件里只有UINT32的宏定义,所以就出错了
解决办法:
将DDK下的相关目录在选项的目录设置里包含进来,我的目录是C:/WINDDK/2600/inc/crt和C:/WINDDK/2600/inc/wxp,并且要使这两个目录的位置在MFC目录的上方,优先包含。这样就能保证用DDK的basetsd.h文件,这个文件里的相关宏定义是齐全的。
3、当DSPP寄存器的值(低12位11-0)大于等于0x100时,用outd向相应地址空间中写入数据时,屏幕会直接定板,死机。(后来发现是因为我的板子的电路设计时,没有在相应的物理空间对应物理设备)

4、当偏移地址大于0x40000时,用outd向Base0地址空间中写入数据时,softICE会捕获到异常,错误描述为:
Break due to Page Fault(0Eh),Fault=0002
这应该是偏移地址越界导致的。且跳出SoftICE后,CPU占用100%,基本上等于死机了,必须重启。

5、在封装过程中出现错误
RecUsb.lib(device.obj)   :   error   LNK2001:   unresolved   external   symbol   __imp__SetupDiGetDeviceInterfaceDetailA@24  
  RecUsb.lib(device.obj)   :   error   LNK2001:   unresolved   external   symbol   __imp__SetupDiDestroyDeviceInfoList@4  
  RecUsb.lib(device.obj)   :   error   LNK2001:   unresolved   external   symbol   __imp__SetupDiEnumDeviceInterfaces@20  
  RecUsb.lib(device.obj)   :   error   LNK2001:   unresolved   external   symbol   __imp__SetupDiGetClassDevsA@16  
  这些都是设备管理相关的函数,error   LNK2001一般都是没有连接必需的DLL库或者联接的DLL库中没有这个函数所致,如果库没有问题的话,在连接选项里面连接Setupapi.lib,之后就OK了。

6、在封装的写base0空间存储区的函数里,如果写的数长度比较大的话,就会出现异常。
解决办法:由于使用DeviceIoControl时,第4个参数提供一个缓冲区大小(以字节B为单位),这个缓冲区是传递给驱动程序用来进行读写缓冲的,因此我们提供的数据长度应该严格小于这个字节长度,否则必然出错。如果我们需要一次写较多数据,可以将这个缓冲区设置的大一些,但是这个缓冲区不能无限大,否则会对系统的安全性产生威胁。

7、在应用程序中调用自己生成的DLL导出函数时,出现错误:
TestDM642DLL.obj : error LNK2001: unresolved external symbol _DM642Open
Debug/TestDM642DLL.exe : fatal error LNK1120: 1 unresolved externals
后来发现在DLL工程里的DM642.cpp文件里没有包含DM642.h文件,把这个文件include进去就行了
说明VC在导出DLL文件时,有可能是通过扫描DM642.h头文件的文件相关性来产生lib文件的,所以代码文件必须和头文件相关起来。                                                                            

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值