wince下流式驱动的编写

  WinCE的设备驱动程序都是简单的DLL,然后导出特定的入口函数。驱动程序不是由与驱动打交道的应用程序直接载入而是由设备管理器在载入的(在Wince 5.0由Device.exe加载的,在Wince6.0是由uDevice.exe加载的)。

       在Wince下的驱动大多数是流式设备驱动,一个流式驱动会暴露12个外部入口函数。设备管理器会调用它们与驱动程序交互。

列举一下每种入口函数的作用:

XXX_Init              初始化设备,在设备被加载时调用

XXX_PreDeinit   通知程序把设备句柄设置无效,在设备即将卸载时调用。

XXX_Deinit          释放设备,在设备被卸载时调用

XXX_Open           打开设备进行读、写,应用程序调用CreateFile打开设备时调用

XXX_Close         关闭设备,应用程序调用CloseHandle关闭设备时调用

XXX_PreClose      通知驱动程序把打开的句柄设置无效

XXX_Read           从设备中读取数据,应用程序调用ReadFile时调用

XXX_Write           向设备中写入数据,应用程序调用WriteFile时调用

XXX_Seek            移动设备中的数据,应用程序调用SetFilePointer时调用

XXX_IOControl    对设备发送控制命令,应用程序调用DeviceIOControl时调用

XXX_PowerUp   在系统恢复挂起前被调用

XXX_PowerDown 在系统挂起前调用

我们了解了流式驱动所有外部入口函数作用,现在就可以开始尝试着写一个我们自己的驱动。

1、  在VS2005定制一个WINCE系统的工程中建立一个Subprojects工程, 选择中“Subprojects”点击右键->“Add New Subproject…”弹出对话框如图:

 

选择“WCE Dynamic – Link Library”在Subproject name中输入工程名,点击“Finish”就好了。

2、Subproject工程建立后,编译器自动帮你生成一些配置文件如图:

 

3、新建一个CPP文件,编写驱动代码。

 

 

下面我自己写的一个驱动代码:

