『壹』 win7系統usb驅動程序開發使用什麼開發工具
Windows平台開發驅動主要有如下工具:
1、VC\VS,主要用於編輯源、編譯驅動程序源代碼,WIN7平台上現在依然正常使用VC6.0,雖然這款IDE很老啦,但是相對來說,運行簡單,佔用資源少,因此不少程序員會即安裝VS也會安裝VC,用VC進行源代碼編寫,用VS進行編譯,更多的是使用makefile文件操作。
2、WDK,(Windows Driver Kit)是一種完全集成的驅動程序開發系統,它包含Windows Driver Device Kit (DDK),用於測試 Windows 驅動器的可靠性和穩定性。可以從微軟官網下載。
『貳』 如何安裝WDK並運行編譯一個工程
方法/步驟 1 WDK的安裝 WDK的安裝,點擊exe文件,然後如圖選中,繼續下一步操作完成安裝,點擊OK即可。 2 打開程序 從「開始」菜單中打開WDK的build環境配置,從「開始」菜單中選擇「所有程序」,然後選擇「Windows Driver Kits」在WDK的版本(這里「WDK 6001 18001」)「Build Enieiroments」到「Windows XP」到「Launch Windows XP x86 Checked Build Enviroment」。 3 編譯程序 出現一個控制台,這個控制台已經配置好編譯環境。現在輸入cd命令,進入我們先前建立的first目錄;進入之後,輸入build命令。現在編譯結束,First.svs出現在\First\objchk_wxp_x86\i386下。 4 安裝srvinstw.exe 接下來安裝srvinstw.exe,執行這個工具,把我們編寫的first.sys安裝到自己的計算機上。 5 服務選擇 選擇「安裝服務」並單擊「下一步」按鈕。然後選擇「本地計算機」,單擊「下一步」按鈕。 6 服務名稱配置 這時要輸入服務名稱,這里輸入文件的名字「first」。但這個名稱不一定要 和文件名相同,可以隨意輸入,只是不能和已經存在的服務沖突。接下來,這個位置是需要手工輸入sys文件的路徑。 7 選擇「設備驅動」 接下來選擇「設備驅動」。輸入「NT驅動器目標名」不需要輸入任何內容,直接單擊「下一步」按鈕即可。選擇啟動類型:請一定選擇「手動」。 8 安裝DehugView.exe DehugView.exe的安裝非常簡單,直接打開DehugView.exe之後,界面如圖所示。 9 啟動.sys文件 要把Capture Kernel勾上,由於前面已經安裝了服務,所以,現在打開控制台(所有程序附件一命令提示符),輸入net start first就可以啟動first.sys了。反之,可以輸入net stop first來停止它的運行。 注意事項 第二步:先前建立的first目錄,這個到時候根據自己的條件自己建立就可以了。
『叄』 windows系統下的wdk和ddk是咋回事呀
原來的驅動開發工具包叫做DDK(Driver Develpment Kit),現在新版本的叫做WDK(Windows Driver Kit)。
DDK是Device Development Kit,設備開發包的意思。一般指windows設備驅動程序開發包。如果你想開發一個設備驅動程序,如顯卡驅動程序,就必須使用DDK。
得到DDK需要二級訂閱MSDN光碟,但是微軟公司也經常不定期開放DDK的網路下載。
『肆』 如何把ndis filter框架利用到日膚indows驅動開發工作中
NDIS Filter NET_BUFFER_LIST NET_BUFFER MDL
1
網路數據結構如下圖:
5
第二種方法:
/*******************************************************************GetNetBufferData函數的功能:從1個NET_BUFFER裡面獲取數據。1個NET_BUFFER裡面含有1個或者多個的MDL*******************************************************************/VOIDGetNetBufferData(PNET_BUFFERNetBuffer,PUCHAROutputBuffer,ULONGOutputBufferSize,PULONGOutputBytesCopied){PMDLMdl=NetBuffer->CurrentMdl;*OutputBytesCopied=0;if(NetBuffer->DataLength>OutputBufferSize){#ifDBGDbgPrint("Notenoughoutputbufferspace,in:%d,out:%d ",NetBuffer->DataLength,OutputBufferSize);#endifreturn;}NdisMoveMemory(OutputBuffer,(PUCHAR)MmGetSystemAddressForMdlSafe(Mdl,LowPagePriority)+NetBuffer->CurrentMdlOffset,Mdl->ByteCount-NetBuffer->CurrentMdlOffset);OutputBuffer+=Mdl->ByteCount-NetBuffer->CurrentMdlOffset;*OutputBytesCopied+=Mdl->ByteCount-NetBuffer->CurrentMdlOffset;////循環MDL鏈表,獲取每一個結點的數據,數據被保存到OutputBuffer裡面//OutputBuffer的空間不斷地擴大。//當鏈表不為空,並且OutputBuffer的長度<1個NET_BUFFER的總長度while(((Mdl=Mdl->Next)!=NULL)&&(*OutputBytesCopied<NetBuffer->DataLength)){NdisMoveMemory(OutputBuffer,MmGetSystemAddressForMdlSafe(Mdl,LowPagePriority),Mdl->ByteCount);OutputBuffer+=Mdl->ByteCount;//數據被保存到OutputBuffer裡面*OutputBytesCopied+=Mdl->ByteCount;//OutputBuffer的空間不斷地擴大}if(Mdl!=NULL){NdisMoveMemory(OutputBuffer,MmGetSystemAddressForMdlSafe(Mdl,LowPagePriority),NetBuffer->DataLength);OutputBuffer+=Mdl->ByteCount;*OutputBytesCopied+=Mdl->ByteCount;}#ifDBGDbgPrint("buffercopied:%dbytes ",*OutputBytesCopied);#endif}
6
上面的2種方法,只是獲取數據。而原本NDISFilter框架提供的這4個函數默認的代碼,都沒有做任何操作,沒有實質性質的功能,這4個函數原本默認的代碼,我們都不需要,因為我們的驅動程序需要處理網路數據包。這4個函數分別是:
7
在我們的NDISFilter工程裡面,我們需要修改掉這4個函數的功能,把它們替換成我們所想要的功能。比如,你在發送數據包或者接收數據包的時候,需要實現自己的一些業務邏輯,而不是去使用MicrosoftNDISFilter提供的原始代碼的功能。
8
函數的功能:NDIS調用把發送的結構和數據返還給FilterDriver。NDIS可以收集多次NdisFSendNetBufferLists發送的結構和數據形成一個單鏈表傳遞給。除非到NDIS調用,否則一個發送請求的當前狀態總是未知的。一個過濾驅動是不能在NDIS調用返回結構之前對NET_BUFFER_LIST和其關聯的數據做檢查的。要完成一個發送請求完成後的任何必要的後繼處理。當NDIS調用時,FilterDriver就重新獲地對結構及結構相關資源的所有權。可以在中釋放相關的資源和准備下一個NdisFSendNetBufferLists調用。NDIS總是按照過濾驅動調用NdisFSendNetBufferLists提交的順序傳遞給下層驅動,但是回返的順序則是任意的。FilterDriver可以請求一個回環發送請求,只要把NdisFSendNetBufferLists的SendFlags設置成NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK就行了。NDIS會引發一個包含發送數據的接收包指示。
9
一個FilterDriver應該對自己引發的發送請求保持跟蹤並確保在完成時不調用NdisFSendNetBufferComplete常式。
步驟閱讀
10
FilterSendNetBufferLists函數的功能:NDIS調用一個FilterDriver的FilterSendNetBufferLists常式來過濾上層驅動的發送請求。FilterDriver不能改變其它驅動傳來的NET_BUFFER_LIST結構中的SourceHandle成員的值。它可以過濾數據並發送過濾的數據到下層驅動。
11
對每一個提交到FilterSendNetBufferLists的NDIS_BUFFER_LIST,我們可做下面的操作:
1)可以把緩沖區通過NdisFSendBufferLists傳遞給下層驅動,NDIS保證上下文空間對FilterDriver的有效性。過濾驅動可以在發送前修改緩沖區的內容。可以像處理自己引發的發送請求的緩沖區一樣處理這個緩沖區。2)可以調用拒絕傳遞這個包3)排隊緩沖區內容到本地的供以後處理。例如要在一定超時後處理或要接收到特定包後才處理等。如果支持這種處理方式就要支持取消請求的操作。4)可以拷貝緩沖區並引發一個發送請求。它類似自己引發一個發送請求,但必須先調用NdisFSendNetBufferComplete返回上層驅動的緩沖區。
12
發送請求在驅動棧繼續完成,當一個微埠驅動調用完成一個發送請求時,NDIS會調用微埠
13
在一個發送操作完成後,FilterDriver可以做在FilterSendNetBufferLists中所有修改的相反操作。返回一個NET_BUFFER_LIST結構的單鏈表和發送請求的最終狀態給上層的驅動。當最頂層的FilterMole的被調用完成後NDIS會調用引發發送請求的協議驅動的。如果FilterDriver不提供FilterSendNetBufferLists它還是可以引發一個發送操作的,但它必須提供一個並且不能在這個常式里把這個事件傳遞給上層驅動。
14
一個FilterDriver可以傳遞或過濾一個上層驅動的回環請求,要傳遞一個回環請求,NDIS會設置FilterSendNetBufferLists的SendFlags參數為NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK,FilterDriver在調用NdisFSendNetBufferLists時把這個標記傳給它即可。在回環請求的情況下NDIS會指示一個包含發送數據的接收包。
15
如果一個FilterDriver修改的任何行為不是NDIS提供的標准服務,那麼它應該當自己為NDIS提供相應的服務。例如,如果一個FilterDriver修改了一個硬體地址請求,就必須處理直接到這個新地址回環包。在這種情況下,因為FilterDriver已經更改了地址NDIS是不能提供一個回環服務的。
16
_Use_decl_annotations_VOIDFilterSendNetBufferLists(NDIS_HANDLEFilterMoleContext,PNET_BUFFER_LISTNetBufferLists,NDIS_PORT_NUMBERPortNumber,ULONGSendFlags){PMS_FILTERpFilter=(PMS_FILTER)FilterMoleContext;PNET_BUFFERNetBuffer;UCHARTempBuffer[MAX_BUFFER_SIZE];ULONGBytesCopied;pEthHdrEthernetHeader;pIPHdrIpHeader;#ifDBGDbgPrint(">>>FilterSendNetBufferLists:%p ",NetBufferLists);#endiffor(NetBuffer=NetBufferLists->FirstNetBuffer;NetBuffer!=NULL;NetBuffer=NetBuffer->Next){GetNetBufferData(NetBuffer,TempBuffer,MAX_BUFFER_SIZE,&BytesCopied);if(BytesCopied==0){#ifDBGDbgPrint("Netbuffercatcherror ");#endif}else{EthernetHeader=TempBuffer;if(EthernetHeader->Type==0x0800)//乙太網類型{IpHeader=EthernetHeader+sizeof(EthHdr);//去掉乙太網頭,抓出IP頭#ifDBGDbgPrint("Getippacket ");#endif}}}NdisFSendNetBufferLists(pFilter->FilterHandle,NetBufferLists,PortNumber,SendFlags);}
17
FilterReturnNetBufferLists函數的功能:如果FilterDriver設置了的狀態為NDIS_STATUS_SUCCESS,NDIS通過驅動的FilterReturnNetBufferLists返回指示數據。在這種情況下FilterDriver失去了對NET_BUFFER_LIST的所有權,直到FilterReturnNetBufferLists被調用。FilterDriver調用NdisFIndicateNetBufferLists傳遞接收指示給驅動棧上的上層驅動,如果上層驅動保留了對緩沖區(NET_BUFFER_LIST)的所有權,NDIS會調用FilterDriver的FilterReturnNetBufferLists常式。在FilterReturnNetBufferLists中應該撤消在接收路徑上(如在FilterReciveNetBufferLists中做的一些處理)的操作。當最底層的FilterMole完成對緩沖區(NET_BUFFER_LIST)的處理後,NDIS把緩沖區返回給微埠驅動。如果FilterReceiveNetBufferLists的ReceiveFlags沒有設置NDIS_RECEIVE_FLAGS_RESOURCES標記,FilterDriver調用NdisFReturnNetBufferList返回這個緩沖區數據,如果設置了FilterReceiveNetBufferLists直接返回時就把緩沖區返還給了下層微埠驅動。
步驟閱讀
18
FilterReceiveNetBufferLists函數的功能:FilterDriver調用來指示發送數據。這個函數通過NET_BUFFER_LIST結構給上層驅動指示數據。FilterDriver可以從池中分配這個結構。如果FilterDriver設置了的狀態為NDIS_STATUS_SUCCESS,NDIS通過驅動的FilterReturnNetBufferLists返回指示數據。在這種情況下FilterDriver失去了對NET_BUFFER_LIST的所有權直到FilterReturnNetBufferLists被調用。如果FilterDriver在調用時設置ReceiveFlags為NDIS_RECEIVE_FLAGS_RESOURCES,在函數返回後FilterDriver會立即恢復對NET_BUFFER_LIST的所有權,這時FilterDriver必須立即處理這個NET_BUFFER_LIST的返回,因為NDIS在這種情況下是不會調用FilterReturnNetBufferLists返回NET_BUFFER_LIST結構的。注意:一個FilterDriver應該跟蹤自己引發的接收指示確保它在FilterReturnNetBufferLists中不調用NdisFReturnNetBufferLists。
19
_Use_decl_annotations_(NDIS_HANDLEFilterMoleContext,PNET_BUFFER_LISTNetBufferLists,NDIS_PORT_NUMBERPortNumber,ULONGNumberOfNetBufferLists,ULONGReceiveFlags){PMS_FILTERpFilter=(PMS_FILTER)FilterMoleContext;PNET_BUFFERNetBuffer;UCHARTempBuffer[MAX_BUFFER_SIZE];ULONGBytesCopied;pEthHdrEthernetHeader;pIPHdrIpHeader;#ifDBGDbgPrint(">>>FilterReceiveNetBufferLists:%p ",NetBufferLists,ReceiveFlags,NumberOfNetBufferLists);#endifdo{for(NetBuffer=NetBufferLists->FirstNetBuffer;NetBuffer!=NULL;NetBuffer=NetBuffer->Next){GetNetBufferData(NetBuffer,TempBuffer,MAX_BUFFER_SIZE,&BytesCopied);if(BytesCopied==0){#ifDBGDbgPrint("Netbuffercatcherror ");#endif}else{EthernetHeader=TempBuffer;if(EthernetHeader->Type==0x0800){IpHeader=EthernetHeader+sizeof(EthHdr);#ifDBGDbgPrint("IPpacketexist ");#endif}}}}while(FALSE);
20
調用來指示發送數據。如果FilterDriver設置了的狀態為NDIS_STATUS_SUCCESS,NDIS通過驅動的FilterReturnNetBufferLists返回指示數據。如果FilterDriver設置了的ReceiveFlags值為NDIS_RECEIVE_FLAGS_RESOURCES,那麼在函數返回後FilterDriver會立即恢復對NET_BUFFER_LIST的所有權,這時FilterDriver必須立即處理這個NET_BUFFER_LIST的返回。在這種情況下是不會調用FilterReturnNetBufferLists返回NET_BUFFER_LIST結構的。
『伍』 看雪論壇的那些驅動代碼怎麼用
你要把微軟的WDK下載下來
建立驅動開發環境,你可以用vc,也可以用mingw gcc編寫驅動程序
WDK裡面有很多驅動例子代碼
夠你學習的了
C/C++編程感興趣的,歡迎到網路codeblocks貼吧耍
『陸』 Windows設備驅動程序WDF開發的本書內容
本書主要討論KMDF,KMDF是WDM的繼續,可以把WDM驅動程序轉換為KMDF驅動程序。還對UMDF設備驅動程序作了編程入門介紹。
過去,我研究過如何用DriverStudio開發工具開發Windows下的WDM設備驅動程序,承蒙電子工業出版社的厚愛,出版了《Windows 2000/XP WDM設備驅動程序開發》一書。
WDF的簡單化編程,導致DriverStudio退出了Windows設備驅動程序的開發,將DriverStudio定格在3.2版本。
從形式上看,KMDF的對象和DriverStudio的類,具有相似的地方。本書的內容安排和《Windows 2000/XP WDM設備驅動程序開發》的基本一致,具體安排如下:
章 名 主 要 內 容
第1章 Windows 2000和WDM驅動程序 KMDF是WDM的繼續,KMDF構建在WDM之上。對於一些Windows驅動程序的基本概念,初學者仍需要了解,如Windows 2000中的組件、驅動程序種類,以及WDM驅動程序特點等
第2章 KMDF驅動程序框架 KMDF驅動程序框架由對象和事件回調常式構成。KMDF框架中所有的事物都由對象來表示,各種事件處理都由事件回調常式來完成。學習KMDF編程,主要是學習KMDF的各種對象、對象函數和事件回調常式的編程
第3章 基本對象 KMDF提供了許多對象,本章只介紹一些基本的對象,如WDFREQUEST對象、WDFQUEUE對象等,還介紹了數據同步訪問、字元串操作和QueueSample實例
第4章 KMDF驅動程序編程入門 介紹Windows Vista下的KMDF驅動程序編程入門,包括KMDF驅動程序編程環境的建立,KMDF的創建、生成及安裝過程,以及Win32 Console和MFC兩種應用程序的編程
第5章 KMDF驅動程序和應用程序之間的通信 介紹應用程序與KMDF之間的通信,包括應用程序對KMDF的通信,以及KMDF對應用程序的通信
第6章 即插即用常式 主要介紹PnP組件、即插即用常式的載入和卸載順序及PnpPowerSample實例等
第7章 電源管理 主要介紹系統電源狀態與設備電源狀態、電源管理控制標志位、設備的喚醒特徵和空閑檢測、電源管理編程及IdleSample實例等
第8章 KMDF過濾器驅動程序 描述如何寫一個過濾器驅動程序,該驅動程序可位於功能驅動程序的上面或下面,它通過過濾流經它的IRP來修改設備的行為
第9章 USB設備開發 主要介紹USB設備的配置/介面/端點、USB數據的傳輸方式、USB描述符、USB編程對象、USB編程(如激活配置與中止配置、同步操作、非同步操作)及USBSample實例等
第10章 PCI設備驅動程序開發 本章就硬體訪問、中斷處理和DMA傳輸3個方面展開討論,並以CY7C09449晶元為例,給出一個經過測試的PCI設備驅動程序實例——PCISample實例。另外,還給出了一個不依靠硬體設備的DMASample實例
第11章 UMDF驅動程序編程入門 介紹UMDF驅動程序編程入門,包括UMDF驅動程序的創建、生成及安裝,以及一個簡單的實例編程
第12章 WinDbg使用介紹 WinDbg是微軟提供的一個功能非常強大的調試軟體,可以在源代碼級別調試Windows下的WDF驅動程序。本章主要介紹用WinDbg調試KMDF和UMDF
微軟推薦的WDF書籍是《Developing Drivers with the Microsoft Windows Driver Foundation》,作者是Penny Orwick和Guy Smith。
微軟提供的學習WDF的中文網站地址是:www. microsoft. com/china/whdc。
開發工具
微軟提供的WDF驅動程序開發工具包WDK的最新版本是WDK 1.7,可以從其網站下載。
本書實現WDF驅動程序及應用程序實例所用的工具是:Visual C++ 6.0和WDK 1.7。
本書配套光碟
本書配套光碟中含有書中所有實例的驅動程序和應用程序的全部源代碼,以及生成的驅動程序和可執行的應用程序。除USBSample和PCISample實例因需要硬體設備的支持,讀者無法運行外,其他11個實例均可在Windows XP和Vista下運行。
本書特點
編程入門:詳細的步驟介紹,初學者的良師益友。
應用實例:對程序作了必要的注釋,了解驅動程序編程的捷徑。
簡單實用:KMDF的編程非常簡單,Winows硬體開發工程師必須掌握。
理解深刻:筆者精通Winows設備驅動程序開發和硬體開發,所有實例均為自己創造,每個實例都有其獨特意義,筆者用實例詮釋自己對KMDF的理解和認識。
微軟推薦的WDF書籍是「理論派」,以講解理論為主,講得非常詳細和全面;本書是「實戰派」,全書以實例為主,用實例帶你快速入門。
善於學習,勤於思考,勇於實踐。用這句話與投身硬體開發的青年學子共勉。
希望這本書能對您現在或將來的工作有所幫助。
本書得以順利出版,要特別感謝周利莉的一貫支持;感謝何海洋和趙慶花的支持;感謝陳建波和何亞壘的支持;感謝朱沭紅編輯和電子工業出版社。
由於作者的理論水平有限,書中難免出現差錯和遺漏,敬請廣大計算機應用開發人員批評指正,
十年時間,跟蹤Windows設備驅動程序的開發,驅動程序VxD->WDM->KMDF,工具VtoolsD->DDK、DriverWorks->WDK,但願WDF長久。別了WDM,別了DriverStudio。
缺月掛疏桐,漏斷人初靜。誰見幽人獨往來,縹緲孤鴻影。……
武安河
2009年元旦
『柒』 vs2010連接WDK讀不出驅動頭文件ntddk.h
需要搭建WDK環境的,你的可能沒有搭建wdk環境,關於「WDK環境搭建」可以看:
http://jingyan..com/article/e75057f2df3493ebc91a89ab.html
我是ndk吧吧主,有問題可以ndk吧留言,謝謝!
『捌』 wdk與DDK有什麼區別
首先,先從基礎的東西說起,開發WINDOWS下的驅動程序,需要一個專門的開發包,如:開發Java程序,我們可能需要一個JDK,開發 WINDOWS應用程序,我們需要WINDOWS的SDK,現在開發WINDOWS下的驅動程序,我們需要一個DDK/WDK。
2.DDK(Driver Developer Kit)和WDK(Windows Driver Kit)的區別:
這個要說說驅動相關的一些歷史:
1).95/98/ME下,驅動模型為:Vxd,相關資料可以看《編程高手箴言》的前幾個章節,裡面有很詳細的介紹,雖然這個東西已經過時,但大概看看還是會增長見識的。
2).2000/XP/2003下,Windows採用WDM驅動模型(Windows Driver Model),開發2000/XP/2003的驅動開發包為:DDK。
3).Vista及以後版本,採用了WDF驅動模型(Windows Driver Foudation),對應的開發包:WDK。
其實WDK可以看做是DDK的升級版本,現在一般的WDK是包含以前DDK相關的功能,現在XP下也可以用WDK開發驅動,WDK能編譯出2000-2008的各種驅動。
3.Vxd驅動文件擴展名為:.vxd。
WDM和WDF驅動文件擴展名為:.sys。
『玖』 Windows內核(驅動)編程中的線程問題
可以使用函數PsCreateSystemThread,用起來和ring3差不多,ring0編程更要注意線程同步問題,否則很容易BSOD(藍屏死機)
『拾』 WDK與WDM區別,兼容嗎
WDK(WindowsDriverKit)是一種完全集成的驅動程序開發系統,它包含WindowsDDK,用於測試Windows驅動器的可靠性和穩定性.WDM是Win32設備驅動程序體系結構Windows設備驅動程序,過去是WDM(WindowsDriverModel)框架,編程復雜,初學者難以掌握其編程要領。為了解決這一問題,微軟對WDM驅動程序的架構做了改進,形成了全新的WDF(WindowsDriverFoundation)框架結構。它提供了面向對象和事件驅動的驅動程序開發框架,大大降低了開發難度。從現在開始,掌握Windows設備驅動程序的開發人員,由過去的專業人士,將變為普通大眾。