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

Sysinternals 電子報第 2 卷,第 3 期

http://www.sysinternals.com
Copyright © 2000 Mark Russinovich


2000 年 6 月 14 日 - 本期內容:

  1. 編輯

  2. SYSINTERNALS 最新動向

    • Regmon v4.25
    • ListDlls v2.22
    • TDImon v1.0
    • AutoRuns v1.1
    • LDMDump v1.0
    • 4 月/6 月內部資料行
  3. 內部資訊

    • Windows NT 組建歷程記錄
    • Windows NT/2000 計時器解析度
    • 重新對應鍵盤
    • 保管庫系統記憶體對應
    • 隱藏的 Windows 98 檔案系統記錄
    • WinDev '00 West
  4. 下期内容預告

    • 「Secure」Windows 98 登錄機碼

贊助者:WINTERNALS SOFTWARE

Sysinternals 電子報由 Winternals Software 贊助,該公司的網址為 http://www.winternals.com. Winternals Software 是領先業界的開發商,也是 Windows NT/2K 進階系統工具的提供者。 Winternals 軟體產品包括適用於 Windows NT 4.0 的 FAT32、ERD Commander Professional Edition (適用於 Windows NT 的進階開機磁碟功能),以及遠端復原。

新發行的 TCPView Pro 可讓你監視 Windows NT 4.0、Windows 2000 和 Windows 95/98 系統上的 TCP/IP 活動。 不同於 Windows 隨附的內建 TCP/IP 監視工具 (例如 netstat),TCPView Pro 會顯示哪些程式與每個 TCP/IP 位址相關聯,讓你輕鬆判斷哪些應用程式負責特定連線和活動。 TCPView Pro 可提供動態檢視和靜態檢視。 靜態檢視會顯示目前開啟的本機 IP 位址、與每個端點相關聯的處理程序,以及端點所連接的遠端 IP 位址。 動態檢視不適用於任何其他公用程式,可讓你即時查看 TCP/IP 活動。

取得定價資訊,並在 http://www.winternals.com/products/tcpview.shtml. 下載 14 天的試用版

大家好,

歡迎閱讀 Systems Internals 電子報。 本電子報目前有 22,000 名訂閱者。

戴夫·所羅門和我在總結「Windows 2000,第三版」的最後階段,這代表本書將在 8 月中旬問世,而非 7 月下旬 (如果出貨日期沒有延遲,它就不是微軟的產品了)。 現在這本書已經定稿,我可以簡要介紹其中的內容。 首先,本書內容比上一版多 50%,並包含四個全新的章節。 以下是目錄:

  1. 簡介
  2. 架構
  3. 系統機制
  4. 啟動和關閉
  5. 管理機制
  6. 處理序和執行緒
  7. 記憶體管理
  8. 安全性
  9. I/O 系統
  10. 儲存體
  11. 快取管理員
  12. 檔案系統
  13. 網路

和第二版一樣,這本書充滿了示範我們描述的概念的實驗內容。 這本書還包括一張 CD,其中包含整個 SysInternals 網站的複本,再加上我們在實驗中使用的一些工具。

我特別為這本書寫的兩個工具受到了書評的好評。 第一個工具名為 LiveKD,可讓你在即時系統上執行任何 Windows 2000 核心偵錯工具 (i386kd、kd、WinDbg)。 這表示你會啟動 LiveKd、指定要裝載的偵錯工具,然後輸入偵錯工具,並在偵錯損毀傾印時提供你將使用的所有偵錯工具命令。 書中幾乎所有以偵錯工具為基礎的實驗,都可以使用 LiveKD 來執行,這表示你不需要第二個系統或序列纜線來執行它們。

第二個工具是效能監視器擴充功能,可讓你檢視任何核心變數的即時值。 例如,如果你想要監視與 PerfMon 搭配使用的非分頁集區數量,你可以選取 MmAllocatedNonPagedPool 變數。

這本書出版時,我會在電子報中通知,但你現在可以透過 Amazon.com 連結 www.sysinternals.com/links.htm 預購。 和往常一樣,請把電子報傳遞給你認為會覺得有趣的朋友。

