Windows捷徑檔案格式解析

來源:互聯網
上載者:User

Windows捷徑檔案格式解析

作者:Cuick

  最近一直作linux項目,很久沒來VC知識庫了,先向大家問個好!現在拜個晚年不是很晚吧?(不是說有心拜年八月十五也不晚嗎!!嘿嘿)
  好了,言歸正傳。大家知道通過IShellLink介面可以得到捷徑的各種屬性。具體怎麼做,網上有很多文章,這裡就不介紹了。現在主要是分析一下捷徑檔案的格式,並且自己寫一個解析程式。
為了方便大家理解,解說完每個段後附上一個捷徑對應部分的案例資料並附內容解說。這裡以Windows Media Player在案頭上的捷徑為例。

一、檔案的整體結構


二、檔案頭

檔案頭結構,參照下面表格:

Offset  Size/Type  Description
0h 1 dword 值常為0000004CH,為字元"L"
4h 16 bytes GUID
①14h 1 dword Flags,用來標識捷徑檔案中有哪些可選屬性,後面有表單獨解釋每一位的意義。
②18h 1 dword 目標檔案屬性,後面解釋。
1ch 1 qword 檔案建立時間
24h 1 qword 檔案修改時間
2ch 1 qword 檔案最後一次訪問時間
34h 1 dword 目標檔案長度
38h 1 dword 自訂表徵圖個數,
3ch 1 dword 目標檔案執行時視窗顯示方式:
1、 正常顯示
2、 最小化
3、 最大化
40h 1 dword 熱鍵
44h 2 dword 暫時還不清楚用途值常為0

 
① 位移14h開始的標誌標示有哪些可選屬性,見下表:

Bit 所在位為1時表示
0 有shell item id list
1 指向檔案或檔案夾,如果此位為0表示指向其他。
2 存在描述字串
3 存在相對路徑
4 存在工作路徑
5 存在命令列參數
6 存在自訂表徵圖

② 位移18h開始的目標檔案屬性: 

Bit 所在位為1時表示
0 捷徑所指目標檔案有唯讀屬性
1 捷徑所指目標檔案有隱藏屬性
2 捷徑所指目標檔案是系統檔案
3 捷徑所指目標是卷標
4 捷徑所指目標是檔案夾
5 捷徑所指目標檔案上次存檔後被改變過
6 捷徑所指目標檔案被加密
7 捷徑所指目標檔案屬性為一般
8 捷徑所指目標檔案為臨時
9 捷徑所指目標檔案為疏鬆檔案(sparse file)
10 捷徑所指目標檔案有重分析點資料(reparse point)
11 捷徑所指目標檔案被壓縮
12 捷徑所指目標檔案離線

例:

位移       資料             解釋
0000 4c 00 00 00 字元"L"
0004 01 14 02 00 捷徑的GUID。值固定
00 00 00 00
C0 00 00 00
00 00 00 46
0014 8F 00 00 00 flags。對照表可知
有shell item id list
目標是檔案
存在描述字串
存在相對路徑
0018 20 00 00 00 檔案屬性,具體內容可以查上面的屬性說明表
001C 40 51 0A 0C 檔案建立時間
AD CB C4 01
0024 C4 D8 A5 91 檔案修改時間
AD CB C4 01
002C 00 33 16 74 檔案最後一次訪問時間
F6 C7 C3 01
0034 00 20 01 00 檔案長度
0038 00 00 00 00 自訂表徵圖個數
003C 01 00 00 00 開啟時視窗為normal狀態
0040 00 00 00 00 熱鍵
0044 00 00 00 00 暫時還不清楚用途值常為0
00 00 00 00

三、Shell item ID list段
  當檔案頭中○1的第0位置位時才有。第一個unsigned short integer表示item ID list段的總長度。後面緊跟著SHITEMID結構。SHITEMID的定義如下:

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

  cb儲存SHITEMID結構的大小。abID是可變長度的對象標識。具體都是什麼含義沒看明白,可以參閱MSDN。因為item ID list段的開始為這個段的總長度,所以在讀取的時候可以把此段跳過不做處理!!:)

例:(檔案頭段的flags標誌顯示存在shell item id list段)

位移       資料             解釋
004C 9c 00 item ID list總長度(下一段的起始地址為004E+009C=00EA)
004E 14 00 第一個item ID的長度
0050 1F 50 E0 4F 第一個item ID標示內容
D0 20 EA 3A
69 10 A2 D8
08 00 2B 30
30 9D
0062 19 00 第二個item ID的長度
0064 23 43 3A 5C 第二個item ID標示內容
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 F1 93
007B 25 00
007D 31 00 00 00
00 00 70 31
47 3B 31 00
50 72 6F 67
72 61 6D 20
46 69 6C 65
73 00 50 52
4F 47 52 41
7E 31 00
00A0 2C 00
00A2 31 00 00 00
00 00 70 31
47 3B 10 00
57 69 6E 64
6F 77 73 20
4D 65 64 69
61 20 50 6C
61 79 65 72
00 57 49 4E
44 4F 57 7E
32 00
00CC 1C 00
00CE 32 00 00 20
01 00 95 2F
A1 99 20 00
77 6D 70 6C
61 79 65 72
2E 65 78 65
00 00
00E8 00 00 item ID list段結束

四、檔案位置資訊段
  開始的一個long integer表示此段的總長度,當檔案頭中○1的第1位沒有置位時表示既不是檔案也不是檔案夾,所以這個資訊沒有意義,所以總長度為0。先讓我們看一下這個段的頭:
 

