[電子報存檔 ^][第 1 卷,第 2 期>]

系統 Systems Internals 電子報第 1 卷第 1 期

http://www.sysinternals.com


1999 年 4 月 14 日 - 本期內容:

  1. 系統內部原理的最新動向

    • Windows 9x 的 VolumeID
    • EFSDump
    • Compaq Alpha 的 ListDLL
    • 「開機處理程序內部原理,第 2 部分」
    • 我的四月 Windows NT 雜誌文章
    • 無功無賞
    • 不怎麼新的東西
  2. 內部新聞

    • Win2K 驅動程式驗證器
    • 使用 Boot.ini 進行 Y2K 測試
  3. 未來動態

    • Win2K 中已排入佇列的微調鎖定
    • Tokenmon

贊助者:WINTERNALS SOFTWARE

Systems Internals 電子報由 Winternals Software 贊助,網址:http://www.winternals.com. Winternals Software 是領先業界的開發商,也是 Windows NT/2K 進階系統工具的提供者。 Winternals Software 產品包括適用於 Windows NT 4.0 的 FAT32、ERD Commander (適用於 Windows NT 的開機磁碟功能),以及 NTRecover。

大家好,

歡迎閱讀 Systems Internals 電子報第一期。 我很高興地說,自一周前發佈以來,本電子報已經獲得了 1000 名訂閱者。

這份電子報的目標是為您提供有關 Systems Internals 上出現的新公用程式和文章的及時資訊,並提供您有關 Systems Internals 網站上沒有適當論壇可以分享的 Windows 內部資訊花絮。 如果您對電子報有任何意見或建議,請隨時透過 mark@.... 發送給我。另外,請將電子報轉發給您知道的任何可能對此感興趣的人。 電子報結尾提供有關訂閱、取消訂閱或修改訂閱的說明。

感謝您!

-Mark

系統內部原理的最新動向

Windows 9X 的 VOLUMEID

雖然 Windows NT 和 Windows 9x 可讓您使用「label」命令變更邏輯磁碟機或磁碟機上的標籤,但它們無法讓您變更在格式化磁碟機時任意指派的磁碟區識別碼。 VolumeID 程式已在 Systems Internals 網站上提供了一年多了,原本可用於 Windows NT,現在已移植到 Windows 9x。 這個小程式可讓您將硬碟和磁片上的磁碟區識別碼變更為您想要的任何內容。

VolumeID 使用 API,可讓應用程式略過檔案系統,直接讀寫邏輯磁碟機以及在 Win9x 上的實體磁碟機 (磁片磁碟機)。 在 Windows NT/2K 上,VolumeID 使用一般 ReadFile 和 WriteFile 存取原始磁碟機資料 - 技巧在於它如何指定要存取的磁碟區名稱。 您可以在 Microsoft 知識庫文章 Q100027 中了解如何從 Windows NT/2K 下的應用程式存取實體或邏輯磁碟機。 針對 Windows 9x 對邏輯磁碟機的存取,您的程式碼可以使用 Microsoft 知識庫文章 Q174569 中提供的範例程式碼為基礎。 如果您需要在 Windows 9x 上從應用程式執行直接磁片磁碟機存取,請使用 Win32 IOCTL VWIN32_DIOC_DOS_INT13,MSDN 中有相關說明。

下載 VolumeID:http://www.sysinternals.com/misc.htm.

EFSDUMP

Windows 2000 將首次採用 Microsoft 內建的檔案加密技術,即加密檔案系統。 EFS 提供了許多用於操作加密檔案的新 API,其中包括一個 QueryUsersOnEncryptedFile,可讓您查看哪些使用者註冊為有權存取加密檔案,以及哪些使用者註冊為這些檔案的復原代理程式。 我撰寫了一個名為 EFSDump 的小程式,可讓您輕鬆查看系統上加密檔案的資訊。

雖然我正在討論 EFS API 主題,但截至 4 月的 MSDN 都尚未收錄許多新的 API,這在 Windows 2000 發行週期的最後階段相當令人不安。 最值得注意的是,OpenEncryptedFileRaw、ReadFileEncryptedRaw、WriteFileEncryptedRaw 和 CloseEncryptedFileRaw (全部由 Win2K 的 ADVAPI32.DLL 匯出) 目前均未收錄。 任何想要備份加密檔案的應用程式都需要使用這些 API,這表示 Microsoft 不是只將相關資訊傳遞給選定的合作夥伴,或是在 Microsoft 最終公開記錄時,備份軟體公司將必須爭先恐後的將產品推出市場。 有一點是肯定的,Windows 2000 NTBACKUP 程式的開發人員已經可以存取 API 檔案:Win2K Beta 3 的 NTBACKUP 正在主動使用 API。

如果您對 EFS 內部原理感興趣,請務必在 Windows NT 雜誌的「NT 內部原理」專欄中查看即將推出的 EFS 6 月/7 月兩部分系列文章。 在本文中,我確切說明 FEK (檔案加密金鑰) 和使用者 EFS 金鑰的儲存位置、NTFS、EFS 驅動程式和 LSASRV (本機安全性授權子系統伺服器) 如何執行加密過程,當然還有解密的運作方式。

從 http://www.sysinternals.com/misc.htm. 下載具備完整原始程式碼的 EFSDump

COMPAQ ALPHA 的 LISTDLLS

Systems Internals 中適用於 Alpha 的公用程式數量持續成長。 ListDLLs 是最新的新增項目,這是一個命令列公用程式,可讓您查看正在執行的處理序的 DLL 資訊。 My HandleEx 工具可讓您查看這些資訊,以及處理序已打開的控制碼 (檔案、處理序、執行緒、同步處理物件) 的資訊,但 HandleEx 是一個 GUI 工具,因此它不一定方便使用 (例如,無法在批次檔中執行)。

您是否對一般 Systems Internals 公用程式的 x86 版本與其對應 Alpha 版本的下載率感到好奇? 其比例約為 20:1,這是在密切追蹤對已安裝 Alpha NT 使用者群的產業估計,即佔整個 NT 市場的 5%。

您可以在 http://www.sysinternals.com/alpha.htm. 下載 ListDLL 和其他 Alpha 埠,包括 HandleEx

「開機處理程序內部原理,第 2 部分」

我的 Windows NT 雜誌一月份的「NT 內部原理」專欄現在可以透過 Windows NT 雜誌網站線上取得。 您可以在 Systems Internals 的出版品頁面上找到該文件,以及第 1 部分和較早的「NT 內部原理」專欄連結:http://www.sysinternals.com/publ.htm.

我的 APRIL WINDOWS NT 雜誌文章

另外,請務必看看我在 Windows NT 雜誌四月號上發表的專題文章「Linux 和企業」。 我揭示了有關 Linux 2.2 核心和網頁伺服器應用程式 (「企業」應用程式) 的幾個重大問題,這些問題最終將防止此版本的 Linux 核心在效能方面與 NT 和其他 UNIX 變體相互競爭。

無功無賞

在相關注意事項中,您可能已經聽說過最近發行的 D.H。Brown 分析公司對 Linux 作為企業作業系統的能力評估。 事實證明,該報告的作者大量「借用」我的一封電子郵件內容,有人在一月份將該電子郵件公開張貼到 Linux 核心 Usenet 新聞群組。 如果您能存取該報告並閱讀討論 Linux 和多處理器的頁面 (44 和 45 頁;該報告是不公開的,您必須花一大筆錢購買),然後閱讀我在 Deja News 的電子郵件,您將看到直接的相似之處,甚至是小細節。

不怎麼新的東西

