一例 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
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

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

 

posted @ 2025-11-27 21:59  UPeRVv  阅读(5)  评论(0)    收藏  举报