感謝您!

-Mark

Systems Internals 的最新動向

REGMON V4.25

Regmon 登錄監視工具的最新更新包含針對 ZwEnumerateKeyZwQuerykey 系統服務的 Windows 2000 新 KeyNameInformation 查詢類型支援。 這項功能不會匯出供 Win32 應用程式使用,但被 ADVAPI32 中的登錄函數用作系統使用每使用者類別登錄登錄區的一部分。

Windows 2000 上的 Win32 應用程式有兩種方式可以開啟登錄的類別登錄部分:他們可以指定 HKEY_CLASS_ROOT 或指定 HKLM\Software\Classes。 第一個會傳回每個使用者類別機碼與全域類別機碼組合的控制碼,而第二個則只傳回全域資訊的控制碼。 ADVAPI32 登錄函式只能藉由檢查使用者傳入的登錄機碼控制碼基礎名稱,判斷使用者指定的登錄機碼控制碼,因此需要新的查詢類型。 如需詳細資訊,請參閱 RegOpenKeyEx 上的 SDK 文件。

在 HTTP:www.sysinternals.com/regmon.htm 下載 Regmon v4.25。

LISTDLLS V2.22

當開發人員建立動態連結程式庫 (DLL) 時,他們會告訴連結器 DLL 的「基底位址」,這是連結器在 DLL 映射檔中建立相對位址資訊的位址。 如果 DLL 載入的位址與其基底位址不同,載入器必須修正載入 DLL 映射中的所有相對位址,以考慮差異。

這些修正或重新配置可以增加應用程式的啟動時間,因此開發人員顯然想要防止重新配置發生。 不過,仔細查看 ListDL 之類的程式輸出,比較負載位址與基底位址很繁瑣。 因此,我已讓 ListDLL 2.22 版採用新的選項 -r,它會記下其輸出中重新配置的 DLL。

在 http://www.sysinternals.com/listdlls.htm. 下載 ListDLl v2.22

TDIMON V1.0

TDImon 是功能強大的 SysInternals 監視工具套件中的最新一項,會顯示系統上發生的 TCP 和 UDP 活動。 此工具會從它監視介面上的 TCP 和 UDP 活動到 TCP/IP 堆疊的事實中取用其名稱,而該介面稱為傳輸驅動程式介面 (TDI)。 所有應用程式和驅動程式 TCP 和 UDP 活動都必須通過這個介面,這表示 TDImon 不會偵測到任何 TCP 或 UDP 活動。

TDIMon 會與同類產品如 Filemon、Regmon、Portmon 和 DebugView 共用相同的 GUI,就像其他監視工具一樣,它會顯示執行活動、時間戳記,和具有篩選和反白顯示功能的程序名稱。 這讓 TDIMon 成為系統管理員的理想網路疑難排解工具,以及應用程式開發人員的 TCP/IP 偵錯工具。 TDImon 適用於 Windows 95、98、NT 4 和 Windows 2000。

在 http://www.sysinternals.com/tdimon.htm. 下載 TDImon v1.0

LDMDUMP V1.0

Windows 2000 包含稱為「軟分割」的新分割格式,可克服所有 Windows 作業系統到目前為止已用盡之 MS-DOS 形式資料分割的部分缺點。 一種稱做邏輯磁碟管理員 (LDM) 的元件會管理以軟分區格式化之磁碟上的磁碟區,這些磁碟稱為動態磁碟 (MS-DOS 樣式分割的磁碟稱為基本磁碟)。 除了由於實作的磁碟分割鏡像而更為強大之外,動態磁碟還有一個優點,即你可以建立多個磁碟分割磁碟區,在無需重新啟動系統的狀況下,即可讓檔案系統驅動程式識別和進行安裝。