[cpp]  view plain copy
  1. #include<windows.h>  
  2. #include<tchar.h>  
  3.   
  4. //Globals  
  5. TCHAR g_Buf[MAX_PATH] ={TEXT("MyDrv")};    
  6.   
  7. HINSTANCE hInst;  
  8.   
  9. BOOL WINAPI DllMain ( HANDLE hinstDLL, DWORD dwReason,LPVOID lpvReserved)  
  10. {  
  11.     hInst = (HINSTANCE) hinstDLL;  
  12.     switch(dwReason)  
  13.     {  
  14.     }  
  15.     return TRUE;  
  16. }  
  17.   
  18.   
  19. DWORD DRV_Open(  
  20.                DWORD hDeviceContext,//设备上下文,由DRV_init()函数创建  
  21.                DWORD AccessCode,    //设备的访问模式,从Createfile()函数传入  
  22.                DWORD ShareMode      //设备的共享模式,从Createfile()函数传入  
  23.                )  
  24. {  
  25.     RETAILMSG(TRUE,(TEXT("[+DRV_Open]/r/n")));  
  26.     //  
  27.     //Add code  
  28.     //  
  29.     RETAILMSG(TRUE,(TEXT("[-DRV_Open]/r/n")));  
  30.   
  31.     return TRUE;  
  32. }  
  33.   
  34. BOOL DRV_Close(  
  35.                DWORD hOpenContext    //设备打开的上下文,由DRV_Open()函数返回  
  36.                )  
  37. {  
  38.     RETAILMSG(TRUE,(TEXT("[+DRV_Close]/r/n")));  
  39.     //  
  40.     //Add code  
  41.     //  
  42.     RETAILMSG(TRUE,(TEXT("[-DRV_Close]/r/n")));  
  43.   
  44.     return TRUE;  
  45. }  
  46.   
  47. DWORD DRV_Init(  
  48.                LPCSTR pContext,      //字符串,指向注册表中记录活动驱动程序的键  
  49.                LPCVOID lpvBusContext //ActivateDeviceEx()函数的第四个参数,VOID指针  
  50.                )  
  51. {  
  52.     RETAILMSG(TRUE,(TEXT("[+DRV_Init]/r/n")));  
  53.     //  
  54.     //Add code  
  55.     //  
  56.     RETAILMSG(TRUE,(TEXT("[-DRV_Init]/r/n")));  
  57.   
  58.     return TRUE;  
  59. }  
  60.   
  61.   
  62. BOOL DRV_Deinit(  
  63.                 DWORD hDeviceContext //DRV_Init()函数返回的设备上下文  
  64.                 )  
  65. {  
  66.     RETAILMSG(TRUE,(TEXT("[+DRV_Deinit]/r/n")));  
  67.     //  
  68.     //Add code  
  69.     //  
  70.     RETAILMSG(TRUE,(TEXT("[-DRV_Deinit]/r/n")));  
  71.   
  72.     return TRUE;  
  73. }  
  74.   
  75. DWORD DRV_Read(  
  76.                DWORD hOpenContext,//DRV_Open()返回的设备打开的上下文  
  77.                LPVOID pBuffer,    //输出,输出缓冲区的指针,读取的数据会被放在改缓冲区内  
  78.                DWORD Count        //要读取的字节数  
  79.                )  
  80. {  
  81.     RETAILMSG(TRUE,(TEXT("[+DRV_Read]/r/n")));  
  82.     //  
  83.     //Add code  
  84.     //   
  85.     int iLen = _tcslen(g_Buf);  
  86.     memcpy(pBuffer,g_Buf,iLen *2);  
  87.   
  88.     RETAILMSG(TRUE,(TEXT("[-DRV_Read]/r/n")));  
  89.   
  90.     return TRUE;  
  91. }  
  92.   
  93. DWORD DRV_Write(  
  94.                 DWORD hOpenContext,//DRV_Open()返回的设备打开的上下文  
  95.                 LPVOID pBuffer,    //输入,输入缓冲区的指针,输入的数据会被放在改缓冲区内  
  96.                 DWORD Count        //要写入的字节数  
  97.                 )  
  98. {  
  99.     RETAILMSG(TRUE,(TEXT("[+DRV_Write]/r/n")));  
  100.     //  
  101.     //Add code  
  102.     //  
  103.     if(Count >= MAX_PATH)  
  104.     {  
  105.         RETAILMSG(TRUE,(TEXT("[Error]:DRV_Write Write data error!/r/n")));  
  106.         return FALSE;  
  107.     }  
  108.   
  109.     memset(g_Buf,0,MAX_PATH * 2);  
  110.     memcpy(g_Buf,pBuffer,Count *2);  
  111.   
  112.     RETAILMSG(TRUE,(TEXT("[-DRV_Write]/r/n")));  
  113.   
  114.     return TRUE;  
  115. }  
  116.   
  117. DWORD DRV_Seek(  
  118.                DWORD hOpenContext,//DRV_Open()返回的设备打开的上下文  
  119.                long Amount,       //要移动的距离,负数表示向前移,正数为向后移  
  120.                WORD Type          //移动的相对位置,有FILE_BEGIN、FILE_CURRENT和FILE_END  
  121.                )  
  122. {  
  123.     RETAILMSG(TRUE,(TEXT("[+DRV_Seek]/r/n")));  
  124.     //  
  125.     //Add code  
  126.     //  
  127.     RETAILMSG(TRUE,(TEXT("[-DRV_Seek]/r/n")));  
  128.   
  129.     return TRUE;  
  130. }  
  131.   
  132. BOOL DRV_IOControl(  
  133.                    DWORD hOpenContext,//DRV_Open()返回的设备打开上下文  
  134.                    DWORD dwCode,      //要发送的控制码,一个32位无符号数  
  135.                    PBYTE pBufIn,      //输入,指向输入缓冲区的指针  
  136.                    DWORD dwLenIn,     //输入缓冲区的长度  
  137.                    PBYTE pBufOut,     //输出,指向输出缓冲区的指针  
  138.                    DWORD dwLenOut,    //输出缓冲区的长度  
  139.                    PDWORD pdwActualOut//输出,设备实际输出字符数  
  140.                    )  
  141. {  
  142.     RETAILMSG(TRUE,(TEXT("[+DRV_IOControl]/r/n")));  
  143.     //  
  144.     //Add code  
  145.     //  
  146.     RETAILMSG(TRUE,(TEXT("[-DRV_IOControl]/r/n")));  
  147.   
  148.     return TRUE;  
  149. }  
  150.   
  151.   
  152. BOOL DRV_PreClose(  
  153.                   DWORD hOpenContext //设备打开的上下文  
  154.                   )  
  155. {  
  156.     RETAILMSG(TRUE,(TEXT("[+DRV_PreClose]/r/n")));  
  157.     //  
  158.     //Add code  
  159.     //  
  160.     RETAILMSG(TRUE,(TEXT("[-DRV_PreClose]/r/n")));  
  161.   
  162.     return TRUE;  
  163. }  
  164.   
  165.   
  166. BOOL DRV_PreDeinit(  
  167.                   DWORD hDeviceContext //设备的上下文  
  168.                   )  
  169. {  
  170.     RETAILMSG(TRUE,(TEXT("[+DRV_PreDeinit]/r/n")));  
  171.     //  
  172.     //Add code  
  173.     //  
  174.     RETAILMSG(TRUE,(TEXT("[-DRV_PreDeinit]/r/n")));  
  175.   
  176.     return TRUE;  
  177. }  
  178.   
  179. void DRV_PowerUp(  
  180.                  DWORD dwContext //由DRV_Init()返回的设备的上下文句柄  
  181.                  )  
  182. {  
  183.     RETAILMSG(TRUE,(TEXT("[+DRV_PowerUp]/r/n")));  
  184.     //  
  185.     //Add code  
  186.     //  
  187.     RETAILMSG(TRUE,(TEXT("[-DRV_PowerUp]/r/n")));  
  188. }  
  189.   
  190. void DRV_PowerDown(  
  191.                  DWORD dwContext //由DRV_Init()返回的设备的上下文句柄  
  192.                  )  
  193. {  
  194.     RETAILMSG(TRUE,(TEXT("[+DRV_PowerDown]/r/n")));  
  195.     //  
  196.     //Add code  
  197.     //  
  198.     RETAILMSG(TRUE,(TEXT("[-DRV_PowerDown]/r/n")));  
  199. }  

 

