[電子報封存 ^][< 第 1 卷,第 2 期][第 1 卷,第 4 期 >]

Systems Internals 電子報第 1 卷,第 3 期

http://www.sysinternals.com
Copyright (C) 1999 Mark Russinovich


1999 年 6 月 19 日 - 在此問題中:

  1. SYSTEMS INTERNALS 最新動向

    • SDelete v1.1
    • Strings v2.0
    • LoggedOn
    • Filemon v4.13
    • DebugView/EE v3.1
    • <NT 網路透析>
    • 6 月的 "NT Internals"
    • NTFrob 更新狀態
    • 部分既有功能
  2. INTERNALS 新聞

    • Numega DriverStudio 已發行
    • 6 月 Platform SDK 可供使用
    • Win2K 系統檔案保護裝置 (SFP)
    • 關閉從網路開啟的檔案
  3. 下期内容預告

    • 絕佳的 "AWE" Win2K API

贊助者: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。

Winternals Software 宣佈發行 Regmon 和 Filemon 企業版。 這些公用程式提供 Filemon 和 Regmon 免費軟體的所有功能,並新增下列強大的功能:

  • 檢視遠端 Win9x/NT 系統上執行的登錄和檔案系統活動
  • 即時將輸出記錄到檔案
  • 將輸出行複製到剪貼簿
  • 醒目提示符合篩選的行
  • 同時檢視不同電腦的輸出
  • 將輸出直接列印到印表機
  • 輕鬆地重新叫用最近的 5 個篩選選項

如需訂購和價格資訊,請前往 http://www.winternals.com.


大家好,

歡迎瀏覽 Systems Internals 電子報第三版。 本電子報目前有 4400 名訂閱者。

在上一篇電子報中,我指出 Microsoft 如何消除藍色當機畫面,我們知道其正在轉移到 Windows 2000 (Win2K)。 新的 Win2K 藍色畫面沒有已載入的驅動程式和堆疊傾印資訊,而舊版 Windows NT 的藍色畫面卻顯示了這些資訊。 我曾詢問過,是否覺得 Microsoft 移除的資訊很有用,並且希望他們不要插手這些事情。 回應幾乎是一致的,每位受訪者 (除了一位受訪者以外) 都想知道 Microsoft 為什麼要選擇最低的公因數標準。 以下是 Tony Lavinio 送出的代表性意見:

換句話說,這是 Microsoft 做出決策所依據的客戶回應:

「我不懂,所以這肯定不對;就讓它消失吧。」

他們為什麼不直接移除整個畫面,並顯示一則訊息說「拔掉插頭,重新插入插頭,再重來一次」? 我們只有少數線索可用來了解發生什麼問題,但為什麼他們連這一點線索都拿走了?

至少在之前,如果是病毒掃描器、重組工具或有錯誤的驅動程式,我們知道從哪一點開始搜尋。

在 NT 部署廣泛的基礎上,只要這個工具能協助我們 10,000 個人中的 1 個人,這就值得了。 特別是因為我們 .01% 的人還支援其他 99.99% 中的很大一部分人。

誰是唯一的反對者? Microsoft 有人負責處理藍色當機畫面的報告,這並不令人意外。 以下是他們對此一變化的看法,證實了 Tony 對其原因的猜測:

我在 MS PSS 的 NT 安裝程式群組中工作 (負責處理藍色畫面疑難排解)。 我可以向您保證,與我交談的大多數人都不知道如何處理 4.0 藍色畫面上的資訊。 我相信如果您在整個堆疊中看到包含 NAIFILTR.SYS 的 stop 0xA,您就知道要更新防毒軟體,但是大多數人不會建立這種關聯,而且真的沒有意識到停止代碼和參數對他們來說很有用。 了解如何解譯藍色畫面資料的人可能會感到惱火,但不幸的是,他們占少數。

