织梦CMS - 轻松建站从此开始!

罗索

WINDOWS驱动并不难开发

落鹤生 发布于 2011-03-25 09:08 点击:次 
我在前些年一直写应用类软件,由于环境不具备特殊要求的环境,故从1997年使用WIN95到99年多少明白一点驱动的概念开始,对驱动这个东西是一个不敢去思考的存在.
TAG:

   我在前些年一直写应用类软件,由于环境不具备特殊要求的环境,故从1997年使用WIN95到99年多少明白一点驱动的概念开始,对驱动这个东西是一个不敢去思考的存在.

   在前一段时间开发时,需要用到一个键盘类的驱动,故想学习并进行一个键盘驱动的开发.
   首先,还是要进行一个开发环境搭建.
   1. windows xp
   2. vs2008
   3. winxp ddk
   4. http://ddkwizard.assarbad.net/下载ddkwizrd
   5. 将ddkbuild.cmd或ddkbuild.bat拷贝到winddk\ver,如我的为c:\winddk\3790.1830下
   6. 在vs2008的vc目录环境中executable files中把刚才的c:\winddk加入进来
按以上的步骤,你在创建一个new project时可以看到有ddk project的项目了.
我上传的包为,我第一次使用以上的环境按别人的方法及部分源码做出的驱动版hello,world
现在有了环境和程序,那么就需要在你的电脑上进行测试了
   其次,驱动的调试环境,我强烈推荐你用VM及snapshot后进行.还需要以下几个软件.
   1.debugview  查看调试信息用
   2.devicetree 查看驱动的device细节
   3.OSRLOADER  非常不错的即时加载及启动驱动的工具
 
   再次,进行以上项目的调试,源码中有非常清楚的注释,就不过多说源码.
   1. 编译程序会在Driver1\Driver1\objchk_wnet_x86\i386\下有driver1.sys
   2. 将以上提到的三个工具与driver1.sys 传到VM中的XP上
   3. 用OSRLOADER 加载生成的driver1.sys并启动它,就可以用devicetree看到helloworld这个驱动了.
   刚说了是要调试环境,怎么没有调试啊?不要急,在这里是因为helloworld这个驱动别的程序不会访问的,自然就不会出调试信息了,那么为了访问helloworld,则需要再开发一个调用驱动的程序了
   由于只有一个文件,是命令行下程序,所以就把源作者的源码发布出来
  1. #define DEBUGMSG 
  2. #include <windows.h> 
  3. #include <winioctl.h> 
  4. #include <stdio.h> 
  5. #define DEVICE_HELLO_INDEX 0x860 
  6. #define START_HELLPWORLD
  7.  CTL_CODE(FILE_DEVICE_UNKNOWN,DEVICE_HELLO_INDEX,METHOD_BUFFERED,FILE_ANY_ACCESS) 
  8. #define STOP_HELLPWORLD
  9.  CTL_CODE(FILE_DEVICE_UNKNOWN,DEVICE_HELLO_INDEX+1,METHOD_BUFFERED,FILE_ANY_ACCESS) 
  10. #define erron GetLastError() 
  11. #define MY_DEVICE_NAME "\\\\.\\HelloWorld" 
  12. #define MY_DEVICE_START "-start" 
  13. #define MY_DEVICE_STOP "-stop" 
  14.  
  15. BOOL DriverControl (TCHAR *Maik); 
  16. void Usage (TCHAR *Paramerter); 
  17. int main (int argc,TCHAR *argv[]) 
  18.  if (argc!=2) 
  19.  { 
  20.   Usage(argv[0]); 
  21.   return 0; 
  22.  } 
  23.  if (strcmpi(argv[1],MY_DEVICE_START)==0 || strcmpi(argv[1],MY_DEVICE_STOP)==0) 
  24.   DriverControl(argv[1]); 
  25.  else 
  26.  { 
  27.   Usage(argv[0]); 
  28.   return 0; 
  29.  } 
  30.  return 0; 
  31. BOOL DriverControl (TCHAR *Maik) 
  32.  HANDLE hDevice=NULL; //设备句柄 
  33.  DWORD RetBytes=0; 
  34.  //获得设备句柄 
  35.  hDevice=CreateFile(MY_DEVICE_NAME,GENERIC_READ |
  36.  GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 
  37.  if (hDevice==INVALID_HANDLE_VALUE) 
  38.  { 
  39. #ifdef DEBUGMSG 
  40.   printf("CreateFile() GetLastError reports %d\n",erron); 
  41. #endif 
  42.   return FALSE; 
  43.  } 
  44.  //启动 
  45.  if (strcmpi(Maik,MY_DEVICE_START)==0) 
  46.  { 
  47.   //传递启动的I/O控制代码 
  48.   if (!(DeviceIoControl(hDevice,START_HELLPWORLD,NULL,0,NULL,0,&RetBytes,NULL))) 
  49.   { 
  50. #ifdef DEBUGMSG 
  51.    printf("DeviceIoControl() GetLastError reports %d\n",erron); 
  52. #endif 
  53.    CloseHandle(hDevice); 
  54.    return FALSE; 
  55.   } 
  56.  } 
  57.  //停止 
  58.  if (strcmpi(Maik,MY_DEVICE_STOP)==0) 
  59.  { 
  60.   //传递停止的I/O控制代码 
  61.   if (!(DeviceIoControl(hDevice,STOP_HELLPWORLD,NULL,0,NULL,0,&RetBytes,NULL))) 
  62.   { 
  63. #ifdef DEBUGMSG 
  64.    printf("DeviceIoControl() GetLastError reports %d\n",erron); 
  65. #endif 
  66.    CloseHandle(hDevice); 
  67.    return FALSE; 
  68.   } 
  69.  } 
  70.  if (hDevice) 
  71.   CloseHandle(hDevice); //关闭句柄 
  72.  return TRUE; 
  73. void Usage (TCHAR *Paramerter) 
  74.    fprintf(stderr,"==============================\n" 
  75.          "      驱动版Hello World\n" 
  76.          "作者:dahubaobao[EST]\n" 
  77.          "主页:[url]www.eviloctal.com[/url] or [url]www.ringz.org[/url]\n" 
  78.          "邮件:[email]dahubaobao@eviloctal.com[/email]\n" 
  79.          "OICQ:382690\n\n" 
  80.          "%s -start\t启动\n" 
  81.          "%s -stop \t停止\n\n" 
  82.          "本程序只是用做代码交流,如有错误,还请多多包含!\n" 
  83.          "===================================\n" 
  84.          ,Paramerter,Paramerter); 

在编译后,假如为calldriver.exe,那么将它也传到刚才的VM环境中,然后先打开,debugview,然后运行calldriver.exe程序

   calldriver -start

   calldriver -stop

再看看debugview中,通过DbgPrint在驱动程序中打印的消息就出来了.

(dahubaobao)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201103/11120.html]
本文出处:ringz.org 作者:dahubaobao
顶一下
(0)
0%
踩一下
(1)
100%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容