【轉】 快捷方式lnk文件格式詳解(英文)(中文)

【轉】 快捷方式lnk文件格式詳解(英文)(中文)html

2009-11-07 10:55shell

轉自:http://www.stdlib.com/art6-Shortcut-File-Format-lnk.html

You should consider using the IShellLink interface which is a safe way to handle windows shortcuts. If you have a strong reason not to use that interface then I have to remind you that this file format is not documented by Microsoft. I cannot say that the info gathered here is accurate nor that it will work in the future.
 
 .LNK File Format 
 1. Header 
 2. Shell Item Id List 
 3. File Location Info 
 4. Description 
 5. Relative Path 
 6. Working Directory 
 7. Command Line Arguments 
 8. Icon Filename 
 9. Additonal Info 
 

1. Headerwindows

Size Contents Description
4 bytes Always 4C 00 00 00 This is how windows knows it is a shortcut file
16 bytes GUID for shortcut files The current GUID for shortcuts. It may change in the future. 01 14 02 00 00 00 00 00 C0 00 00 00 00 00 46
1 dword Shortcut flags Shortcut flags are explained below
1 dword Target file flags Flags are explained below
1 qword Creation time  
1 qword Last access time  
1 qword Modification time  
1 dword File length The length of the target file. 0 if the target is not a file. This value is used to find the target when the link is broken.
1 dword Icon number If the file has a custom icon (set by the flags bit 6), then this long integer indicates the index of the icon to use. Otherwise it is zero.
1 dword Show Window the ShowWnd value to pass to the target application when starting it. 1:Normal Window 2:Minimized 3:Maximized
1 dword Hot Key The hot key assigned for this shortcut
1 dword Reserved Always 0
1 dword Reserved Always 0
 

Shortcut flags網絡

Bit Meaning
0 Shell item id list is present
1 Target is a file or directory
2 Has a description
3 Has a relative path
4 Has a working directory
5 Has command line arguments
6 Has a custom icon.
 

Target flagsapp

Bit Meaning
0 Target is read only.
1 Target is hidden.
2 Target is a system file.
3 Target is a volume label. (Not possible)
4 Target is a directory.
5 Target has been modified since last backup. (archive)
6 Target is encrypted (NTFS partitions)
7 Target is Normal
8 Target is temporary.
9 Target is a sparse file.
10 Target has reparse point data.
11 Target is compressed.
12 Target is offline.

 

Last Access and Modified time offsets corrected thanks to JimmyW

Shell Item Id List

Note: This section exists only if the first bit for shortcut flags is set the header section. If that bit is not set then this section does not exists.

The first word contains the size of the list in bytes. Each item (except the last) in the list contains its size in a word fallowed by the content. The size includes and the space used to store it. The last item has the size 0. These items are used to store various informations. For more info read the SHITEMID documentation.


File Location Info

This section is always present, but if bit 1 is not set in the flags value, then the length of this section will be zero. The header of this section is described below.
 ide

Size Description
1 dword This length value includes all the assorted pathnames and other data structures. All offsets are relative to the start of this section.
1 dword The offset at which the basic file info structure ends. Should be 1C.
1 dword File available on local volume (0) or network share(1)
1 dword Offset to the local volume table.
1 dword Offset to the base path on the local volume.
1 dword Offset to the network volume table.
1 dword Offset to the final part of the pathname.


Combine the base path string and the final path string to find the filename of the file on the local volume. To find the filename of the file on the network you need to combine the share name in the network volume table with the final path string.

The local volume table函數

 

Size Description
1 dword Length of this structure including the volume label string.
1 dword Type of volume (code below)
1 dword Volume serial number
1 dword Offset of the volume name (Always 0x10)
ASCIZ Volume label

Type of volumesthis

 

Code Description
0 Unknown
1 No root directory
2 Removable (Floppy, Zip ...)
3 Fixed (Hard disk)
4 Remote (Network drive)
5 CD-ROM
6 Ram drive

The network volume table加密

 

Size Description
1 dword Length of this structure
1 dword Always 02
1 dword Offset of network share name (Always 0x14)
1 dword Reserved 0
1 dword Always 0x20000
ASCIZ Network share name

 

Description

This section is present if bit 2 is set in the flags value in the header. The first word value indicates the length of the string. Following the length value is a string of ASCII characters. It is a description of the item.


Relative path string

This section is present if bit 3 is set in the flags value in the header. The first word value indicates the length of the string. Following the length value is a string of ASCII characters. It is a relative path to the target.


Working directory

This section is present if bit 4 is set in the flags value in the header. The first word value indicates the length of the string. Following the length value is a string of ASCII characters. It is the working directory as specified in the shortcut properties.


Command line arguments

This section is present if bit 5 is set in the flags value in the header. The first word value indicates the length of the string. Following the length value is a string of ASCII characters. The command line string includes everything except the program name.


Icon filename

This section is present if bit 6 is set in the flags value in the header. The first word value indicates the length of the string. Following the length value is a string of ASCII characters. This the name of the file containing the icon.


Additonal Info Usualy consists of a dword with the value 0.

你們知道經過IShellLink接口能夠獲得快捷方式的各類屬性。具體怎麼作,網上有不少文章,這裏就不介紹了。如今主要是分析一下快捷方式文件的格 式,而且本身寫一個解析程序。
爲了方便你們理解,解說完每一個段後附上一個快捷方式對應部分的事例數據並附內容解說。這裏以Windows Media Player在桌面上的快捷方式爲例。

1、文件的總體結構
 .LNK 文件格式
 1. 文件頭
 2. Shell Item Id List
 3. 文件位置信息段
 4. 描述字符段
 5. 相對路徑段
 6. 工做目錄段
 7. 命令行段
 8. 圖標文件段
 9. 附加信息段


2、文件頭

文件頭結構,參照下面表格:
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 目標文件執行時窗口顯示方式:
一、 正常顯示
二、 最小化
三、 最大化
40h 1 dword 熱鍵
44h 2 dword 暫時還不清楚用途值常爲0


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

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
3、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段結束
4、文件位置信息段
開始的一個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
5、描述字符段
當文件頭中○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 電臺。

6、相對路徑段
當文件頭中○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" 7、工做目錄段 同上。 例:由於文件頭中○1flags的第四位沒有置位,因此此段不存在 8、 命令行段 同上。 例:由於文件頭中○1flags的第五位沒有置位,因此此段不存在 9、圖標文件段 同上。 例: 由於文件頭中○1flags的第六位沒有置位,因此此段不存在 10、 附加信息段 具體信息不清楚!!!!! 以上不少資料來自網上,並非微軟文檔,因此不免有理解錯誤的地方,請包含。所附代碼只是爲了 跟蹤顯示,沒有輸出,嘿嘿,本身改改看吧!!:)有興趣能夠本身寫一個類,分析快捷方式的全部信息。
相關文章
相關標籤/搜索