青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

任我行

一天一個腳印......
每日一句:
posts - 54, comments - 218, trackbacks - 1, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

驅動程序開發—Hello Word

Posted on 2006-01-03 10:07 任我行 閱讀(4134) 評論(6)  編輯 收藏 引用 所屬分類: 驅動開發

 

看了好多天的書!特別到書店買了《Windows 200/xp wdm 設備驅動開發》這本書,在這里我不想怎么評論它!對于高手來說,我覺得她一定不能滿足,但是對于像我這樣想入門的人來說,仿佛看了半天,還是不知道從何下手。什么原理、模型、分層等等講不講,講!絕對應該講!但是你得快點告訴我怎么先弄一個像“Hello Word!”的什么簡單來不能再簡單的完整的例子給我呀!到網上找阿找啊!那些高手??!也不為我們新手寫點圖文并茂的上手資料。沒辦法!結合自己的需要再參考一些別人的東東,算是自己的一點不成熟的想法吧!

我覺得下面這個介紹非常不錯!我能看懂,所以貼了出來。

我道為什么找不到“Hello Word!”呢?原來在驅動開發的例子里是沒有所謂的“Hello World”程序的。這主要還是因為網絡上的WDM資料太少造成的。但是程序的入口點呢?c語言有Main(),用Vc的??匆姷氖荳inMain(),Delphi開發的是Program里的Begin,但是驅動開發呢?那也是應該有程序的入口點啊。后來我才明白了,那就是DriverEntry()函數。還有一個問題讓我懷疑了老半天,那就是驅動開發的源程序中需不需要include頭文件呀?為什么會懷疑呢?那是因為我看了半天的書都沒有看到一個完整的驅動程序結構。真的是郁悶。下面是我看到的一個完整的結構,我先放上來,讓大家看看驅動開發的結構吧。

/***************************************************************
程序名稱:Hello World for WDM
文件名稱:HelloWDM.cpp
日期:2002-8-16
***************************************************************/

//一定要的頭文件,聲明了函數模塊和變量:

#include "HelloWDM.h"

/***************************************************************
函數名稱:DriverEntry()
功能描述:WDM程序入口(原來的WinMain被換成了DriverEntry,也是驅動程序的大門)
***************************************************************/

//extern "C"是必須的,表示“用C鏈接”。如果你的文件名是HelloWDM.c的話,這句可以省略。
extern "C"
NTSTATUS DriverEntry(    IN PDRIVER_OBJECT DriverObject, //IN 是一個關鍵字表示這是一個輸 入參數,PDRIVER_OBJECT是一個數據結構的指針,就像PCHAR一樣,這個數據結構是什么樣子的,后面我會列出來。她描述了一個驅動設備對象。
                        IN PUNICODE_STRING RegistryPath)//參數RegistryPath指定了驅動程序注冊表健的路徑,因為驅動程序安裝后總會在系統注冊表里留下一點東西的。
{
    //指定“添加設備”消息由函數“HelloWDMAddDevice()”來處理:
    DriverObject->DriverExtension->AddDevice = HelloWDMAddDevice;
    //指定“即插即用”消息由函數“HelloWDMPnp()”來處理:
    DriverObject->MajorFunction[IRP_MJ_PNP] = HelloWDMPnp;

    //返回一個NTSTATUS值STATUS_SUCCESS。幾乎所有的驅動程序例程都必須返回一個NTSTATUS值,這些值在NTSTATUS.H DDK頭文件中有詳細的定義。
    return STATUS_SUCCESS;
}

//NTSTATUS也是一個數據類型,上面我所說的消息有點不準確的,準確地說是“I/O請求包”,不過如果像我們以前理解消息那樣來理解也無不可,我覺得兩者太想了。無非就是上層的應用程序通過它來告訴驅動程序,你要給我什么服務吧!IRP_MJ_PNP就是即插即用處理的請求。你發沒發覺上面其實是在制造進入各個房間的“小門”


/***************************************************************
函數名稱:HelloWDMAddDevice()
功能描述:處理“添加設備”消息
***************************************************************/

NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,
                           IN PDEVICE_OBJECT PhysicalDeviceObject)
{
    //定義一個NTSTATUS類型的返回值:
    NTSTATUS status;
    //定義一個功能設備對象(Functional Device Object):
    PDEVICE_OBJECT fdo;

    //創建我們的功能設備對象,并儲存到fdo中:
    status = IoCreateDevice(
        DriverObject,                //驅動程序對象
        sizeof(DEVICE_EXTENSION),    //要求的設備擴展的大小
        NULL,                        //設備名稱,這里為NULL
        FILE_DEVICE_UNKNOWN,        //設備的類型,在標準頭文件WDM.H或NTDDK.H中列出的FILE_DEVICE_xxx值之一
        0,                            //各種常量用OR組合在一起,指示可刪除介質、只讀等。
        FALSE,                        //如果一次只有一個線程可以訪問該設備,為TRUE,否則為FALSE
        &fdo);                        //返回的設備對象

    //NT_SUCCESS宏用于測試IoCreateDevice內核是否成功完成。不要忘記檢查對內核的所有調用是否成功。NT_ERROR宏不等同于!NT_SUCCESS,最好使用!NT_SUCCESS,因為除了錯誤外,它還截獲警告信息。
    if( !NT_SUCCESS(status))
        return status;

    //創建一個設備擴展對象dx,用于存儲指向fdo的指針:
    PDEVICE_EXTENSION dx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
    dx->fdo = fdo;

    //用IoAttachDeviceToDeviceStack函數把HelloWDM設備掛接到設備棧:
    dx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);

    //設置fdo的flags。有兩個“位”是必須改變的,一個是必須清除DO_DEVICE_INITIALIZING標志,如果在DriverEntry例程中調用IoCreateDevice(),就不需要清除這個標志位。還有一個是必須設置DO_BUFFER_IO標志位:
    fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
    fdo->Flags &= ~DO_DEVICE_INITIALIZING;

    //返回值:
    return STATUS_SUCCESS;
}


/***************************************************************
函數名稱:HelloWDMPnp()
功能描述:處理“即插即用”消息
***************************************************************/

NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo,
                        IN PIRP Irp)
{
    //創建一個設備擴展對象dx,用于存儲指向fdo的指針:
    PDEVICE_EXTENSION dx=(PDEVICE_EXTENSION)fdo->DeviceExtension;

    //首先要通過函數IoGetCurrentIrpStackLocation()得到當前的IRP,并由此得到Minor Function:
    PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
    ULONG MinorFunction = IrpStack->MinorFunction;

    //然后把這個Minor Function傳遞給下一個設備棧:
    IoSkipCurrentIrpStackLocation(Irp);
    NTSTATUS status = IoCallDriver( dx->NextStackDevice, Irp);

    //處理“即插即用”次功能代碼:
    //當Minor Function等于IRP_MN_REMOVE_DEVICE時,說明有設備被拔出或卸下,這時要取消資源分配并刪除設備:
    if( MinorFunction==IRP_MN_REMOVE_DEVICE)
    {
        //取消設備接口:
        IoSetDeviceInterfaceState(&dx->ifSymLinkName, FALSE);
        RtlFreeUnicodeString(&dx->ifSymLinkName);
        
        //調用IoDetachDevice()把fdo從設備棧中脫開:
        if (dx->NextStackDevice)
            IoDetachDevice(dx->NextStackDevice);
        //刪除fdo:
        IoDeleteDevice(fdo);
    }

    //返回值:
    return status;
}



/***************************************************************
程序名稱:Hello World for WDM
文件名稱:HelloWDM.h
作者:羅聰
日期:2002-8-16
***************************************************************/


//頭文件,只是聲明一些函數和變量,比較簡單就不多說了,請讀者自行研究:

#ifdef __cplusplus

extern "C"
{
#endif

#include "ntddk.h"

#ifdef __cplusplus
}
#endif