我使用電子報的此章節來說明您可能不知道的 Systems Internals 網站的最新變更,和/或提供比該網站上更多有關可用公用程式的資訊。 例如,幾週前我們發佈了 Filemon v4.1。 此版本的 Filemon 能夠監視 Windows NT/2K 下的具名管道和郵件位置活動。 因為具名管道和 Mailslots 實作為檔案系統驅動程式,因此支援此程式碼所需的增強功能相對較小。 困難的部分 (繁瑣) 是弄清楚這些特殊檔案系統支援的私人 IOCTL (I/O 控制項命令),以便 Filemon 可以進行顯示。 您可以在 http://www.sysinternals.com/filemon.htm. 下載 Filemon (適用於 Windows NT/2K 和 Windows 9x)

如果您想了解有關 Filemon 內部運作原理的更多資訊,請參閱我的二月 Windows NT 雜誌「NT Internals」專欄,標題為「Inside NT Utilities」(NT 公用程式內部原理)。 本文介紹如何使用 Filemon、Regmon、NTFSDOS、NewSID 和 HandleEx,並簡要說明相關功能。

INTERNALS 新聞

Windows 2000 驅動程式驗證器

Windows 2000 Beta 3 引進了一種非常強大的裝置驅動程式開發輔助工具,稱為「驅動程式驗證器」。 此工具與核心中的程式碼配合使用,以取得對驅動程式的控制權,並以前所未見的方式用以遵守核心模式規則。 迄今為止,有缺陷的裝置驅動程式,是許多人認為 NT 是不穩定作業系統最重要的原因,而此工具旨在協助驅動程式作者在使用者之前發現錯誤,以彌補這種為人詬病的情況。

數種類型的微妙問題可透過臨時驅動程式測試 (在嚴格的上市時間限制下進行的最常見測試類型),甚至可以通過嚴格的壓力測試。 其中一種常見驅動程式問題,是驅動程式會在「提升權限的 IRQL」(高中斷優先順序) 存取分頁記憶體。 如果驅動程式存取的記憶體在存取時恰好實際存在 (尚未分頁到分頁檔案),則非法存取將會被忽略。 將違反此規則的驅動程式發佈到使用者的狂野世界中,它必然會出現導致藍色畫面的當機。

另一種常見的驅動程式程式設計錯誤,是開發人員在撰寫程式碼時假設分頁和/或非分頁記憶體始終可以使用,即他們不會檢查分配的傳回值。 如果集區用罄,且驅動程式收到 NULL 緩衝區位址,驅動程式會將系統重新參考為藍色畫面。 儘管集區耗盡的情況很少見,但這不該是系統管理員出現藍色畫面的原因。 相關的記憶體錯誤是緩衝區滿溢或不足,即驅動程式在其分配的緩衝區之外讀取或寫入。

驅動程式驗證器會透過在驅動程式載入時,以對應的驗證器核心函式 (VerifierKeRaiseIrqlVerifierKeAcquireSpinLock) 取代驅動程式中操作 IRQL 的所有函式 (例如,KeRaiseIrqlKeAcquireSpinLock) 的呼叫來解決 IRQL 問題。 每當 IRQL 提升到 DISPATCH_LEVEL 或更高版本時,驗證器程式碼都會呼叫內部記憶體管理員函式 MmTrimAllPageableSystemMemory(),以強制所有分頁資料移出實體記憶體。 因此,當驅動程式違反不存取 DISPATCH_LEVEL 或更高層級的可分頁資料或程式碼的 IRQL 規則時,記憶體管理員將偵測到存取非目前頁面的嘗試,並引發藍色畫面。 這使開發人員可在驅動程式啟動之前快速攔截這些類型的錯誤,因為他們可以偵錯當機,並看到其驅動程式位於故障堆疊上。