Microsoft 尚未記錄 LDM 資料分割資料庫的格式,事實上,由於他們的技術是透過 Veritas 授權取得,而他們也在 UNIX 磁碟區管理軟體中使用了相同的資料庫,因此授權合約可能會防止 Microsoft 進行記錄。 最終可能會有一個 LDM 的 Win32 IOCTL 介面,但與此同時,我已經釐清了格式,並編寫了一個名為 LDMDump 的工具,你可以使用它來查看動態磁碟的資料庫內部。 LDMDump 提供與 Windows 2000 資源套件的 DmDiag 工具大致相同的資訊,但 LDMDump 會以更簡潔的方式呈現資訊。 我目前不提供此工具的原始程式碼,但如果你有興趣為自己的應用程式進行授權,請與我連絡。

在 http://www.sysinternals.com/publ.htm. 閱讀我的 Windows 2000 雜誌《儲存體內部原理,第 2 部分》專欄的 LDM 資料庫

在 http://www.sysinternals.com/ldmdump.htm. 下載 LDMDump v1.0

AUTORUNS V1.1

你可能已經熟悉過去兩個月內發行的 AutoRuns。 AutoRuns 會顯示登錄和 .INI 檔案中指定此類資訊 (或我們認為如此) 的每個位置的自動執行設定。 使用者意見反應已讓我們了解一些 AutoRuns 遺失的位置,而此最新版本現在會顯示這些位置。

在 http://www.sysinternals.com/misc.htm. 下載 AutoRuns v1.1

6 月/7 月內部資料行

你是否曾經想知道 Win32 服務與標準 Win32 應用程式有何不同? 或者,你可能好奇 NT 開機或關機順序需要這麼久的時間。 我在 Windows 2000 雜誌的 Win32 服務兩部分系列中回答這些問題等等。

在第 1 部分中,我會帶你進入 Win32 服務的結構,說明它們如何接受來自用戶端應用程式的命令。 然後,我會開始描述負責管理 Win32 服務的服務控制管理員 (SCM),包括其啟動和關閉。 在第 2 部分中,我會完成服務啟動程序的描述,此程序會在系統開機期間進行,然後告訴你 SCM 如何關閉服務。 我也會針對 Microsoft 在 Windows 2000 中對 SCM 所做的改進稍作討論,並帶你進入 SrvAny 資源套件工具。

Windows 2000 Magazine 訂閱者可以在 http://www.sysinternals.com/publ.htm. 線上閱讀專欄

內部資訊

WINDOWS NT 組建歷程記錄

如你從過去的電子報中學到的,當組建小組使用當天的程式碼簽入產生新組建時,Windows NT (現在是 Windows 2000) 的組建編號會每天遞增。我使用舊版 Beta 和候選版本 CD,以及借助其他 Windows NT 經驗比我更豐富的人的協助,我編譯了對應至公開發行的組建編號清單 (測試版、候選版本和完整版本)。 請注意,日期是組建的日期,而不是組建的發行日期。 例如,Win2K 的最終組建 2195 是在 12 月完成的,但它直到 2 月才向公眾發行。

組建 版本 Date
297 PDC 1992
340 NT 3.1 Beta 1 1992 年 10 月
397 NT 3.1 Beta 2 1993 年 3 月
511 NT 3.1 1993 年 7 月
611 NT 3.5 Beta 1 1994 年 4 月
683 NT 3.5 Beta 2 1994 年 6 月
756 NT 3.5 RC 1 1994 年 8 月
807 NT 3.5 1994 年 9 月
944 NT 3.51 Beta 1 1995 年 2 月
1057 NT 3.51 1995 年 5 月
1234 NT 4.0 Beta 1 1996 年 1 月
1314 NT 4.0 Beta 2 1996 年 5 月
1381 NT 4.0 1996 年 7 月
1671 NT 5.0 Beta 1 1997 年 9 月
1877 NT 5.0 Beta 2 1998 年 9 月
1946 Beta 3 的 Win2K RC0 1998 年 12 月
2000.3 Beta 3 的 Win2K RC1 1999 年 3 月
2031 Win2K Beta 3 1999 年 4 月
2072 Win2K RC1 1999 年 7 月
2128 Win2K RC2 1999 年 9 月
2183 Win2K RC3 1999 年 11 月
2195 Win2K 1999 年 12 月

WINDOWS NT/2000 計時器解析度

