@isopodlabs/binary_libs 0.0.1

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.
@@ -0,0 +1,69 @@
1
+ export declare const isLittleEndian: boolean;
2
+ export declare function isPow2(n: number): boolean;
3
+ export declare function lowestSet(n: number): number;
4
+ export declare function lowestSet(n: bigint): bigint;
5
+ export declare function contiguousBits(n: number): boolean;
6
+ export declare function highestSetIndex32(n: number): number;
7
+ export declare function highestSetIndex(n: number | bigint): number;
8
+ export declare function lowestSetIndex32(n: number): number;
9
+ export declare function lowestSetIndex(n: number | bigint): number;
10
+ export declare function clearLowest(n: number | bigint): number | bigint;
11
+ export declare function bitCount(n: number | bigint): number;
12
+ export declare function splitBinary(n: number | bigint, splits: number[]): number[] | bigint[];
13
+ export interface memory {
14
+ length?: bigint;
15
+ get(address: bigint, len: number): Uint8Array | Promise<Uint8Array>;
16
+ }
17
+ interface arrayBuffer {
18
+ length: number;
19
+ buffer: ArrayBuffer;
20
+ byteLength: number;
21
+ byteOffset: number;
22
+ slice(begin: number, end?: number): arrayBuffer;
23
+ [n: number]: number;
24
+ }
25
+ export declare const enum MEM {
26
+ NONE = 0,
27
+ READ = 1,
28
+ WRITE = 2,
29
+ EXECUTE = 4,
30
+ RELATIVE = 8
31
+ }
32
+ export declare class MappedMemory {
33
+ data: Uint8Array;
34
+ address: number;
35
+ flags: number;
36
+ constructor(data: Uint8Array, address: number, flags: number);
37
+ resolveAddress(base: number): number;
38
+ slice(begin: number, end?: number): MappedMemory;
39
+ at(begin: number, length?: number): MappedMemory;
40
+ }
41
+ export declare function to8(arg: arrayBuffer): Uint8Array;
42
+ export declare function to8(arg?: arrayBuffer): Uint8Array | undefined;
43
+ export declare function to16(arg: arrayBuffer, be?: boolean): Uint16Array;
44
+ export declare function to16(arg?: arrayBuffer, be?: boolean): Uint16Array | undefined;
45
+ export declare function to16s(arg: arrayBuffer, be?: boolean): Int16Array;
46
+ export declare function to16s(arg?: arrayBuffer, be?: boolean): Int16Array | undefined;
47
+ export declare function to32(arg: arrayBuffer, be?: boolean): Uint32Array;
48
+ export declare function to32(arg?: arrayBuffer, be?: boolean): Uint32Array | undefined;
49
+ export declare function to32s(arg: arrayBuffer, be?: boolean): Int32Array;
50
+ export declare function to32s(arg?: arrayBuffer, be?: boolean): Int32Array | undefined;
51
+ export declare function to64(arg: arrayBuffer, be?: boolean): BigUint64Array;
52
+ export declare function to64(arg?: arrayBuffer, be?: boolean): BigUint64Array | undefined;
53
+ export declare function to64s(arg: arrayBuffer, be?: boolean): BigInt64Array;
54
+ export declare function to64s(arg?: arrayBuffer, be?: boolean): BigInt64Array | undefined;
55
+ export declare function getBigUint(dv: DataView, len: number, littleEndian?: boolean): bigint;
56
+ export declare function getBigInt(dv: DataView, len: number, littleEndian?: boolean): bigint;
57
+ export declare function putBigUint(dv: DataView, v: bigint, len: number, littleEndian?: boolean): void;
58
+ export declare function getUint(dv: DataView, len: number, littleEndian?: boolean): number;
59
+ export declare function getInt(dv: DataView, len: number, littleEndian?: boolean): number;
60
+ export declare function putUint(dv: DataView, v: number, len: number, littleEndian?: boolean): void;
61
+ export declare function stringCode(s: string): number;
62
+ export declare function stringCodeBig(s: string): bigint;
63
+ export type TextEncoding = 'utf8' | 'utf16le' | 'utf16be';
64
+ export declare function encodeTextInto(str: string, into: Uint8Array, encoding: TextEncoding, bom?: boolean): void;
65
+ export declare function encodeText(str: string, encoding?: TextEncoding, bom?: boolean): Uint8Array;
66
+ export declare function decodeText(buf: Uint8Array, encoding?: TextEncoding): string;
67
+ export declare function decodeTextTo0(buf: Uint8Array | undefined, encoding?: TextEncoding): string;
68
+ export declare function getTextEncoding(bytes: Uint8Array): TextEncoding;
69
+ export {};
@@ -0,0 +1,328 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTextEncoding = exports.decodeTextTo0 = exports.decodeText = exports.encodeText = exports.encodeTextInto = exports.stringCodeBig = exports.stringCode = exports.putUint = exports.getInt = exports.getUint = exports.putBigUint = exports.getBigInt = exports.getBigUint = exports.to64s = exports.to64 = exports.to32s = exports.to32 = exports.to16s = exports.to16 = exports.to8 = exports.MappedMemory = exports.splitBinary = exports.bitCount = exports.clearLowest = exports.lowestSetIndex = exports.lowestSetIndex32 = exports.highestSetIndex = exports.highestSetIndex32 = exports.contiguousBits = exports.lowestSet = exports.isPow2 = exports.isLittleEndian = void 0;
4
+ //-----------------------------------------------------------------------------
5
+ // bit stuff
6
+ //-----------------------------------------------------------------------------
7
+ exports.isLittleEndian = (new Uint8Array(new Uint16Array([0x1234]).buffer))[0] === 0x34;
8
+ function isPow2(n) {
9
+ return (n & (n - 1)) === 0;
10
+ }
11
+ exports.isPow2 = isPow2;
12
+ function lowestSet(n) {
13
+ return typeof n === 'bigint' ? n & -n : n & -n;
14
+ }
15
+ exports.lowestSet = lowestSet;
16
+ function contiguousBits(n) {
17
+ return isPow2(n + lowestSet(n));
18
+ }
19
+ exports.contiguousBits = contiguousBits;
20
+ function highestSetIndex32(n) {
21
+ return 31 - Math.clz32(n);
22
+ }
23
+ exports.highestSetIndex32 = highestSetIndex32;
24
+ function highestSetIndex(n) {
25
+ return typeof n === 'bigint' || n > 2 ** 32
26
+ ? n.toString(2).length - 1
27
+ : highestSetIndex32(n);
28
+ }
29
+ exports.highestSetIndex = highestSetIndex;
30
+ function lowestSetIndex32(n) {
31
+ return n ? 31 - Math.clz32(n & -n) : 32;
32
+ }
33
+ exports.lowestSetIndex32 = lowestSetIndex32;
34
+ function lowestSetIndex(n) {
35
+ if (typeof n === 'bigint') {
36
+ const i = Number(n & 0xffffffffn);
37
+ return i ? lowestSetIndex32(i) : 32 + lowestSetIndex(n >> 32n);
38
+ }
39
+ return lowestSetIndex32(n);
40
+ }
41
+ exports.lowestSetIndex = lowestSetIndex;
42
+ function clearLowest(n) {
43
+ return typeof n === 'bigint'
44
+ ? n & (n - 1n)
45
+ : n & (n - 1);
46
+ }
47
+ exports.clearLowest = clearLowest;
48
+ function bitCount32(n) {
49
+ n = n - ((n >> 1) & 0x55555555);
50
+ n = (n & 0x33333333) + ((n >> 2) & 0x33333333);
51
+ return ((n + (n >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;
52
+ }
53
+ function bitCount(n) {
54
+ return typeof n === 'bigint'
55
+ ? bitCount32(Number(n & 0xffffffffn)) + bitCount(n >> 32n)
56
+ : bitCount32(n);
57
+ }
58
+ exports.bitCount = bitCount;
59
+ function splitBinary(n, splits) {
60
+ let b = 0;
61
+ return typeof n === 'bigint'
62
+ ? splits.map(s => {
63
+ const r = (n >> BigInt(b)) & ((1n << BigInt(s)) - 1n);
64
+ b += s;
65
+ return r;
66
+ })
67
+ : splits.map(s => {
68
+ const r = (n >> b) & ((1 << s) - 1);
69
+ b += s;
70
+ return r;
71
+ });
72
+ }
73
+ exports.splitBinary = splitBinary;
74
+ class MappedMemory {
75
+ data;
76
+ address;
77
+ flags;
78
+ constructor(data, address, flags) {
79
+ this.data = data;
80
+ this.address = address;
81
+ this.flags = flags;
82
+ }
83
+ resolveAddress(base) { return this.address; }
84
+ slice(begin, end) { return new MappedMemory(this.data.subarray(begin, end), this.address + begin, this.flags); }
85
+ at(begin, length) { return this.slice(begin - this.address, length && (begin - this.address + length)); }
86
+ }
87
+ exports.MappedMemory = MappedMemory;
88
+ function pairSwap(a) {
89
+ for (let i = 0; i < a.length; i += 2)
90
+ [a[i], a[i + 1]] = [a[i + 1], a[i]];
91
+ }
92
+ function fixEndian16(a, be) {
93
+ if (be === exports.isLittleEndian) {
94
+ pairSwap(new Uint8Array(a));
95
+ }
96
+ return a;
97
+ }
98
+ function fixEndian32(a, be) {
99
+ if (be === exports.isLittleEndian) {
100
+ pairSwap(new Uint8Array(a));
101
+ pairSwap(new Uint16Array(a));
102
+ }
103
+ return a;
104
+ }
105
+ function fixEndian64(a, be) {
106
+ if (be === exports.isLittleEndian) {
107
+ pairSwap(new Uint8Array(a));
108
+ pairSwap(new Uint16Array(a));
109
+ pairSwap(new Uint32Array(a));
110
+ }
111
+ return a;
112
+ }
113
+ function to8(arg) {
114
+ return arg && new Uint8Array(arg.buffer, arg.byteOffset, arg.byteLength);
115
+ }
116
+ exports.to8 = to8;
117
+ function dupBuffer(arg) {
118
+ const buffer = new ArrayBuffer(arg.byteLength);
119
+ (new Uint8Array(buffer)).set(new Uint8Array(arg.buffer, arg.byteOffset, arg.byteLength));
120
+ return buffer;
121
+ }
122
+ function to16(arg, be) { return arg && new Uint16Array(fixEndian16(dupBuffer(arg), be)); }
123
+ exports.to16 = to16;
124
+ function to16s(arg, be) { return arg && new Int16Array(fixEndian16(dupBuffer(arg), be)); }
125
+ exports.to16s = to16s;
126
+ function to32(arg, be) { return arg && new Uint32Array(fixEndian32(dupBuffer(arg), be)); }
127
+ exports.to32 = to32;
128
+ function to32s(arg, be) { return arg && new Int32Array(fixEndian32(dupBuffer(arg), be)); }
129
+ exports.to32s = to32s;
130
+ function to64(arg, be) { return arg && new BigUint64Array(fixEndian64(dupBuffer(arg), be)); }
131
+ exports.to64 = to64;
132
+ function to64s(arg, be) { return arg && new BigInt64Array(fixEndian64(dupBuffer(arg), be)); }
133
+ exports.to64s = to64s;
134
+ //-----------------------------------------------------------------------------
135
+ // numbers
136
+ //-----------------------------------------------------------------------------
137
+ function getBigUint(dv, len, littleEndian) {
138
+ let result = 0n;
139
+ if (littleEndian) {
140
+ let offset = len;
141
+ while (offset >= 4) {
142
+ offset -= 4;
143
+ result = (result << 32n) | BigInt(dv.getUint32(offset, true));
144
+ }
145
+ if (len & 2) {
146
+ offset -= 2;
147
+ result = (result << 16n) | BigInt(dv.getUint16(offset, true));
148
+ }
149
+ if (len & 1)
150
+ result = (result << 8n) | BigInt(dv.getUint8(--offset));
151
+ }
152
+ else {
153
+ let offset = 0;
154
+ while (offset + 4 <= len) {
155
+ result = (result << 32n) | BigInt(dv.getUint32(offset));
156
+ offset += 4;
157
+ }
158
+ if (len & 2) {
159
+ result = (result << 16n) | BigInt(dv.getUint16(offset));
160
+ offset += 2;
161
+ }
162
+ if (len & 1)
163
+ result = (result << 8n) | BigInt(dv.getUint8(offset));
164
+ }
165
+ return result;
166
+ }
167
+ exports.getBigUint = getBigUint;
168
+ function getBigInt(dv, len, littleEndian) {
169
+ const v = getBigUint(dv, len, littleEndian);
170
+ const s = 1n << BigInt(len * 8 - 1);
171
+ return v < s ? v : v - s - s;
172
+ }
173
+ exports.getBigInt = getBigInt;
174
+ function putBigUint(dv, v, len, littleEndian) {
175
+ if (littleEndian) {
176
+ let offset = 0;
177
+ while (offset + 4 <= len) {
178
+ dv.setUint32(offset, Number(v & 0xffffffffn), true);
179
+ v >>= 32n;
180
+ offset += 4;
181
+ }
182
+ if (len & 2) {
183
+ dv.setUint16(offset, Number(v & 0xffffn), true);
184
+ v >>= 16n;
185
+ offset += 2;
186
+ }
187
+ if (len & 1)
188
+ dv.setUint8(offset, Number(v & 0xffn));
189
+ }
190
+ else {
191
+ let offset = len;
192
+ while (offset >= 4) {
193
+ offset -= 4;
194
+ dv.setUint32(offset, Number(v & 0xffffffffn));
195
+ v >>= 32n;
196
+ }
197
+ if (len & 2) {
198
+ offset -= 2;
199
+ dv.setUint16(offset, Number(v & 0xffffn));
200
+ v >>= 16n;
201
+ }
202
+ if (len & 1)
203
+ dv.setUint8(--offset, Number(v & 0xffn));
204
+ }
205
+ }
206
+ exports.putBigUint = putBigUint;
207
+ // get/put 1-7 byte integers from/to DavaView (7 bytes will lose precision)
208
+ function getUint(dv, len, littleEndian) {
209
+ let result = 0;
210
+ if (littleEndian) {
211
+ if (len & 1)
212
+ result = dv.getUint8(len & 6);
213
+ if (len & 2)
214
+ result = (result << 16) | dv.getUint16(len & 4, true);
215
+ if (len & 4)
216
+ result = result * (2 ** 32) + dv.getUint32(0, true);
217
+ }
218
+ else {
219
+ if (len & 1)
220
+ result = dv.getUint8(0);
221
+ if (len & 2)
222
+ result = (result << 16) | dv.getUint16(len & 1);
223
+ if (len & 4)
224
+ result = result * (2 ** 32) + dv.getUint32(len & 3);
225
+ }
226
+ return result;
227
+ }
228
+ exports.getUint = getUint;
229
+ function getInt(dv, len, littleEndian) {
230
+ const v = getUint(dv, len, littleEndian);
231
+ const s = 1 << len * 8 - 1;
232
+ return v < s ? v : v - s - s;
233
+ }
234
+ exports.getInt = getInt;
235
+ function putUint(dv, v, len, littleEndian) {
236
+ if (littleEndian) {
237
+ if (len & 4) {
238
+ dv.setUint32(0, v & 0xffffffff, true);
239
+ v /= 2 ** 32;
240
+ }
241
+ if (len & 2) {
242
+ dv.setUint16(len & 4, v & 0xffff, true);
243
+ v >>= 16;
244
+ }
245
+ if (len & 1)
246
+ dv.setUint8(len & 6, v & 0xff);
247
+ }
248
+ else {
249
+ if (len & 4) {
250
+ dv.setUint32(len & 3, v & 0xffffffff);
251
+ v /= 2 ** 32;
252
+ }
253
+ if (len & 2) {
254
+ dv.setUint16(len & 1, v & 0xffff);
255
+ v >>= 16;
256
+ }
257
+ if (len & 1)
258
+ dv.setUint8(0, v & 0xff);
259
+ }
260
+ }
261
+ exports.putUint = putUint;
262
+ //-----------------------------------------------------------------------------
263
+ // text
264
+ //-----------------------------------------------------------------------------
265
+ function stringCode(s) {
266
+ let r = 0;
267
+ for (let i = 0; i < s.length; i++)
268
+ r += s.charCodeAt(i) << (i * 8);
269
+ return r;
270
+ }
271
+ exports.stringCode = stringCode;
272
+ function stringCodeBig(s) {
273
+ let r = 0n;
274
+ for (let i = 0; i < s.length; i++)
275
+ r += BigInt(s.charCodeAt(i)) << BigInt(i * 8);
276
+ return r;
277
+ }
278
+ exports.stringCodeBig = stringCodeBig;
279
+ function encodeText16Into(str, into, be) {
280
+ const len = str.length;
281
+ const view = new Uint16Array(into);
282
+ for (let i = 0; i < len; i++)
283
+ view[i] = str.charCodeAt(i);
284
+ if (be === exports.isLittleEndian)
285
+ pairSwap(into);
286
+ }
287
+ function encodeTextInto(str, into, encoding, bom = false) {
288
+ if (bom)
289
+ str = String.fromCharCode(0xfeff) + str;
290
+ if (encoding === 'utf8')
291
+ into.set(Buffer.from(str, encoding));
292
+ else
293
+ encodeText16Into(str, into, encoding === 'utf16be');
294
+ }
295
+ exports.encodeTextInto = encodeTextInto;
296
+ function encodeText(str, encoding = 'utf8', bom = false) {
297
+ if (bom)
298
+ str = String.fromCharCode(0xfeff) + str;
299
+ if (encoding === 'utf8')
300
+ return Buffer.from(str, encoding);
301
+ const buf = new Uint8Array(str.length * 2);
302
+ encodeText16Into(str, buf, encoding === 'utf16be');
303
+ return buf;
304
+ }
305
+ exports.encodeText = encodeText;
306
+ function decodeText(buf, encoding = 'utf8') {
307
+ if (encoding === 'utf8')
308
+ return new TextDecoder(encoding).decode(buf);
309
+ const view = to16(buf, encoding === 'utf16be');
310
+ let result = '';
311
+ for (let i = view[0] === 0xfeff ? 1 : 0; i < view.length; i += 1024)
312
+ result += String.fromCharCode(...view.subarray(i, i + 1024));
313
+ return result;
314
+ }
315
+ exports.decodeText = decodeText;
316
+ function decodeTextTo0(buf, encoding = 'utf8') {
317
+ return buf ? decodeText(buf.subarray(0, encoding === 'utf8' ? buf.indexOf(0) : to16(buf).indexOf(0) * 2), encoding) : '';
318
+ }
319
+ exports.decodeTextTo0 = decodeTextTo0;
320
+ function getTextEncoding(bytes) {
321
+ return bytes.length >= 3 && bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF ? 'utf8'
322
+ : bytes.length >= 2 && bytes[0] === 0xFE && bytes[1] === 0xFF ? 'utf16be'
323
+ : bytes.length >= 2 && bytes[0] === 0xFF && bytes[1] === 0xFE ? 'utf16le'
324
+ : bytes.length >= 2 && bytes[0] === 0 && bytes[1] !== 0 ? 'utf16be'
325
+ : bytes.length >= 2 && bytes[0] !== 0 && bytes[1] === 0 ? 'utf16le'
326
+ : 'utf8';
327
+ }
328
+ exports.getTextEncoding = getTextEncoding;
package/dist/clr.d.ts ADDED
@@ -0,0 +1,63 @@
1
+ import * as pe from './pe';
2
+ declare enum TABLE {
3
+ Module = 0,
4
+ TypeRef = 1,
5
+ TypeDef = 2,
6
+ Field = 4,
7
+ MethodDef = 6,
8
+ Param = 8,
9
+ InterfaceImpl = 9,
10
+ MemberRef = 10,
11
+ Constant = 11,
12
+ CustomAttribute = 12,
13
+ FieldMarshal = 13,
14
+ DeclSecurity = 14,
15
+ ClassLayout = 15,
16
+ FieldLayout = 16,
17
+ StandAloneSig = 17,
18
+ EventMap = 18,
19
+ Event = 20,
20
+ PropertyMap = 21,
21
+ Property = 23,
22
+ MethodSemantics = 24,
23
+ MethodImpl = 25,
24
+ ModuleRef = 26,
25
+ TypeSpec = 27,
26
+ ImplMap = 28,
27
+ FieldRVA = 29,
28
+ Assembly = 32,
29
+ AssemblyProcessor = 33,
30
+ AssemblyOS = 34,
31
+ AssemblyRef = 35,
32
+ AssemblyRefProcessor = 36,
33
+ AssemblyRefOS = 37,
34
+ File = 38,
35
+ ExportedType = 39,
36
+ ManifestResource = 40,
37
+ NestedClass = 41,
38
+ GenericParam = 42,
39
+ MethodSpec = 43,
40
+ GenericParamConstraint = 44
41
+ }
42
+ interface Table {
43
+ count: number;
44
+ size: number;
45
+ offset: number;
46
+ }
47
+ export declare class CLR {
48
+ header: any;
49
+ table_info: any;
50
+ heaps: Uint8Array[];
51
+ tables: {
52
+ [K in TABLE]?: Table;
53
+ };
54
+ raw?: Uint8Array;
55
+ Resources?: Uint8Array;
56
+ constructor(pe: pe.PE, clr_data: Uint8Array);
57
+ getEntry(t: TABLE, i: number): any;
58
+ getTable(t: TABLE): any[] | undefined;
59
+ getResources(block: string): Record<string, any> | undefined;
60
+ getResource(block: string, name: string): any;
61
+ allResources(): {} | undefined;
62
+ }
63
+ export {};