一例 PA30 格式文件
文件来源:(2007-02-15) Windows6.0-KB925902-x64.msu
为简单起见,此处选择一个Source为空的Delta文件,#0 - 4da919192572252cae0644b0877a1d6cf1092ade
基本信息
文件信息:FileSize 1982 (0x07BE)
通过 msdelta!GetDeltaInfoW 获取基本信息。
Delta Header Information:
FileTypeSet: EXECUTABLES_1 (0x0000000F)
FileType: RAW (0x00000001)
Flags: 0x00020000
- DELTA_FLAG_IGNORE_FILE_SIZE_LIMIT
TargetSize: 8024 bytes
FileTime: (0x01c75124-c1b4006b) 2007-02-15 17:14:31
TargetHash:
AlgId: MD5 (0x8003)
Hash: 41027b86e892cc1c54d19a1f30895da8
Header
00000000 50 41 33 30 6b 00 b4 c1 24 51 c7 01 f8 03 02 00 |PA30k...$Q......|
00000010 08 62 7d e0 00 a0 10 41 02 7b 86 e8 92 cc 1c 54 |.b}....A.{.....T|
00000020 d1 9a 1f 30 89 5d a8 |...0.]. |
| 00..03 | PA30 | ||
| 04..0B | FILETIME | 6B00B4C1 2451C701 | 2007-02-15 17:14:31 |
| 0C.. | BitStream |
| BIN | remain: 20 | ||
| 3 bit | 000 | 3D, 0x1C0FAC410000407F | |
| Int | 1111 1 | FileTypeSet: 0xF | 38, 0xE07D6208000203 |
| Int | 0001 1 | FileType: 0x1 | 33, 0x703EB10400010 |
| Int | 0010 0000 0000 0000 0000 10000 | Flags: 0x20000 | 3A, 0x10442800381F588 |
| Int | 0001 1111 0101 1000 1000 | TargetSize: 1F58 | 26, 0x822180038 |
| Int | 1000 0000 0000 0011 1000 | HashAlg: 0x8003 | 12, 0x8221 |
| Buffer | 0001 0000 10 | L - HashSize: 0x10 | 8, 0x41 |
| 41 02 7b 86 e8 92 cc 1c 54 d1 9a 1f 30 89 5d a8 | V - HashVal |
PreProcessBuffer - RiftTable - 508 / 50B
07
00000020 01 | . |
| BIN | 28, 04643CA401 | ||
| Buffer | 0000 1 | L - 0x0 | 23, 2321E520 => 20, 04643CA4 |
| V - |
ProcessBuffer - 516
00000020 a4 3c 64 04 00 48 2b 9a | .<d..H+.|
00000030 21 1a 00 00 00 00 00 98 82 4b 00 98 ba 3a bc 03 |!........K...:..|
...
000007a0 72 21 3e 30 37 00 74 6a e5 6c 48 96 07 ad 9c 8d |r!>07.tj.lH.....|
000007b0 09 a2 0d 86 08 9c b7 44 f4 8c 8a b1 85 0e |.......D......|
| BIN | 20, 04643CA4 | ||
| Buffer | 0111 1001 0100 100 | L - 0x794 | 11, 8C8 => 10, 464 |
| V - |
Process - 517
00000020 64 04 00 48 2b 9a | d..H+.|
00000030 21 1a 00 00 00 00 00 98 82 4b 00 98 ba 3a bc 03 |!........K...:..|
00000040 ab a4 80 c2 4f 0b 92 28 36 c7 8c cd 06 22 d1 ea |....O..(6...."..|
00000050 13 b1 24 b2 6b a2 92 c7 38 a9 f4 42 7c b6 79 76 |..$.k...8..B|.yv|
00000060 b8 61 33 3e 63 07 5b a1 40 41 85 bc 42 a0 86 d2 |.a3>c.[.@A..B...|
00000070 3b 7d 41 52 0c ae 80 d1 d2 42 4f a9 a1 27 af be |;}AR.....BO..'..|
00000080 75 df 92 72 34 da 94 75 d7 46 58 b4 58 62 7d b5 |u..r4..u.FX.Xb}.|
00000090 6a 4e 5e b5 d9 2d 89 39 ba 6a cc fa ea 8e d8 89 |jN^..-.9.j......|
000000a0 a8 c4 d2 eb 6b 4b e4 da 58 65 6f f3 44 2a cd 93 |....kK..Xeo.D*..|
000000b0 be ef f3 92 96 14 54 79 42 2a b9 10 79 a0 11 82 |......TyB*..y...|
000000c0 11 8c 80 b1 cd f8 7c 36 13 9b f0 88 4d 33 be 19 |......|6....M3..|
000000d0 f1 cd be d9 14 04 df 3e 13 fb 26 26 3e ba cd 74 |.......>..&&>..t|
000000e0 03 8a 4d f8 86 fe e0 c1 c0 10 0c 04 c1 03 00 28 |..M............(|
000000f0 40 00 12 1f 02 3a 67 9f d2 b4 f3 d2 8d 03 f8 38 |@....:g........8|
...
000007a0 72 21 3e 30 37 00 74 6a e5 6c 48 96 07 ad 9c 8d |r!>07.tj.lH.....|
000007b0 09 a2 0d 86 08 9c b7 44 f4 8c 8a b1 85 0e |.......D......|
517002
| BIN | 30 | ||
| 3 bit | 100 | 4 | 2D, 000013456900008C |
517006
| BIN | 2D, 000013456900008C | ||
| 1 bit | 0 | 2C, 0009A2B4800046 |
Composite Format - 517008
| BIN | 2C, 0009A2B4800046 | ||
| 1 bit | 0 | 2B, 0x4D15A400023 | |
| Int | 0001 1 | num_blocks = 1 | 26, 0x268AD20001 |
| [Int] | 0000 1 | [0] | 21, 0x134569000 |
| 4 bit × 0x27 × num_blocks |
00 00 00 09 06 05 04 03 |
Pre Tree 码长序列 | 25, 0x1850149560 = (C280A4AB << 5) | 0 |
| [] × num_blocks | Tree code | 2C, 0x1F120040280 |
Pre Tree
- 码长序列 0x27 { 00 00 00 09, 06 05 04 03, 03 04 04 03, 00 00 00 00, 00 00 00 00, 00 00 00 03, 05 00 07 09, 00 00 00 03, 05 07 05 07, 08 07 07}
- 符号集 0x27 { -- -- -- 00, 30 08 0C 06, 01 02 0A 05, -- -- -- --, -- -- -- --, -- -- -- 03, 18 -- 40 100, -- -- -- 07, 04 20 14 60, 80 10 50 }
解码示例,0x1850149560 (0101 0100 0000)
- 100 0000 -> Symbol 0x23 ( Copy (read more 3 bit) from prev block )
- -> 8 + 010 = A
- => [ 00 00 00 00, 00 00 00 00, 00 00 ]
解码结果,分三部分,main tree, length tree, aligned offset tree 的码长序列。
00000000: 00 00 00 00 00 00 00 00 00 00 0b 00 00 0b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 06 00 08 0b 0b 00 00 00 09 08 0a 0a 0a 07 06 08 07 06 06 06 07 06 07 07 07 07 07 09 08 0a 0b 0a
00000040: 00 08 08 09 07 09 08 08 09 09 00 0a 08 08 0a 09 08 00 08 07 07 07 08 08 0b 09 0b 00 09 00 00 07
00000060: 00 06 07 07 06 06 07 07 08 06 0b 08 06 07 06 06 06 00 06 06 06 07 08 08 08 07 0a 00 00 00 00 00
00000080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000000a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0b 00 00 00 0b
000000c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000000e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000120: 0a 08 00 00 00 00 0b 00 07 08 0b 00 0b 00 00 00 09 0b 0b 0b 00 00 00 00 00 00 00 00 00 00 00 00
00000140: 00 09 00 00 00 00 00 00 00 00 0b 0b 00 00 00 00 00 08 00 00 00 00 00 00 00 08 0b 00 00 00 00 00
00000160: 00 08 00 00 00 00 00 00 00 08 08 00 0b 0a 00 0b 0b 07 0b 00 0b 0b 00 00 0b 06 08 0a 08 0a 0b 08
00000180: 0b 06 0a 0a 00 0a 0b 08 09 06 09 0a 0b 0b 0b 09 08 07 0a 00 0b 0a 0b 0a 07 06 08 08 00 0b 0a 07
000001a0: 07 06 07 0b 0b 00 00 08 07 06 08 0a 0a 0b 0a 08 07 06 0a 00 0b 0a 0a 00 05 06 07 08 08 09 0a 09
000001c0: 08 07 09 0b 00 0a 00 0b 07 07 09 08 09 00 0a 0b 08 07 0a 09 09 00 0b 0b 08 00 08 08 09 0b 09 0b
000001e0: 08 00 08 08 0b 00 0b 00 0b 00 08 00 0b 00 00 0b 0b 00 00 0b 00 00 00 0b 09 00 08 08 00 00 0b 09
00000200: 08 00 09 00 00 09 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000220: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000240: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000240: 00 05 04 05 04 05 05 05
00000260: 05 05 05 06 07 07 06 06 06 00 06 00 06 07 06 00 00 07 07 00 00 06 06 00 00 07 07 00 00 00 00 00
00000280: 07 07 07 00 07 06 05 06 00 07 06 07 00 07 06 07 00 00 00 00 05 04 00 07 07 00 06 00 00 07 07 00
000002a0: 07 00 00 07 00 00 07 00 05 00 07 07 06 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00
000002c0: 00 00 00 00 00 00 00 07 07 00 00 06 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000002e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000320: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000340: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000340: 04 04 04 04 04 04 05 04
00000360: 04 04 04 04 05 04 04 03
Decompress - 51700D
000000e0 0 28 | .(|
000000f0 40 00 12 1f 02 3a 67 9f d2 b4 f3 d2 8d 03 f8 38 |@....:g........8|
...
000007a0 72 21 3e 30 37 00 74 6a e5 6c 48 96 07 ad 9c 8d |r!>07.tj.lH.....|
000007b0 09 a2 0d 86 08 9c b7 44 f4 8c 8a b1 85 0e |.......D......|
分别解得 main tree, length tree, aligned offset tree 符号集编码。
解码示例,0x1F120040280 (0000 0010 1000 0000)
- 01010000000 -> Symbol 0xEF (0B) - literal byte
解码示例,0x67670a0c (0000 1010 0000 1100)
- 00001100 -> Symbol 0x129 (08)
- -> 29 (00101 001) = slot 5, len 2
- --> LRU #1 -> Offset 0x19 (LRU #0 = 14, LRU #1 = 19, LRU #2 = 41)
- => [ ... 61 73 ... 61 73 ]
解码示例,0xcb0f358c (0011 0101 1000 1100)
- 10001100 -> Symbol 0x151 (08)
- -> 51 (1010 001) = slot a, len 2
- --> a - 7 = offset 0x3
- (offset 3, len 2) => [ ... 6F 72 ... 6F 72 ]
解码示例,0x1eb5965b (1001 0110 0101 1011)
- 011011 -> Symbol 0x179 (06)
- -> 79 (1111 001) = slot f, len 2
- --> ((f-7) & 1) + 2 = 2, ((f-7) >> 1) - 1 = 3
- --> (2 << 3) | 001 = offset 0x11
- => [ ... 22 20 ... 22 20 ]
解码示例,0xdcdbb507 (1011 1011 0101 0000 0111)
- 000111 -> Symbol 0x189 (06)
- -> 89 (10001 001) = slot 11, len 2
- --> ((11-7) &1) +2 = 2, ((11-7) >> 1) -1 = 4
- 0100 -> aligned offset 0x1
- --> (2 << 4) | 1 = offset 0x21
- => [ ... 6F 6E ... 6F 6E ]
解码示例,0xf65868dc (1000 0100 1000 1101 1100)
- 11011100 -> Symbol 0x19A (08)
- -> 9A (10011 010) = slot 13, len 3
- --> ((13-7) &1) +2 = 2, ((13-7) >> 1) -1 = 5
- 0 -> (2 << 1) | 0 = 4
- 0100 -> aligned offset 0x1
- --> (4 << 4) | 1 = offset 0x41
- => [ ... 78 6D 6C ... 78 6D 6C ]
解码示例,0xe2b62371 (1011 0110 0010 0011 0111 0001)
- 1110001 -> Symbol 0x1C8 (07)
- -> C8 (11001 000) = slot 19
- --> ((19-7) &1) + 2 = 2, ((19-7) >> 1) - 1 = 8
- 0110 -> (2 << 4) | 6 = 26
- 0100 -> aligned offset 0x1
- --> (26 << 4 ) | 1 = offset 0x261
- 1101100 -> Length 0x75 (07)
- -> 75 + 8 = len 7D
- (offset 0x261, len 0x7D) => [ ... 2E - 22 ... 2E - 22 ]
参考
- Microsoft® Windows® Software Development Kit Update for Windows Vista™, 6.1.6000.16384.10.WindowsSDK_Vista_Feb2007Update_rtm.DVD.Rel.iso
- Delta Compression Application Programming Interfaces - http://msdn.microsoft.com/en-us/library/bb417345.aspx
- [MS-PATCH] LZX DELTA Compression and Decompression - http://msdn.microsoft.com/en-us/library/cc483133.aspx
- smilingthax / msdelta-pa30-format - Github
更多
Canonical Huffman Codes
前导零/尾随零计数
- MSVC - <intrin.h> 🔗 🔗
- __lzcnt16、__lzcnt、__lzcnt64
- _BitScanReverse、_BitScanReverse64
- GCC / Clang
- __builtin_clz

浙公网安备 33010602011771号