1
2#------------------------------------------------------------------------------
3# $File: gpt,v 1.5 2020/12/12 20:01:47 christos Exp $
4#
5# GPT Partition table patterns.
6# Author: Rogier Goossens (goossens.rogier@gmail.com)
7# Note that a GPT-formatted disk must contain an MBR as well.
8#
9
10# The initial segment (up to >>>>>>>>422) was copied from the X86
11# partition table code (aka MBR).
12# This is kept separate, so that MBR partitions are not reported as well.
13# (use -k if you do want them as well)
14
15# First, detect the MBR partition table
16# If more than one GPT protective MBR partition exists, don't print anything
17# (the other MBR detection code will then just print the MBR partition table)
180x1FE                         leshort             0xAA55
19>3                            string              !MS
20>>3                           string              !SYSLINUX
21>>>3                          string              !MTOOL
22>>>>3                         string              !NEWLDR
23>>>>>5                        string              !DOS
24# not FAT (32 bit)
25>>>>>>82            string              !FAT32
26#not Linux kernel
27>>>>>>>514                    string              !HdrS
28#not BeOS
29>>>>>>>>422                   string              !Be\ Boot\ Loader
30# GPT with protective MBR entry in partition 1 (only)
31>>>>>>>>>450                  ubyte               0xee
32>>>>>>>>>>466                 ubyte               !0xee
33>>>>>>>>>>>482                ubyte               !0xee
34>>>>>>>>>>>>498               ubyte               !0xee
35#>>>>>>>>>>>>>446   use                 gpt-mbr-partition
36>>>>>>>>>>>>>(454.l*8192)     string              EFI\ PART GPT partition table
37>>>>>>>>>>>>>>0                         use                 gpt-mbr-type
38>>>>>>>>>>>>>>&-8             use                 gpt-table
39>>>>>>>>>>>>>>0                         ubyte               x                   of 8192 bytes
40>>>>>>>>>>>>>(454.l*8192)     string              !EFI\ PART
41>>>>>>>>>>>>>>(454.l*4096)    string              EFI\ PART GPT partition table
42>>>>>>>>>>>>>>>0              use                 gpt-mbr-type
43>>>>>>>>>>>>>>>&-8            use                 gpt-table
44>>>>>>>>>>>>>>>0              ubyte               x                   of 4096 bytes
45>>>>>>>>>>>>>>(454.l*4096)    string              !EFI\ PART
46>>>>>>>>>>>>>>>(454.l*2048)   string              EFI\ PART GPT partition table
47>>>>>>>>>>>>>>>>0             use                 gpt-mbr-type
48>>>>>>>>>>>>>>>>&-8           use                 gpt-table
49>>>>>>>>>>>>>>>>0             ubyte               x                   of 2048 bytes
50>>>>>>>>>>>>>>>(454.l*2048)   string              !EFI\ PART
51>>>>>>>>>>>>>>>>(454.l*1024)  string              EFI\ PART GPT partition table
52>>>>>>>>>>>>>>>>>0            use                 gpt-mbr-type
53>>>>>>>>>>>>>>>>>&-8                    use                 gpt-table
54>>>>>>>>>>>>>>>>>0            ubyte               x                   of 1024 bytes
55>>>>>>>>>>>>>>>>(454.l*1024)  string              !EFI\ PART
56>>>>>>>>>>>>>>>>>(454.l*512)  string              EFI\ PART GPT partition table
57>>>>>>>>>>>>>>>>>>0           use                 gpt-mbr-type
58>>>>>>>>>>>>>>>>>>&-8                   use                 gpt-table
59>>>>>>>>>>>>>>>>>>0           ubyte               x                   of 512 bytes
60# GPT with protective MBR entry in partition 2 (only)
61>>>>>>>>>450                  ubyte               !0xee
62>>>>>>>>>>466                 ubyte               0xee
63>>>>>>>>>>>482                ubyte               !0xee
64>>>>>>>>>>>>498               ubyte               !0xee
65#>>>>>>>>>>>>>462   use                 gpt-mbr-partition
66>>>>>>>>>>>>>(470.l*8192)     string              EFI\ PART GPT partition table
67>>>>>>>>>>>>>>0                         use                 gpt-mbr-type
68>>>>>>>>>>>>>>&-8             use                 gpt-table
69>>>>>>>>>>>>>>0                         ubyte               x                   of 8192 bytes
70>>>>>>>>>>>>>(470.l*8192)     string              !EFI\ PART
71>>>>>>>>>>>>>>(470.l*4096)    string              EFI\ PART GPT partition table
72>>>>>>>>>>>>>>>0              use                 gpt-mbr-type
73>>>>>>>>>>>>>>>&-8            use                 gpt-table
74>>>>>>>>>>>>>>>0              ubyte               x                   of 4096 bytes
75>>>>>>>>>>>>>>(470.l*4096)    string              !EFI\ PART
76>>>>>>>>>>>>>>>(470.l*2048)   string              EFI\ PART GPT partition table
77>>>>>>>>>>>>>>>>0             use                 gpt-mbr-type
78>>>>>>>>>>>>>>>>&-8           use                 gpt-table
79>>>>>>>>>>>>>>>>0             ubyte               x                   of 2048 bytes
80>>>>>>>>>>>>>>>(470.l*2048)   string              !EFI\ PART
81>>>>>>>>>>>>>>>>(470.l*1024)  string              EFI\ PART GPT partition table
82>>>>>>>>>>>>>>>>>0            use                 gpt-mbr-type
83>>>>>>>>>>>>>>>>>&-8                    use                 gpt-table
84>>>>>>>>>>>>>>>>>0            ubyte               x                   of 1024 bytes
85>>>>>>>>>>>>>>>>(470.l*1024)  string              !EFI\ PART
86>>>>>>>>>>>>>>>>>(470.l*512)  string              EFI\ PART GPT partition table
87>>>>>>>>>>>>>>>>>>0           use                 gpt-mbr-type
88>>>>>>>>>>>>>>>>>>&-8                   use                 gpt-table
89>>>>>>>>>>>>>>>>>>0           ubyte               x                   of 512 bytes
90# GPT with protective MBR entry in partition 3 (only)
91>>>>>>>>>450                  ubyte               !0xee
92>>>>>>>>>>466                 ubyte               !0xee
93>>>>>>>>>>>482                ubyte               0xee
94>>>>>>>>>>>>498               ubyte               !0xee
95#>>>>>>>>>>>>>478   use                 gpt-mbr-partition
96>>>>>>>>>>>>>(486.l*8192)     string              EFI\ PART GPT partition table
97>>>>>>>>>>>>>>0                         use                 gpt-mbr-type
98>>>>>>>>>>>>>>&-8             use                 gpt-table
99>>>>>>>>>>>>>>0                         ubyte               x                   of 8192 bytes
100>>>>>>>>>>>>>(486.l*8192)     string              !EFI\ PART
101>>>>>>>>>>>>>>(486.l*4096)    string              EFI\ PART GPT partition table
102>>>>>>>>>>>>>>>0              use                 gpt-mbr-type
103>>>>>>>>>>>>>>>&-8            use                 gpt-table
104>>>>>>>>>>>>>>>0              ubyte               x                   of 4096 bytes
105>>>>>>>>>>>>>>(486.l*4096)    string              !EFI\ PART
106>>>>>>>>>>>>>>>(486.l*2048)   string              EFI\ PART GPT partition table
107>>>>>>>>>>>>>>>>0             use                 gpt-mbr-type
108>>>>>>>>>>>>>>>>&-8           use                 gpt-table
109>>>>>>>>>>>>>>>>0             ubyte               x                   of 2048 bytes
110>>>>>>>>>>>>>>>(486.l*2048)   string              !EFI\ PART
111>>>>>>>>>>>>>>>>(486.l*1024)  string              EFI\ PART GPT partition table
112>>>>>>>>>>>>>>>>>0            use                 gpt-mbr-type
113>>>>>>>>>>>>>>>>>&-8                    use                 gpt-table
114>>>>>>>>>>>>>>>>>0            ubyte               x                   of 1024 bytes
115>>>>>>>>>>>>>>>>(486.l*1024)  string              !EFI\ PART
116>>>>>>>>>>>>>>>>>(486.l*512)  string              EFI\ PART GPT partition table
117>>>>>>>>>>>>>>>>>>0           use                 gpt-mbr-type
118>>>>>>>>>>>>>>>>>>&-8                   use                 gpt-table
119>>>>>>>>>>>>>>>>>>0           ubyte               x                   of 512 bytes
120# GPT with protective MBR entry in partition 4 (only)
121>>>>>>>>>450                  ubyte               !0xee
122>>>>>>>>>>466                 ubyte               !0xee
123>>>>>>>>>>>482                ubyte               !0xee
124>>>>>>>>>>>>498               ubyte               0xee
125#>>>>>>>>>>>>>494   use                 gpt-mbr-partition
126>>>>>>>>>>>>>(502.l*8192)     string              EFI\ PART GPT partition table
127>>>>>>>>>>>>>>0                         use                 gpt-mbr-type
128>>>>>>>>>>>>>>&-8             use                 gpt-table
129>>>>>>>>>>>>>>0                         ubyte               x                   of 8192 bytes
130>>>>>>>>>>>>>(502.l*8192)     string              !EFI\ PART
131>>>>>>>>>>>>>>(502.l*4096)    string              EFI\ PART GPT partition table
132>>>>>>>>>>>>>>>0              use                 gpt-mbr-type
133>>>>>>>>>>>>>>>&-8            use                 gpt-table
134>>>>>>>>>>>>>>>0              ubyte               x                   of 4096 bytes
135>>>>>>>>>>>>>>(502.l*4096)    string              !EFI\ PART
136>>>>>>>>>>>>>>>(502.l*2048)   string              EFI\ PART GPT partition table
137>>>>>>>>>>>>>>>>0             use                 gpt-mbr-type
138>>>>>>>>>>>>>>>>&-8           use                 gpt-table
139>>>>>>>>>>>>>>>>0             ubyte               x                   of 2048 bytes
140>>>>>>>>>>>>>>>(502.l*2048)   string              !EFI\ PART
141>>>>>>>>>>>>>>>>(502.l*1024)  string              EFI\ PART GPT partition table
142>>>>>>>>>>>>>>>>>0            use                 gpt-mbr-type
143>>>>>>>>>>>>>>>>>&-8                    use                 gpt-table
144>>>>>>>>>>>>>>>>>0            ubyte               x                   of 1024 bytes
145>>>>>>>>>>>>>>>>(502.l*1024)  string              !EFI\ PART
146>>>>>>>>>>>>>>>>>(502.l*512)  string              EFI\ PART GPT partition table
147>>>>>>>>>>>>>>>>>>0           use                 gpt-mbr-type
148>>>>>>>>>>>>>>>>>>&-8                   use                 gpt-table
149>>>>>>>>>>>>>>>>>>0           ubyte               x                   of 512 bytes
150
151# The following code does GPT detection and processing, including
152# sector size detection.
153# It has to be duplicated above because the top-level pattern
154# (i.e. not called using 'use') must print *something* for file
155# to count it as a match. Text only printed in named patterns is
156# not counted, and causes file to continue, and try and match
157# other patterns.
158#
159# Unfortunately, when assuming sector sizes >=16k, if the sector size
160# happens to be 512 instead, we may find confusing data after the GPT
161# table...  If the GPT table has less than 128 entries, this may even
162# happen for assumed sector sizes as small as 4k
163# This could be solved by checking for the presence of the backup GPT
164# header as well, but that makes the logic extremely complex
165##0                 name                gpt-mbr-partition
166##>(8.l*8192)       string              EFI\ PART
167##>>(8.l*8192)      use                 gpt-mbr-type
168##>>&-8             use                 gpt-table
169##>>0               ubyte               x                   of 8192 bytes
170##>(8.l*8192)       string              !EFI\ PART
171##>>(8.l*4096)      string              EFI\ PART GPT partition table
172##>>>0              use                 gpt-mbr-type
173##>>>&-8            use                 gpt-table
174##>>>0              ubyte               x                   of 4096 bytes
175##>>(8.l*4096)      string              !EFI\ PART
176##>>>(8.l*2048)     string              EFI\ PART GPT partition table
177##>>>>0             use                 gpt-mbr-type
178##>>>>&-8           use                 gpt-table
179##>>>>0             ubyte               x                   of 2048 bytes
180##>>>(8.l*2048)     string              !EFI\ PART
181##>>>>(8.l*1024)    string              EFI\ PART GPT partition table
182##>>>>>0            use                 gpt-mbr-type
183##>>>>>&-8          use                 gpt-table
184##>>>>>0            ubyte               x                   of 1024 bytes
185##>>>>(8.l*1024)    string              !EFI\ PART
186##>>>>>(8.l*512)    string              EFI\ PART GPT partition table
187##>>>>>>0           use                 gpt-mbr-type
188##>>>>>>&-8         use                 gpt-table
189##>>>>>>0           ubyte               x                   of 512 bytes
190
191# Print details of MBR type for a GPT-disk
192# Calling code ensures that there is only one 0xee partition.
1930                   name                gpt-mbr-type
194# GPT with protective MBR entry in partition 1
195>450                ubyte               0xee
196>>454               ulelong             1
197>>>462              string              !\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0   \b (with hybrid MBR)
198>>454               ulelong             !1                                                                                                                                \b (nonstandard: not at LBA 1)
199# GPT with protective MBR entry in partition 2
200>466                ubyte               0xee
201>>470               ulelong             1
202>>>478              string              \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
203>>>>446             string              !\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0                                               \b (with hybrid MBR)
204>>>478              string              !\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0     \b (with hybrid MBR)
205>>470               ulelong             !1                                                                                        \b (nonstandard: not at LBA 1)
206# GPT with protective MBR entry in partition 3
207>482                ubyte               0xee
208>>486               ulelong             1
209>>>494              string              \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
210>>>>446             string              !\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0     \b (with hybrid MBR)
211>>>494              string              !\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0                                               \b (with hybrid MBR)
212>>486               ulelong             !1                                                                                        \b (nonstandard: not at LBA 1)
213# GPT with protective MBR entry in partition 4
214>498                ubyte               0xee
215>>502               ulelong             1
216>>>446              string              !\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0   \b (with hybrid MBR)
217>>502               ulelong             !1                                                                                                                                \b (nonstandard: not at LBA 1)
218
219# Print the information from a GPT partition table structure
2200                   name                gpt-table
221>10                 uleshort  x                   \b, version %u
222>8                  uleshort  x                   \b.%u
223>56                 ulelong             x                   \b, GUID: %08x
224>60                 uleshort  x                   \b-%04x
225>62                 uleshort  x                   \b-%04x
226>64                 ubeshort  x                   \b-%04x
227>66                 ubeshort  x                   \b-%04x
228>68                 ubelong             x                   \b%08x
229#>80                uleshort  x                   \b, %d partition entries
230>32                 ulequad+1 x                   \b, disk size: %lld sectors
231
232# In case a GPT data-structure is at LBA 0, report it as well
233# This covers systems which are not GPT-aware, and which show
234# and allow access to the protective partition. This code will
235# detect the contents of such a partition.
2360                   string              EFI\ PART GPT data structure (nonstandard: at LBA 0)
237>0                  use                 gpt-table
238>0                  ubyte               x                   (sector size unknown)
239
240
241