typedef struct _DEVICE_EXTENSION
{
    PDEVICE_OBJECT    fdo;
    PDEVICE_OBJECT    NextStackDevice;
    UNICODE_STRING    ifSymLinkName;

} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,
                           IN PDEVICE_OBJECT PhysicalDeviceObject);

NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo,
                        IN PIRP Irp);



好了,第一個WDM版的“Hello World”就介紹到這里,雖然實際上它什么都沒有做,但是由于它包含了完整的框架,所以對于向我這樣的新手來說還是很有參考價值的。至于怎么編譯及安裝只有下次再說了

Feedback

# re: 驅動程序開發—Hello Word  回復  更多評論   

2006-04-16 10:42 by zjh
很好,學習中

# re: 驅動程序開發—Hello Word  回復  更多評論   

2006-09-10 16:29 by 小宋
你好,我是個新手,剛開始學寫驅動,照著你給的例子做了一下,可是在VC下面compile時出現了no compile tool is associated with the file extension的錯誤,不知道怎么解決了,請大俠不吝賜教。

# re: 驅動程序開發—Hello Word  回復  更多評論   

2006-09-11 09:40 by oosky
文章非我作,你可以仔細再看看。

# re: 驅動程序開發—Hello Word  回復  更多評論   

2008-03-16 11:11 by 小雪
{,,ˊ夲亾提丗;蒙住雙眼看卜見伱,?

# re: 驅動程序開發—Hello Word  回復  更多評論   

2008-04-03 23:26 by yilian
我想試試阿

# re: 驅動程序開發—Hello Word  回復  更多評論   

2008-04-11 18:02 by 車萬興
我想要提交成功
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩精品二区| 亚洲一二三四久久| 欧美精品97| 午夜激情综合网| 久久成人精品电影| 亚洲三级免费| 久久成年人视频| 亚洲精品四区| 久久gogo国模裸体人体| 在线看无码的免费网站| 在线视频欧美一区| 亚洲国产另类久久精品| 亚洲一区二区三区在线| 亚洲成人资源| 欧美一级淫片播放口| 亚洲美女在线一区| 久久精品国产99国产精品| 亚洲精品视频免费在线观看| 欧美一区二区三区视频在线观看| 亚洲国产精品毛片| 亚洲欧美日韩中文视频| 一区二区三区www| 久久综合伊人77777尤物| 久久久久久国产精品一区| 欧美日韩一区二区三区四区五区| 欧美大片免费| 亚洲福利免费| 欧美91大片| 最新日韩在线| 在线中文字幕一区| 欧美日一区二区三区在线观看国产免| 免费成人在线观看视频| 国产中文一区| 亚洲人人精品| 欧美大尺度在线观看| 亚洲福利视频专区| 亚洲精品国产无天堂网2021| 欧美激情一区二区三区在线视频观看 | 亚洲专区一二三| 国产精品亚洲精品| 久久影视三级福利片| 欧美成人激情在线| 亚洲免费一级电影| 亚洲福利视频在线| 久久久久久久综合色一本| 久久久国产视频91| 亚洲国产婷婷香蕉久久久久久| 亚洲国产婷婷| 亚洲欧美日韩直播| 亚洲区国产区| 国产婷婷色综合av蜜臀av| 免费日本视频一区| 午夜伦理片一区| 欧美激情片在线观看| 亚洲男人第一网站| 一区二区三区精品在线| 国内一区二区在线视频观看| 欧美日韩在线精品一区二区三区| 欧美一区二区啪啪| 亚洲一区二区三区高清不卡| 亚洲激情啪啪| 亚洲第一黄网| 欧美激情视频一区二区三区不卡| 欧美有码在线观看视频| 亚洲午夜国产一区99re久久 | 亚洲裸体俱乐部裸体舞表演av| 欧美视频四区| 国产精品久久午夜夜伦鲁鲁| 久久黄色影院| 久久精品国产免费| 久久成人综合网| 久久精品视频免费播放| 欧美在线视频一区二区| 久久另类ts人妖一区二区| 久久精品系列| 欧美激情精品久久久久久久变态| 免费成人在线观看视频| 亚洲国产乱码最新视频| 亚洲美女av黄| 午夜在线电影亚洲一区| 久久久久久穴| 国产精品www994| 国内在线观看一区二区三区| 亚洲国产精品成人综合| 亚洲免费视频一区二区| 久久久噜噜噜久久久| 亚洲国产精品第一区二区| 亚洲一区二区三区在线播放| 久久久综合激的五月天| 欧美亚洲第一区| 亚洲品质自拍| 麻豆精品在线视频| 亚洲四色影视在线观看| 欧美国产高清| 极品少妇一区二区| 亚欧成人在线| 一本大道久久a久久精品综合 | 最新精品在线| 久久亚洲国产成人| 性欧美1819sex性高清| 国产精品极品美女粉嫩高清在线| 激情欧美一区二区三区在线观看| 国产精品99久久久久久有的能看 | 欧美剧在线观看| 亚洲国内自拍| 亚洲国产aⅴ天堂久久| 男人的天堂亚洲| 亚洲黄一区二区| 最新国产成人av网站网址麻豆| 美女脱光内衣内裤视频久久网站| 亚洲欧美日韩国产综合在线| 国产精品任我爽爆在线播放| 亚洲女同精品视频| 香蕉久久国产| 伊人成人在线视频| 亚洲福利电影| 国产精品羞羞答答xxdd| 久久久久久亚洲精品中文字幕 | 国产精品99久久99久久久二8| 国产精品v欧美精品v日韩 | 亚洲视频1区| 亚洲一区二区三区777| 狠狠色狠狠色综合日日五| 欧美激情亚洲另类| 国产精品久久久久久亚洲毛片 | 欧美~级网站不卡| 亚洲图色在线| 裸体一区二区三区| 欧美一乱一性一交一视频| 久久久久国色av免费观看性色| 亚洲国产天堂久久综合网| 亚洲一本大道在线| 亚洲欧洲一级| 巨胸喷奶水www久久久免费动漫| 亚洲午夜精品| 欧美日韩国产一区二区三区地区| 牛牛影视久久网| 国产伦精品一区二区三区照片91 | 亚洲一区二区三区高清 | 亚洲二区三区四区| 亚洲欧美视频一区| 国产精品一二三| 亚洲特色特黄| 亚洲日韩第九十九页| 国产日韩av高清| 久久国产欧美精品| 久久国产精品一区二区| 一区二区三区在线免费播放| 欧美激情精品久久久久久大尺度 | 国产午夜一区二区三区| 另类春色校园亚洲| 久热综合在线亚洲精品| 久久夜色精品国产噜噜av| 老牛影视一区二区三区| 男女视频一区二区| 欧美日韩国产电影| 国产精品成人va在线观看| 国产精品你懂的在线| 国产欧美日韩视频一区二区| 国产一区二区三区在线观看免费视频 | 免费成人美女女| 亚洲三级免费| 国产精品99久久久久久宅男| 午夜精品久久久久久久久| 久久一区二区三区四区| 欧美激情综合亚洲一二区| 国产精品久久久久久久久婷婷 | a4yy欧美一区二区三区| 午夜亚洲一区| 蜜桃久久精品一区二区| 亚洲日本欧美天堂| 亚洲欧美成人一区二区在线电影| 久久精品一区中文字幕| 欧美老女人xx| 国产在线视频欧美| 99在线|亚洲一区二区| 久久精品道一区二区三区| 欧美顶级艳妇交换群宴| 99精品欧美一区| 久久亚洲色图| 国产精品视频| 91久久午夜| 久久久精品国产免大香伊 | 亚洲一区二区三区高清| 免费在线国产精品| 国产人久久人人人人爽| 亚洲三级视频在线观看| 久久精品99国产精品| 亚洲免费高清视频| 久久一区中文字幕| 国产日韩精品在线| 亚洲视频图片小说| 亚洲第一在线视频| 久久久久久久精| 国产麻豆综合| 亚洲欧美变态国产另类| 亚洲欧洲日韩在线| 蜜臀久久久99精品久久久久久 | 欧美国产日韩一区二区在线观看 | 欧美1区2区3区|