7z-iterator 1.3.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.d.cts +3 -1
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +7 -28
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/nextEntry.js +1 -2
- package/dist/cjs/nextEntry.js.map +1 -1
- package/dist/cjs/sevenz/codecs/index.js +52 -30
- package/dist/cjs/sevenz/codecs/index.js.map +1 -1
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +4 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/nextEntry.js +1 -2
- package/dist/esm/nextEntry.js.map +1 -1
- package/dist/esm/sevenz/codecs/index.js +32 -10
- package/dist/esm/sevenz/codecs/index.js.map +1 -1
- package/package.json +10 -4
- package/dist/cjs/lzma/Lzma2ChunkParser.d.cts +0 -73
- package/dist/cjs/lzma/Lzma2ChunkParser.d.ts +0 -73
- package/dist/cjs/lzma/Lzma2ChunkParser.js +0 -148
- package/dist/cjs/lzma/Lzma2ChunkParser.js.map +0 -1
- package/dist/cjs/lzma/index.d.cts +0 -13
- package/dist/cjs/lzma/index.d.ts +0 -13
- package/dist/cjs/lzma/index.js +0 -63
- package/dist/cjs/lzma/index.js.map +0 -1
- package/dist/cjs/lzma/stream/transforms.d.cts +0 -38
- package/dist/cjs/lzma/stream/transforms.d.ts +0 -38
- package/dist/cjs/lzma/stream/transforms.js +0 -149
- package/dist/cjs/lzma/stream/transforms.js.map +0 -1
- package/dist/cjs/lzma/sync/Lzma2Decoder.d.cts +0 -30
- package/dist/cjs/lzma/sync/Lzma2Decoder.d.ts +0 -30
- package/dist/cjs/lzma/sync/Lzma2Decoder.js +0 -135
- package/dist/cjs/lzma/sync/Lzma2Decoder.js.map +0 -1
- package/dist/cjs/lzma/sync/LzmaDecoder.d.cts +0 -82
- package/dist/cjs/lzma/sync/LzmaDecoder.d.ts +0 -82
- package/dist/cjs/lzma/sync/LzmaDecoder.js +0 -440
- package/dist/cjs/lzma/sync/LzmaDecoder.js.map +0 -1
- package/dist/cjs/lzma/sync/RangeDecoder.d.cts +0 -69
- package/dist/cjs/lzma/sync/RangeDecoder.d.ts +0 -69
- package/dist/cjs/lzma/sync/RangeDecoder.js +0 -162
- package/dist/cjs/lzma/sync/RangeDecoder.js.map +0 -1
- package/dist/cjs/lzma/types.d.cts +0 -110
- package/dist/cjs/lzma/types.d.ts +0 -110
- package/dist/cjs/lzma/types.js +0 -264
- package/dist/cjs/lzma/types.js.map +0 -1
- package/dist/cjs/sevenz/codecs/Bcj.d.cts +0 -16
- package/dist/cjs/sevenz/codecs/Bcj.d.ts +0 -16
- package/dist/cjs/sevenz/codecs/Bcj.js +0 -183
- package/dist/cjs/sevenz/codecs/Bcj.js.map +0 -1
- package/dist/cjs/sevenz/codecs/BcjArm.d.cts +0 -21
- package/dist/cjs/sevenz/codecs/BcjArm.d.ts +0 -21
- package/dist/cjs/sevenz/codecs/BcjArm.js +0 -104
- package/dist/cjs/sevenz/codecs/BcjArm.js.map +0 -1
- package/dist/cjs/sevenz/codecs/BcjArm64.d.cts +0 -21
- package/dist/cjs/sevenz/codecs/BcjArm64.d.ts +0 -21
- package/dist/cjs/sevenz/codecs/BcjArm64.js +0 -65
- package/dist/cjs/sevenz/codecs/BcjArm64.js.map +0 -1
- package/dist/cjs/sevenz/codecs/BcjArmt.d.cts +0 -19
- package/dist/cjs/sevenz/codecs/BcjArmt.d.ts +0 -19
- package/dist/cjs/sevenz/codecs/BcjArmt.js +0 -76
- package/dist/cjs/sevenz/codecs/BcjArmt.js.map +0 -1
- package/dist/cjs/sevenz/codecs/BcjIa64.d.cts +0 -15
- package/dist/cjs/sevenz/codecs/BcjIa64.d.ts +0 -15
- package/dist/cjs/sevenz/codecs/BcjIa64.js +0 -141
- package/dist/cjs/sevenz/codecs/BcjIa64.js.map +0 -1
- package/dist/cjs/sevenz/codecs/BcjPpc.d.cts +0 -20
- package/dist/cjs/sevenz/codecs/BcjPpc.d.ts +0 -20
- package/dist/cjs/sevenz/codecs/BcjPpc.js +0 -64
- package/dist/cjs/sevenz/codecs/BcjPpc.js.map +0 -1
- package/dist/cjs/sevenz/codecs/BcjSparc.d.cts +0 -19
- package/dist/cjs/sevenz/codecs/BcjSparc.d.ts +0 -19
- package/dist/cjs/sevenz/codecs/BcjSparc.js +0 -69
- package/dist/cjs/sevenz/codecs/BcjSparc.js.map +0 -1
- package/dist/cjs/sevenz/codecs/Delta.d.cts +0 -16
- package/dist/cjs/sevenz/codecs/Delta.d.ts +0 -16
- package/dist/cjs/sevenz/codecs/Delta.js +0 -74
- package/dist/cjs/sevenz/codecs/Delta.js.map +0 -1
- package/dist/cjs/sevenz/codecs/Lzma.d.cts +0 -17
- package/dist/cjs/sevenz/codecs/Lzma.d.ts +0 -17
- package/dist/cjs/sevenz/codecs/Lzma.js +0 -40
- package/dist/cjs/sevenz/codecs/Lzma.js.map +0 -1
- package/dist/cjs/sevenz/codecs/Lzma2.d.cts +0 -20
- package/dist/cjs/sevenz/codecs/Lzma2.d.ts +0 -20
- package/dist/cjs/sevenz/codecs/Lzma2.js +0 -42
- package/dist/cjs/sevenz/codecs/Lzma2.js.map +0 -1
- package/dist/esm/lzma/Lzma2ChunkParser.d.ts +0 -73
- package/dist/esm/lzma/Lzma2ChunkParser.js +0 -137
- package/dist/esm/lzma/Lzma2ChunkParser.js.map +0 -1
- package/dist/esm/lzma/index.d.ts +0 -13
- package/dist/esm/lzma/index.js +0 -15
- package/dist/esm/lzma/index.js.map +0 -1
- package/dist/esm/lzma/stream/transforms.d.ts +0 -38
- package/dist/esm/lzma/stream/transforms.js +0 -150
- package/dist/esm/lzma/stream/transforms.js.map +0 -1
- package/dist/esm/lzma/sync/Lzma2Decoder.d.ts +0 -30
- package/dist/esm/lzma/sync/Lzma2Decoder.js +0 -115
- package/dist/esm/lzma/sync/Lzma2Decoder.js.map +0 -1
- package/dist/esm/lzma/sync/LzmaDecoder.d.ts +0 -82
- package/dist/esm/lzma/sync/LzmaDecoder.js +0 -403
- package/dist/esm/lzma/sync/LzmaDecoder.js.map +0 -1
- package/dist/esm/lzma/sync/RangeDecoder.d.ts +0 -69
- package/dist/esm/lzma/sync/RangeDecoder.js +0 -132
- package/dist/esm/lzma/sync/RangeDecoder.js.map +0 -1
- package/dist/esm/lzma/types.d.ts +0 -110
- package/dist/esm/lzma/types.js +0 -154
- package/dist/esm/lzma/types.js.map +0 -1
- package/dist/esm/sevenz/codecs/Bcj.d.ts +0 -16
- package/dist/esm/sevenz/codecs/Bcj.js +0 -175
- package/dist/esm/sevenz/codecs/Bcj.js.map +0 -1
- package/dist/esm/sevenz/codecs/BcjArm.d.ts +0 -21
- package/dist/esm/sevenz/codecs/BcjArm.js +0 -101
- package/dist/esm/sevenz/codecs/BcjArm.js.map +0 -1
- package/dist/esm/sevenz/codecs/BcjArm64.d.ts +0 -21
- package/dist/esm/sevenz/codecs/BcjArm64.js +0 -57
- package/dist/esm/sevenz/codecs/BcjArm64.js.map +0 -1
- package/dist/esm/sevenz/codecs/BcjArmt.d.ts +0 -19
- package/dist/esm/sevenz/codecs/BcjArmt.js +0 -66
- package/dist/esm/sevenz/codecs/BcjArmt.js.map +0 -1
- package/dist/esm/sevenz/codecs/BcjIa64.d.ts +0 -15
- package/dist/esm/sevenz/codecs/BcjIa64.js +0 -127
- package/dist/esm/sevenz/codecs/BcjIa64.js.map +0 -1
- package/dist/esm/sevenz/codecs/BcjPpc.d.ts +0 -20
- package/dist/esm/sevenz/codecs/BcjPpc.js +0 -55
- package/dist/esm/sevenz/codecs/BcjPpc.js.map +0 -1
- package/dist/esm/sevenz/codecs/BcjSparc.d.ts +0 -19
- package/dist/esm/sevenz/codecs/BcjSparc.js +0 -59
- package/dist/esm/sevenz/codecs/BcjSparc.js.map +0 -1
- package/dist/esm/sevenz/codecs/Delta.d.ts +0 -16
- package/dist/esm/sevenz/codecs/Delta.js +0 -66
- package/dist/esm/sevenz/codecs/Delta.js.map +0 -1
- package/dist/esm/sevenz/codecs/Lzma.d.ts +0 -17
- package/dist/esm/sevenz/codecs/Lzma.js +0 -33
- package/dist/esm/sevenz/codecs/Lzma.js.map +0 -1
- package/dist/esm/sevenz/codecs/Lzma2.d.ts +0 -20
- package/dist/esm/sevenz/codecs/Lzma2.js +0 -38
- package/dist/esm/sevenz/codecs/Lzma2.js.map +0 -1
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Transform } from 'extract-base-iterator';
|
|
2
|
-
/**
|
|
3
|
-
* Decode BCJ (x86) filtered data (synchronous, for buffered use)
|
|
4
|
-
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
-
*
|
|
6
|
-
* @param input - BCJ filtered data
|
|
7
|
-
* @param _properties - Unused for BCJ
|
|
8
|
-
* @param _unpackSize - Unused for BCJ
|
|
9
|
-
* @returns Unfiltered data
|
|
10
|
-
*/
|
|
11
|
-
export declare function decodeBcj(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
12
|
-
/**
|
|
13
|
-
* Create a streaming BCJ decoder Transform.
|
|
14
|
-
* Processes data chunk by chunk, buffering incomplete instructions.
|
|
15
|
-
*/
|
|
16
|
-
export declare function createBcjDecoder(_properties?: Buffer, _unpackSize?: number): InstanceType<typeof Transform>;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Transform } from 'extract-base-iterator';
|
|
2
|
-
/**
|
|
3
|
-
* Decode BCJ (x86) filtered data (synchronous, for buffered use)
|
|
4
|
-
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
-
*
|
|
6
|
-
* @param input - BCJ filtered data
|
|
7
|
-
* @param _properties - Unused for BCJ
|
|
8
|
-
* @param _unpackSize - Unused for BCJ
|
|
9
|
-
* @returns Unfiltered data
|
|
10
|
-
*/
|
|
11
|
-
export declare function decodeBcj(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
12
|
-
/**
|
|
13
|
-
* Create a streaming BCJ decoder Transform.
|
|
14
|
-
* Processes data chunk by chunk, buffering incomplete instructions.
|
|
15
|
-
*/
|
|
16
|
-
export declare function createBcjDecoder(_properties?: Buffer, _unpackSize?: number): InstanceType<typeof Transform>;
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
// BCJ (x86) filter codec - converts x86 CALL/JMP relative addresses
|
|
2
|
-
// This is a simple filter that makes executables more compressible by LZMA
|
|
3
|
-
//
|
|
4
|
-
// BCJ transforms relative addresses in x86 CALL (0xE8) and JMP (0xE9) instructions
|
|
5
|
-
// to absolute addresses, which creates more repetitive patterns for compression.
|
|
6
|
-
//
|
|
7
|
-
// Reference: https://github.com/jljusten/LZMA-SDK/blob/master/C/Bra86.c
|
|
8
|
-
//
|
|
9
|
-
// This implementation uses true streaming - processes data chunk by chunk
|
|
10
|
-
// while buffering incomplete instructions across chunk boundaries.
|
|
11
|
-
"use strict";
|
|
12
|
-
Object.defineProperty(exports, "__esModule", {
|
|
13
|
-
value: true
|
|
14
|
-
});
|
|
15
|
-
function _export(target, all) {
|
|
16
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
17
|
-
enumerable: true,
|
|
18
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
_export(exports, {
|
|
22
|
-
get createBcjDecoder () {
|
|
23
|
-
return createBcjDecoder;
|
|
24
|
-
},
|
|
25
|
-
get decodeBcj () {
|
|
26
|
-
return decodeBcj;
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
var _extractbaseiterator = require("extract-base-iterator");
|
|
30
|
-
function decodeBcj(input, _properties, _unpackSize) {
|
|
31
|
-
// BCJ filter state
|
|
32
|
-
var pos = 0;
|
|
33
|
-
var prevMask = 0;
|
|
34
|
-
var output = (0, _extractbaseiterator.bufferFrom)(input); // Copy since we modify in place
|
|
35
|
-
while(pos < output.length - 4){
|
|
36
|
-
var b = output[pos];
|
|
37
|
-
// Check for CALL (0xE8) or JMP (0xE9) opcode
|
|
38
|
-
if (b !== 0xe8 && b !== 0xe9) {
|
|
39
|
-
pos++;
|
|
40
|
-
prevMask = 0;
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
// Check mask to avoid false positives in data
|
|
44
|
-
var offset = pos + 5;
|
|
45
|
-
if (offset > output.length) {
|
|
46
|
-
break;
|
|
47
|
-
}
|
|
48
|
-
// Skip if in masked region (previous conversion affected this area)
|
|
49
|
-
if ((prevMask & 1) !== 0) {
|
|
50
|
-
prevMask = prevMask >> 1 | 4;
|
|
51
|
-
pos++;
|
|
52
|
-
continue;
|
|
53
|
-
}
|
|
54
|
-
// Read the 32-bit address (little-endian)
|
|
55
|
-
var addr = output[pos + 1] | output[pos + 2] << 8 | output[pos + 3] << 16 | output[pos + 4] << 24 >>> 0;
|
|
56
|
-
// Check if this looks like a converted address
|
|
57
|
-
// High byte should be 0x00 or 0xFF for typical code
|
|
58
|
-
var highByte = output[pos + 4];
|
|
59
|
-
if (highByte === 0x00 || highByte === 0xff) {
|
|
60
|
-
// Convert absolute to relative
|
|
61
|
-
var newAddr = void 0;
|
|
62
|
-
if (highByte === 0x00) {
|
|
63
|
-
// Positive offset - subtract position
|
|
64
|
-
newAddr = addr - pos;
|
|
65
|
-
} else {
|
|
66
|
-
// Negative offset (0xFF high byte)
|
|
67
|
-
newAddr = addr + pos;
|
|
68
|
-
}
|
|
69
|
-
// Write back as little-endian
|
|
70
|
-
output[pos + 1] = newAddr & 0xff;
|
|
71
|
-
output[pos + 2] = newAddr >>> 8 & 0xff;
|
|
72
|
-
output[pos + 3] = newAddr >>> 16 & 0xff;
|
|
73
|
-
output[pos + 4] = newAddr >>> 24 & 0xff;
|
|
74
|
-
pos += 5;
|
|
75
|
-
prevMask = 0;
|
|
76
|
-
} else {
|
|
77
|
-
pos++;
|
|
78
|
-
prevMask = 0;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return output;
|
|
82
|
-
}
|
|
83
|
-
function createBcjDecoder(_properties, _unpackSize) {
|
|
84
|
-
// State that persists across chunks
|
|
85
|
-
var globalPos = 0; // Position in the overall stream
|
|
86
|
-
var prevMask = 0;
|
|
87
|
-
var pending = null; // Bytes pending from previous chunk
|
|
88
|
-
var transform = new _extractbaseiterator.Transform({
|
|
89
|
-
transform: function(chunk, _encoding, callback) {
|
|
90
|
-
// Combine pending bytes with new chunk
|
|
91
|
-
var data;
|
|
92
|
-
if (pending && pending.length > 0) {
|
|
93
|
-
data = Buffer.concat([
|
|
94
|
-
pending,
|
|
95
|
-
chunk
|
|
96
|
-
]);
|
|
97
|
-
} else {
|
|
98
|
-
data = chunk;
|
|
99
|
-
}
|
|
100
|
-
// We need at least 5 bytes to process an instruction
|
|
101
|
-
// Keep the last 4 bytes as pending in case an instruction spans chunks
|
|
102
|
-
var safeEnd = data.length - 4;
|
|
103
|
-
if (safeEnd <= 0) {
|
|
104
|
-
// Not enough data yet, keep it all pending
|
|
105
|
-
pending = data;
|
|
106
|
-
callback(null, (0, _extractbaseiterator.allocBuffer)(0));
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
var output = (0, _extractbaseiterator.bufferFrom)(data.slice(0, safeEnd)); // Copy the portion we'll process
|
|
110
|
-
pending = data.slice(safeEnd); // Keep last 4 bytes for next chunk
|
|
111
|
-
var localPos = 0;
|
|
112
|
-
while(localPos < output.length){
|
|
113
|
-
var b = output[localPos];
|
|
114
|
-
// Check for CALL (0xE8) or JMP (0xE9) opcode
|
|
115
|
-
if (b !== 0xe8 && b !== 0xe9) {
|
|
116
|
-
localPos++;
|
|
117
|
-
globalPos++;
|
|
118
|
-
prevMask = 0;
|
|
119
|
-
continue;
|
|
120
|
-
}
|
|
121
|
-
// Check if we have enough bytes for the full instruction
|
|
122
|
-
if (localPos + 5 > output.length + pending.length) {
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
|
-
// Skip if in masked region
|
|
126
|
-
if ((prevMask & 1) !== 0) {
|
|
127
|
-
prevMask = prevMask >> 1 | 4;
|
|
128
|
-
localPos++;
|
|
129
|
-
globalPos++;
|
|
130
|
-
continue;
|
|
131
|
-
}
|
|
132
|
-
// Get the 4 address bytes (might span into pending)
|
|
133
|
-
var addr = void 0;
|
|
134
|
-
var highByte = void 0;
|
|
135
|
-
if (localPos + 5 <= output.length) {
|
|
136
|
-
addr = output[localPos + 1] | output[localPos + 2] << 8 | output[localPos + 3] << 16 | output[localPos + 4] << 24 >>> 0;
|
|
137
|
-
highByte = output[localPos + 4];
|
|
138
|
-
} else {
|
|
139
|
-
// Address spans output and pending - shouldn't happen with safeEnd
|
|
140
|
-
localPos++;
|
|
141
|
-
globalPos++;
|
|
142
|
-
prevMask = 0;
|
|
143
|
-
continue;
|
|
144
|
-
}
|
|
145
|
-
if (highByte === 0x00 || highByte === 0xff) {
|
|
146
|
-
// Convert absolute to relative
|
|
147
|
-
var newAddr = void 0;
|
|
148
|
-
if (highByte === 0x00) {
|
|
149
|
-
newAddr = addr - globalPos;
|
|
150
|
-
} else {
|
|
151
|
-
newAddr = addr + globalPos;
|
|
152
|
-
}
|
|
153
|
-
// Write back as little-endian
|
|
154
|
-
output[localPos + 1] = newAddr & 0xff;
|
|
155
|
-
output[localPos + 2] = newAddr >>> 8 & 0xff;
|
|
156
|
-
output[localPos + 3] = newAddr >>> 16 & 0xff;
|
|
157
|
-
output[localPos + 4] = newAddr >>> 24 & 0xff;
|
|
158
|
-
localPos += 5;
|
|
159
|
-
globalPos += 5;
|
|
160
|
-
prevMask = 0;
|
|
161
|
-
} else {
|
|
162
|
-
localPos++;
|
|
163
|
-
globalPos++;
|
|
164
|
-
prevMask = 0;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
callback(null, output);
|
|
168
|
-
},
|
|
169
|
-
flush: function flush(callback) {
|
|
170
|
-
// Output any remaining pending bytes
|
|
171
|
-
if (pending && pending.length > 0) {
|
|
172
|
-
// Process the final bytes - no need to worry about spanning
|
|
173
|
-
var output = (0, _extractbaseiterator.bufferFrom)(pending);
|
|
174
|
-
// Don't convert anything in the final bytes since we can't know
|
|
175
|
-
// if they're complete instructions
|
|
176
|
-
this.push(output);
|
|
177
|
-
}
|
|
178
|
-
callback(null);
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
return transform;
|
|
182
|
-
}
|
|
183
|
-
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Bcj.ts"],"sourcesContent":["// BCJ (x86) filter codec - converts x86 CALL/JMP relative addresses\n// This is a simple filter that makes executables more compressible by LZMA\n//\n// BCJ transforms relative addresses in x86 CALL (0xE8) and JMP (0xE9) instructions\n// to absolute addresses, which creates more repetitive patterns for compression.\n//\n// Reference: https://github.com/jljusten/LZMA-SDK/blob/master/C/Bra86.c\n//\n// This implementation uses true streaming - processes data chunk by chunk\n// while buffering incomplete instructions across chunk boundaries.\n\nimport { allocBuffer, bufferFrom, Transform } from 'extract-base-iterator';\n\n/**\n * Decode BCJ (x86) filtered data (synchronous, for buffered use)\n * Reverses the BCJ transformation by converting absolute addresses back to relative\n *\n * @param input - BCJ filtered data\n * @param _properties - Unused for BCJ\n * @param _unpackSize - Unused for BCJ\n * @returns Unfiltered data\n */\nexport function decodeBcj(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n // BCJ filter state\n let pos = 0;\n let prevMask = 0;\n const output = bufferFrom(input); // Copy since we modify in place\n\n while (pos < output.length - 4) {\n const b = output[pos];\n\n // Check for CALL (0xE8) or JMP (0xE9) opcode\n if (b !== 0xe8 && b !== 0xe9) {\n pos++;\n prevMask = 0;\n continue;\n }\n\n // Check mask to avoid false positives in data\n const offset = pos + 5;\n if (offset > output.length) {\n break;\n }\n\n // Skip if in masked region (previous conversion affected this area)\n if ((prevMask & 1) !== 0) {\n prevMask = (prevMask >> 1) | 4;\n pos++;\n continue;\n }\n\n // Read the 32-bit address (little-endian)\n const addr = output[pos + 1] | (output[pos + 2] << 8) | (output[pos + 3] << 16) | ((output[pos + 4] << 24) >>> 0);\n\n // Check if this looks like a converted address\n // High byte should be 0x00 or 0xFF for typical code\n const highByte = output[pos + 4];\n\n if (highByte === 0x00 || highByte === 0xff) {\n // Convert absolute to relative\n let newAddr: number;\n if (highByte === 0x00) {\n // Positive offset - subtract position\n newAddr = addr - pos;\n } else {\n // Negative offset (0xFF high byte)\n newAddr = addr + pos;\n }\n\n // Write back as little-endian\n output[pos + 1] = newAddr & 0xff;\n output[pos + 2] = (newAddr >>> 8) & 0xff;\n output[pos + 3] = (newAddr >>> 16) & 0xff;\n output[pos + 4] = (newAddr >>> 24) & 0xff;\n\n pos += 5;\n prevMask = 0;\n } else {\n pos++;\n prevMask = 0;\n }\n }\n\n return output;\n}\n\n/**\n * Create a streaming BCJ decoder Transform.\n * Processes data chunk by chunk, buffering incomplete instructions.\n */\nexport function createBcjDecoder(_properties?: Buffer, _unpackSize?: number): InstanceType<typeof Transform> {\n // State that persists across chunks\n let globalPos = 0; // Position in the overall stream\n let prevMask = 0;\n let pending: Buffer | null = null; // Bytes pending from previous chunk\n\n const transform = new Transform({\n transform: (chunk: Buffer, _encoding: string, callback: (err?: Error | null, data?: Buffer) => void) => {\n // Combine pending bytes with new chunk\n let data: Buffer;\n if (pending && pending.length > 0) {\n data = Buffer.concat([pending, chunk]);\n } else {\n data = chunk;\n }\n\n // We need at least 5 bytes to process an instruction\n // Keep the last 4 bytes as pending in case an instruction spans chunks\n const safeEnd = data.length - 4;\n if (safeEnd <= 0) {\n // Not enough data yet, keep it all pending\n pending = data;\n callback(null, allocBuffer(0));\n return;\n }\n\n const output = bufferFrom(data.slice(0, safeEnd)); // Copy the portion we'll process\n pending = data.slice(safeEnd); // Keep last 4 bytes for next chunk\n\n let localPos = 0;\n while (localPos < output.length) {\n const b = output[localPos];\n\n // Check for CALL (0xE8) or JMP (0xE9) opcode\n if (b !== 0xe8 && b !== 0xe9) {\n localPos++;\n globalPos++;\n prevMask = 0;\n continue;\n }\n\n // Check if we have enough bytes for the full instruction\n if (localPos + 5 > output.length + pending.length) {\n // Not enough bytes - need to wait for more data\n // This shouldn't happen with our safeEnd calculation, but be safe\n break;\n }\n\n // Skip if in masked region\n if ((prevMask & 1) !== 0) {\n prevMask = (prevMask >> 1) | 4;\n localPos++;\n globalPos++;\n continue;\n }\n\n // Get the 4 address bytes (might span into pending)\n let addr: number;\n let highByte: number;\n if (localPos + 5 <= output.length) {\n addr = output[localPos + 1] | (output[localPos + 2] << 8) | (output[localPos + 3] << 16) | ((output[localPos + 4] << 24) >>> 0);\n highByte = output[localPos + 4];\n } else {\n // Address spans output and pending - shouldn't happen with safeEnd\n localPos++;\n globalPos++;\n prevMask = 0;\n continue;\n }\n\n if (highByte === 0x00 || highByte === 0xff) {\n // Convert absolute to relative\n let newAddr: number;\n if (highByte === 0x00) {\n newAddr = addr - globalPos;\n } else {\n newAddr = addr + globalPos;\n }\n\n // Write back as little-endian\n output[localPos + 1] = newAddr & 0xff;\n output[localPos + 2] = (newAddr >>> 8) & 0xff;\n output[localPos + 3] = (newAddr >>> 16) & 0xff;\n output[localPos + 4] = (newAddr >>> 24) & 0xff;\n\n localPos += 5;\n globalPos += 5;\n prevMask = 0;\n } else {\n localPos++;\n globalPos++;\n prevMask = 0;\n }\n }\n\n callback(null, output);\n },\n flush: function (this: InstanceType<typeof Transform>, callback: (err?: Error | null) => void) {\n // Output any remaining pending bytes\n if (pending && pending.length > 0) {\n // Process the final bytes - no need to worry about spanning\n const output = bufferFrom(pending);\n // Don't convert anything in the final bytes since we can't know\n // if they're complete instructions\n this.push(output);\n }\n callback(null);\n },\n });\n\n return transform;\n}\n"],"names":["createBcjDecoder","decodeBcj","input","_properties","_unpackSize","pos","prevMask","output","bufferFrom","length","b","offset","addr","highByte","newAddr","globalPos","pending","transform","Transform","chunk","_encoding","callback","data","Buffer","concat","safeEnd","allocBuffer","slice","localPos","flush","push"],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Transform } from 'extract-base-iterator';
|
|
2
|
-
/**
|
|
3
|
-
* Decode ARM BCJ filtered data (synchronous, for buffered use)
|
|
4
|
-
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
-
*
|
|
6
|
-
* ARM BL instruction format:
|
|
7
|
-
* - 4 bytes aligned
|
|
8
|
-
* - Byte pattern: XX XX XX EB (where EB = 0xEB opcode for BL)
|
|
9
|
-
* - Lower 24 bits are signed offset (in words, not bytes)
|
|
10
|
-
*
|
|
11
|
-
* @param input - ARM BCJ filtered data
|
|
12
|
-
* @param _properties - Unused for ARM BCJ
|
|
13
|
-
* @param _unpackSize - Unused for ARM BCJ
|
|
14
|
-
* @returns Unfiltered data
|
|
15
|
-
*/
|
|
16
|
-
export declare function decodeBcjArm(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
17
|
-
/**
|
|
18
|
-
* Create a streaming ARM BCJ decoder Transform.
|
|
19
|
-
* Processes data in 4-byte aligned chunks.
|
|
20
|
-
*/
|
|
21
|
-
export declare function createBcjArmDecoder(_properties?: Buffer, _unpackSize?: number): InstanceType<typeof Transform>;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Transform } from 'extract-base-iterator';
|
|
2
|
-
/**
|
|
3
|
-
* Decode ARM BCJ filtered data (synchronous, for buffered use)
|
|
4
|
-
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
-
*
|
|
6
|
-
* ARM BL instruction format:
|
|
7
|
-
* - 4 bytes aligned
|
|
8
|
-
* - Byte pattern: XX XX XX EB (where EB = 0xEB opcode for BL)
|
|
9
|
-
* - Lower 24 bits are signed offset (in words, not bytes)
|
|
10
|
-
*
|
|
11
|
-
* @param input - ARM BCJ filtered data
|
|
12
|
-
* @param _properties - Unused for ARM BCJ
|
|
13
|
-
* @param _unpackSize - Unused for ARM BCJ
|
|
14
|
-
* @returns Unfiltered data
|
|
15
|
-
*/
|
|
16
|
-
export declare function decodeBcjArm(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
17
|
-
/**
|
|
18
|
-
* Create a streaming ARM BCJ decoder Transform.
|
|
19
|
-
* Processes data in 4-byte aligned chunks.
|
|
20
|
-
*/
|
|
21
|
-
export declare function createBcjArmDecoder(_properties?: Buffer, _unpackSize?: number): InstanceType<typeof Transform>;
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
// BCJ (ARM 32-bit) filter codec - converts ARM branch instruction addresses
|
|
2
|
-
// This filter makes ARM executables more compressible by LZMA
|
|
3
|
-
//
|
|
4
|
-
// ARM branch instructions (BL) use relative addressing. The filter converts
|
|
5
|
-
// these to absolute addresses during compression, and back during decompression.
|
|
6
|
-
//
|
|
7
|
-
// Reference: https://github.com/kornelski/7z/blob/main/C/Bra.c
|
|
8
|
-
//
|
|
9
|
-
// This implementation uses true streaming - processes data chunk by chunk.
|
|
10
|
-
"use strict";
|
|
11
|
-
Object.defineProperty(exports, "__esModule", {
|
|
12
|
-
value: true
|
|
13
|
-
});
|
|
14
|
-
function _export(target, all) {
|
|
15
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
16
|
-
enumerable: true,
|
|
17
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
_export(exports, {
|
|
21
|
-
get createBcjArmDecoder () {
|
|
22
|
-
return createBcjArmDecoder;
|
|
23
|
-
},
|
|
24
|
-
get decodeBcjArm () {
|
|
25
|
-
return decodeBcjArm;
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
var _extractbaseiterator = require("extract-base-iterator");
|
|
29
|
-
function decodeBcjArm(input, _properties, _unpackSize) {
|
|
30
|
-
var output = (0, _extractbaseiterator.bufferFrom)(input); // Copy since we modify in place
|
|
31
|
-
var pos = 0;
|
|
32
|
-
// Process 4-byte aligned positions
|
|
33
|
-
while(pos + 4 <= output.length){
|
|
34
|
-
// Check for BL instruction: byte 3 is 0xEB
|
|
35
|
-
if (output[pos + 3] === 0xeb) {
|
|
36
|
-
// Read 24-bit address (little-endian in bytes 0-2)
|
|
37
|
-
var addr = output[pos] | output[pos + 1] << 8 | output[pos + 2] << 16;
|
|
38
|
-
// Sign-extend 24-bit to 32-bit
|
|
39
|
-
if (addr & 0x800000) {
|
|
40
|
-
addr |= 0xff000000;
|
|
41
|
-
}
|
|
42
|
-
// Convert absolute to relative:
|
|
43
|
-
// Subtract current position (in words, so divide by 4)
|
|
44
|
-
var relAddr = addr - (pos >>> 2);
|
|
45
|
-
// Write back lower 24 bits
|
|
46
|
-
output[pos] = relAddr & 0xff;
|
|
47
|
-
output[pos + 1] = relAddr >>> 8 & 0xff;
|
|
48
|
-
output[pos + 2] = relAddr >>> 16 & 0xff;
|
|
49
|
-
}
|
|
50
|
-
pos += 4;
|
|
51
|
-
}
|
|
52
|
-
return output;
|
|
53
|
-
}
|
|
54
|
-
function createBcjArmDecoder(_properties, _unpackSize) {
|
|
55
|
-
var globalPos = 0; // Position in the overall stream (in bytes)
|
|
56
|
-
var pending = null; // Incomplete 4-byte group
|
|
57
|
-
var transform = new _extractbaseiterator.Transform({
|
|
58
|
-
transform: function(chunk, _encoding, callback) {
|
|
59
|
-
// Combine pending bytes with new chunk
|
|
60
|
-
var data;
|
|
61
|
-
if (pending && pending.length > 0) {
|
|
62
|
-
data = Buffer.concat([
|
|
63
|
-
pending,
|
|
64
|
-
chunk
|
|
65
|
-
]);
|
|
66
|
-
} else {
|
|
67
|
-
data = chunk;
|
|
68
|
-
}
|
|
69
|
-
// Process only complete 4-byte groups
|
|
70
|
-
var completeBytes = data.length - data.length % 4;
|
|
71
|
-
if (completeBytes === 0) {
|
|
72
|
-
pending = data;
|
|
73
|
-
callback(null, (0, _extractbaseiterator.allocBuffer)(0));
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
var output = (0, _extractbaseiterator.bufferFrom)(data.slice(0, completeBytes));
|
|
77
|
-
pending = data.length > completeBytes ? data.slice(completeBytes) : null;
|
|
78
|
-
var pos = 0;
|
|
79
|
-
while(pos + 4 <= output.length){
|
|
80
|
-
if (output[pos + 3] === 0xeb) {
|
|
81
|
-
var addr = output[pos] | output[pos + 1] << 8 | output[pos + 2] << 16;
|
|
82
|
-
if (addr & 0x800000) {
|
|
83
|
-
addr |= 0xff000000;
|
|
84
|
-
}
|
|
85
|
-
var relAddr = addr - (globalPos >>> 2);
|
|
86
|
-
output[pos] = relAddr & 0xff;
|
|
87
|
-
output[pos + 1] = relAddr >>> 8 & 0xff;
|
|
88
|
-
output[pos + 2] = relAddr >>> 16 & 0xff;
|
|
89
|
-
}
|
|
90
|
-
pos += 4;
|
|
91
|
-
globalPos += 4;
|
|
92
|
-
}
|
|
93
|
-
callback(null, output);
|
|
94
|
-
},
|
|
95
|
-
flush: function flush(callback) {
|
|
96
|
-
if (pending && pending.length > 0) {
|
|
97
|
-
this.push(pending);
|
|
98
|
-
}
|
|
99
|
-
callback(null);
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
return transform;
|
|
103
|
-
}
|
|
104
|
-
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/BcjArm.ts"],"sourcesContent":["// BCJ (ARM 32-bit) filter codec - converts ARM branch instruction addresses\n// This filter makes ARM executables more compressible by LZMA\n//\n// ARM branch instructions (BL) use relative addressing. The filter converts\n// these to absolute addresses during compression, and back during decompression.\n//\n// Reference: https://github.com/kornelski/7z/blob/main/C/Bra.c\n//\n// This implementation uses true streaming - processes data chunk by chunk.\n\nimport { allocBuffer, bufferFrom, Transform } from 'extract-base-iterator';\n\n/**\n * Decode ARM BCJ filtered data (synchronous, for buffered use)\n * Reverses the BCJ transformation by converting absolute addresses back to relative\n *\n * ARM BL instruction format:\n * - 4 bytes aligned\n * - Byte pattern: XX XX XX EB (where EB = 0xEB opcode for BL)\n * - Lower 24 bits are signed offset (in words, not bytes)\n *\n * @param input - ARM BCJ filtered data\n * @param _properties - Unused for ARM BCJ\n * @param _unpackSize - Unused for ARM BCJ\n * @returns Unfiltered data\n */\nexport function decodeBcjArm(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n const output = bufferFrom(input); // Copy since we modify in place\n let pos = 0;\n\n // Process 4-byte aligned positions\n while (pos + 4 <= output.length) {\n // Check for BL instruction: byte 3 is 0xEB\n if (output[pos + 3] === 0xeb) {\n // Read 24-bit address (little-endian in bytes 0-2)\n let addr = output[pos] | (output[pos + 1] << 8) | (output[pos + 2] << 16);\n\n // Sign-extend 24-bit to 32-bit\n if (addr & 0x800000) {\n addr |= 0xff000000;\n }\n\n // Convert absolute to relative:\n // Subtract current position (in words, so divide by 4)\n const relAddr = addr - (pos >>> 2);\n\n // Write back lower 24 bits\n output[pos] = relAddr & 0xff;\n output[pos + 1] = (relAddr >>> 8) & 0xff;\n output[pos + 2] = (relAddr >>> 16) & 0xff;\n }\n pos += 4;\n }\n\n return output;\n}\n\n/**\n * Create a streaming ARM BCJ decoder Transform.\n * Processes data in 4-byte aligned chunks.\n */\nexport function createBcjArmDecoder(_properties?: Buffer, _unpackSize?: number): InstanceType<typeof Transform> {\n let globalPos = 0; // Position in the overall stream (in bytes)\n let pending: Buffer | null = null; // Incomplete 4-byte group\n\n const transform = new Transform({\n transform: (chunk: Buffer, _encoding: string, callback: (err?: Error | null, data?: Buffer) => void) => {\n // Combine pending bytes with new chunk\n let data: Buffer;\n if (pending && pending.length > 0) {\n data = Buffer.concat([pending, chunk]);\n } else {\n data = chunk;\n }\n\n // Process only complete 4-byte groups\n const completeBytes = data.length - (data.length % 4);\n if (completeBytes === 0) {\n pending = data;\n callback(null, allocBuffer(0));\n return;\n }\n\n const output = bufferFrom(data.slice(0, completeBytes));\n pending = data.length > completeBytes ? data.slice(completeBytes) : null;\n\n let pos = 0;\n while (pos + 4 <= output.length) {\n if (output[pos + 3] === 0xeb) {\n let addr = output[pos] | (output[pos + 1] << 8) | (output[pos + 2] << 16);\n if (addr & 0x800000) {\n addr |= 0xff000000;\n }\n const relAddr = addr - (globalPos >>> 2);\n output[pos] = relAddr & 0xff;\n output[pos + 1] = (relAddr >>> 8) & 0xff;\n output[pos + 2] = (relAddr >>> 16) & 0xff;\n }\n pos += 4;\n globalPos += 4;\n }\n\n callback(null, output);\n },\n flush: function (this: InstanceType<typeof Transform>, callback: (err?: Error | null) => void) {\n if (pending && pending.length > 0) {\n this.push(pending);\n }\n callback(null);\n },\n });\n\n return transform;\n}\n"],"names":["createBcjArmDecoder","decodeBcjArm","input","_properties","_unpackSize","output","bufferFrom","pos","length","addr","relAddr","globalPos","pending","transform","Transform","chunk","_encoding","callback","data","Buffer","concat","completeBytes","allocBuffer","slice","flush","push"],"mappings":"AAAA,4EAA4E;AAC5E,8DAA8D;AAC9D,EAAE;AACF,4EAA4E;AAC5E,iFAAiF;AACjF,EAAE;AACF,+DAA+D;AAC/D,EAAE;AACF,2EAA2E;;;;;;;;;;;;QAqD3DA;eAAAA;;QAnCAC;eAAAA;;;mCAhBmC;AAgB5C,SAASA,aAAaC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACpF,IAAMC,SAASC,IAAAA,+BAAU,EAACJ,QAAQ,gCAAgC;IAClE,IAAIK,MAAM;IAEV,mCAAmC;IACnC,MAAOA,MAAM,KAAKF,OAAOG,MAAM,CAAE;QAC/B,2CAA2C;QAC3C,IAAIH,MAAM,CAACE,MAAM,EAAE,KAAK,MAAM;YAC5B,mDAAmD;YACnD,IAAIE,OAAOJ,MAAM,CAACE,IAAI,GAAIF,MAAM,CAACE,MAAM,EAAE,IAAI,IAAMF,MAAM,CAACE,MAAM,EAAE,IAAI;YAEtE,+BAA+B;YAC/B,IAAIE,OAAO,UAAU;gBACnBA,QAAQ;YACV;YAEA,gCAAgC;YAChC,uDAAuD;YACvD,IAAMC,UAAUD,OAAQF,CAAAA,QAAQ,CAAA;YAEhC,2BAA2B;YAC3BF,MAAM,CAACE,IAAI,GAAGG,UAAU;YACxBL,MAAM,CAACE,MAAM,EAAE,GAAG,AAACG,YAAY,IAAK;YACpCL,MAAM,CAACE,MAAM,EAAE,GAAG,AAACG,YAAY,KAAM;QACvC;QACAH,OAAO;IACT;IAEA,OAAOF;AACT;AAMO,SAASL,oBAAoBG,WAAoB,EAAEC,WAAoB;IAC5E,IAAIO,YAAY,GAAG,4CAA4C;IAC/D,IAAIC,UAAyB,MAAM,0BAA0B;IAE7D,IAAMC,YAAY,IAAIC,8BAAS,CAAC;QAC9BD,WAAW,SAACE,OAAeC,WAAmBC;YAC5C,uCAAuC;YACvC,IAAIC;YACJ,IAAIN,WAAWA,QAAQJ,MAAM,GAAG,GAAG;gBACjCU,OAAOC,OAAOC,MAAM,CAAC;oBAACR;oBAASG;iBAAM;YACvC,OAAO;gBACLG,OAAOH;YACT;YAEA,sCAAsC;YACtC,IAAMM,gBAAgBH,KAAKV,MAAM,GAAIU,KAAKV,MAAM,GAAG;YACnD,IAAIa,kBAAkB,GAAG;gBACvBT,UAAUM;gBACVD,SAAS,MAAMK,IAAAA,gCAAW,EAAC;gBAC3B;YACF;YAEA,IAAMjB,SAASC,IAAAA,+BAAU,EAACY,KAAKK,KAAK,CAAC,GAAGF;YACxCT,UAAUM,KAAKV,MAAM,GAAGa,gBAAgBH,KAAKK,KAAK,CAACF,iBAAiB;YAEpE,IAAId,MAAM;YACV,MAAOA,MAAM,KAAKF,OAAOG,MAAM,CAAE;gBAC/B,IAAIH,MAAM,CAACE,MAAM,EAAE,KAAK,MAAM;oBAC5B,IAAIE,OAAOJ,MAAM,CAACE,IAAI,GAAIF,MAAM,CAACE,MAAM,EAAE,IAAI,IAAMF,MAAM,CAACE,MAAM,EAAE,IAAI;oBACtE,IAAIE,OAAO,UAAU;wBACnBA,QAAQ;oBACV;oBACA,IAAMC,UAAUD,OAAQE,CAAAA,cAAc,CAAA;oBACtCN,MAAM,CAACE,IAAI,GAAGG,UAAU;oBACxBL,MAAM,CAACE,MAAM,EAAE,GAAG,AAACG,YAAY,IAAK;oBACpCL,MAAM,CAACE,MAAM,EAAE,GAAG,AAACG,YAAY,KAAM;gBACvC;gBACAH,OAAO;gBACPI,aAAa;YACf;YAEAM,SAAS,MAAMZ;QACjB;QACAmB,OAAO,SAAPA,MAAuDP,QAAsC;YAC3F,IAAIL,WAAWA,QAAQJ,MAAM,GAAG,GAAG;gBACjC,IAAI,CAACiB,IAAI,CAACb;YACZ;YACAK,SAAS;QACX;IACF;IAEA,OAAOJ;AACT"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { Transform } from 'stream';
|
|
2
|
-
/**
|
|
3
|
-
* Decode ARM64 BCJ filtered data
|
|
4
|
-
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
-
*
|
|
6
|
-
* ARM64 B/BL instruction format (little-endian):
|
|
7
|
-
* - 4 bytes aligned
|
|
8
|
-
* - B: opcode 0x14 (000101xx)
|
|
9
|
-
* - BL: opcode 0x94 (100101xx)
|
|
10
|
-
* - Bits 0-25 are 26-bit signed offset (in words)
|
|
11
|
-
*
|
|
12
|
-
* @param input - ARM64 BCJ filtered data
|
|
13
|
-
* @param _properties - Unused for ARM64 BCJ
|
|
14
|
-
* @param _unpackSize - Unused for ARM64 BCJ
|
|
15
|
-
* @returns Unfiltered data
|
|
16
|
-
*/
|
|
17
|
-
export declare function decodeBcjArm64(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
18
|
-
/**
|
|
19
|
-
* Create an ARM64 BCJ decoder Transform stream
|
|
20
|
-
*/
|
|
21
|
-
export declare function createBcjArm64Decoder(properties?: Buffer, unpackSize?: number): Transform;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { Transform } from 'stream';
|
|
2
|
-
/**
|
|
3
|
-
* Decode ARM64 BCJ filtered data
|
|
4
|
-
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
-
*
|
|
6
|
-
* ARM64 B/BL instruction format (little-endian):
|
|
7
|
-
* - 4 bytes aligned
|
|
8
|
-
* - B: opcode 0x14 (000101xx)
|
|
9
|
-
* - BL: opcode 0x94 (100101xx)
|
|
10
|
-
* - Bits 0-25 are 26-bit signed offset (in words)
|
|
11
|
-
*
|
|
12
|
-
* @param input - ARM64 BCJ filtered data
|
|
13
|
-
* @param _properties - Unused for ARM64 BCJ
|
|
14
|
-
* @param _unpackSize - Unused for ARM64 BCJ
|
|
15
|
-
* @returns Unfiltered data
|
|
16
|
-
*/
|
|
17
|
-
export declare function decodeBcjArm64(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
18
|
-
/**
|
|
19
|
-
* Create an ARM64 BCJ decoder Transform stream
|
|
20
|
-
*/
|
|
21
|
-
export declare function createBcjArm64Decoder(properties?: Buffer, unpackSize?: number): Transform;
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
// BCJ (ARM64/AArch64) filter codec - converts ARM64 branch instruction addresses
|
|
2
|
-
// This filter makes ARM64 executables more compressible by LZMA
|
|
3
|
-
//
|
|
4
|
-
// ARM64 uses 32-bit fixed-width instructions. Branch instructions use 26-bit signed offsets.
|
|
5
|
-
//
|
|
6
|
-
// Reference: https://github.com/kornelski/7z/blob/main/C/Bra.c
|
|
7
|
-
"use strict";
|
|
8
|
-
Object.defineProperty(exports, "__esModule", {
|
|
9
|
-
value: true
|
|
10
|
-
});
|
|
11
|
-
function _export(target, all) {
|
|
12
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
13
|
-
enumerable: true,
|
|
14
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
_export(exports, {
|
|
18
|
-
get createBcjArm64Decoder () {
|
|
19
|
-
return createBcjArm64Decoder;
|
|
20
|
-
},
|
|
21
|
-
get decodeBcjArm64 () {
|
|
22
|
-
return decodeBcjArm64;
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
var _extractbaseiterator = require("extract-base-iterator");
|
|
26
|
-
var _createBufferingDecoderts = /*#__PURE__*/ _interop_require_default(require("./createBufferingDecoder.js"));
|
|
27
|
-
function _interop_require_default(obj) {
|
|
28
|
-
return obj && obj.__esModule ? obj : {
|
|
29
|
-
default: obj
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
function decodeBcjArm64(input, _properties, _unpackSize) {
|
|
33
|
-
var output = (0, _extractbaseiterator.bufferFrom)(input); // Copy since we modify in place
|
|
34
|
-
var pos = 0;
|
|
35
|
-
// Process 4-byte aligned positions
|
|
36
|
-
while(pos + 4 <= output.length){
|
|
37
|
-
// Read 32-bit value (little-endian)
|
|
38
|
-
var instr = output[pos] | output[pos + 1] << 8 | output[pos + 2] << 16 | output[pos + 3] << 24 >>> 0;
|
|
39
|
-
// Check for B/BL instruction: (instr & 0x7C000000) === 0x14000000
|
|
40
|
-
// This matches both B (0x14000000) and BL (0x94000000)
|
|
41
|
-
if ((instr & 0x7c000000) === 0x14000000) {
|
|
42
|
-
// Extract 26-bit offset
|
|
43
|
-
var addr = instr & 0x03ffffff;
|
|
44
|
-
// Sign-extend 26-bit to 32-bit
|
|
45
|
-
if (addr & 0x02000000) {
|
|
46
|
-
addr |= 0xfc000000;
|
|
47
|
-
}
|
|
48
|
-
// Convert absolute to relative: subtract current position (in words)
|
|
49
|
-
var relAddr = addr - (pos >>> 2);
|
|
50
|
-
// Clear old offset and write new one, preserve opcode
|
|
51
|
-
instr = instr & 0xfc000000 | relAddr & 0x03ffffff;
|
|
52
|
-
// Write back (little-endian)
|
|
53
|
-
output[pos] = instr & 0xff;
|
|
54
|
-
output[pos + 1] = instr >>> 8 & 0xff;
|
|
55
|
-
output[pos + 2] = instr >>> 16 & 0xff;
|
|
56
|
-
output[pos + 3] = instr >>> 24 & 0xff;
|
|
57
|
-
}
|
|
58
|
-
pos += 4;
|
|
59
|
-
}
|
|
60
|
-
return output;
|
|
61
|
-
}
|
|
62
|
-
function createBcjArm64Decoder(properties, unpackSize) {
|
|
63
|
-
return (0, _createBufferingDecoderts.default)(decodeBcjArm64, properties, unpackSize);
|
|
64
|
-
}
|
|
65
|
-
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/BcjArm64.ts"],"sourcesContent":["// BCJ (ARM64/AArch64) filter codec - converts ARM64 branch instruction addresses\n// This filter makes ARM64 executables more compressible by LZMA\n//\n// ARM64 uses 32-bit fixed-width instructions. Branch instructions use 26-bit signed offsets.\n//\n// Reference: https://github.com/kornelski/7z/blob/main/C/Bra.c\n\nimport { bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n/**\n * Decode ARM64 BCJ filtered data\n * Reverses the BCJ transformation by converting absolute addresses back to relative\n *\n * ARM64 B/BL instruction format (little-endian):\n * - 4 bytes aligned\n * - B: opcode 0x14 (000101xx)\n * - BL: opcode 0x94 (100101xx)\n * - Bits 0-25 are 26-bit signed offset (in words)\n *\n * @param input - ARM64 BCJ filtered data\n * @param _properties - Unused for ARM64 BCJ\n * @param _unpackSize - Unused for ARM64 BCJ\n * @returns Unfiltered data\n */\nexport function decodeBcjArm64(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n const output = bufferFrom(input); // Copy since we modify in place\n let pos = 0;\n\n // Process 4-byte aligned positions\n while (pos + 4 <= output.length) {\n // Read 32-bit value (little-endian)\n let instr = output[pos] | (output[pos + 1] << 8) | (output[pos + 2] << 16) | ((output[pos + 3] << 24) >>> 0);\n\n // Check for B/BL instruction: (instr & 0x7C000000) === 0x14000000\n // This matches both B (0x14000000) and BL (0x94000000)\n if ((instr & 0x7c000000) === 0x14000000) {\n // Extract 26-bit offset\n let addr = instr & 0x03ffffff;\n\n // Sign-extend 26-bit to 32-bit\n if (addr & 0x02000000) {\n addr |= 0xfc000000;\n }\n\n // Convert absolute to relative: subtract current position (in words)\n const relAddr = addr - (pos >>> 2);\n\n // Clear old offset and write new one, preserve opcode\n instr = (instr & 0xfc000000) | (relAddr & 0x03ffffff);\n\n // Write back (little-endian)\n output[pos] = instr & 0xff;\n output[pos + 1] = (instr >>> 8) & 0xff;\n output[pos + 2] = (instr >>> 16) & 0xff;\n output[pos + 3] = (instr >>> 24) & 0xff;\n }\n\n pos += 4;\n }\n\n return output;\n}\n\n/**\n * Create an ARM64 BCJ decoder Transform stream\n */\nexport function createBcjArm64Decoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcjArm64, properties, unpackSize);\n}\n"],"names":["createBcjArm64Decoder","decodeBcjArm64","input","_properties","_unpackSize","output","bufferFrom","pos","length","instr","addr","relAddr","properties","unpackSize","createBufferingDecoder"],"mappings":"AAAA,iFAAiF;AACjF,gEAAgE;AAChE,EAAE;AACF,6FAA6F;AAC7F,EAAE;AACF,+DAA+D;;;;;;;;;;;;QA+D/CA;eAAAA;;QA1CAC;eAAAA;;;mCAnBW;+EAEQ;;;;;;AAiB5B,SAASA,eAAeC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACtF,IAAMC,SAASC,IAAAA,+BAAU,EAACJ,QAAQ,gCAAgC;IAClE,IAAIK,MAAM;IAEV,mCAAmC;IACnC,MAAOA,MAAM,KAAKF,OAAOG,MAAM,CAAE;QAC/B,oCAAoC;QACpC,IAAIC,QAAQJ,MAAM,CAACE,IAAI,GAAIF,MAAM,CAACE,MAAM,EAAE,IAAI,IAAMF,MAAM,CAACE,MAAM,EAAE,IAAI,KAAO,AAACF,MAAM,CAACE,MAAM,EAAE,IAAI,OAAQ;QAE1G,kEAAkE;QAClE,uDAAuD;QACvD,IAAI,AAACE,CAAAA,QAAQ,UAAS,MAAO,YAAY;YACvC,wBAAwB;YACxB,IAAIC,OAAOD,QAAQ;YAEnB,+BAA+B;YAC/B,IAAIC,OAAO,YAAY;gBACrBA,QAAQ;YACV;YAEA,qEAAqE;YACrE,IAAMC,UAAUD,OAAQH,CAAAA,QAAQ,CAAA;YAEhC,sDAAsD;YACtDE,QAAQ,AAACA,QAAQ,aAAeE,UAAU;YAE1C,6BAA6B;YAC7BN,MAAM,CAACE,IAAI,GAAGE,QAAQ;YACtBJ,MAAM,CAACE,MAAM,EAAE,GAAG,AAACE,UAAU,IAAK;YAClCJ,MAAM,CAACE,MAAM,EAAE,GAAG,AAACE,UAAU,KAAM;YACnCJ,MAAM,CAACE,MAAM,EAAE,GAAG,AAACE,UAAU,KAAM;QACrC;QAEAF,OAAO;IACT;IAEA,OAAOF;AACT;AAKO,SAASL,sBAAsBY,UAAmB,EAAEC,UAAmB;IAC5E,OAAOC,IAAAA,iCAAsB,EAACb,gBAAgBW,YAAYC;AAC5D"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { Transform } from 'stream';
|
|
2
|
-
/**
|
|
3
|
-
* Decode ARM Thumb BCJ filtered data
|
|
4
|
-
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
-
*
|
|
6
|
-
* ARM Thumb BL instruction format (2 x 16-bit):
|
|
7
|
-
* - First half-word: 1111 0xxx xxxx xxxx (high bits of offset)
|
|
8
|
-
* - Second half-word: 1111 1xxx xxxx xxxx (low bits of offset)
|
|
9
|
-
*
|
|
10
|
-
* @param input - ARM Thumb BCJ filtered data
|
|
11
|
-
* @param _properties - Unused for ARM Thumb BCJ
|
|
12
|
-
* @param _unpackSize - Unused for ARM Thumb BCJ
|
|
13
|
-
* @returns Unfiltered data
|
|
14
|
-
*/
|
|
15
|
-
export declare function decodeBcjArmt(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
16
|
-
/**
|
|
17
|
-
* Create an ARM Thumb BCJ decoder Transform stream
|
|
18
|
-
*/
|
|
19
|
-
export declare function createBcjArmtDecoder(properties?: Buffer, unpackSize?: number): Transform;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { Transform } from 'stream';
|
|
2
|
-
/**
|
|
3
|
-
* Decode ARM Thumb BCJ filtered data
|
|
4
|
-
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
-
*
|
|
6
|
-
* ARM Thumb BL instruction format (2 x 16-bit):
|
|
7
|
-
* - First half-word: 1111 0xxx xxxx xxxx (high bits of offset)
|
|
8
|
-
* - Second half-word: 1111 1xxx xxxx xxxx (low bits of offset)
|
|
9
|
-
*
|
|
10
|
-
* @param input - ARM Thumb BCJ filtered data
|
|
11
|
-
* @param _properties - Unused for ARM Thumb BCJ
|
|
12
|
-
* @param _unpackSize - Unused for ARM Thumb BCJ
|
|
13
|
-
* @returns Unfiltered data
|
|
14
|
-
*/
|
|
15
|
-
export declare function decodeBcjArmt(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
16
|
-
/**
|
|
17
|
-
* Create an ARM Thumb BCJ decoder Transform stream
|
|
18
|
-
*/
|
|
19
|
-
export declare function createBcjArmtDecoder(properties?: Buffer, unpackSize?: number): Transform;
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
// BCJ (ARM Thumb) filter codec - converts ARM Thumb branch instruction addresses
|
|
2
|
-
// This filter makes ARM Thumb executables more compressible by LZMA
|
|
3
|
-
//
|
|
4
|
-
// ARM Thumb uses 16-bit instructions, but BL (branch with link) spans two 16-bit words.
|
|
5
|
-
// The filter converts relative addresses to absolute during compression.
|
|
6
|
-
//
|
|
7
|
-
// Reference: https://github.com/kornelski/7z/blob/main/C/Bra.c
|
|
8
|
-
"use strict";
|
|
9
|
-
Object.defineProperty(exports, "__esModule", {
|
|
10
|
-
value: true
|
|
11
|
-
});
|
|
12
|
-
function _export(target, all) {
|
|
13
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
14
|
-
enumerable: true,
|
|
15
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
_export(exports, {
|
|
19
|
-
get createBcjArmtDecoder () {
|
|
20
|
-
return createBcjArmtDecoder;
|
|
21
|
-
},
|
|
22
|
-
get decodeBcjArmt () {
|
|
23
|
-
return decodeBcjArmt;
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
var _extractbaseiterator = require("extract-base-iterator");
|
|
27
|
-
var _createBufferingDecoderts = /*#__PURE__*/ _interop_require_default(require("./createBufferingDecoder.js"));
|
|
28
|
-
function _interop_require_default(obj) {
|
|
29
|
-
return obj && obj.__esModule ? obj : {
|
|
30
|
-
default: obj
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
function decodeBcjArmt(input, _properties, _unpackSize) {
|
|
34
|
-
var output = (0, _extractbaseiterator.bufferFrom)(input); // Copy since we modify in place
|
|
35
|
-
var pos = 0;
|
|
36
|
-
// Process 2-byte aligned positions
|
|
37
|
-
while(pos + 4 <= output.length){
|
|
38
|
-
// Read two 16-bit values (little-endian)
|
|
39
|
-
var w0 = output[pos] | output[pos + 1] << 8;
|
|
40
|
-
var w1 = output[pos + 2] | output[pos + 3] << 8;
|
|
41
|
-
// Check for BL instruction pair:
|
|
42
|
-
// First word: 0xF000-0xF7FF (1111 0xxx xxxx xxxx)
|
|
43
|
-
// Second word: 0xF800-0xFFFF (1111 1xxx xxxx xxxx)
|
|
44
|
-
if ((w0 & 0xf800) === 0xf000 && (w1 & 0xf800) === 0xf800) {
|
|
45
|
-
// Extract and combine the offset parts
|
|
46
|
-
// High 11 bits from w0, low 11 bits from w1
|
|
47
|
-
var hi = w0 & 0x7ff;
|
|
48
|
-
var lo = w1 & 0x7ff;
|
|
49
|
-
// Combine into 22-bit offset (in half-words)
|
|
50
|
-
var addr = hi << 11 | lo;
|
|
51
|
-
// Sign-extend 22-bit to 32-bit
|
|
52
|
-
if (addr & 0x200000) {
|
|
53
|
-
addr |= 0xffc00000;
|
|
54
|
-
}
|
|
55
|
-
// Convert absolute to relative:
|
|
56
|
-
// Subtract current position (in half-words, so divide by 2)
|
|
57
|
-
// Thumb PC is 2 half-words (4 bytes) ahead
|
|
58
|
-
var relAddr = addr - (pos >>> 1);
|
|
59
|
-
// Write back
|
|
60
|
-
var newHi = relAddr >>> 11 & 0x7ff;
|
|
61
|
-
var newLo = relAddr & 0x7ff;
|
|
62
|
-
output[pos] = newHi & 0xff;
|
|
63
|
-
output[pos + 1] = 0xf0 | newHi >>> 8 & 0x07;
|
|
64
|
-
output[pos + 2] = newLo & 0xff;
|
|
65
|
-
output[pos + 3] = 0xf8 | newLo >>> 8 & 0x07;
|
|
66
|
-
pos += 4;
|
|
67
|
-
} else {
|
|
68
|
-
pos += 2;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return output;
|
|
72
|
-
}
|
|
73
|
-
function createBcjArmtDecoder(properties, unpackSize) {
|
|
74
|
-
return (0, _createBufferingDecoderts.default)(decodeBcjArmt, properties, unpackSize);
|
|
75
|
-
}
|
|
76
|
-
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|