課程講義-windows wdm驅(qū)動(dòng)開發(fā)_第1頁
課程講義-windows wdm驅(qū)動(dòng)開發(fā)_第2頁
課程講義-windows wdm驅(qū)動(dòng)開發(fā)_第3頁
課程講義-windows wdm驅(qū)動(dòng)開發(fā)_第4頁
課程講義-windows wdm驅(qū)動(dòng)開發(fā)_第5頁
已閱讀5頁,還剩48頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

WindowsWDMWyouken&O4icwin2005年11月Rev.(c)2005-2006,ICWIN保留所RevisionIssueWyouken&第一 概 本的規(guī)劃 第二 IRP主功能碼(MajorFunction IRP_MJ_PNP次功能碼(MinorFunction IRP_MJ_POWER次功能碼(MinorFunction 第三 安裝 在project->settings中設(shè)置成如下 還可以在Tools->Options-〉directories中選擇“Executablefiles”并添加MakeDrvr.bat的 再按F7編譯有編譯提 搞清楚MakeDrvr.BAT文件的功 第四章安裝DebugPrintMonitor驅(qū)動(dòng)程 檢查DebugPrintdriver的安裝情 第五章安裝wdm1驅(qū)動(dòng)程 INF文 第六章執(zhí)行應(yīng)用程 編譯Wdm1Test工 重新指定Wdm1Test工程的setupapi.lib的路 第七章啟用wdm1驅(qū)動(dòng)程 第八章停用wdm1驅(qū)動(dòng)程 點(diǎn)擊“我的電腦”–“屬性”–“硬件 點(diǎn)擊“設(shè)備管理器”并展開其他設(shè) 第九章還有更好的 得到 原 修改wdm1工程的例 第十章USB驅(qū)動(dòng)程序的設(shè)計(jì)詳 第十一章PCI驅(qū)動(dòng)設(shè)計(jì)詳 序80年代以前的程序員們個(gè)個(gè)身懷絕技,軟硬兼通,從最頂層的應(yīng)用到最底層的IO控制都人們隨時(shí)都有感。所以一部分人開始轉(zhuǎn)向嵌入式開發(fā),硬件邏輯設(shè)計(jì)等等方面。需求讓開發(fā)商們不得不做出接口豐富的產(chǎn)品。驅(qū)動(dòng)的經(jīng)歷淺薄的寫出來,只要您是有心人,此文將能最大限度的快速入門。如果您有好的文章或建議,請給我們!第一本的規(guī)劃應(yīng)用系統(tǒng)開發(fā)的角度來一步步的去講解如何實(shí)現(xiàn)WDM驅(qū)動(dòng)的開發(fā)。閱讀本書的條件(閱讀者必須具備的能力Icwin書寫本文的目的第二章WDM動(dòng)程序的運(yùn)WDM驅(qū)動(dòng)程序的基本調(diào)用流程WDMIRP_MJ_*IRP_MN_*等都是可以理驅(qū)動(dòng)程序何時(shí)從何處開始執(zhí)行驅(qū)動(dòng)程序都可從正確安裝成功或更新后就會(huì)作系統(tǒng)調(diào)用,并*根據(jù)VID和PID計(jì)算機(jī)會(huì)查找是否已經(jīng)裝過驅(qū)動(dòng)程序,如果沒有裝過,就提示新設(shè)備要裝驅(qū)動(dòng)程序了;如果已經(jīng)裝了,就由系統(tǒng)裝載驅(qū)動(dòng)程序并開始從DriverEntry()執(zhí)行(如果有正DbgPrint就可以看到驅(qū)動(dòng)程序執(zhí)行的流程一般情況下,驅(qū)動(dòng)程序從windows檢查到設(shè)備的拔插開始,由操作系統(tǒng)調(diào)用執(zhí)行,進(jìn)入我們驅(qū)動(dòng)代碼的是DriverEntry()DriverEntry()大約做些什么#pragma#pragmacode_seg("INIT")//startINITsectionextern"C"NTSTATUS INPDRIVER_OBJECTINPUNICODE_STRING{NTSTATUSstatus=#ifDebugPrint("RegistryPathis//ExportotherdriverentryDriverObject->DriverExtension->AddDevice=Wdm1AddDevice;DriverObject->DriverUnload=Wdm1Unload;DriverObject->MajorFunction[IRP_MJ_CREATE]=Wdm1Create;//forDriverObject->MajorFunction[IRP_MJ_CLOSE]=Wdm1Close;//forDriverObject->MajorFunction[IRP_MJ_PNP]=Wdm1Pnp;DriverObject->MajorFunction[IRP_MJ_POWER]=Wdm1Power;DriverObject->MajorFunction[IRP_MJ_READ]DriverObject->MajorFunction[IRP_MJ_READ]=Wdm1Read;//forReadFileDriverObject->MajorFunction[IRP_MJ_WRITE]=Wdm1Write;//for//Initialisespinlockwhichprotectsaccesstosharedmemorybufferreturnstatus;}#pragmacode_seg()//endINIT回調(diào)函數(shù)分為主功能和次功能兩種 IRP功能碼(MajorFunction驅(qū)動(dòng)程序與應(yīng)用程序相關(guān)的功能碼如何調(diào)用DriverEntry()中您必須要回調(diào)函DriverObject->MajorFunction[IRP_MJ_CREATE]=息碼的消息處理函數(shù)Wdm1Create():NTSTATUS INPDEVICE_OBJECTfdo,INPIRP在您的應(yīng)用程序中正確調(diào)用HANDLEHANDLErv=CreateFile(ifDetail->DevicePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,IoControl調(diào)用#define#defineIOCTL_WDM1_ZERO_BUFFERCTL_CODE(\ if(if(!DeviceIoControl(hWdm1,NULL,0,//InputNULL,0,//Output{}\NTSTATUSINNTSTATUSINPDEVICE_OBJECTINPIRP{PIO_STACK_LOCATIONIrpStack=IoGetCurrentIrpStackLocation(Irp);NTSTATUSstatus=STATUS_SUCCESS;ULONGBytesTxd=ULONGControlCodeIrpStack->Parameters.DeviceIoControl.IoControlCode;取得ControlCodeULONGInputLength=IrpStack->Parameters.DeviceIoControl.InputBufferLength;DebugPrint("DeviceIoControl:Controlcode%xInputLength%dOutputLength%d",ControlCode,InputLength,OutputLength);//GetaccesstothesharedbufferKIRQLirql;switch(ControlCode){///////ZerocaseIOCTL_WDM1_ZERO_BUFFER://處理此//Zerotheif(Buffer!=NULL&&}}第三章開始編WDM動(dòng)程得到一個(gè)Demo工程 ││││││││││││││││││││││││││││││││││││││││││││││││││││││ │ │ │││ │ │ │ │ │ │││││││││││ ││VCDDK我 :H:\driverDev\ 我的機(jī)器XP_DDK的 :D:\winddk\2600(根據(jù)您自己的填寫) ”和”DDK :H:\driverDev\ 我的機(jī)器XP_DDK的 :D:\winddk\2600(根據(jù)您自己的填寫)“R”或點(diǎn)擊“屬性”出現(xiàn)屬性注:變量值是你的DDK的 (bin的上層 打開wdm1\sys\Wdm1.dsp點(diǎn) “是修改H:\driverDev\MakeDrvr.bat @echo@echo@echoDDK_DIR:%1if"%1"==""gotousageif"%3"==""gotoifnotexist%1\bin\setenv.batgotousagecall%1\bin\setenv%1%4cdbuild-b-w-cef%5%6%7%8%9gotoexitechousage MakeDrvrDDK_dirDriver_DriveDriver_Dirfree/checkedecho MakeDrvr%%DDKROOT%%C:%%WDMBOOK%%free-ConfigurationWdm1Win32Free'MakeDrvr'不是內(nèi)部或外部命令,也不是可運(yùn)行的程序Errorexecutingc:\windows\system32\cmd.exe.Wdm1.sys-1error(s),0warning(s)VC前面的內(nèi)容編譯時(shí)出了錯(cuò)誤(配置我們在VC6中常做的有兩種解決的辦法:注意:后面的3.2.5.1.1和3.2.5.1.2project->settings中設(shè)置成如還可以在Tools->Options-〉directories中選擇“Executablefiles”并添加MakeDrvr.bat的 F7編譯Configuration:Configuration:Wdm1-Win32BUILD:Objectrootsetto:==>BUILD:Adding/YtoCOPYCMDsoxcopyopswon'thang.BUILD:/iswitchignoredBUILD:CompileandLinkforBUILD:LoadingD:\WINDDK\2600\build.dat...BUILD:ComputingIncludefiledependencies:BUILD:SavingD:\WINDDK\2600\build.dat...BUILD:DoneWdm1.sys-0error(s),0SRC_ROOT:c:我們應(yīng)該更改C:為我們源代碼的 (即把下圖的C:改SRC_PATH:H:\driverDev\wdm1\sys的 搞清楚MakeDrvr.BAT文件的 @echo@echo @echo DDK@echo SRCROOT,@echoif"%1"==""gotoif"%3"==""gotoifnotexist%1\bin\setenv.batgotocall%1\bin\setenv%1cdbuildbwcef%567%89buildgotoexitechousage MakeDrvrDDK_dirDriver_DriveDriver_Dirfree/checkedecho MakeDrvr%%DDKROOT%%C:%%WDMBOOK%%free-Configuration:Configuration:Wdm1-Win32COMPILETYPE:checkedCOMPILEPARAM:-cefH:\driverDev\wdm1\sys>if"d:\winddk\2600"==""gotousageH:\driverDev\wdm1\sys>if"H:\driverDev\wdm1\sys"==""gotousageH:\driverDev\wdm1\sys>ifnotexistd:\winddk\2600\bin\setenv.batgotousagecalld:\winddk\2600\bin\setenvd:\winddk\2600checkedH:\driverDev\wdm1\sys>calld:\winddk\2600\bin\setenvd:\winddk\2600checkedbuild-b-w-cefBUILD:Objectrootsetto:==>BUILD:Adding/YtoCOPYCMDsoxcopyopswon'thang.BUILD:/iswitchignoredBUILD:CompileandLinkforBUILD:Loadingd:\winddk\2600\build.dat...BUILD:ComputingIncludefileBUILD:ExaminingH:\driverDev\wdm1\sysdirectoryforfilestoH:\driverDev\wdm1\sys-5sourcefiles(1,824lines)BUILD:Savingd:\winddk\2600\build.dat...BUILD:CompilingH:\driverDev\wdm1\sysdirectoryCompiling-wdm1.rcfori386Compiling-debugprint.cfori386Compiling-init.cppfori386Compiling-dispatch.cppfori386Compiling-pnp.cppfori386LinkingExecutable-objchk\i386\wdm1.sysforBUILD:BUILD:LinkingH:\driverDev\wdm1\sysdirectoryBUILD:Done9filescompiled 9121executableWdm1.sys-0error(s),0LinkingExecutable-objchk\i386\wdm1.sysfori386第四章DebugPrintMonitor用控制面板安(Y”然后點(diǎn)擊“下一步”(H點(diǎn)擊“打開(O)”

DebugPrintdriver安裝情沒有黃色的警告和紅X說明安裝成功了第五章安裝wdm1動(dòng)程INF安裝驅(qū)動(dòng)程序必須有*.INF文件,INF文件主要了*.sys文件相對(duì)于*.INF文件的位置,驅(qū)動(dòng)程序相關(guān)的版本、廠商、時(shí)間等等信息。全新安裝驅(qū)DriverEntry安裝驅(qū)動(dòng) 我們點(diǎn)擊Configuration:Wdm1TestConfiguration:Wdm1Test-Win32H:\driverDev\wdm1\exe\Wdm1Test.cpp(17):fatalerrorC1083:Cannotopenincludefile:'c:\98ddk\inc\win98\setupapi.h':NosuchfileordirectoryErrorexecutingWdm1Test.exe-1error(s),0Cannotopenincludefile:'c:\98ddk\inc\win98\setupapi.h':Nosuchfileor修改Wdm1Test.CPP文件的setupapi.h的路上面的編譯錯(cuò)誤了setupapi.h路徑錯(cuò)誤,這是DDK的文件,我們在DDK(D:\WINDDK\2600)下搜索setupapi.h并把 我的DDK 是D:\winddk\2600#include Configuration:Wdm1TestConfiguration:Wdm1Test-Win32 ErrorexecutingWdm1Test.exe-1error(s),0 這是說找不到重新指Wdm1Test工程setupapi.lib的路VC6projectsettingsLinkObject/librarymodules的 類型DWORD_PTR和ULONG_PTRd:\winddk\2600\inc\crt\setupapi.h(688)d:\winddk\2600\inc\crt\setupapi.h(688):errorC2146:syntaxerror:missing';'beforeidentifier''d:\winddk\2600\inc\crt\setupapi.h(688):errorC2501:'ULONG_PTR':missingstorage-classortypespecifiersd:\winddk\2600\inc\crt\setupapi.h(1492):errorC2146:syntaxerror:missing';'beforeidentifier'PrivateData'd:\winddk\2600\inc\crt\setupapi.h(1492):errorC2501:'DWORD_PTR':missingstorage-classtypetypedefPVOID////DefinetypeforreferencetodeviceinformationtypedefPVOID//addedbytypedefunsignedlong*ULONG_PTR;typedefunsignedlong*DWORD_PTRConfiguration:Wdm1TestConfiguration:Wdm1Test-Win32Wdm1Test.exe-0error(s),0調(diào)試WdmTest設(shè)置斷在VC搜 HANDLErv=CreateFile(ifDetail-單步執(zhí) 下驅(qū)動(dòng)程序代碼對(duì)照EXE中繼續(xù)往下執(zhí)行執(zhí)行ReadFile執(zhí)行WriteFile其他的請自己執(zhí)第

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論