【WinCE 驱动】Win CE驱动程序快速入门|VS模拟调试 Window CE

目录

Win CE驱动程序快速入门

VS模拟调试 Window CE (WinCE)应用程序的开发(笔记)


Win CE驱动程序快速入门

2012-09-10 22:06:29

应用程序调用驱动程序

1、应用程序使用CreateFile函数打开设备

2、然后用DeviceIoControl与驱动程序进行通信,发送命令,交换数据,向指定的设备驱动发送正确的控制码及数据。

3、驱动中的IOControl根据传进来的控制码及数据执行swith。。case语句中代码,进而执行操作。

    应用程序可以通过API函数DeviceIoControl来实现对设备的访问—获取信息,发送命令,交换数据等。利用该接口函数向指定的设备驱动发送正确的控制码及数据,然后分析它的响应,就可以达到我们的目的。

    应用程序和驱动程序的通信过程是:应用程序使用CreateFile函数打开设备,然后用DeviceIoControl与驱动程序进行通信,包括读和写两种操作。还可以用ReadFile读数据用WriteFile写数据。操作完毕时用CloseHandle关闭设备。我们比较常用的就是用DeviceIoControl对设备进行读写操作。

 流式驱动程序的工作过程。

答:第一步:加载驱动程序,主要有两种加载方式:(1)当系统启动时,设备管理器搜寻注册表的HKEY_LOCAL_MACHINE\Drivers\BuiltIn键下面的子键,并逐一加载该子键下的每一个驱动,此过程称为BusEnum;(2)应用程序可调用ActivateDeviceEx()函数动态地加载驱动程序。

    第二步:设备管理器从注册表的dll键值中获取驱动程序所在的DLL文件名。

第三步:设备管理器调用LoadDriver()函数把该DLL加载到自己的虚拟地址空间中。

第四步:设备管理器在注册表的HKEY_LOCAL_MACHINE\Drivers\Active下,记录所有已经加载的驱动程序。

第五步:设备管理器调用驱动程序中的COM_Init函数,并把上一步中添加的注册表项的完整路径作为COM_Init函数的第1个参数传入驱动程序内。

第六步:在COM_Init中,通常须对硬件进行一些最基本的初始化操作。

通过以上的操作完成流式驱动程序的加载任务。

对驱动程序的操作:

第一步:应用程序使用该设备。首先,应用程序调用CreateFile(TEXT(“COM1”)….)打开设备。然后,文件系统判断打开的是文件还是设备。最后,如果打开的是设备,就将控制权交回设备管理器。

第二步:设备管理器调用驱动程序的COM_Open()函数打开设备。

第三步:COM_Open()函数把打开设备的结果返回给设备管理器。

第四步:设备管理器把SMP_open()的返回结果,返回给应用程序的CreateFile()函数调用。

通过第七步到第十步,设备已被成功打开,接下来可对设备进行读/写和控制操作。下面将以从设备中读取数据为例。

第一步:应用程序使用CreateFile()调用返回的句柄,调用函数ReadFile(),向设备发送读请求。

第二步:设备管理器调用驱动程序的COM_Read()函数,读取设备的数据信息。在此过程中,COM_Read()函数可与硬件交互,从硬件中读取必要的信息。然后返回给设备管理器,再返回给应用程序。

最后,当应用程序不再使用该设备时,它可调用CloseHandle()将设备关闭。

      入门前应该阅读一下这篇文章:VirtualCopy详细介绍_lan120576664的博客-CSDN博客

     有人也许和我一样比较心急,想尽快知道如何去写一个具体的驱动程序,这里,假设您对驱动程序已经有比较好的了解,告诉大家一个快速上路的方法。当然,如果您有足够的时间我建议在动手之前还是深入了解一下CE整个系统架构。

在CE中,最简单的一个驱动程序莫过于一个内置(Built-in)设备的流接口驱动。对于一个不支持热拔插的设备,最快捷的方法就是为其实现一个内置的流接口的驱动。

对于这样一类驱动程序,我们只需要按一种特定的规则实现一个动态库,其中实现对所有的硬件功能的调用,再将这个动态库加入系统中,然后设置相关的注册表项,使得在系统启动时设备管理器能识别并且加载这个设备即可。

(自我理解:驱动程序即完成硬件操作的动态链接库)

3.1               实现动态链接库
此动态链接库与应用程序层所用的库并不很大差别,源文件可以是C、C++、甚至汇编,,只是它要实现以下函数。

1       DllEntry(HINSTANCE DllInstance, INT Reason, LPVOID Reserved )  //动态库被加载和卸载时被调用

这个函数是动态链接库的入口,每个动态链接库都需要输出这个函数,它只在动态库被加载和卸载时被调用,也就是设备管理器调用LoadLibrary而引起它被装入内存和调用UnloadLibrary将其从内存释放时被调用,因而它是每个动态链接库最早被调用的函数,一般用它做一些全局变量的初始化。

参数:

DllInstance:DLL的句柄,与一个EXE文件的句柄功能类似,一般可以通过它在得到DLL中的一些资源,例如对话框,除此之外一般没什么用处。

Reason:

这个是操作系自动统调用的,参数也是操作系统传入的,一般不用管这个DllEntry,可以加一些打印信息而已,按照模板写即可。

一般我们只关心两个值:DLL_PROCESS_ATTACH与DLL_PROCESS_DETACH,Reason等于前者是动态库被加载,等于后者是动态库被释放。

所以,我们可以在Reason等于前者是初始化一些资源,等于后者时将其释放。

2       DWORD XXX_Init( LPCTSTR pContext, LPCVOID lpvBusContext);        它是驱动程序的动态库被成功装载以后第一个被调用的函数。其调用时间仅次与DllEntry,而且,当一个库用来生成多于一个的驱动程序实例时仅调用一次DllEntry,而xxx_Init会被调用多次。驱动程序应当在这个函数中初始化硬件,如果初始化成功,就分配一个自已的内存空间(通常用结构体表示),将自已的状态保存起来,并且将此内存块的地址做为一个DWORD值返回给上层。设备管理器就会用在调用XXX_O

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值