對應驅動程式檔案

取代驅動程式檔案可能很困難。 您經常必須開機至Microsoft Windows 安全組建、取代驅動程式二進位檔,然後再開機。

使用對應檔案存在替代方法。 您可以使用這個對應方法來取代任何內核模式驅動程式(包括顯示驅動程式)、任何 Windows 子系統驅動程式或任何其他內核模式模組。 為了簡單起見,本主題中的這些檔案稱為 驅動程式 ,即使您可以將此方法用於任何內核模式模組也一樣。

每當 WinDbg 或 KD 附加為核心調試程式時,您就可以使用這個方法。 您也可以在開機驅動程式上使用此方法,但比較困難。 如需如何搭配開機驅動程式使用此方法的詳細資訊,請參閱取代開機驅動程式。

若要使用驅動程式取代對應來取代驅動程式檔案,請執行下列動作:

  1. 建立 驅動程式取代對應檔案。 此檔案是文字檔,列出目標計算機上的驅動程式及其主計算機上的取代驅動程式。 您可以取代任意數目的驅動程式。 例如,您可能會在主計算機的 d:\Map_Files 目錄中,建立名為 Mymap.ini 的檔案,其中包含下列資訊。

    map
    \Systemroot\system32\drivers\videoprt.sys
    \\myserver\myshare\new_drivers\videoprt.sys
    

    如需此檔案語法的詳細資訊,請參閱 驅動程式取代對應檔格式

  2. 設定目標電腦的核心偵錯連線,並在主計算機上啟動核心調試程式 (KD 或 WinDbg)。 (你不必實際闖入目標計算機。

  3. 執行下列其中一項動作,以載入驅動程式取代對應檔案:

    • 在您啟動核心調試程式之前, 請先設定_NT_KD_FILES環境變數

      D:\Debugging Tools for Windows> set _NT_KD_FILES=d:\Map_Files\mymap.ini
      D:\Debugging Tools for Windows> kd
      
    • 啟動 核心調試程序之後,請使用 .kdfiles (Set Driver Replacement Map) 命令。

      D:\Debugging Tools for Windows> kd
      kd> .kdfiles d:\Map_Files\mymap.ini
      KD file associations loaded from 'd:\Map_Files\mymap.ini'
      

      您也可以使用 .kdfiles 命令來顯示目前的驅動程式取代對應檔,或刪除驅動程式取代對應。 如果您未使用此命令,對應會持續存在,直到您結束調試程序為止。

完成此程式之後,驅動程式取代對應就會生效。

每當目標電腦即將載入驅動程式時,它會查詢核心調試程式,以判斷此驅動程式是否已對應。 如果驅動程式已對應,則會透過核心連線傳送取代檔案,並透過舊驅動程式檔案複製。 然後載入新的驅動程式。

驅動程式取代對應檔格式

每個驅動程式檔案取代都會以驅動程式取代對應檔中的三行表示。

  • 第一行是由 「map」 一詞所組成。

  • 第二行會指定目標計算機上舊驅動程式的路徑和檔名。

  • 第三行會指定新驅動程式的完整路徑。 此驅動程式可以位於主電腦或其他伺服器上。

您可以任意次數重複此資訊模式。

路徑和檔名不區分大小寫,而且實際的驅動程序檔名可能不同。 您在第三行上指定的檔案,會在目標計算機即將載入該驅動程式時,複製到您在第二行指定的檔案上。

Kdfiles 會嘗試比對儲存在 Service Control Manager (SCM) 資料庫中的檔名。 SCM 資料庫中的名稱與傳遞給 MmLoadSystemImage 的名稱相同。

在 Windows 10 和更新版本的偵錯工具中,驅動程式對應的運作方式是動態比對驅動程式名稱,並判斷適當的路徑。 不需要指定完整路徑,而且擴展名是選擇性的。 您可以使用這些專案中的任何專案來比對 NT 檔案系統驅動程式。

  • ntfs
  • NTFS
  • ntfs.sys
  • windows\system32\drivers\ntfs.sys

您可以使用這些專案中的任何專案來比對NT核心驅動程式。

  • ntoskrnl
  • NTOSKRNL
  • ntoskrnl.sys
  • windows\system32\drivers\ntoskrnl.sys

地圖檔案可以包含空白行,而且可以包含以數位符號開頭的批注行(#)。 不過,在檔案中出現「對應」之後,接下來兩行必須是舊的驅動程式和新驅動程式。 空白行和批註行無法分解三行地圖區塊。

下列範例顯示驅動程式取代對應檔。

# Use the # for comments like this one
map
\Systemroot\system32\drivers\videoprt.sys
e:\MyNewDriver\binaries\videoprt.sys
map
\Systemroot\system32\mydriver.sys
\\myserver\myshare\new_drivers\mydriver0031.sys

# This is replacing a beep driver
map
\??\c:\windows\system32\beep.sys
\\myserver\myshare\new_drivers\new_beep.sys

驅動程式取代對應檔案必須是文本檔,但您可以使用任何檔名和擴展名(.ini、.txt、.map 等等)。

其他附注

發生驅動程式替代時,核心調試程式中會出現訊息。

如果您使用 CTRL+D (在 KD 中)或 CTRL+ALT+D (在 WinDbg 中),您會看到有關取代要求的詳細資訊。 如果您不確定您列出的名稱是否符合 SCM 資料庫中的名稱,這項資訊會很有用。

您可以啟用 bcdedit bootdebug 選項,以檢視早期開機資訊,其有助於取代核心、hal 或開機驅動程式。

bcdedit -bootdebug on

如需詳細資訊,請參閱 BCDEdit 選項參考

如果核心調試程序結束時,就不會再發生驅動程式取代。 不過,任何已取代的驅動程式都不會還原成其舊的二進制檔,因為驅動程式檔案實際上會被覆寫。

此驅動程式取代功能會自動略過 Windows 檔案保護 (WFP)。

您不需要重新啟動目標電腦。 不論驅動程式是否已重新啟動,目標計算機都會載入驅動程式時發生。 當然,大部分驅動程式都會在開機過程中載入,因此實際上您應該在載入對應檔案之後重新啟動目標計算機。

如果已定義_NT_KD_FILES變數,則會在啟動核心調試程式時讀取指定的驅動程式取代對應檔。 如果您發出 .kdfiles 命令,則會立即讀取指定的檔案。 此時,調試程式會確認檔案具有基本的 map/line/line 格式。 但在替代發生之前,不會驗證實際的路徑和檔名。

讀取對應檔案之後,調試程式會儲存其內容。 如果您在此點之後變更此檔案,則變更不會有任何作用(除非您重新發出 .kdfiles 命令)。