雖然 Windows NT/2000 提供包括 QueryPerformanceCounter 的服務,可讓你測量到 Pentium 迴圈計數器解析度下限的時間,但其間隔計時服務解析度卻稍低。 事實上,預設計時器解析度與系統時脈間隔相同,在單處理器 x86 系統上為 10 毫秒 (在 SMP 系統上通常為 7.5 毫秒或 15 毫秒)。 應用程式可以運用使用者空間中的多媒體計時器功能,將解析度提高到 1 毫秒,但如果驅動程式想要更高的解析度,則驅動程式會處於被忽略狀態,這種情況直到 Windows 2000 才改變。

Windows 2000 引進了新的 DDK 函式 ExSetTimerResolution,讓驅動程式可用來將系統計時器的間隔減少為 1 毫秒。 想知道多媒體計時器與 ExSetTimerResolution 幕後發生了什麼事嗎? 請至 http://www.sysinternals.com/timer.htm. 參閱「在 Windows NT 高解析度計時器內」

安全系統記憶體對應

雖然我們正討論適用於驅動程式開發人員的新 Windows 2000 核心函式主題,但 MmGetSystemAddressForMdlSafe 也值得一提。 在舊版 Windows NT 中,想要取得用戶緩衝區的系統地址空間指標或物理記憶體片段的驅動程式開發人員,必須傳遞描述實體緩衝區的 MDL (記憶體描述元清單) 至 MmGetSystemAddressForMdl

在系統的位址空間中建立虛擬對應會使用稱為「系統分頁表專案」的資源,其中每個對應的實體頁面都需要一個系統 PTE。 不幸的是,系統 PTE 的資源有限,而且如果驅動程式對應大量的記憶體,可能會耗盡。 當 MmGetSystemAddressForMdl 無法取得所需的系統 PTE 時 ,會發生什麼事? 你可能會認為它會做一些有用的事,例如傳回 NULL 作為對應的虛擬位址。 但並沒有,它會放棄掙扎並顯示藍白當機畫面。 類似的行為會對提出請求的驅動程式造成不良影響。

Windows 2000 的 MmGetSystemAddressForMdlSafe 做了 MmGetSystemAddressForMdl 應該做的事:如果沒有足夠的系統 PTE 來建立緩衝區的對應,則會傳回 NULL。 使用此函式可避免指向你的驅動程式進行尷尬的傾印。 如果你有一個在 NT 4 和 Windows 2000 上執行的驅動程式,那麼發布兩個不同的版本是值得的,也就是每個平台各一個,這樣你就可以在 Windows 2000 上利用這個新的 API。

重新對應鍵盤

如果你像我一樣,一開始使用的是 UNIX 鍵盤,則在鍵盤上會有一個 ctrl 鍵,而該位置由電腦的 caps-lock 鍵所佔用。 為了改善我的輸入速率,並了解 Windows 9x 和 Windows NT 上的裝置磁碟機開發相關內容,在這兩個作業系統上,我的第一個驅動程式專案之一,是實作鍵盤重新對應驅動程式。 你可以在 http://www.sysinternals.com/c2cap95.htm 找到 Windows 9x 版本,並在 http://www.sysinternals.com/ctrl2cap.htm. 找到 Windows NT/2K 版本

在 Windows NT/2K 上有使用鍵盤篩選驅動程式的替代方案。 透過在登錄中定義掃描碼重新對應項目,你可以完全重新撰寫鍵盤的行為。 事實上,Windows 2000 資源套件包含稱為 RemapKey 的工具,可讓你使用鍵盤的圖形表示來交換按鍵。 在 Microsoft 網站的這篇文章探討了鍵盤重新對應程式及其運作方式:http://www.microsoft.com/HWDEV/input/W2kscan-map.htm. 請注意,此工具也適用於 NT 4。

