程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> Windows快捷方式文件格式解析

Windows快捷方式文件格式解析

編輯:關於VC++

最近一直作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的第六位沒有置位,所以此段不存在

十、 附加信息段 具體信息不清楚!!!!!

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

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved