WinCE中的驱动程序开发一.实验目的1、熟悉WinCE中流式接口驱动程序的12个接口的功能。
2、掌握流式驱动程序的工作过程。
3、能够编写出流式接口的驱动程序。
二.实验内容使用VS2005的智能设备应用程序开发方法,进行网络通信的编程,并通信多线程技术实现服务器与客户端之间的文件传输。
三.实验设备及工具硬件:PC机一台;软件:Windows XP操作系统,VS2005开发环境,WinCE 6.0开发环境,或Windows Mobile 5.0 SDK四.实验步骤及说明(1)写出流式接口驱动程序的12个接口,及每个接口的功能。
答:见教材515页(2)写出流式驱动程序的工作过程。
答:第一步:加载驱动程序,主要有两种加载方式:(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()将设备关闭。
(3)实验过程及主要代码分析:a. 写出两种导出动态链接库接口的方法答:导出动态链接库接口的方法,主要有以下两种:第一种,使用动态链接库的导出文件,即.DEF文件LIBRARY GenDriverEXPORTSGEN_InitGEN_DeinitGEN_PreDeinitGEN_OpenGEN_CloseGEN_PreCloseGEN_ReadGEN_WriteGEN_SeekGEN_PowerDownGEN_PowerUpGEN_IOControl第二种,使用__declspec(dllexport)关键字__declspec(dllexport) DWORD GEN_Init (DWORD dwContext);__declspec(dllexport) BOOL GEN_PreDeinit (DWORD dwContext);__declspec(dllexport) BOOL GEN_Deinit (DWORD dwContext);__declspec(dllexport) DWORD GEN_Open (DWORD dwContext, DWORD dwAccess,DWORD dwShare);__declspec(dllexport) BOOL GEN_PreClose (DWORD dwOpen);__declspec(dllexport) BOOL GEN_Close (DWORD dwOpen);__declspec(dllexport) DWORD GEN_Read (DWORD dwOpen, LPVOID pBuffer,DWORD dwCount);__declspec(dllexport) DWORD GEN_Write (DWORD dwOpen, LPVOID pBuffer,DWORD dwCount);__declspec(dllexport) DWORD GEN_Seek (DWORD dwOpen, long lDelta,WORD wType);__declspec(dllexport) DWORD GEN_IOControl (DWORD dwOpen, DWORD dwCode,PBYTE pIn, DWORD dwIn,PBYTE pOut, DWORD dwOut,DWORD *pdwBytesWritten);__declspec(dllexport) void GEN_PowerDown (DWORD dwContext);__declspec(dllexport) void GEN_PowerUp (DWORD dwContext);b.写出示例代码进行驱动程序的打开,并分析代码答:打开驱动程序GenDriver的示例代码如下:HWND hWnd = hMain;DWORD dwwritten;int count;int ret;//加载驱动HANDLE HandleDriver = INVALID_HANDLE_VALUE; //驱动程序句柄HANDLE hFile = INVALID_HANDLE_VALUE; //设备文件操作句柄HKEY hDrvKey = NULL; //注册表操作句柄HandleDriver = ActivateDeviceEx(L"Drivers\\BuiltIn\\GEN", NULL, 0, NULL);/* 加载SimpleDriver 驱动*/if (HandleDriver == INVALID_HANDLE_VALUE)Add2List(hWnd,TEXT("加载SimpleDriver失败."));elseAdd2List(hWnd,TEXT("加载SimpleDriver成功."));HANDLE hDrv =CreateFile(TEXT("GEN0:"),GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORM AL,NULL);//以打开文件的方式打开流式驱动程序if(INVALID_HANDLE_VALUE == hDrv){OutputDebugString(L"Failed to open driver...\r\n");Add2List (hWnd, TEXT("Failed to open driver."));return 0;}else{OutputDebugString(L"succeed to open driver...\r\n");Add2List (hWnd, TEXT("File sent successfully."));}(4)实验结果及分析:答:(1)用VS 2008生成GenDriver.dll,位于CHS Windows Mobile 5.0 PocketPC R2 Emulator 仿真器中,具体位置: \我的设备\Program files\GenDriver.dll。
如图1所示。
将GenDriver.dll 复制到根目录下(\)图1生成的GenDriver.dll(2)修改CHS Windows Mobile 5.0 PocketPC R2 Emulator的注册表。
第一步:打开VS2008的远程注册表编辑器,打开设备CHS Windows Mobile 5.0 PocketPC R2 Emulator。
如图2所示图2VS2008的注册表远程编辑器第二步:在HKEY_LOCAL_MACHINE\Drivers\BuiltIn\下增加GenDriver,具体内容如下所示:HKEY_LOCAL_MACHINE\Drivers\BuiltIn\GENPrefix=GENDll=\GenDriver.dllFriendlyName=Simple DriverIndex=dword:0Order=dword:0最后,更新注册表(3)运行流式驱动程序的加载测试程序MySquit,运行结果如图3所示:图3GenDriver加载成功(4)通过VS2008的远程进程查看器,也可以证明驱动程序已经运行,如图4所示五.实验总结。