因此,假設你沒有 Windows 2000 資源套件,而且也不想花錢購買 (我建議花錢購買,畢竟這個套件包含了各種實用的工具和文件)。 如果是這種情況,你可以手動重新對應鍵盤。 我剛才參考的 Microsoft 文章,可讓你知道鍵盤驅動程式尋找重新對應程式碼的登錄機碼格式 (HKLM\ SYSTEM\CurrentControlSet\Control\Keyboard Layout\Scancode Map),你也可從 Microsoft 取得這份文章:http://www.microsoft.com/hwdev/download/desinit/scancode.zip.,它收錄了對應至機碼的掃描碼

如果你想要把 caps-lock 和 control 對換 (注意,我的鍵盤篩選工具完全不使用 caps-lock 鍵,因為我從來不用這個鍵),你可以將下列文字 (不包括「----」分隔符號) 複製到檔案 (將它命名為 swapcaps.reg 之類的名稱),然後按兩下該檔案。 這些設定將會匯入登錄,重新開機之後就會生效。

REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,3a,00,1d,00,1d,00,3a,00,\
  00,00,00,00

如果你想要復原對應,只要從登錄中刪除 Scancode Map 值,然後重新開機。

隱藏的 WINDOWS 98 檔案系統記錄

你是否曾經瀏覽過 Windows 98 系統目錄,並注意到名為 \Windows\Applog 的子目錄? 在此目錄中,你可能會找到名稱符合最近執行的應用程式名稱的檔案,以及類似 .LGC 和 .LGD 的副檔名。 在記事本中開啟其中一個檔案,你將會清楚看到檔案系統活動追蹤、檔案名、位移,以及開啟和關閉呼叫。 病毒是否會產生這些記錄,或者它是否是 Windows 98 中包含的一個秘密公用程式,可以向 Microsoft 報告你的應用程式使用模式? 兩者都不是 (如果是的話,你不會在 SysInternals 電子報看到這件事,而是會被披露在業界新聞中)。 這是 Windows 98 的「把載入你最常使用應用程式的速度提升 36%」功能的一部分。

由於 HKLM\Software\Microsoft\Windows\CurrentVersion\Run 中的 Taskmon 項目,Windows 98 會在名為 Taskmon 的開機期間啟動服務程式。 Taskmon 會載入名為 FioLog (\Windows\System\FioLog.Vxd) 的 VxD,以安裝檔案系統活動攔截,以便在應用程式啟動時查看檔案使用量。 Taskmon 會監視所有應用程式在啟動時執行的檔案系統活動,但 HKLM\Software\Microsoft\Windows\CurrentVersion\Taskmon\ExcludeApps 中列出的除外。 FioLog 會記錄 Applog 目錄中的應用程式開機檔案系統活動。 它建立的記錄檔案會以副檔名 .LGA 開頭。 目前還不清楚系統如何判斷何時該刪除記錄檔,以及何時為具有新副檔名且最後一個字母遞增的應用程式建立新記錄檔。 以下是範例記錄檔的一部分:

{
o da3034d0 d000 "C:\WINDOWS\NOTEPAD.EXE"
R da3034d0 0 40
R da3034d0 80 f8
R da3034d0 80 1c0
R da3034d0 7000 1000
R da3034d0 6000 e00
o da2b2610 156000 "C:\WINDOWS\SYSTEM\SHELL32.DLL"
R da2b2610 83000 1000
o da2b2f40 45110 "C:\WINDOWS\SYSTEM\SHLWAPI.DLL"
R da2b2f40 3c000 1000
R da2b2f40 3c000 1000
...

行會分成四個欄位:第一個欄位是作業程式碼,其中 o 是開啟、R 是讀取,而 C 是關閉。 因為 FioLog 只會在應用程式啟動期間記錄讀取作業,所以你可以最佳化應用程式啟動,因此你不會看到 W (供寫入)。 第二個欄位是內部檔案指標。 第三個和第四個欄位必須根據行的作業程式碼來解譯。 如果作業程式碼是 R,則第三個欄位是檔案位移,而第四個欄位是讀取的長度。 不過,如果作業程式碼是 o,則第三個欄位是開啟旗標,第四個是開啟的檔案名。 在追蹤 notepad.exe 開啟的範例中,系統會傳回檔案指標 da3034d0,你可以在後續的讀取作業中看到該指標正在被使用。

在你啟動重組作業時,Defrag.Exe 程式會執行名為 CvtApLog (\Windows\System\Cvtaplog.exe) 的程式來處理記錄檔。 CvtApLog 會使用名為 ClusAlgo.Dll (\Windows\System\Clusalgo.dll) 的 DLL,以根據其讀取的記錄檔找出最佳叢集位置,並將這項資訊記錄在名為 \Windows\Applog\Applog.d* 的檔案中,以引導重組程式。 CvtApLog 也會產生名為 \Windows\Applog\Optlog.txt 的檔案,摘要說明記錄檔所指定的應用程式啟動最佳化。 以下是 Optlog.txt 檔案的部分內容:

Program Launch Optimization Log - Created Tue Jun 13 11:42:52 2000

Programs Eligible for Optimization:
Ord Flag ProgName Uses   LastExecDate Program Path                           
1        RUNDLL32 65     2000.06.13   C:\WINDOWS\RUNDLL32.EXE                
2        ATIPTAAB 31     2000.06.13   C:\WINDOWS\SYSTEM\ATIPTAAB.EXE         
3        NOTEPAD  22     2000.06.13   C:\WINDOWS\NOTEPAD.EXE                 
4        PING     9      2000.06.10   C:\WINDOWS\PING.EXE                    
…             
17       IEXPLORE 2      2000.06.01   C:\PROGRAM FILES\INTERNET EXPLORER\IEXPLORE.EXE

Programs Ineligible for Optimization:
Ord Flag ProgName Uses   LastExecDate Program Path                           
18  S    GREP     5      2000.06.13   C:\BIN\GREP.EXE                        
19  S    STRINGS  12     2000.06.13   C:\BIN\STRINGS.EXE                     
20  S    ATI2CWXX 31     2000.06.13   C:\WINDOWS\SYSTEM\ATI2CWXX.EXE         

Control Parameters:
Use app profile        = Yes
Minimum log size    = 1000
Maximum no use days = 90
Maximum apps        = 50

Flags for Ineligible Programs:
S = Log size smaller than <Minimum log size>
U = Program not used for more than <Maximum no use days>
P = No profile for program
E = Associated program no longer exists
D = Log deleted (may be combined with one of the above)

Windows 98 具備將應用程式啟動期間所使用檔案部分移至磁碟上連續區域的能力,這是 Intel 授權給 Microsoft 的技術 (若要進行查看,請手動執行 Defrag.exe,而你將看到「Intel Application Launch Accelerator」文字)。

WINDEV '00 WEST

WinDev '00 East 在上周舉行,破紀錄的高達 660 人出席率 (這也是該飯店可以容納的所有人數)。 出席會議的演講者代表了 Windows 開發各領域的大人物,包括從 COM-god Don Box 到驅動程式專家 Jamie Hanrahan 和 Brian Catlin。 我的工作階段包括「Windows 2000 內部原理」、「進階驅動程式」、「Windows NT/2000 檔案系統驅動程式」和「叢集伺服器」。

如果你不慎錯過了,那你的運氣很好,因為你還有第二次機會。 WinDev'00 West 將於 9 月 11 日至 15 日在加州聖克拉拉舉行,所有原班人馬的演講者也將齊聚一堂。 我也會出席同一場會議,並且會和 WinDev East 一樣免費送出 SysInternals T-恤,提供給回答問題或提出獨到見解的現場聽眾。 你可以在 http://www.butrain.com/windev/west/default.htm. 參閱詳細資訊

未來動態

「SECURE」WINDOWS 98 登錄機碼

雖然 Windows 98 登錄不支援安全性,但 Microsoft 已實作定義隱藏登錄機碼的機制。 哪些應用程式會使用此隱形技術? 當然就是 Internet Explorer。 下次我會告訴你 IE 隱藏了哪些金鑰,以及 Windows 98 如何進行實作。


感謝你閱讀 Systems Internals 電子報。

發佈時間:2000 年 6 月 14 日星期三下午 7:08,發佈者:ottoh

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