MyDriver.def

[cpp]  view plain copy
  1. LIBRARY     MYDRIVE  
  2.   
  3. EXPORTS  
  4.     DRV_Init               
  5.     DRV_PreDeinit     
  6.     DRV_Deinit           
  7.     DRV_Open             
  8.     DRV_Close         
  9.     DRV_PreClose       
  10.     DRV_Read           
  11.     DRV_Write            
  12.     DRV_Seek             
  13.     DRV_IOControl     
  14.     DRV_PowerUp     
  15.     DRV_PowerDown   


 

现在我们可以测试一下驱动程序,测试代码如下:

[cpp]  view plain copy
  1. // fff.cpp : Defines the entry point for the console application.  
  2. //  
  3. #include <windows.h>  
  4. #include<tchar.h>  
  5. int _tmain(int argc, _TCHAR* argv[])  
  6. {  
  7.     TCHAR ReadBuf[MAX_PATH] ={0};  
  8.     TCHAR WriteBuf[MAX_PATH ]={TEXT("Write new data!")};  
  9.     DWORD dwNumber = 0;  
  10.     HANDLE hDevice = CreateFile(TEXT("DRV1:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);  
  11.     if(hDevice)  
  12.     {  
  13.         ReadFile(hDevice,ReadBuf,MAX_PATH,&dwNumber,NULL);  
  14.         //ReadBuf中的内容为:“MyDrv”  
  15.         WriteFile(hDevice,WriteBuf,MAX_PATH - 1,&dwNumber,NULL);  
  16.   
  17.         ReadFile(hDevice,ReadBuf,MAX_PATH,&dwNumber,NULL);  
  18.         //ReadBuf中的内容为:“Write new data!”  
  19.         CloseHandle(hDevice);  
  20.           
  21.     }  
  22.     return 0;  
  23. }  

注意:我们还需要修改一下.bib文件,将

MODULES

XXX.dll  $(_FLATRELEASEDIR)/MyDrv.dll               NK

 

改为:

MODULES

XXX.dll  $(_FLATRELEASEDIR)/MyDrv.dll               NK  K

 

至于为什么,请查阅http://blog.csdn.net/norains/archive/2010/11/10/6000519.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值