首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

Windows 捷徑檔案格式深度解析與手寫解析器實作

     編輯:關於VC++

前言

雖可透過 IShellLink 介面取得捷徑屬性,但理解二進位格式有助於在無 COM 環境下解析,或進行深度偵錯。本文以「Windows Media Player」桌面捷徑為例,逐段解析 .lnk 檔案結構。

整體結構

捷徑檔案整體結構圖

  1. 檔案標頭
  2. Shell Item ID List(可選)
  3. 檔案位置資訊
  4. 描述字串(可選)
  5. 相對路徑(可選)
  6. 工作目錄(可選)
  7. 命令列參數(可選)
  8. 圖示檔案(可選)
  9. 附加資訊(可選)

檔案標頭 詳細結構

位移大小/型別說明
0x00DWORD固定 0x0000004C ('L')
0x0416 bytesGUID (固定 {00021401-0000-0000-C000-000000000046})
0x14DWORDFlags:標示後續可選區段是否存在
0x18DWORD目標檔案屬性
0x1CQWORD建立時間 (FILETIME)
0x24QWORD修改時間
0x2CQWORD最後存取時間
0x34DWORD目標檔案長度
0x38DWORD自訂圖示數量
0x3CDWORD視窗顯示模式 (1=正常, 2=最小化, 3=最大化)
0x40DWORD熱鍵
0x442 DWORD保留 (通常為 0)

Flags 位元定義 (Offset 0x14)

Bit意義
0存在 Shell Item ID List
1指向檔案/資料夾 (0=其他)
2存在描述字串
3存在相對路徑
4存在工作目錄
5存在命令列參數
6存在自訂圖示

檔案屬性位元 (Offset 0x18)

對應 WIN32_FIND_DATA.dwFileAttributes,包含 READONLY、HIDDEN、SYSTEM、DIRECTORY、ARCHIVE、ENCRYPTED、TEMPORARY、SPARSE_FILE、REPARSE_POINT、COMPRESSED、OFFLINE 等。

Shell Item ID List 區段

Flags Bit 0 置位時存在。第一個 USHORT 為整個區段總長度,後續為連續 SHITEMID 結構:

typedef struct _SHITEMID { USHORT cb; BYTE abID[0]; } SHITEMID;

cb 為該項目長度,abID 為可變長度識別資料。解析時可直接依總長度跳過此區段。

檔案位置資訊區段

Flags Bit 1 置位時存在。區段開頭 DWORD 為總長度,接著區段標頭:

位移大小說明
0x00DWORD區段總長度
0x04DWORD標頭固定長度 0x1C
0x08DWORD磁碟機類型旗標 (Bit 0=本機, Bit 1=網路)
0x0CDWORD本機磁碟資訊表區段內位移 (固定 0x1C)
0x10DWORD本機路徑字串區段內位移
0x14DWORD網路磁碟資訊表區段內位移
0x18DWORD附加資訊字串區段內位移
  • 本機檔案:完整路徑 = 本機路徑字串 + 附加資訊字串
  • 網路檔案:完整路徑 = 網路共享名稱 + 附加資訊字串

本機磁碟資訊表

位移說明
0x00表長度
0x04磁碟類型 (0=Unknown, 2=Removable, 3=Fixed, 4=Remote, 5=CD-ROM, 6=RAM)
0x08磁碟序號
0x0C固定 0x10
0x10可變長度磁碟標籤

網路磁碟資訊表

位移說明
0x00表長度
0x04固定 2
0x08固定 0x14
0x0C固定 0
0x10固定 0x20000
0x14可變長度網路共享名稱

描述字串、相對路徑、工作目錄、命令列、圖示檔案

結構相同:起始 USHORT 為字元數(Unicode,實際位元組數 ×2),後接字串內容。Flags 對應 Bit 2~6 決定是否存在。

實際範例數據節錄

// 標頭
0000: 4C 00 00 00 01 14 02 00 00 00 00 00 C0 00 00 00 00 00 00 46
0014: 8F 00 00 00  // Flags: 有IDL、是檔案、有描述、有相對路徑
0018: 20 00 00 00  // 屬性: ARCHIVE
// 時間、長度等略

// ID List 區段 (總長 0x9C)
004C: 9C 00
004E: 14 00 ... (第一個 SHITEMID)
0062: 19 00 ... (第二個 SHITEMID)
...
00E8: 00 00  // 結束標記

// 檔案位置資訊
00EA: 67 00 00 00  // 區段總長
00EE: 1C 00 00 00
00F2: 01 00 00 00  // 本機磁碟
...
011D: "C:\Program Files\Windows Media Player\wmplayer.exe" (本機路徑)
0150: 00  // 附加資訊為空

// 描述字串 (長度 0x20)
0151: 20 00
0153: ... Unicode "播放數字媒體,包括 音樂、視頻、CD 和 Internet 電台。"

// 相對路徑 (長度 0x38)
0193: 38 00
0195: "..\..\..\Program Files\Windows Media Player\wmplayer.exe"

結語

掌握 .lnk 二進位格式,可在無 Shell 介面環境下解析捷徑,或開發自訂捷徑處理工具。本文提供完整欄位定義與實際數據對照,歡迎開發者擴充為功能完整的解析類別。完整原始碼請參考附件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved