1. 程式人生 > >win7 x64部署和串列埠除錯虛擬驅動toaster

win7 x64部署和串列埠除錯虛擬驅動toaster

    WDK7600自帶的toaster驅動是個很好的學習驅動的案例,從匯流排驅動到App層,Class-install/Co-install都有涉及。本文主要涉及驅動部署和除錯。

1.先說說除錯的準備工作。一般除錯驅動都是在虛擬機器中進行的,這裡也不例外,用windbg+vmware雙擊聯調。通常開發階段,Wdm驅動以inf形式安裝並載入,載入後依次執行DriverEntry,AddDevice並響應IRP_MJ_PNP&IRP_MN_START事件。安裝的同時,pnp管理器會複製檔案及改寫登錄檔,待下次重啟,驅動在系統重啟階段會載入執行驅動。因此,在DriverEntry時加入斷點尤為重要,要不然將錯過這些函式的除錯時機。在x86時代,加入口斷點無非是程式碼中插入 asm int 3.但是,這麼美好的時代已經過去了,x64驅動不支援嵌入彙編。取而代之,必須通過編寫一個asm檔案,在原始碼中以呼叫外部函式的形式,共5步來實現。

1.1第一步實現int 3的彙編程式碼形如:

.code
asm_int3 proc
	int 3
	ret
asm_int3 endp	
end
1.2將這段程式碼儲存為softbp.asm。然後用wdk自帶的ml64編譯,注意僅編譯生成obj檔案:
ml64 /c softbp.asm
1.3接著是在C檔案中呼叫這個函式,如在wdm/bus/busenum.c的DriverEntry處加入斷點
extern void asm_int3(); //<-------------外部函式宣告

NTSTATUS
DriverEntry (
    __in  PDRIVER_OBJECT  DriverObject,
    __in  PUNICODE_STRING RegistryPath
    )
