Skip to content

Instantly share code, notes, and snippets.

@generalmimon
Created October 8, 2020 17:53
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save generalmimon/b6041260c9e09ee3e8ea8eeea363b6a1 to your computer and use it in GitHub Desktop.
Save generalmimon/b6041260c9e09ee3e8ea8eeea363b6a1 to your computer and use it in GitHub Desktop.
meta:
id: cab
file-extension: cab
endian: le
license: CC0-1.0
doc-ref: http://download.microsoft.com/download/4/d/a/4da14f27-b4ef-4170-a6e6-5b1ef85b1baa/[ms-cab].pdf
seq:
- id: magic
contents: "MSCF"
- id: reserved
type: u4
- id: cabinet_size
type: u4
- id: cabinet
type: cabinet
size: cabinet_size - 12
instances:
data_reserve_size:
value: 'cabinet.header.reserve_header.data_reserve_size'
header_reserve_size:
value: 'cabinet.header.reserve_header.header_reserve_size'
folder_reserve_size:
value: 'cabinet.header.reserve_header.folder_reserve_size'
prev_cabinet_flag:
value: '(cabinet.header.flags & 0x0001) > 0'
next_cabinet_flag:
value: '(cabinet.header.flags & 0x0002) > 0'
reserve_present_flag:
value: '(cabinet.header.flags & 0x0004) > 0'
folder_count:
value: 'cabinet.header.folder_count'
file_count:
value: 'cabinet.header.file_count'
types:
cabinet:
seq:
- id: header
type: cf_header
- id: folders
type: cf_folder
repeat: expr
repeat-expr: _root.folder_count
- id: files
type: cf_file
repeat: expr
repeat-expr: _root.file_count
- id: entries
type: cf_data
repeat: eos
cf_header:
seq:
- id: reserved1
type: u4
- id: files_offset
type: u4
- id: reserved2
type: u4
- id: version_minor
type: u1
- id: version_major
type: u1
- id: folder_count
type: u2le
- id: file_count
type: u2
- id: flags
type: u2
- id: set_id
type: u2
- id: cabinet_seq
type: u2
- id: reserve_header
type: reserve_header
if: _root.reserve_present_flag
- id: prev
type: cabinet_desc
if: _root.prev_cabinet_flag
- id: next
type: cabinet_desc
if: _root.next_cabinet_flag
reserve_header:
seq:
- id: header_reserve_size
type: u2
- id: folder_reserve_size
type: u1
- id: data_reserve_size
type: u1
- id: reserve_data
size: header_reserve_size
if: header_reserve_size > 0
cabinet_desc:
seq:
- id: cabinet_name
type: strz
encoding: ASCII
- id: disk_name
type: strz
encoding: ASCII
cf_folder:
seq:
- id: cab_start_offset
type: u4
- id: cf_data_count
type: u2
- id: type_compress
type: u2
enum: compression_type
- id: reserve
size: _root.folder_reserve_size
if: _root.reserve_present_flag and _root.folder_reserve_size > 0
cf_file:
seq:
- id: file_size
type: u4
- id: folder_start_offset
type: u4
- id: index
type: u2
- id: date
type: u2
- id: time
type: u2
- id: attribs
type: u2
- id: name
type: strz
encoding: ASCII
cf_data:
seq:
- id: checksum
type: u4
- id: data_size
type: u2
- id: uncompressed_size
type: u2
- id: reserve
size: _root.data_reserve_size
if: _root.reserve_present_flag and _root.data_reserve_size > 0
- id: data
size: data_size
if: data_size > 0
enums:
compression_type:
0x0000: none
0x0001: mszip
0x0002: quantum
0x0003: lzx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment