Wince驱动调试杂项

来源:互联网 发布:淘宝买不了q币了 编辑:程序博客网 时间:2024/05/19 13:14

最近在学习wince驱动时,收获颇多,将遇到的问题写下来,以免忘了

一,驱动的加载一般可以由应用程序调用ActivateDeviceExc来实现动态加载,用完之后应用程序调用DeactivateDevice卸载驱动,譬如我用的驱动调试工具就是利用的这个原理。但是,我写了一个流驱动,第一次加载的时候可以正常运行,可以响应中断,可是卸载之后,第二次加载时,虽然能成功加载,可就是不响应中断。刚开始百思不得其解,查看了硬件寄存器的初始化,没有问题,IST中响应中断后也调用了InterruptDisable,问题出在哪里呢?后来看了一篇博客,恍然大悟,原来是逻辑中断的问题。我在驱动程序中调用了KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwVirtualIRQ, sizeof(DWORD), &g_SysIntr1, sizeof(DWORD),NULL)来申请了一个逻辑中断g_SysIntr1,在驱动卸载时,没有调用KernelIoControl( IOCTL_HAL_RELEASE_SYSINTR, &g_SysIntr1, sizeof(DWORD), NULL, 0,NULL)来释放申请的逻辑中断g_SysIntr1,这样,操作系统就一直认为g_SysIntr1有设备在用,后来我在测试时,果然发现第二次加载时的逻辑中断号与第一次加载时的逻辑中断号是连续的,这说明第一加载时的逻辑中断号没有被释放,设备中断一直被该逻辑中断占用,所以导致,即便第二次申请到了逻辑中断号,但无法响应硬件中断。

二,在调试驱动时,有时只需要将驱动编译成dll,并不需要把驱动编译进内核,在这种情况下,只能用命令行操作,在vs2005中在菜单里面选择“build”->“Open ReleaseDirectory in Build Window”,然后在弹出的命令行窗口中,通过dos命令切换到你要编译的driver的目录下面,也可以在Solution中的驱动目录中单击右键,在弹出的菜单中选择Open Build Window,这样就可以直接进入Dos环境下得驱动目录,然后运行“build”就可以了。也可以运行“build -C”清除lib文件,然后强制把所有的文件都编译一遍。被编译后的driver的dll会被自动拷贝到release目录下面。注意,在进行编译之前,应该先对源文件进行保存,这样编译的才是最新的版本,我在这里吃了很大的亏,刚开始总是搞不明白怎么回事。

原创粉丝点击