正如我在上一篇電子報中所說,我覺得 Microsoft 應繼續使用 NT 4.0 藍色畫面,並保留已載入的驅動程式清單和堆疊傾印。 我還認為,他們可以透過提供更多資訊 (而不是減少資訊) 來改善藍色畫面。 例如,為什麼不在當機時顯示目前執行中處理序的名稱? 或者讓更多的 BugCheck 呼叫傳遞錯誤端的位址,而不只是發生錯誤的位址? PSS 遇到這麼多客戶對藍色畫面一無所知的主要原因,就是 Microsoft 從未撰寫過文件來說明如何閱讀藍色畫面的資訊。 因此,使用者無知的責任至少有一部分要歸咎於 Microsoft 本身。

如果您想要深入了解藍色畫面如何發生,以及 (NT 4.)藍色畫面上有哪些資訊,請參閱 1997 年 12 月我在 Windows NT Magazine 中發佈的<藍色畫面透析>文章 (您可以從下列網址取得線上版本:http://www.sysinternals.com/publ.htm).

和往常一樣,請把電子報傳遞給您認為可能覺得該內容有趣的朋友。

感謝您!

-Mark

SYSTEMS INTERNALS 最新動向

SDELETE V1.1

在上一篇電子報中,我介紹了 SDelete,這是一種安全刪除公用程式,可讓您在無法逆轉的情況下終結檔案資料,以及清除先前刪除資料的磁碟可用空間。 第一個版本的 SDelete 無法安全地覆寫您使用其刪除的檔案名稱。 檔案名稱通常會洩露敏感性資訊,而使用 SDelete 刪除具有此類名稱的檔案,可能會讓該資訊公開可見。 為了解決這個漏洞,我已更新 SDelete,不僅可安全地覆寫檔案資料,還能覆寫檔案名稱。 SDelete 會重新命名檔案 26 次,將檔案名稱中的每個字母取代為字母表的連續字母 (從 'A' 到 'Z'),藉以安全地刪除檔案名稱。

若要下載包含完整原始程式碼的 SDelete v1.1,請前往 http://www.sysinternals.com/sdelete.htm.

STRINGS V2.0

可執行檔和 DLL 通常會內嵌字串,這些字串可顯示未記載的登錄值,以及提示未記載功能的錯誤訊息。 不幸的是,大部分的 Windows NT/2K 系統 DLL 和 EXE 都會撰寫為使用 Unicode 字元字串,而 Grep 等傳統字串搜尋工具只會擷取 ASCII 字串。 幾年前,我撰寫了第一個版本的 Strings 公用程式,用來掃描二進位檔案中的 ASCII 或 Unicode 字元字串。 我在 NT internals 的研究中多次使用此程式來協助找出 Microsoft 沒有記載的資訊。

不過,Strings 一直存在重大缺陷,那就是無法將萬用字元運算式當作檔案規範,因此不能讓您一次掃描多個檔案。 例如,我需要這項功能,以便在指定登錄值的名稱時,可以輕鬆地判斷哪些系統 DLL 參考了該值。

最後,我更新了 Strings,使其接受完整的萬用字元檔案名稱,以及遞迴目錄。 如果您指定了萬用字元運算式,Strings 會自動在輸出行前面加上找到該字串的檔案名稱,因此您可以執行如下動作:

strings *.dll | grep SafeBoot

透過檢視此運算式的輸出 (Windows NT Resource Kit Posix 公用程式中提供某個版本的 Grep),您就知道哪些系統 DLL 會檢查 Windows 2000 上的 SafeBoot 登錄機碼。 若要查看 Win2K 系統 DLL、驅動程式和可執行檔使用了哪些新登錄值,Strings 也非常有用。 例如,我使用 Strings 來比較 NT 4.0 SP4 TCP/IP 堆疊 (tcpip.sys) 中參考的登錄值與 Windows 2000 TCPIP 堆疊所參考的登錄值。 以下是 Win2K TCPIP 堆疊中新增的值,大約顯示一半 (我假設所有這些值都位於 HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 下):

ReservedPorts
DefaultGatewayMetric
InterfaceMetric
TempLeaseExpirationTime
TempIpAddress
TempMask
DhcpDefaultGateway
TcpWindowSize
TcpInitialRTT
TcpDelAckTicks
EnableTrafficControl
EnableTOSetting
MaxNormLookupMemory
MaxSendSegments
MaxFreeConnections
MaxFreeTWTcbs
FFPFastForwardingCacheSize

我不會屏息等待 Microsoft 記錄所有堆疊的新組態參數。

您可以下載 Strings v2.0,網址為 http://www.sysinternals.com/misc.htm.

LOGGEDON

您是否曾經想知道誰登入過遠端 NT 系統? 如果是,您需要下載 LoggedOn。 LoggedOn 是一種簡單的公用程式,可顯示哪些使用者以互動方式登入本機電腦或遠端電腦,以及哪些使用者是透過資源連線 (例如,檔案或印表機共用) 登入。 以下是 LoggedOn 輸出範例:

C:\>loggedon main

LoggedOn v1.0 - Logon Session Displayer
Copyright (C) 1999 Mark Russinovich
Systems Internals - http://www.sysinternals.com

Users logged on locally:
MAIN\Administrator

Users logged on via resource shares:
MAINDOM\MARK

Windows NT 和 Win2K 沒有提供應用程式可用來確定電腦登入人員的 API,但 LoggedOn 會藉由查看載入系統 HKEY\USERS 登錄樹狀目錄的登錄機碼來確定此資訊。 以互動方式登入的任何使用者的個人資料都會載入到此機碼中,而個人資料的名稱可識別與個人資料相關聯之使用者帳戶的 SID (安全性識別碼)。 例如,如果您開啟 Regedit 並在 HKEY_USERS 下查看,您會看到如下所示的內容:

HKEY_USERS\.DEFAULT\S-1-5-21-734676951-386466661-1233803906-500

在這裡,只有一位使用者以互動方式登入。 您可以分辨其是本機或網域系統管理員,因為 RID (相對識別碼) 是 500,這是 NT 保留給系統管理員帳戶的 RID。

透過使用允許某個系統查看另一個系統之登錄的 API,LoggedOn 會讀取遠端電腦的 HKEY_USERS 機碼,並將其找到的 SID 轉換成帳戶名稱。 為了確定誰透過資源共用登入,LoggedOn 會使用 SDK 中記載的 NET API。 Net 命令列工具廣泛使用 NET API。 LoggedOn 存取遠端系統登錄的副作用是,執行 LoggedOn 的帳戶一律會在 LoggedOn 輸出中顯示為透過資源共用登入遠端系統。

您可以下載包含完整原始程式碼的 LoggedOn,網址為 http://www.sysinternals.com/misc.htm.

FILEMON V4.13

Filemon v4.13 剛剛發行,此更新反映了 Windows NT 篩選驅動程式的變更,並更正我意外引入 4.12 驅動程式的 Bug。 4.13 篩選驅動程式具有下列變更:

  • 其可使用資源同步處理類型來保護其某些內部資料結構
  • 其可處理新的 Win2K IRP、IRP_MJ_PNP_POWER

Windows NT 4.0 和 Win2K 裝置驅動程式開發套件 (DDK) 中實際上都沒有記載資源同步處理類型。 設計指南甚至沒有提到資源,而其功能記載於<執行支援常式>一節下的參考。 資源是一種實用機制,用於保護可由不同的執行緒同時讀取,但在更新期間需要由執行緒獨佔存取的資料結構。 因此,資源是讀取器/寫入器鎖定,當讀取器進行共用存取和寫入器進行獨佔存取時需要取得這些鎖定。 檔案系統驅動程式會廣泛使用資源,因此我認為更新 Filemon 以在適當情況下使用資源是恰當的。

Filemon v4.13 也會處理新的 IRP_MJ_PNP_POWER IRP,以便在 Win2K 下執行時,其是電源相容且隨插即用的篩選驅動程式。 處理此類型 IRP 時,檔案系統篩選驅動程式的唯一需求,就是將 IRP 傳遞給篩選所連結的檔案系統裝置。

您可以下載包含完整原始程式碼的 Filemon v4.13,網址為 http://www.sysinternals.com/filemon.htm.

DEBUGVIEW/EE V3.1

DebugView/EE 是一種多功能的偵錯輸出監視器,可用來擷取 Win95、Win98、WinNT 和 Win2K 下 Win32 程式或核心模式裝置驅動程式所產生的本機或遠端偵錯輸出。 但是,在使用者使用裝置驅動程式時發生當機的環境中,其效用有限,DebugView 在當機前擷取的所有偵錯輸出都會遺失。 最新版的 DebugView/EE 解決了 Windows NT/2K 上的這個問題。 如果使用者正在擷取裝置驅動程式所產生的核心模式輸出,且使用者已設定 NT 來儲存損毀傾印,則 DebugView/EE 可以在系統重新開機時從傾印檔案擷取偵錯輸出。 請使用 DebugView/EE 的 [編輯]|[理損毀傾印] 功能表選項,使其掃描記憶體傾印以取得偵錯輸出。 此功能可讓使用者將文字檔傳回給您,其中包含驅動程式在當機時剛產生的偵錯輸出。

若要下載 DebugView/EE v3.1,請前往 http://www.sysinternals.com/debugview.htm.

<NT 網路透析>

1999 年 3 月我在 Windows NT Magazine 發佈的 "NT Internals" 專欄現已上線。 可全面了解 NT 的網路架構,包括其實作哪些 API、通訊協定堆疊如何與 API 互動,以及硬體廠商如何撰寫網路驅動程式來使用通訊協定驅動程式。 此外,還可了解 Win2K 網路的一些新功能,包括還原序列化的 NDIS 和 ATM 支援。

若要線上閱讀<NT 網路透析>和其他過去的 NT Internals 專欄,請前往 http://www.sysinternals.com/publ.htm.

6 月的 "NT INTERNALS"

我的 Windows NT Magazine 專欄 6 月期內容是<EFS 透析內,第 1 部分>。 本文說明 Microsoft 加密檔案系統 (EFS) 的架構,並詳細地逐步解說 EFS 加密檔案時所遵循的步驟。 EFS 為 Win2K NTFS 磁碟機提供一種透明的加密機能,這是 Microsoft 專門開發的機能,用來解決 NTFSDOS 工具在不考慮 NTFS 檔案安全性的情況下讀取這些檔案的能力。 此專欄將在三個月內線上提供。

在過去的兩篇電子報中,我曾談到備份和還原加密檔案所需的 EFS API 未加以記載的情況。 遺憾的是,這些 API 仍未記載於目前版本的 MSDN 中。 不過,我已收到通知,獲悉 Microsoft 正在將標記為「Microsoft 機密」的文件傳送給其合作夥伴和備份軟體廠商。 此外,Microsoft 檔案系統專案經理 David Golds 還在達拉斯近期舉行的 Microsoft TechEd 會議上發表了有關 Win2K 檔案系統增強功能的演說。 在簡報中 (您可以線上檢視的投影片位於 http://www.teched99.com/slides/1-337.ppt),他提到沒有記載備份 API,但您可以告訴他您需要文件。 遺憾的是,投影片上並未列出他的電子郵件地址。

如需 Windows NT Magazine 的訂閱資訊,請瀏覽 http://www.winntmag.com。

NTFROB 更新狀態

NTFrob 是我幾年前發行的公用程式,可讓您在 NT 4.0 上精確設定前景和背景處理序的配量長度。 NTFrob 會修改 NT 核心內部的資料結構,因此其為 Service Pack 高度專用的公用程式。 自 NT 4.0 Service Pack 5 發行以來,我收到很多詢問,詢問我何時要發行 NTFrob v1.5 (SP 5 更新)。 答案是即將推出更新,我正在等待 Microsoft 向 MSDN 訂閱者提供 SP5,包括偵錯資訊。 我需要偵錯資訊來更新新版 Service Pack 的 NTFrob。

您可以下載 NT 4 SP0-4 的 NTFrob,網址為 http://www.sysinternals.com/ntfrob.htm.

部分既有功能

幾個月前,我在 Systems Internals 上發行了 Win9x/NT/2K 序列和平行連接埠監視器。 Portmon 可讓您確切查看應用程式如何與序列和平行連接埠互動,包括其傳送和接收的資料。 您可以使用 Portmon 來監看撥號工作階段、laplink 序列式連線或印表機活動。 Portmon 非常受歡迎,最近從 Ziff-Davis 的軟體程式庫中獲得了 5 星的最高評分。 其他獲得 5 星的 Systems Internals 工具包括 Regmon、NTFSDOS 和 BlueSave。

若要下載 Portmon,請前往 http://www.sysinternals.com/portmon.htm.

INTERNALS 新聞

DRIVERSTUDIO 已發行

CompuWare 的 NuMega Labs 已發行 DriverStudio,這是適用於 Windows 9x/NT/2K 裝置驅動程式開發人員的完整工具組。 其中包含 SoftICE 4.0、BoundsChecker for Drivers、VtoolsD、DriverAgent、DriverWorks、FieldAgent for Drivers,未來會新增 TrueTime for Drivers 和 TrueCoverage for Drivers。 就像我在上一篇電子報中所說,這是一個必備的開發人員工具組。 NuMega 還推出了以裝置驅動程式開發人員為導向的網站,名為 "Driver Central",網址為 http://www.numega.com/drivercentral/default.asp.

6 月 PLATFORM SDK 已發行

您現在可以下載 6 月版的 Microsoft Platform SDK,網址為 http://www.msdn.microsoft.com/developer/sdk/platform.asp.

WIN2K 系統檔案保護裝置 (SFP)

NT 系統管理員和使用者最大的抱怨之一是 NT 的「DLL 地獄」。 DLL 地獄是許多應用程式使用其搭售版本來更新主要系統 DLL 的結果。 應用程式通常執行這項操作的目的是為了保證它們能夠正常運作,不過,當他們取代 DLL 時,他們會安裝不相容的版本而多次中斷其他應用程式,甚至將 DLL「更新」為較舊版本。

Microsoft 已透過引進系統檔案保護裝置 (SFP) 解決 Win2K 中的 DLL 版本控制問題。 實際上,它的名稱很快就會變更為 Windows 檔案保護裝置 (WFP),但截至 Beta 3 (組建 2031),它仍然名為 SFP。 SFP 是在名為 sfc.dll 的 DLL 中實作,Winlogon 處理序 (winlogon.exe) 會在系統開機時載入該 DLL。 SFP 包含一個內建清單,其中列出大約 3000 個標準 Win2K 系統 DLL、可執行檔 (.exe)、安裝檔案 (.inf)、驅動程式 (.sys) 和字型 (.fon) 檔案,這些檔案安裝在 30-40 個不同的目錄中。 當 SFP 初始化時,它會對包含其保護檔案的每個目錄執行變更通知目錄作業。 當 SFP 偵測到檔案遭竄改時,它會彈出對話方塊通知目前的使用者,將事件寫入事件記錄檔,並將修改過的檔案取代為儲存在 %systemroot%\system32\dllcache 中的備份。 如果 SFP 在 dllcache 中尋找的備份檔案遺失,或者也遭到竄改,SFP 就會從 Win2K 安裝媒體擷取全新的複本。

若要查看 SFP 保護哪些檔案,您可以使用本電子報中其他地方提及的 Strings 公用程式,傾印 %systemroot%\system32\sfc.dll 中內嵌的 Unicode 字串名稱。

可以更新系統檔案的公用程式只有 hotfix.exe、Service Pack (update.exe)、升級安裝,以及 Win2K 更新服務。 這些工具如何略過 SFP? 這些工具藉由呼叫匯出的 sfc.dll 函式 SfcTerminateWatcherThread 來暫時停用 SFP,並且確保在 dllcache 子目錄中反映更新。 您應該注意到,Win2K 需要 Microsoft 以數位方式簽署所有系統檔案,因此通常無法以您自己的任意版本更新系統檔案。

Win32 程式可以使用 FindFirstChangeNotification 和 FindNextChangeNotification Win32 API 來監看目錄中的變更。 不過,這些 API 只會通知應用程式某個項目已變更;而不會確切告知應用程式哪些內容已變更。 因此,應用程式需要掃描整個目錄,才能判斷哪些檔案或子目錄可能已變更。 SFP 使用 NT 原生 API 來執行變更通知要求,其中 NT 會確切告知受監視目錄中哪些檔案或子目錄發生變更。 SFP 使用的函式名為 NtNotifyChangeDirectoryFile,並且與 90% 的 NT 原生 API 一樣未加以記載。 在不久的將來,Systems Internals 將提供一個小程式,該程式可示範如何使用 NtNotifyChangeDirectoryFile。

我在 9 月的 "NT Internals" 專欄<Win2K 可靠性增強功能透析,第 2 部分>更詳細地描述了 SFP。

關閉從網路開啟的檔案

Systems Internals 訪客向我反映的最常見問題之一是「如何關閉使用者從網路開啟的檔案?」如果使用者已遠端開啟檔案或目錄,則您無法在本機刪除、重新命名或更新檔案或目錄。 類似的問題是:「如何查看使用者從網路開啟了哪些檔案?」這兩個問題都可以使用 Windows NT/2K 隨附的 Net 命令列公用程式來回答。 若要查看開啟的檔案,只需輸入 "net file"。 您將取得一份清單,其中包含開啟的檔案名稱、對應的檔案名稱識別碼,以及已開啟檔案的使用者名稱。 若要關閉其中一個已開啟的檔案,請鍵入 net file <id> /close。 若要檢視在本機開啟的檔案,您可以使用我的 NTHandle 或 HandleEx 工具。

Net 命令的檔案檢視和關閉功能所依據的 API 記載於 Platform SDK 和 MSDN 程式庫中。 請使用 NetFileEnum API 列舉開啟的檔案,並使用 NetFileClose API 關閉開啟的檔案。 這些 API 實際上可讓您列舉遠端伺服器上開啟的檔案,這是 Net 命令不允許的操作。

若要取得 NTHandle,請前往 http://www.sysinternals.com/nthandle.htm. 若要取得 HandleEx,請前往 http://www.sysinternals.com/handleex.htm.

下期内容預告

絕佳的 "AWE" WIN2K API

Win2K 引進了一個名為 AWE 的新 API (位址視窗延伸模組),需要大量記憶體的應用程式可用來直接存取和管理大量實體 RAM,甚至是超過 3GB 的 RAM,3GB 是 Windows NT 應用程式可以在其虛擬位址空間中定址的 RAM 上限。 事實上,如果 x86 系統具有 PSE (頁面大小延伸模組) 和超過 4GB 的 RAM,應用程式就可以使用 AWE 來利用所有電腦的記憶體。 因此,此 API 非常適用於耗費記憶體的應用程式,例如網頁伺服器和資料庫伺服器。 下次我將說明如何使用 API,無論是從 Win32 應用程式還是裝置驅動程式。

雖然我討論的是耗費記憶體的應用程式,但對於任何撰寫檔案快取應用程式 (例如網頁伺服器) 的人來說,此處提供了提示。 Windows NT 快取管理員將其快取記憶體分成 256KB 的位置,稱為「檢視」。 如果快取大小小於 256KB 的檔案,快取管理員仍必須將整個 256KB 的位置指派給檔案,這表示會浪費掉快取虛擬記憶體的一部分。 因此,在您自己的應用程式虛擬記憶體中,快取大小小於 256KB 的檔案,並且依賴檔案系統快取大小大於 256KB 的檔案,通常這樣做的效能更高。 IIS 5.0 就會使用此一技巧。


感謝您閱讀 Systems Internals 電子報。

發佈時間:1999 年 6 月 19 日星期六下午 7:14,發佈者:ottoh

[電子報封存 ^][< 第 1 卷,第 2 期][第 1 卷,第 4 期 >]