日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

《Windows驱动开发技术详解》读书笔记(一)

發(fā)布時間:2025/7/14 windows 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Windows驱动开发技术详解》读书笔记(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??首先需要安裝DDK,這里我選擇Microsoft Windows Server 2003 SP1 DDK

Windows驅(qū)動分成兩類,一類是不支持即插即用的NT式驅(qū)動,一類是支持即插即用的WDM驅(qū)動.

首先來看一個最簡單的NT式驅(qū)動。

?

  • #pragma?once ?
  • ?
  • #ifdef?__cplusplus ?
  • extern?"C"?
  • { ?
  • #endif ?
  • #include?<NTDDK.h> ?
  • #ifdef?__cplusplus ?
  • } ?
  • #endif? ?
  • ?
  • #define?PAGEDCODE?code_seg("PAGE") ?
  • #define?LOCKEDCODE?code_seg() ?
  • #define?INITCODE?code_seg("INIT") ?
  • ?
  • #define?PAGEDDATA?data_seg("PAGE") ?
  • #define?LOCKEDDATA?data_seg() ?
  • #define?INITDATA?data_seg("INIT") ?
  • ?
  • #define?arraysize(p)?(sizeof(p)/sizeof((p)[0])) ?
  • ?
  • typedef?struct?_DEVICE_EXTENSION?{ ?
  • ????PDEVICE_OBJECT?pDevice; ?
  • ????UNICODE_STRING?ustrDeviceName;????//設(shè)備名稱 ?
  • ????UNICODE_STRING?ustrSymLinkName;????//符號鏈接名 ?
  • }?DEVICE_EXTENSION,?*PDEVICE_EXTENSION; ?
  • ?
  • //?驅(qū)動函數(shù)聲明 ?
  • NTSTATUS?CreateDevice?(IN?PDRIVER_OBJECT?pDriverObject); ?
  • VOID?HelloDDKUnload?(IN?PDRIVER_OBJECT?pDriverObject); ?
  • NTSTATUS?HelloDDKDispatchRoutine(IN?PDEVICE_OBJECT?pDevObj, ?
  • ?????????????????????????????????IN?PIRP?pIrp);?
  • ? Driver.h頭文件中包含了開發(fā)NT式驅(qū)動所需要的NTDDK.h,此外還定義了幾個標(biāo)志來指明函數(shù)和變量分配在分頁內(nèi)存還是非分頁內(nèi)存中。Windows驅(qū)動程序的入口函數(shù)是DriverEntry函數(shù),

    ?

  • #include?"Driver.h" ?
  • ?
  • /************************************************************************ ?
  • *?函數(shù)名稱:DriverEntry ?
  • *?功能描述:初始化驅(qū)動程序,定位和申請硬件資源,創(chuàng)建內(nèi)核對象 ?
  • *?參數(shù)列表: ?
  • ??????pDriverObject:從I/O管理器中傳進(jìn)來的驅(qū)動對象 ?
  • ??????pRegistryPath:驅(qū)動程序在注冊表的中的路徑 ?
  • *?返回?值:返回初始化驅(qū)動狀態(tài) ?
  • *************************************************************************/?
  • #pragma?INITCODE ?
  • extern?"C"?NTSTATUS?DriverEntry?( ?
  • ????????????IN?PDRIVER_OBJECT?pDriverObject, ?
  • ????????????IN?PUNICODE_STRING?pRegistryPath????)? ?
  • { ?
  • ????NTSTATUS?status; ?
  • ????KdPrint(("Enter?DriverEntry\n")); ?
  • ?
  • ????//注冊其他驅(qū)動調(diào)用函數(shù)入口 ?
  • ????pDriverObject->DriverUnload?=?HelloDDKUnload; ?
  • ????pDriverObject->MajorFunction[IRP_MJ_CREATE]?=?HelloDDKDispatchRoutine; ?
  • ????pDriverObject->MajorFunction[IRP_MJ_CLOSE]?=?HelloDDKDispatchRoutine; ?
  • ????pDriverObject->MajorFunction[IRP_MJ_WRITE]?=?HelloDDKDispatchRoutine; ?
  • ????pDriverObject->MajorFunction[IRP_MJ_READ]?=?HelloDDKDispatchRoutine; ?
  • ???? ?
  • ????//創(chuàng)建驅(qū)動設(shè)備對象 ?
  • ????status?=?CreateDevice(pDriverObject); ?
  • ?
  • ????KdPrint(("DriverEntry?end\n")); ?
  • ????return?status; ?
  • } ?
  • ?
  • /************************************************************************ ?
  • *?函數(shù)名稱:CreateDevice ?
  • *?功能描述:初始化設(shè)備對象 ?
  • *?參數(shù)列表: ?
  • ??????pDriverObject:從I/O管理器中傳進(jìn)來的驅(qū)動對象 ?
  • *?返回?值:返回初始化狀態(tài) ?
  • *************************************************************************/?
  • #pragma?INITCODE???//指明此函數(shù)加載到INIT內(nèi)存區(qū)域(即只在加載的時候需要載入內(nèi)存,加載成功后可以從內(nèi)存中卸載掉) ?
  • NTSTATUS?CreateDevice?( ?
  • ????????IN?PDRIVER_OBJECT????pDriverObject)? ?
  • { ?
  • ????NTSTATUS?status; ?
  • ????PDEVICE_OBJECT?pDevObj; ?
  • ????PDEVICE_EXTENSION?pDevExt; ?
  • ???? ?
  • ????//創(chuàng)建設(shè)備名稱 ?
  • ????UNICODE_STRING?devName; ?
  • ????RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice"); ?
  • ???? ?
  • ????//創(chuàng)建設(shè)備 ?
  • ????status?=?IoCreateDevice(?pDriverObject, ?
  • ????????????????????????sizeof(DEVICE_EXTENSION), ?
  • ????????????????????????&(UNICODE_STRING)devName, ?
  • ????????????????????????FILE_DEVICE_UNKNOWN,//此種設(shè)備為獨(dú)占設(shè)備 ?
  • ????????????????????????0,?TRUE, ?
  • ????????????????????????&pDevObj?); ?
  • ????if?(!NT_SUCCESS(status)) ?
  • ????????return?status; ?
  • ?
  • ????pDevObj->Flags?|=?DO_BUFFERED_IO; ?
  • ????pDevExt?=?(PDEVICE_EXTENSION)pDevObj->DeviceExtension; ?
  • ????pDevExt->pDevice?=?pDevObj; ?
  • ????pDevExt->ustrDeviceName?=?devName; ?
  • ????//創(chuàng)建符號鏈接 ?
  • ????UNICODE_STRING?symLinkName; ?
  • ????RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK"); ?
  • ????pDevExt->ustrSymLinkName?=?symLinkName; ?
  • ????status?=?IoCreateSymbolicLink(?&symLinkName,&devName?); ?
  • ????if?(!NT_SUCCESS(status))? ?
  • ????{ ?
  • ????????IoDeleteDevice(?pDevObj?); ?
  • ????????return?status; ?
  • ????} ?
  • ????return?STATUS_SUCCESS; ?
  • } ?
  • ?
  • /************************************************************************ ?
  • *?函數(shù)名稱:HelloDDKUnload ?
  • *?功能描述:負(fù)責(zé)驅(qū)動程序的卸載操作 ?
  • *?參數(shù)列表: ?
  • ??????pDriverObject:驅(qū)動對象 ?
  • *?返回?值:返回狀態(tài) ?
  • *************************************************************************/?
  • #pragma?PAGEDCODE ?
  • VOID?HelloDDKUnload?(IN?PDRIVER_OBJECT?pDriverObject)? ?
  • {//遍歷系統(tǒng)中所有的此類設(shè)備對象,刪除設(shè)備對象及其符號鏈接 ?
  • ????PDEVICE_OBJECT????pNextObj; ?
  • ????KdPrint(("Enter?DriverUnload\n")); ?
  • ????pNextObj?=?pDriverObject->DeviceObject; ?
  • ????while?(pNextObj?!=?NULL)? ?
  • ????{ ?
  • ????????PDEVICE_EXTENSION?pDevExt?=?(PDEVICE_EXTENSION) ?
  • ????????????pNextObj->DeviceExtension; ?
  • ?
  • ????????//刪除符號鏈接 ?
  • ????????UNICODE_STRING?pLinkName?=?pDevExt->ustrSymLinkName; ?
  • ????????IoDeleteSymbolicLink(&pLinkName); ?
  • ????????pNextObj?=?pNextObj->NextDevice; ?
  • ????????IoDeleteDevice(?pDevExt->pDevice?); ?
  • ????} ?
  • } ?
  • ?
  • /************************************************************************ ?
  • *?函數(shù)名稱:HelloDDKDispatchRoutine ?
  • *?功能描述:對讀IRP進(jìn)行處理 ?
  • *?參數(shù)列表: ?
  • ??????pDevObj:功能設(shè)備對象 ?
  • ??????pIrp:從IO請求包 ?
  • *?返回?值:返回狀態(tài) ?
  • *************************************************************************/?
  • #pragma?PAGEDCODE ?
  • NTSTATUS?HelloDDKDispatchRoutine(IN?PDEVICE_OBJECT?pDevObj, ?
  • ?????????????????????????????????IN?PIRP?pIrp)? ?
  • { ?
  • ????KdPrint(("Enter?HelloDDKDispatchRoutine\n")); ?
  • ????NTSTATUS?status?=?STATUS_SUCCESS; ?
  • ????//?完成IRP ?
  • ????pIrp->IoStatus.Status?=?status; ?
  • ????pIrp->IoStatus.Information?=?0;????//?bytes?xfered ?
  • ????IoCompleteRequest(?pIrp,?IO_NO_INCREMENT?); ?
  • ????KdPrint(("Leave?HelloDDKDispatchRoutine\n")); ?
  • ????return?status; ?
  • }?
  • 有兩種編譯驅(qū)動的辦法,一種是用DDK環(huán)境來編譯,需要在源代碼所在目錄下創(chuàng)建兩個文件makefileSources

    makefile內(nèi)容如下,功能是引入DDKbin目錄下的makefile.def文件:

  • !INCLUDE?$(NTMAKEENV)\makefile.def?
  • ?Sources內(nèi)容如下:

  • TARGETNAME=HelloDDK ?
  • TARGETTYPE=DRIVER ?
  • TARGETPATH=OBJ ?
  • INCLUDES=$(BASEDIR)\inc;\ ?
  • ?????????$(BASEDIR)\inc\ddk;\ ?
  • SOURCES=Driver.cpp\ ?
  • ?然后在開始菜單中選擇“Windows XP Checked Build Environment”編譯環(huán)境,進(jìn)入需要編譯的目錄,輸入”build命令就可以,

    編譯后的驅(qū)動位于objchk_wxp_x86"i386目錄下,名為HelloDDK.sys

    第二種編譯方式是使用VC++進(jìn)行編譯

    1,用vc新建工程。在"project"選項(xiàng)卡中,選擇win32 Application,選擇一個空的工程。
    2
    ,將兩個源文件Driver.hDriver.cpp拷貝到工程目錄中,并添加到工程中。
    3
    ,增加新的編譯版本,去掉Debug Release 版本,增加一個Win32 Driver Check Edition

    4,修改工程屬性。選擇"Project|Setting",或者直接按下Alt+F7鍵,彈出"Project Settings"。在對話框中,選擇“General”選項(xiàng)卡。將Intermediate filesOutput files都改為MyDriver_Check.
    5
    ,選擇C/C++選項(xiàng)卡,將原有的Project Options 內(nèi)容全部刪除替換成如下內(nèi)容:

  • /nologo?/Gz?/MLd?/W3?/WX?/Z7?/Od?/D?WIN32=100?/D?_X86_=1?/D?WINVER=0x500?/D?DBG=1?/Fo"MyDriver_Check/"?/Fd"MyDriver_Check/"?/FD?/c?
  • 6,選擇Link選項(xiàng)卡,將原有的Project Options 內(nèi)容全部刪除,替換成如下內(nèi)容:

  • ntoskrnl.lib?/nologo?/base:"0x10000"?/stack:0x400000,0x1000?/entry:"DriverEntry"?/subsystem:console?/incremental:no?/pdb:"MyDriver_Check/HelloDDK.pdb"?/map:"MyDriver_Check/HelloDDK.map"?/debug?/machine:I386?/nodefaultlib?/out:"MyDriver_Check/HelloDDK.sys"?/pdbtype:sept?/subsystem:native?/driver?/SECTION:INIT,D?/RELEASE?/IGNORE:4078 ?
  • 7。修改VClib目錄和include目錄。

    vc中選擇"Tools"|"Options",在彈出的對話框中選擇“Directories”選項(xiàng)卡。在“Show directories for”下拉菜單中選擇“Include files”菜單,添加

  • D:\WINDDK\3790.1830\INC\W2K?
  • D:\WINDDK\3790.1830\INC\DDK\W2K?
  • 并將這兩個目錄置于最上。

    "Show directories for "下拉菜單中選擇“Library files”菜單,添加目錄

  • D:\WINDDK\3790.1830\LIB\W2K\I386?
  • 并置于最上端。
    8
    ,按照書上所述的步驟做完后編譯,會報錯如下:

  • fatal?error?C1083:?Cannot?open?include?file:?'specstrings.h':?No?such?file?or?directory?
  • 原因是include目錄設(shè)置沒完整,加入如下目錄既可以正確編譯

    ?

  • D:\WINDDK\3790.1830\INC\CRT?
  • 最后來安裝此驅(qū)動,這里使用Driver Studio3.2.1中的Driver Monitor來完成

    ?

    ?

    轉(zhuǎn)載于:https://blog.51cto.com/phinecos/368163

    總結(jié)

    以上是生活随笔為你收集整理的《Windows驱动开发技术详解》读书笔记(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。