windows下開發驅動並不難

來源:互聯網
上載者:User
   /********************此文可以被轉寄,但請轉寄者保留作者的署名權
****李浩
****msn:lihao_nx@hotmail.com
****
****email:lihaoyxj@gmail.com

****出處:lihaoyxj.cublog.cn

****       www.cnblogs.com/lihaoyxj

*******************************************************/
   我在前些年一直寫應用類軟體,由於環境不具備特殊要求的環境,故從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

檔案: Driver1.rar
大小: 14KB
下載: 下載
現在有了環境和程式,那麼就需要在你的電腦上進行測試了   其次,驅動的調試環境,我強烈推薦你用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,則需要再開發一個調用驅動的程式了   由於只有一個檔案,是命令列下程式,所以就把源作者的源碼發布出來#define DEBUGMSG#include <windows.h>
#include <winioctl.h>
#include <stdio.h>#define DEVICE_HELLO_INDEX 0x860#define START_HELLPWORLD CTL_CODE(FILE_DEVICE_UNKNOWN,DEVICE_HELLO_INDEX,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define STOP_HELLPWORLD CTL_CODE(FILE_DEVICE_UNKNOWN,DEVICE_HELLO_INDEX+1,METHOD_BUFFERED,FILE_ANY_ACCESS)#define erron GetLastError()#define MY_DEVICE_NAME """"".""HelloWorld"#define MY_DEVICE_START "-start"
#define MY_DEVICE_STOP "-stop"BOOL DriverControl (TCHAR *Maik);void Usage (TCHAR *Paramerter);
int main (int argc,TCHAR *argv[])
{
 if (argc!=2)
 {
  Usage(argv[0]);
  return 0;
 } if (strcmpi(argv[1],MY_DEVICE_START)==0 || strcmpi(argv[1],MY_DEVICE_STOP)==0)
  DriverControl(argv[1]);
 else
 {
  Usage(argv[0]);
  return 0;
 } return 0;
}
BOOL DriverControl (TCHAR *Maik)
{
 HANDLE hDevice=NULL; //裝置控制代碼
 DWORD RetBytes=0; //獲得裝置控制代碼
 hDevice=CreateFile(MY_DEVICE_NAME,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if (hDevice==INVALID_HANDLE_VALUE)
 {
#ifdef DEBUGMSG
  printf("CreateFile() GetLastError reports %d"n",erron);
#endif
  return FALSE;
 } //啟動
 if (strcmpi(Maik,MY_DEVICE_START)==0)
 {
  //傳遞啟動的I/O控制碼
  if (!(DeviceIoControl(hDevice,START_HELLPWORLD,NULL,0,NULL,0,&RetBytes,NULL)))
  {
#ifdef DEBUGMSG
   printf("DeviceIoControl() GetLastError reports %d"n",erron);
#endif
   CloseHandle(hDevice);
   return FALSE;
  }
 } //停止
 if (strcmpi(Maik,MY_DEVICE_STOP)==0)
 {
  //傳遞停止的I/O控制碼
  if (!(DeviceIoControl(hDevice,STOP_HELLPWORLD,NULL,0,NULL,0,&RetBytes,NULL)))
  {
#ifdef DEBUGMSG
   printf("DeviceIoControl() GetLastError reports %d"n",erron);
#endif
   CloseHandle(hDevice);
   return FALSE;
  }
 } if (hDevice)
  CloseHandle(hDevice); //關閉控制代碼 return TRUE;
}
void Usage (TCHAR *Paramerter)
{
   fprintf(stderr,"============================================================================"n"
         "      驅動版Hello World"n"
         "作者:dahubaobao[EST]"n"
         "首頁:www.eviloctal.com or www.ringz.org"n"
         "郵件:[email]dahubaobao@eviloctal.com[/email]"n"
         "OICQ:382690"n"n"
         "%s -start"t啟動"n"
         "%s -stop "t停止"n"n"
         "本程式只是用做代碼交流,如有錯誤,還請多多包含!"n"
         "============================================================================"n"
         ,Paramerter,Paramerter);
}  

在編譯後,假如為calldriver.exe,那麼將它也傳到剛才的VM環境中,然後先開啟,debugview,然後運行calldriver.exe程式

   calldriver -start

   calldriver -stop

再看看debugview中,通過DbgPrint在驅動程式中列印的訊息就出來了.

因為是熟悉驅動開發,引用了別人的原始碼,請諒解。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.