/*++
Routine Description:

    Initialize the driver dispatch table.

Arguments:

    DriverObject - pointer to the driver object

    RegistryPath - pointer to a unicode string representing the path,
                   to driver-specific key in the registry.

Return Value:

  NT Status Code

--*/
{

    asm_int3(); //<--------------外部函式呼叫
    Bus_KdPrint_Def (BUS_DBG_SS_TRACE, ("Driver Entry \n"));

    //
    // Save the RegistryPath for WMI.
1.4修改sources檔案,新增對softbp.obj的連結:

原本sources檔案中TARGETLIBS的值為

TARGETLIBS=  $(DDK_LIB_PATH)\wdmsec.lib \
             $(DDK_LIB_PATH)\ntstrsafe.lib
修改為:
TARGETLIBS=  $(DDK_LIB_PATH)\wdmsec.lib \
             $(DDK_LIB_PATH)\ntstrsafe.lib \
             softbp.obj
1.5執行build -ceZ編譯連結整個toaster工程。

2.得到驅動檔案後就是部署階段。win7 x64的部署也是夠磨人的:bcdedit增加啟動項(再次懷念xp的好,修改boot.ini就夠了),禁用驅動簽名,最後安裝驅動。以下的步驟都在虛擬機器中進行

2.1增加啟動項:

2.1.1 以administrator許可權下進入cmd,執行bcdedit命令設定埠COM1為除錯埠, baudrate為115200(我已將虛擬機器的印表機移除,印表機可恥的佔用著COM1,並將串列埠的名字改為COM1)

bcdedit /dbgsettings serial baudrate:115200 debugport:1
2.1.2 複製一個開機選項, 以進入OS的debug模式
bcdedit /copy {current} /d DebugEnty
2.1.3 接著增加一個新的選項到引導選單
bcdedit /displayorder {current} {6426f429-17fc-11e6-bf64-ad656b9740aa}
{6426f429-17fc-11e6-bf64-ad656b9740aa}是2.1.2執行結束後生成的id值

2.1.4 啟用前面生成的debug項

bcdedit /debug {6426f429-17fc-11e6-bf64-ad656b9740aa} on
最後上一張效果圖,然後重啟機器準備除錯:


3.windbg連結。

開始串列埠連線前,要設定除錯符號和windbg啟動引數,我直接寫了個指令碼setenv.bat完成這兩步,以後雙擊執行即可:

;set _NT_SYMBOL_PATH=SRV*C:\sym;用於設定除錯符號的路徑
set _NT_SYMBOL_PATH=SRV*C:\sym;
;我的winbdg裝在下列位置,後面的引數是串列埠除錯引數
"D:\WinDDK\7600.16385.1\Debuggers\windbg.exe" -b -k com:pipe,port=\\.\pipe\com_1,baud=115200,pipe
系統重啟後雙擊setenv.bat,在虛擬機器中選擇DebugEntry 按F8進入高階啟動項,然後選擇Disable Driver Signature Enforcement

(注,在等待虛擬機器啟動期間,經常出現windbg閃退,這時再雙擊setenv.bat即可。)

4.部署toaster

進入win7後,在控制面板中沒有硬體嚮導的一席之地!需要通過在開始選單-執行中輸入hdwwiz.exe來開啟。真是何其不易。ms出於安全目的,希望我們通過driver store安裝受信得驅動,倒給開發驅動的找了一堆破事。安裝toaster的步驟不再敘述,參照wdk中xp下安裝方式在hdwwiz.exe中設定即可。

安裝的末尾,也就是進入DriverEntry,由於我們在程式碼中設定了int3斷點,因此windbg會獲得執行權。這時可以追加並驗證toaster的除錯符號,因為此時驅動已經載入到記憶體中,因此設定斷點不會報類似code not set之類的錯誤,而且符號也能正確載入。

追加toaster除錯符號
kd> .sympath+ C:\toaster\wdm\bus\objchk_win7_amd64\amd64
Symbol search path is: SRV*C:\sym;C:\toaster\wdm\bus\objchk_win7_amd64\amd64
檢驗符號是否載入
kd> lm m busenum*
start             end                 module name
fffff880`0392e000 fffff880`0393e000   busenum    (private pdb symbols)  c:\toaster\wdm\bus\objchk_win7_amd64\amd64\BusEnum.pdb
驗證符號是否和sys版本一致
kd> !itoldyouso busenum c:\toaster\wdm\bus\objchk_win7_amd64\amd64\busenum.sys

busenum.sys
    Timestamp: 57333596
  SizeOfImage: 10000
          pdb: c:\toaster\wdm\bus\objchk_win7_amd64\amd64\BusEnum.pdb
      pdb sig: A8748D1B-8C93-4855-BBC7-4D773CADC3B0
          age: 1

Loaded pdb is c:\toaster\wdm\bus\objchk_win7_amd64\amd64\BusEnum.pdb

BusEnum.pdb
      pdb sig: A8748D1B-8C93-4855-BBC7-4D773CADC3B0
          age: 1

MATCH: BusEnum.pdb and busenum.sys
驗證當前執行的位置是不是在busenum中
kd> ln $ip
(fffff880`039301a0)   busenum!asm_int3   |  (fffff880`039301c0)   busenum!__security_check_cookie
Exact matches: 
待一切驗證完畢,就可以在AddDevice 等函式入口下斷點。等下次系統在啟動階段時,會在這些斷點處停下。

如果想多次進入DriverEntry/AddDevice函式,可以在裝置管理器中找到toaster裝置,然後右鍵disable/enable裝置,就能多次進入這些函式


相關推薦

win7 x64部署串列除錯虛擬驅動toaster

    WDK7600自帶的toaster驅動是個很好的學習驅動的案例,從匯流排驅動到App層,Class-install/Co-install都有涉及。本文主要涉及驅動部署和除錯。1.先說說除錯的準備工作。一般除錯驅動都是在虛擬機器中進行的,這裡也不例外,用windbg+

使用虛擬串列軟體串列除錯助手來測試串列通訊程式碼

轉載自:http://blog.csdn.net/u013232740/article/details/49838233 為解決計算機的物理串列埠個數的限制,在進行串列埠除錯實驗時,應儘可能採用虛擬串列埠軟體。VSPD(Virtual Serial Ports Driv

虛擬串列軟體串列除錯助手的簡單使用

為解決計算機的物理串列埠個數的限制,在進行串列埠除錯實驗時,應儘可能採用虛擬串列埠軟體。VSPD(Virtual Serial Ports Driver)虛擬串列埠軟體是由Eltima軟體公司設計的虛擬串列埠軟體,使用方便且穩定。同時,使用虛擬串列埠也是規避風險的好辦法,尤

keil MDK 中使用虛擬串列除錯串列

      題目有點拗口,想利用串列埠除錯Modbus啊,GPS啊什麼的,可是手頭沒有硬體,怎麼辦?其實位元組KEIL MDK和VSPD(這裡兩個軟體網上都很容易就可以下載到破解版,如果找不到可以給我聯絡)就可以,這樣除錯串列埠就會很方便了。看了很多的文章,寫的都很簡單(其

Virtual Machine串列除錯:用命名管道在宿主機與虛擬機器間建立起通訊連線

轉自:http://www.360doc.com/content/15/0518/10/12129652_471385326.shtml 本文內容簡介: (1)在Virtual Machine上建立虛擬串列埠,用命名管道的方式建立實現在宿主機與虛擬機器間打通通訊通道; (2)用PuTTY除錯串列

QNX學習筆記 [IMX6Q/TQIMX6Q]LINUX與QNX串列除錯

通過linux向串列埠寫入待解析報文,QNX開發板接收報文並解析 1.設定linux串列埠 sudo chmod 777 /dev/ttyUSB0 //檢視串列埠設定引數 stty -F /dev/ttyUSB0 -a //設定串列埠波特率等引數 stty -F /dev/ttyU

Mac OS下安裝串列除錯工具minicom

最近在做一個Mac下的ssh除錯工具,但是出現了一點問題。後來發現居然Mac下有串列埠除錯工具可以用,所以果斷換串列埠了,是普通PL2303晶片的usb轉串列埠線。 接下來說下簡單的安裝步驟吧。我是勤勞的搬磚工。。。 首先的是安裝PL2303串列埠驅動,轉載自在MAC OS X下安裝usb轉

正點原子戰艦開發板---串列除錯(硬體除錯的一點經驗吧)

1、為什麼需要串列埠除錯? 因為自己在設計電路畫板子的時候,很多時候都要用到串列埠,比喻語音模組,藍芽模組等等。 2、硬體原理圖明明是對的,程式也改了,但是用串列埠printf效果就是不出來,應該怎麼辦? (1)在開發板上驗證程式碼,我這裡用的是正點原子戰艦的開發板,我程式中用的是串列埠

CentOS下安裝xgcom串列除錯助手

原始碼:xgcom-0.04.2-src.ra 環境:  CentOS 6.10   依賴包安裝:   yum install  gtk              

[轉]web串列除錯助手,瀏覽器控制串列裝置

本文轉自:https://blog.csdn.net/ldevs/article/details/39664697 開啟串列埠時查詢可用串列埠供選擇   通過javascript呼叫activex控制串列埠收發資料,可以通過輪詢每個串列埠狀態找到指定的裝置,簡化使用者操作 選擇並開啟串列埠

STM32之串列除錯

在串列埠除錯過程中,usart1可以正常使用printf列印輸出,根據usart1修改來的usart3卻不能使用printf列印,最終找到原因,對比如下 //正確程式碼 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOB時鐘 R

如何在串列除錯助手上,使用printf()函式顯示十進位制的資料及漢字說明(c語言版)

估計很多人和我一樣,很想直接在串列埠除錯助手上顯示十進位制資料,我最近在做一個專案,當然本人也是小白,但這個問題已經被我解決了,希望幫助需要的人。 我們都知道,串列埠助手一般都只能顯示十六進位制資料和字元,如果我們想將控制器的實時資料通過串列埠傳送到上位機,方便監測,最好直接顯示十進位制資料。廢

python 串列除錯小工具

import serial.tools.list_ports import serial from tkinter import Tk,StringVar,Label,Button,Listbox,Text,END import time import datetime import re imp

QNX Momentics IDE 串列除錯配置方法

1. 安裝 QNX Momentics IDE 5.0 2. 安裝 SecuretCRT 終端模擬工具 3. 通過串列埠連線測試板卡的QNX作業系統 4. 通過指令‘ifconfig’找到測試板卡QNX作業系統的網路配置資訊 5. 修改windows的

Linux 串列除錯工具彙總

在 linux 系統下進行串列埠除錯或者開發時配合簡單易用的串列埠除錯工具那是必不可少。這篇部落格對當前用的較多的,且我自己經常用的一些串列埠工具做一下彙總,大家可以參考一下。 實驗環境: OS: Ubuntu16.04 Kernel: 4.4.0 ----------

在linux上寫好串列程式後,利用windows上的串列除錯助手互發資料

我是用QT4在Linux上寫的串列埠程式,具體的程式碼就不寫了,網上搜一下很多。這裡主要說一下寫完程式碼之後,之前也行。要做的事情。 1,使用命令在終端上檢視有哪些串列埠驅動。 可以看出ttyS0 ttyS1能用 .一般ttyS0指com1,ttyS1指co

stm32新增串列除錯

MCU為stm32F103,選擇usart3作為輸出除錯口。 有三種實現方法: ////////////////////////////////////////// 方法一: 1、usart3.c #if 1 #pragma import(__use_no_semihosting

串列除錯小結

       這個專案是將藍芽模組與NFC模組整合在一起,做一個demo。兩個模組之間使用串列埠通訊,兩個模組上的mcu均為STM32系列,NFC模組上還有兩個串列埠,一個作為log,一個作為AT通道,與上位機通訊。  &nb

java 串列除錯 感測器指令傳送與資料接收

    本文主要講述串列埠除錯的Java工具類,並實現迴圈傳送指令,接收資料!!     本文主要實現的功能是呼叫工具類中開啟串列埠方法,連線感測器所在串列埠,向串列埠(感測器)傳送指令,並接收串列埠(感測器)資料。 主函式-----main(): public sta

【第四章】NB-IoT模組BC95 利用串列除錯助手接入華為(電信)平臺

BC95的Coap測試需要雲平臺配合,當前的支援Coap協議的平臺有華為OceanConnect平臺、電信天翼雲(除了logo其他和華為的一樣)、移動OneNet。此教程以華為的OceanConnect平臺為例進行測試。下面我將就平臺申請、平臺測開發、EVB_M1與平