驅動程式驗證器會完成記憶體使用量測試,並修補要驗證的驅動程式匯入資料表,讓驅動程式呼叫驗證器記憶體函式,而不是標準核心版本。 例如,對 ExAllocatePool 的呼叫將替換為對 VerifierAllocatePool 的呼叫。 驗證器會使用兩種技術來幫助開發人員快速找到記憶體錯誤。 第一個是使用特殊的記憶體集區,其中防護頁面 (防護頁面是無效頁面) 被放置在緩衝區結尾的後面。 此外,在緩衝區之前配置緩衝區的頁面部分會填入簽章。 在緩衝區結尾以外的頁面內,會立即偵測到滿溢,因為它們會導致防護頁面上的不合法分頁錯誤。 當驅動程式釋放記憶體時,驗證器會偵測到涉及修改緩衝區前資料的不足,因為簽章將會發生變更。

一律預期非空白集區的驅動程式會透過使用其「記憶體錯誤插入」來誘使驗證器產生當機。 您可以將驗證器設定為隨機使驅動程式集區分配失敗。

驅動程式驗證器也會檢查一些其他錯誤類型,包括 IRP (I/O 要求封包) 一致性,以及系統和驅動程式代碼頁的唯讀保護。

如果您是裝置驅動程式開發人員,那麼使用驗證器進行測試將為您自己、您的公司和 NT 社群帶來好處。 請注意,當您能夠存取驅動程式驗證器時,也應該測試與 Win2K 相容的 NT 4.0 驅動程式 (大多數開發人員將在 4 月底或 5 月透過 MSDN 發布的 Win2K Beta 3 取得該驅動程式)。

如需詳細資訊,請參閱驅動程式驗證器

使用 BOOT.INI 進行 Y2K 測試

如果您經常瀏覽 Systems Internals 網站,那麼您可能已經知道新的 Win2K 未記錄 BOOT.INI 參數 /YEAR。 我沒有在網站上提到該參數也受 NT 4.0 Service Pack 4 支援。 這個參數可讓您欺騙 NT 和 NT 系統上的所有軟體,讓他們以為現在是另一年。 例如,/YEAR=2001 將使系統認為是 2001 年而不是 1999 年。 因此,該參數非常適合在任何層級的軟體上測試 Y2K 問題,並且善用此參數而不用手動重置 BIOS 時鐘 (例如,透過時鐘小程式) 的優點是,這種變更是臨時的,並且僅當您開機到其 BOOT.INI 行中存在該參數的安裝時才有效。 如此只需從 BOOT.INI 中取得現有開機行、複製並新增 /YEAR 參數,即可輕鬆建立特殊的 Y2K 安裝。

未來動態

預計幾週後會推出下一份電子報。 下次我將為您提供的內部技巧是關於已排入佇列的 Spinlocks,這是 Windows 2000 用於其全域同步鎖定的新型微調鎖定。 以下是 Windows 2000 中存在的全域同步鎖定:

  • KiDispatcherLock:排程器資料庫鎖定
  • KiContext-SwapLock:執行緒交換鎖定
  • MmPfnLock:實體頁面框架資料庫鎖定
  • MmSystemSpaceLock:核心模式位址空間鎖定
  • CcMasterSpinLock:快取管理員的全域同步鎖定
  • CcVacbSpinLock:快取管理員的對應陣列鎖定

不像 NT 4.0,Windows 2000 核心不會對這些全域鎖定使用常規核心微調鎖定 (KeAcquireSpinLock, KeReleaseSpinLock),而是使用佇列的微調鎖定 (KeAcquireQueuedSpinLock, KeReleaseQueuedSpinLock)。 這些鎖定具備一些有趣的屬性,可將 SMP 上的匯流排活動降到最低。 下次我會告訴你如何實作佇列的微調鎖定。

Systems Internals 即將推出另一個監視工具 Tokenmon。 Tokenmon 會顯示系統上所有權杖相關活動的詳細資訊,包括登入、登出、許可權的使用,以及模擬。


感謝您閱讀 Systems Internals 電子報。

發表於 1999 年 4 月 14 日星期三晚上 7:16,發佈者:ottoh

[電子報存檔 ^][第 1 卷,第 2 期>]