Offset  Size/Type  Description
0h 1 dword 此段的總長度
4h 1 dword 頭結構長度,固定為1ch
8h 1 dword Flags指示檔案在哪些卷有效,這裡只用到低兩位,第一位置位表示本地卷有效,反之無效。第二位置位表示網路卷有效,反之無效。
ch 1 dword 本地卷資訊表的位移(固定1ch)
10h 1 dword 本地路徑資訊的位移
14h 1 dword 網路卷資訊表的位移
18h 1 dword 附加資訊的位移

如果檔案在本地卷,那麼檔案名稱為:本地路徑資訊+附加資訊
如果檔案在網路卷,那麼檔案名稱為:網路卷資訊中的共用名稱+附加資訊

緊跟在段頭後面的是本地卷資訊表(段內位移為1ch),結構如下:

Offset  Size/Type  Description
0h 1 dword 本地卷資訊表的長度
4h 1 dword 卷類型:
0 Unknown
1 No root directory
2 Removable (Floppy, Zip, etc..)
3 Fixed (Hard disk)
4 Remote (Network drive)
5 CD-ROM
6 Ram drive (Shortcuts to stuff on a ram drive, now that''s smart...)
8h 1 dword 卷序號
ch 1 dword 固定長度部分的大小,固定為10h
10h 可變長度  卷標籤

然後是本地路徑資訊串段內位移決定於10h的值。

再往後就是網路卷資訊表段內位移決定於14h的值。結構如下:

Offset  Size/Type  Description
0h 1 dword 網路卷資訊表的長度
4h 1 dword 固定為2h
8h 1 dword 固定長度部分的大小,固定為14h
ch 1 dword 固定為0h
10h 1 dword 固定為20000h
14h 可變長度 網際網路共用名

最後是附加資訊串段內位移決定於18h的值 例:

位移       資料             解釋
段頭
00EA 67 00 00 00 檔案位置資訊段總長度
00EE 1C 00 00 00 段頭長度,固定為1ch
00F2 01 00 00 00 本地卷
00F6 1C 00 00 00 本地卷資訊表的段內位移
00FA 33 00 00 00 本地路徑資訊的位移
00FE 00 00 00 00 網路卷資訊表的位移
0102 66 00 00 00 附加資訊的位移

本地卷資訊表

0106    17 00 00 00     表長度
010A 03 00 00 00 Fixed (Hard disk)
010E AD C9 B2 F0 卷序號
0112 10 00 00 00 固定為10h
0116 73 79 73 74 卷標"system"
65 6D 00

本地路徑資訊串

011D    43 3A 5C 50  C:\Program Files\Windows Media Player\wmplayer.exe
72 6F 67 72
61 6D 20 46
69 6C 65 73
5C 57 69 6E
64 6F 77 73
20 4D 65 64
69 61 20 50
6C 61 79 65
72 5C 77 6D
70 6C 61 79
65 72 2E 65
78 65 00

  網路卷資訊表 因為段頭裡flags指示僅為本地卷,並且網路卷資訊表的位移值為零。所以不存在網路卷資訊表。
|
附加資訊串

0150    00

五、描述字元段
  當檔案頭中○1的第2位置位時才有。開始的一個unsigned short int表示描述字串的長度(描述字元為Unicode字元,所以位元組數需乘以2,可以使用API函數WideCharToMultiByte將其轉換成ANSI字元)。後面為內容。例:

位移       資料             解釋
0151 20 00 描述字元長度
0153 AD 64 3E 65
70 65 57 5B
92 5A 53 4F
0C FF 05 53
EC 62 F3 97
50 4E 01 30
C6 89 91 98
01 30 43 00
44 00 20 00
8C 54 20 00
49 00 6E 00
74 00 65 00
72 00 6E 00
65 00 74 00
20 00 35 75
F0 53 02 30

  轉換成ANSI字元為"播放數位媒體,包括音樂、視頻、CD 和 Internet 電台。

六、相對路徑段
  當檔案頭中○1的第3位置位時才有。同描述字元段一樣開始的一個unsigned short int表示相對路徑字串的長度。後面為內容。 例:

位移       資料             解釋
0193 38 00 相對路徑字元長度
0195 2E 00 2E 00
5C 00 2E 00
2E 00 5C 00
2E 00 2E 00
5C 00 50 00
72 00 6F 00
67 00 72 00
61 00 6D 00
20 00 46 00
69 00 6C 00
65 00 73 00
5C 00 57 00
69 00 6E 00
64 00 6F 00
77 00 73 00
20 00 4D 00
65 00 64 00
69 00 61 00
20 00 50 00
6C 00 61 00
79 00 65 00
72 00 5C 00
77 00 6D 00
70 00 6C 00
61 00 79 00
65 00 72 00
2E 00 65 00
78 00 65 00

轉換成ANSI字元為"..\..\..\Program Files\Windows Media Player\wmplayer.exe"

七、工作目錄段 同上。

例:因為檔案頭中○1flags的第四位沒有置位,所以此段不存在

八、 命令列段 同上。

例:因為檔案頭中○1flags的第五位沒有置位,所以此段不存在

九、表徵圖檔案段 同上。

例:因為檔案頭中○1flags的第六位沒有置位,所以此段不存在

十、 附加資訊段 具體資訊不清楚!!!!!

  以上很多資料來自網上,並不是微軟文檔,所以難免有理解錯誤的地方,請包含。所附代碼只是為了跟蹤顯示,沒有輸出,嘿嘿,自己改改看吧!!:)有興趣可以自己寫一個類,分析捷徑的所有資訊。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.