mharj-diskinfo 0.1.0 → 0.2.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/index.cjs ADDED
@@ -0,0 +1,228 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region \0rolldown/runtime.js
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
+ key = keys[i];
12
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
13
+ get: ((k) => from[k]).bind(null, key),
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
20
+ value: mod,
21
+ enumerable: true
22
+ }) : target, mod));
23
+ //#endregion
24
+ let node_fs = require("node:fs");
25
+ node_fs = __toESM(node_fs);
26
+ //#region src/Magic.ts
27
+ var Magic = class {
28
+ constructor(fd) {
29
+ this.fd = fd;
30
+ }
31
+ haveExt(offset) {
32
+ const data = Buffer.allocUnsafe(2048);
33
+ node_fs.default.readSync(this.fd, data, 0, data.length, 512 * offset);
34
+ return data.readInt16BE(1080) === 21487;
35
+ }
36
+ haveNtfs(offset) {
37
+ const data = Buffer.allocUnsafe(512);
38
+ node_fs.default.readSync(this.fd, data, 0, data.length, 512 * offset);
39
+ return data.readInt32BE(3) === 1314145875;
40
+ }
41
+ haveLvm2(offset) {
42
+ const data = Buffer.allocUnsafe(1024);
43
+ node_fs.default.readSync(this.fd, data, 0, data.length, 512 * offset);
44
+ return data.readInt32BE(536) === 1280724274;
45
+ }
46
+ };
47
+ //#endregion
48
+ //#region src/gptPart.ts
49
+ const EFI_PART = Buffer.from([
50
+ 69,
51
+ 70,
52
+ 73,
53
+ 32,
54
+ 80,
55
+ 65,
56
+ 82,
57
+ 84
58
+ ]);
59
+ const gptPartTypes = Object.freeze({
60
+ EMPTY: "00000000-0000-0000-0000-000000000000",
61
+ MBR: "024dee41-33e7-11d3-9d69-0008c781f39f",
62
+ EFI: "c12a7328-f81f-11d2-ba4b-00a0c93ec93b",
63
+ LINUX: "0fc63daf-8483-4772-8e79-3d69d8477de4",
64
+ LINUX_SWAP: "0657fd6d-a4ab-43c4-84e5-0933c84b4f4f",
65
+ LINUX_LVM: "e6d6d379-f507-44c2-a23c-238f2a3df928",
66
+ LINUX_RAID: "a19d880f-05fc-4d3b-a006-743f0f84911e",
67
+ MSR: "e3c9e316-0b5c-4db8-817d-f92df00215ae",
68
+ BASIC_DATA: "ebd0a0a2-b9e5-4433-87c0-68b6b72699c7",
69
+ getName: function(val) {
70
+ return Object.entries(this).reduce((acc, [k, v]) => {
71
+ if (typeof v === "string" && v === val) return k;
72
+ return acc;
73
+ }, "Unknown");
74
+ }
75
+ });
76
+ function readUuidBytes(buf, pos) {
77
+ return Buffer.from([
78
+ buf[pos + 3],
79
+ buf[pos + 2],
80
+ buf[pos + 1],
81
+ buf[pos + 0],
82
+ buf[pos + 5],
83
+ buf[pos + 4],
84
+ buf[pos + 7],
85
+ buf[pos + 6],
86
+ buf[pos + 8],
87
+ buf[pos + 9],
88
+ buf[pos + 10],
89
+ buf[pos + 11],
90
+ buf[pos + 12],
91
+ buf[pos + 13],
92
+ buf[pos + 14],
93
+ buf[pos + 15]
94
+ ]);
95
+ }
96
+ function readUuidString(buf, pos) {
97
+ const uuid = readUuidBytes(buf, pos).toString("hex");
98
+ return `${uuid.slice(0, 8)}-${uuid.slice(8, 12)}-${uuid.slice(12, 16)}-${uuid.slice(16, 20)}-${uuid.slice(20, 32)}`;
99
+ }
100
+ function parseGPTable(buf) {
101
+ const typeId = readUuidString(buf, 0);
102
+ const uuid = readUuidString(buf, 16);
103
+ const startLBA = buf.readBigUInt64LE(32);
104
+ const endLBA = buf.readBigUInt64LE(40);
105
+ return {
106
+ typeId,
107
+ type: gptPartTypes.getName(typeId),
108
+ uuid,
109
+ active: uuid !== gptPartTypes.EMPTY,
110
+ startLBA,
111
+ endLBA,
112
+ partitionSize: endLBA - startLBA + 1n,
113
+ attributes: buf.readBigUInt64BE(48),
114
+ label: buf.subarray(56, 128).toString("utf16le").split("\0", 1)[0]
115
+ };
116
+ }
117
+ function parseGPT(buf) {
118
+ if (buf.indexOf(EFI_PART) !== 0) throw Error("not GTP entry");
119
+ return {
120
+ revision: `${buf[8]}.${buf[9]}.${buf[10]}.${buf[11]}`,
121
+ headerSize: buf.readUInt32LE(12),
122
+ headerCRC32: buf.readUInt32LE(16),
123
+ currentLBA: buf.readBigUInt64LE(24),
124
+ backupLBA: buf.readBigUInt64LE(32),
125
+ firstUsableLBA: buf.readBigUInt64LE(40),
126
+ lastUsableLBA: buf.readBigUInt64LE(48),
127
+ uuid: readUuidString(buf, 56),
128
+ tableLBA: buf.readBigUInt64LE(72),
129
+ partitions: buf.readUInt32LE(80),
130
+ partitionSize: buf.readUInt32LE(84),
131
+ partitionCRC32: buf.readUInt32LE(88)
132
+ };
133
+ }
134
+ //#endregion
135
+ //#region src/mbrPart.ts
136
+ const partTypes = {
137
+ EMPTY: 0,
138
+ EXTENDED: 5,
139
+ NTFS: 7,
140
+ LINUX_SWAP: 130,
141
+ LINUX: 131,
142
+ LINUX_EXTENDED: 133,
143
+ LINUX_LVM: 142,
144
+ GPT: 238,
145
+ EFI: 239,
146
+ LINUX_RAID: 253,
147
+ getName: function(val) {
148
+ return Object.entries(this).reduce((acc, [k, v]) => {
149
+ if (typeof v === "number" && v === val) return k;
150
+ return acc;
151
+ }, "Unknown");
152
+ }
153
+ };
154
+ function parseMBR(mbr) {
155
+ if (mbr.length < 512 || mbr[510] !== 85 || mbr[511] !== 170) throw Error("no MBR signature or buffer is less than 512 bytes");
156
+ const ret = {
157
+ copyProtected: !!(mbr[444] === 90 && mbr[444] === 90),
158
+ uuid: Buffer.from([
159
+ mbr[443],
160
+ mbr[442],
161
+ mbr[441],
162
+ mbr[440]
163
+ ]).toString("hex"),
164
+ partitions: [],
165
+ type: "MBR"
166
+ };
167
+ for (let i = 446; i <= 508; i += 16) ret.partitions.push(parseMBRPartition(mbr.slice(i, i + 16)));
168
+ return ret;
169
+ }
170
+ function parseMBRPartition(part) {
171
+ const startLBA = part.readUInt32LE(8);
172
+ const partitionSize = part.readUInt32LE(12);
173
+ return {
174
+ active: part.readUInt8(0) === 128,
175
+ type: part.readUInt8(4),
176
+ startLBA,
177
+ partitionSize,
178
+ endLBA: startLBA + partitionSize
179
+ };
180
+ }
181
+ function isMbrPartition(part) {
182
+ return typeof part.type === "number";
183
+ }
184
+ //#endregion
185
+ //#region src/util.ts
186
+ function readFile(fd, offset, length, position) {
187
+ return new Promise((resolve, reject) => {
188
+ const buffer = Buffer.allocUnsafe(length);
189
+ node_fs.default.read(fd, buffer, offset, buffer.length, position, (err) => {
190
+ if (err) reject(err);
191
+ else resolve(buffer);
192
+ });
193
+ });
194
+ }
195
+ //#endregion
196
+ //#region src/scan.ts
197
+ async function scan(fd) {
198
+ const rootMbr = parseMBR(await readFile(fd, 0, 512, 0));
199
+ rootMbr.partitions.forEach(async function(p) {
200
+ if (p.type === partTypes.EXTENDED) {
201
+ if (!isMbrPartition(p)) throw TypeError("we did get GPT partition as extended");
202
+ parseMBR(await readFile(fd, 0, 512, 512)).partitions.forEach(function(extpart) {
203
+ if (!isMbrPartition(extpart)) throw TypeError("we did get GPT partition as extended");
204
+ if (extpart.type !== partTypes.EMPTY) {
205
+ extpart.startLBA = extpart.startLBA + p.startLBA;
206
+ rootMbr.partitions.push(extpart);
207
+ }
208
+ });
209
+ }
210
+ if (p.type === partTypes.GPT) {
211
+ rootMbr.type = "GPT";
212
+ const gpt = parseGPT(await readFile(fd, 0, 512, 512));
213
+ rootMbr.uuid = gpt.uuid;
214
+ const gBuff = Buffer.allocUnsafe(gpt.partitions * gpt.partitionSize);
215
+ node_fs.default.readSync(fd, gBuff, 0, gBuff.length, Number(gpt.tableLBA) * 512);
216
+ const partitions = [];
217
+ for (let i = 0; i < gpt.partitions * gpt.partitionSize; i += gpt.partitionSize) {
218
+ const table = parseGPTable(gBuff.slice(i, i + gpt.partitionSize));
219
+ if (table.typeId !== gptPartTypes.EMPTY) partitions.push(table);
220
+ }
221
+ rootMbr.partitions = partitions;
222
+ }
223
+ });
224
+ return rootMbr;
225
+ }
226
+ //#endregion
227
+ exports.Magic = Magic;
228
+ exports.scan = scan;
@@ -0,0 +1,48 @@
1
+ //#region src/Magic.d.ts
2
+ declare class Magic {
3
+ private fd;
4
+ constructor(fd: number);
5
+ haveExt(offset: number): boolean;
6
+ haveNtfs(offset: number): boolean;
7
+ haveLvm2(offset: number): boolean;
8
+ }
9
+ //#endregion
10
+ //#region src/types.d.ts
11
+ type MBRPartition = {
12
+ active: boolean;
13
+ type: number;
14
+ startLBA: number;
15
+ partitionSize: number;
16
+ endLBA: number;
17
+ };
18
+ type GPTPartition = {
19
+ typeId: string;
20
+ type: string;
21
+ uuid: string;
22
+ active: boolean;
23
+ startLBA: bigint;
24
+ endLBA: bigint;
25
+ partitionSize: bigint;
26
+ attributes: bigint;
27
+ label: string;
28
+ };
29
+ //#endregion
30
+ //#region src/mbrPart.d.ts
31
+ type GptData = {
32
+ copyProtected: boolean;
33
+ uuid: string;
34
+ type: 'GPT';
35
+ partitions: GPTPartition[];
36
+ };
37
+ type MbrData = {
38
+ copyProtected: boolean;
39
+ uuid: string;
40
+ type: 'MBR';
41
+ partitions: MBRPartition[];
42
+ };
43
+ type IMbrData = MbrData | GptData;
44
+ //#endregion
45
+ //#region src/scan.d.ts
46
+ declare function scan(fd: number): Promise<IMbrData>;
47
+ //#endregion
48
+ export { Magic, scan };
@@ -0,0 +1,48 @@
1
+ //#region src/Magic.d.ts
2
+ declare class Magic {
3
+ private fd;
4
+ constructor(fd: number);
5
+ haveExt(offset: number): boolean;
6
+ haveNtfs(offset: number): boolean;
7
+ haveLvm2(offset: number): boolean;
8
+ }
9
+ //#endregion
10
+ //#region src/types.d.ts
11
+ type MBRPartition = {
12
+ active: boolean;
13
+ type: number;
14
+ startLBA: number;
15
+ partitionSize: number;
16
+ endLBA: number;
17
+ };
18
+ type GPTPartition = {
19
+ typeId: string;
20
+ type: string;
21
+ uuid: string;
22
+ active: boolean;
23
+ startLBA: bigint;
24
+ endLBA: bigint;
25
+ partitionSize: bigint;
26
+ attributes: bigint;
27
+ label: string;
28
+ };
29
+ //#endregion
30
+ //#region src/mbrPart.d.ts
31
+ type GptData = {
32
+ copyProtected: boolean;
33
+ uuid: string;
34
+ type: 'GPT';
35
+ partitions: GPTPartition[];
36
+ };
37
+ type MbrData = {
38
+ copyProtected: boolean;
39
+ uuid: string;
40
+ type: 'MBR';
41
+ partitions: MBRPartition[];
42
+ };
43
+ type IMbrData = MbrData | GptData;
44
+ //#endregion
45
+ //#region src/scan.d.ts
46
+ declare function scan(fd: number): Promise<IMbrData>;
47
+ //#endregion
48
+ export { Magic, scan };
package/dist/index.mjs ADDED
@@ -0,0 +1,203 @@
1
+ import fs from "node:fs";
2
+ //#region src/Magic.ts
3
+ var Magic = class {
4
+ constructor(fd) {
5
+ this.fd = fd;
6
+ }
7
+ haveExt(offset) {
8
+ const data = Buffer.allocUnsafe(2048);
9
+ fs.readSync(this.fd, data, 0, data.length, 512 * offset);
10
+ return data.readInt16BE(1080) === 21487;
11
+ }
12
+ haveNtfs(offset) {
13
+ const data = Buffer.allocUnsafe(512);
14
+ fs.readSync(this.fd, data, 0, data.length, 512 * offset);
15
+ return data.readInt32BE(3) === 1314145875;
16
+ }
17
+ haveLvm2(offset) {
18
+ const data = Buffer.allocUnsafe(1024);
19
+ fs.readSync(this.fd, data, 0, data.length, 512 * offset);
20
+ return data.readInt32BE(536) === 1280724274;
21
+ }
22
+ };
23
+ //#endregion
24
+ //#region src/gptPart.ts
25
+ const EFI_PART = Buffer.from([
26
+ 69,
27
+ 70,
28
+ 73,
29
+ 32,
30
+ 80,
31
+ 65,
32
+ 82,
33
+ 84
34
+ ]);
35
+ const gptPartTypes = Object.freeze({
36
+ EMPTY: "00000000-0000-0000-0000-000000000000",
37
+ MBR: "024dee41-33e7-11d3-9d69-0008c781f39f",
38
+ EFI: "c12a7328-f81f-11d2-ba4b-00a0c93ec93b",
39
+ LINUX: "0fc63daf-8483-4772-8e79-3d69d8477de4",
40
+ LINUX_SWAP: "0657fd6d-a4ab-43c4-84e5-0933c84b4f4f",
41
+ LINUX_LVM: "e6d6d379-f507-44c2-a23c-238f2a3df928",
42
+ LINUX_RAID: "a19d880f-05fc-4d3b-a006-743f0f84911e",
43
+ MSR: "e3c9e316-0b5c-4db8-817d-f92df00215ae",
44
+ BASIC_DATA: "ebd0a0a2-b9e5-4433-87c0-68b6b72699c7",
45
+ getName: function(val) {
46
+ return Object.entries(this).reduce((acc, [k, v]) => {
47
+ if (typeof v === "string" && v === val) return k;
48
+ return acc;
49
+ }, "Unknown");
50
+ }
51
+ });
52
+ function readUuidBytes(buf, pos) {
53
+ return Buffer.from([
54
+ buf[pos + 3],
55
+ buf[pos + 2],
56
+ buf[pos + 1],
57
+ buf[pos + 0],
58
+ buf[pos + 5],
59
+ buf[pos + 4],
60
+ buf[pos + 7],
61
+ buf[pos + 6],
62
+ buf[pos + 8],
63
+ buf[pos + 9],
64
+ buf[pos + 10],
65
+ buf[pos + 11],
66
+ buf[pos + 12],
67
+ buf[pos + 13],
68
+ buf[pos + 14],
69
+ buf[pos + 15]
70
+ ]);
71
+ }
72
+ function readUuidString(buf, pos) {
73
+ const uuid = readUuidBytes(buf, pos).toString("hex");
74
+ return `${uuid.slice(0, 8)}-${uuid.slice(8, 12)}-${uuid.slice(12, 16)}-${uuid.slice(16, 20)}-${uuid.slice(20, 32)}`;
75
+ }
76
+ function parseGPTable(buf) {
77
+ const typeId = readUuidString(buf, 0);
78
+ const uuid = readUuidString(buf, 16);
79
+ const startLBA = buf.readBigUInt64LE(32);
80
+ const endLBA = buf.readBigUInt64LE(40);
81
+ return {
82
+ typeId,
83
+ type: gptPartTypes.getName(typeId),
84
+ uuid,
85
+ active: uuid !== gptPartTypes.EMPTY,
86
+ startLBA,
87
+ endLBA,
88
+ partitionSize: endLBA - startLBA + 1n,
89
+ attributes: buf.readBigUInt64BE(48),
90
+ label: buf.subarray(56, 128).toString("utf16le").split("\0", 1)[0]
91
+ };
92
+ }
93
+ function parseGPT(buf) {
94
+ if (buf.indexOf(EFI_PART) !== 0) throw Error("not GTP entry");
95
+ return {
96
+ revision: `${buf[8]}.${buf[9]}.${buf[10]}.${buf[11]}`,
97
+ headerSize: buf.readUInt32LE(12),
98
+ headerCRC32: buf.readUInt32LE(16),
99
+ currentLBA: buf.readBigUInt64LE(24),
100
+ backupLBA: buf.readBigUInt64LE(32),
101
+ firstUsableLBA: buf.readBigUInt64LE(40),
102
+ lastUsableLBA: buf.readBigUInt64LE(48),
103
+ uuid: readUuidString(buf, 56),
104
+ tableLBA: buf.readBigUInt64LE(72),
105
+ partitions: buf.readUInt32LE(80),
106
+ partitionSize: buf.readUInt32LE(84),
107
+ partitionCRC32: buf.readUInt32LE(88)
108
+ };
109
+ }
110
+ //#endregion
111
+ //#region src/mbrPart.ts
112
+ const partTypes = {
113
+ EMPTY: 0,
114
+ EXTENDED: 5,
115
+ NTFS: 7,
116
+ LINUX_SWAP: 130,
117
+ LINUX: 131,
118
+ LINUX_EXTENDED: 133,
119
+ LINUX_LVM: 142,
120
+ GPT: 238,
121
+ EFI: 239,
122
+ LINUX_RAID: 253,
123
+ getName: function(val) {
124
+ return Object.entries(this).reduce((acc, [k, v]) => {
125
+ if (typeof v === "number" && v === val) return k;
126
+ return acc;
127
+ }, "Unknown");
128
+ }
129
+ };
130
+ function parseMBR(mbr) {
131
+ if (mbr.length < 512 || mbr[510] !== 85 || mbr[511] !== 170) throw Error("no MBR signature or buffer is less than 512 bytes");
132
+ const ret = {
133
+ copyProtected: !!(mbr[444] === 90 && mbr[444] === 90),
134
+ uuid: Buffer.from([
135
+ mbr[443],
136
+ mbr[442],
137
+ mbr[441],
138
+ mbr[440]
139
+ ]).toString("hex"),
140
+ partitions: [],
141
+ type: "MBR"
142
+ };
143
+ for (let i = 446; i <= 508; i += 16) ret.partitions.push(parseMBRPartition(mbr.slice(i, i + 16)));
144
+ return ret;
145
+ }
146
+ function parseMBRPartition(part) {
147
+ const startLBA = part.readUInt32LE(8);
148
+ const partitionSize = part.readUInt32LE(12);
149
+ return {
150
+ active: part.readUInt8(0) === 128,
151
+ type: part.readUInt8(4),
152
+ startLBA,
153
+ partitionSize,
154
+ endLBA: startLBA + partitionSize
155
+ };
156
+ }
157
+ function isMbrPartition(part) {
158
+ return typeof part.type === "number";
159
+ }
160
+ //#endregion
161
+ //#region src/util.ts
162
+ function readFile(fd, offset, length, position) {
163
+ return new Promise((resolve, reject) => {
164
+ const buffer = Buffer.allocUnsafe(length);
165
+ fs.read(fd, buffer, offset, buffer.length, position, (err) => {
166
+ if (err) reject(err);
167
+ else resolve(buffer);
168
+ });
169
+ });
170
+ }
171
+ //#endregion
172
+ //#region src/scan.ts
173
+ async function scan(fd) {
174
+ const rootMbr = parseMBR(await readFile(fd, 0, 512, 0));
175
+ rootMbr.partitions.forEach(async function(p) {
176
+ if (p.type === partTypes.EXTENDED) {
177
+ if (!isMbrPartition(p)) throw TypeError("we did get GPT partition as extended");
178
+ parseMBR(await readFile(fd, 0, 512, 512)).partitions.forEach(function(extpart) {
179
+ if (!isMbrPartition(extpart)) throw TypeError("we did get GPT partition as extended");
180
+ if (extpart.type !== partTypes.EMPTY) {
181
+ extpart.startLBA = extpart.startLBA + p.startLBA;
182
+ rootMbr.partitions.push(extpart);
183
+ }
184
+ });
185
+ }
186
+ if (p.type === partTypes.GPT) {
187
+ rootMbr.type = "GPT";
188
+ const gpt = parseGPT(await readFile(fd, 0, 512, 512));
189
+ rootMbr.uuid = gpt.uuid;
190
+ const gBuff = Buffer.allocUnsafe(gpt.partitions * gpt.partitionSize);
191
+ fs.readSync(fd, gBuff, 0, gBuff.length, Number(gpt.tableLBA) * 512);
192
+ const partitions = [];
193
+ for (let i = 0; i < gpt.partitions * gpt.partitionSize; i += gpt.partitionSize) {
194
+ const table = parseGPTable(gBuff.slice(i, i + gpt.partitionSize));
195
+ if (table.typeId !== gptPartTypes.EMPTY) partitions.push(table);
196
+ }
197
+ rootMbr.partitions = partitions;
198
+ }
199
+ });
200
+ return rootMbr;
201
+ }
202
+ //#endregion
203
+ export { Magic, scan };
package/package.json CHANGED
@@ -1,62 +1,57 @@
1
1
  {
2
- "name": "mharj-diskinfo",
3
- "version": "0.1.0",
4
- "description": "",
5
- "main": "./dist/index.js",
6
- "scripts": {
7
- "build": "tsc",
8
- "prepublishOnly": "npm run build",
9
- "test": "mocha"
10
- },
11
- "mocha": {
12
- "exit": true,
13
- "extension": [
14
- "ts",
15
- "js"
16
- ],
17
- "recursive": true,
18
- "require": [
19
- "ts-node/register",
20
- "source-map-support/register"
21
- ],
22
- "reporters": [
23
- "spec",
24
- "mocha-junit-reporter"
25
- ]
26
- },
27
- "repository": {
28
- "type": "git",
29
- "url": "git+https://github.com/mharj/diskinfo.git"
30
- },
31
- "files": [
32
- "dist"
33
- ],
34
- "engines": {
35
- "node": ">=10.4.0"
36
- },
37
- "author": "mharj",
38
- "license": "LGPL",
39
- "bugs": {
40
- "url": "https://github.com/mharj/diskinfo/issues"
41
- },
42
- "homepage": "https://github.com/mharj/diskinfo#readme",
43
- "devDependencies": {
44
- "@types/buffer-crc32": "^0.2.0",
45
- "@types/chai": "^4.2.21",
46
- "@types/mocha": "^9.0.0",
47
- "@types/node": "^16.7.1",
48
- "@types/uuid-parse": "^1.0.0",
49
- "buffer-crc32": "^0.2.13",
50
- "chai": "^4.0.2",
51
- "eslint": "^7.32.0",
52
- "eslint-config-google": "^0.14.0",
53
- "mocha": "^9.1.0",
54
- "source-map-support": "^0.5.19",
55
- "ts-node": "^10.2.1",
56
- "typescript": "^4.3.5"
57
- },
58
- "dependencies": {
59
- "iconv-lite": "^0.6.3",
60
- "uuid-parse": "^1.0.0"
61
- }
2
+ "name": "mharj-diskinfo",
3
+ "version": "0.2.0",
4
+ "description": "Node.js library to parse MBR and GPT partition information from disk images or devices.",
5
+ "main": "./dist/index.cjs",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.mts",
8
+ "exports": {
9
+ "import": {
10
+ "types": "./dist/index.d.mts",
11
+ "default": "./dist/index.mjs"
12
+ },
13
+ "require": {
14
+ "types": "./dist/index.d.cts",
15
+ "default": "./dist/index.cjs"
16
+ },
17
+ "default": "./dist/index.mjs"
18
+ },
19
+ "scripts": {
20
+ "prepare": "lefthook install",
21
+ "build": "tsdown src/index.ts --format cjs,esm --dts --clean",
22
+ "prepublishOnly": "npm run build",
23
+ "test": "vitest test --typecheck --run --no-isolate --coverage",
24
+ "coverage": "vitest test --run --no-isolate --reporter=dot --coverage --coverage.reporter=lcov",
25
+ "lint": "biome check",
26
+ "validate": "tsc --noEmit --project tsconfig.test.json"
27
+ },
28
+ "repository": "github:mharj/diskinfo",
29
+ "files": [
30
+ "dist"
31
+ ],
32
+ "engines": {
33
+ "node": ">=10.4.0"
34
+ },
35
+ "author": "mharj",
36
+ "license": "LGPL",
37
+ "bugs": {
38
+ "url": "https://github.com/mharj/diskinfo/issues"
39
+ },
40
+ "homepage": "https://github.com/mharj/diskinfo#readme",
41
+ "devDependencies": {
42
+ "@biomejs/biome": "^2.4.15",
43
+ "@tsconfig/node16": "^16.1.8",
44
+ "@types/buffer-crc32": "^0.2.0",
45
+ "@types/node": "^22.19.1",
46
+ "@vitest/coverage-v8": "^4.1.6",
47
+ "buffer-crc32": "^0.2.13",
48
+ "c8": "^11.0.0",
49
+ "lefthook": "^2.1.6",
50
+ "tsdown": "^0.22.0",
51
+ "tslib": "^2.8.1",
52
+ "typescript": "^6.0.3",
53
+ "vite": "^8.0.12",
54
+ "vitest": "^4.1.6"
55
+ },
56
+ "packageManager": "pnpm@10.33.4+sha512.1c67b3b359b2d408119ba1ed289f34b8fc3c6873412bec6fd264fbdc82489e510fcbecb9ce9d22dae7f3b76269d8441046014bdca53b9979cd7a561ad631b800"
62
57
  }
package/dist/gptPart.d.ts DELETED
@@ -1,31 +0,0 @@
1
- /// <reference types="node" />
2
- import { GPTPartition, MBRPartition } from './types';
3
- export declare const gptPartTypes: Readonly<{
4
- EMPTY: string;
5
- MBR: string;
6
- EFI: string;
7
- LINUX: string;
8
- LINUX_SWAP: string;
9
- LINUX_LVM: string;
10
- LINUX_RAID: string;
11
- MSR: string;
12
- BASIC_DATA: string;
13
- getName: (val: string) => string;
14
- }>;
15
- export interface IGtpData {
16
- revision: string;
17
- headerSize: number;
18
- headerCRC32: number;
19
- currentLBA: bigint;
20
- backupLBA: bigint;
21
- firstUsableLBA: bigint;
22
- lastUsableLBA: bigint;
23
- uuid: string;
24
- tableLBA: bigint;
25
- partitions: number;
26
- partitionSize: number;
27
- partitionCRC32: number;
28
- }
29
- export declare function parseGPTable(buf: Buffer): GPTPartition;
30
- export declare function parseGPT(buf: Buffer): IGtpData;
31
- export declare function isGptPartition(part: MBRPartition | GPTPartition): part is GPTPartition;
package/dist/gptPart.js DELETED
@@ -1,91 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isGptPartition = exports.parseGPT = exports.parseGPTable = exports.gptPartTypes = void 0;
4
- const uuidParse = require("uuid-parse");
5
- const iconv = require("iconv-lite");
6
- const EFI_PART = Buffer.from([0x45, 0x46, 0x49, 0x20, 0x50, 0x41, 0x52, 0x54]);
7
- exports.gptPartTypes = Object.freeze({
8
- EMPTY: '00000000-0000-0000-0000-000000000000',
9
- MBR: '024dee41-33e7-11d3-9d69-0008c781f39f',
10
- EFI: 'c12a7328-f81f-11d2-ba4b-00a0c93ec93b',
11
- LINUX: '0fc63daf-8483-4772-8e79-3d69d8477de4',
12
- LINUX_SWAP: '0657fd6d-a4ab-43c4-84e5-0933c84b4f4f',
13
- LINUX_LVM: 'e6d6d379-f507-44c2-a23c-238f2a3df928',
14
- LINUX_RAID: 'a19d880f-05fc-4d3b-a006-743f0f84911e',
15
- MSR: 'e3c9e316-0b5c-4db8-817d-f92df00215ae',
16
- BASIC_DATA: 'ebd0a0a2-b9e5-4433-87c0-68b6b72699c7',
17
- getName: function (val) {
18
- // print names for values
19
- for (let k in exports.gptPartTypes) {
20
- if (exports.gptPartTypes[k] === val) {
21
- return k;
22
- }
23
- }
24
- return 'Unknown';
25
- },
26
- });
27
- function readUuidBytes(buf, pos) {
28
- return Buffer.from([
29
- buf[pos + 3],
30
- buf[pos + 2],
31
- buf[pos + 1],
32
- buf[pos + 0],
33
- buf[pos + 5],
34
- buf[pos + 4],
35
- buf[pos + 7],
36
- buf[pos + 6],
37
- buf[pos + 8],
38
- buf[pos + 9],
39
- buf[pos + 10],
40
- buf[pos + 11],
41
- buf[pos + 12],
42
- buf[pos + 13],
43
- buf[pos + 14],
44
- buf[pos + 15],
45
- ]);
46
- }
47
- function parseGPTable(buf) {
48
- const typeId = uuidParse.unparse(readUuidBytes(buf, 0));
49
- const uuid = uuidParse.unparse(readUuidBytes(buf, 16));
50
- const startLBA = buf.readBigUInt64LE(32);
51
- const endLBA = buf.readBigUInt64LE(40);
52
- return {
53
- typeId,
54
- type: exports.gptPartTypes.getName(typeId),
55
- uuid,
56
- active: uuid == exports.gptPartTypes.EMPTY ? false : true,
57
- startLBA,
58
- endLBA,
59
- partitionSize: endLBA - startLBA + 1n,
60
- attributes: buf.readBigUInt64BE(48),
61
- label: iconv.decode(buf.slice(56, 128), 'utf16le').split('\u0000')[0], // bit hack in here
62
- };
63
- }
64
- exports.parseGPTable = parseGPTable;
65
- function parseGPT(buf) {
66
- // https://en.wikipedia.org/wiki/GUID_Partition_Table
67
- if (buf.indexOf(EFI_PART) != 0) {
68
- throw Error('not GTP entry');
69
- }
70
- return {
71
- revision: buf[8] + '.' + buf[9] + '.' + buf[10] + '.' + buf[11],
72
- headerSize: buf.readUInt32LE(12),
73
- headerCRC32: buf.readUInt32LE(16),
74
- // buf.readUInt32LE(20); // reserved; must be zero
75
- currentLBA: buf.readBigUInt64LE(24),
76
- backupLBA: buf.readBigUInt64LE(32),
77
- firstUsableLBA: buf.readBigUInt64LE(40),
78
- lastUsableLBA: buf.readBigUInt64LE(48),
79
- uuid: uuidParse.unparse(readUuidBytes(buf, 56)),
80
- tableLBA: buf.readBigUInt64LE(72),
81
- partitions: buf.readUInt32LE(80),
82
- partitionSize: buf.readUInt32LE(84),
83
- partitionCRC32: buf.readUInt32LE(88),
84
- };
85
- }
86
- exports.parseGPT = parseGPT;
87
- function isGptPartition(part) {
88
- return typeof part.type === 'string';
89
- }
90
- exports.isGptPartition = isGptPartition;
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3B0UGFydC5qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImdwdFBhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0NBQXdDO0FBQ3hDLG9DQUFvQztBQUdwQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFFbEUsUUFBQSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN6QyxLQUFLLEVBQUUsc0NBQXNDO0lBQzdDLEdBQUcsRUFBRSxzQ0FBc0M7SUFDM0MsR0FBRyxFQUFFLHNDQUFzQztJQUMzQyxLQUFLLEVBQUUsc0NBQXNDO0lBQzdDLFVBQVUsRUFBRSxzQ0FBc0M7SUFDbEQsU0FBUyxFQUFFLHNDQUFzQztJQUNqRCxVQUFVLEVBQUUsc0NBQXNDO0lBQ2xELEdBQUcsRUFBRSxzQ0FBc0M7SUFDM0MsVUFBVSxFQUFFLHNDQUFzQztJQUNsRCxPQUFPLEVBQUUsVUFBVSxHQUFXO1FBQzdCLHlCQUF5QjtRQUN6QixLQUFLLElBQUksQ0FBQyxJQUFJLG9CQUFZLEVBQUU7WUFDM0IsSUFBSSxvQkFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtnQkFDNUIsT0FBTyxDQUFDLENBQUM7YUFDVDtTQUNEO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbEIsQ0FBQztDQUNELENBQUMsQ0FBQztBQWlCSCxTQUFTLGFBQWEsQ0FBQyxHQUFXLEVBQUUsR0FBVztJQUM5QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDbEIsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNaLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1osR0FBRyxD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QUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMvQyxRQUFRLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7UUFDakMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ2hDLGFBQWEsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxjQUFjLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7S0FDcEMsQ0FBQztBQUNILENBQUM7QUFwQkQsNEJBb0JDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLElBQWlDO0lBQy9ELE9BQU8sT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztBQUN0QyxDQUFDO0FBRkQsd0NBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dWlkUGFyc2UgZnJvbSAndXVpZC1wYXJzZSc7XG5pbXBvcnQgKiBhcyBpY29udiBmcm9tICdpY29udi1saXRlJztcbmltcG9ydCB7R1BUUGFydGl0aW9uLCBNQlJQYXJ0aXRpb259IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBFRklfUEFSVCA9IEJ1ZmZlci5mcm9tKFsweDQ1LCAweDQ2LCAweDQ5LCAweDIwLCAweDUwLCAweDQxLCAweDUyLCAweDU0XSk7XG5cbmV4cG9ydCBjb25zdCBncHRQYXJ0VHlwZXMgPSBPYmplY3QuZnJlZXplKHtcblx0RU1QVFk6ICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnLFxuXHRNQlI6ICcwMjRkZWU0MS0zM2U3LTExZDMtOWQ2OS0wMDA4Yzc4MWYzOWYnLFxuXHRFRkk6ICdjMTJhNzMyOC1mODFmLTExZDItYmE0Yi0wMGEwYzkzZWM5M2InLFxuXHRMSU5VWDogJzBmYzYzZGFmLTg0ODMtNDc3Mi04ZTc5LTNkNjlkODQ3N2RlNCcsXG5cdExJTlVYX1NXQVA6ICcwNjU3ZmQ2ZC1hNGFiLTQzYzQtODRlNS0wOTMzYzg0YjRmNGYnLFxuXHRMSU5VWF9MVk06ICdlNmQ2ZDM3OS1mNTA3LTQ0YzItYTIzYy0yMzhmMmEzZGY5MjgnLFxuXHRMSU5VWF9SQUlEOiAnYTE5ZDg4MGYtMDVmYy00ZDNiLWEwMDYtNzQzZjBmODQ5MTFlJyxcblx0TVNSOiAnZTNjOWUzMTYtMGI1Yy00ZGI4LTgxN2QtZjkyZGYwMDIxNWFlJyxcblx0QkFTSUNfREFUQTogJ2ViZDBhMGEyLWI5ZTUtNDQzMy04N2MwLTY4YjZiNzI2OTljNycsXG5cdGdldE5hbWU6IGZ1bmN0aW9uICh2YWw6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Ly8gcHJpbnQgbmFtZXMgZm9yIHZhbHVlc1xuXHRcdGZvciAobGV0IGsgaW4gZ3B0UGFydFR5cGVzKSB7XG5cdFx0XHRpZiAoZ3B0UGFydFR5cGVzW2tdID09PSB2YWwpIHtcblx0XHRcdFx0cmV0dXJuIGs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAnVW5rbm93bic7XG5cdH0sXG59KTtcblxuZXhwb3J0IGludGVyZmFjZSBJR3RwRGF0YSB7XG5cdHJldmlzaW9uOiBzdHJpbmc7XG5cdGhlYWRlclNpemU6IG51bWJlcjtcblx0aGVhZGVyQ1JDMzI6IG51bWJlcjtcblx0Y3VycmVudExCQTogYmlnaW50O1xuXHRiYWNrdXBMQkE6IGJpZ2ludDtcblx0Zmlyc3RVc2FibGVMQkE6IGJpZ2ludDtcblx0bGFzdFVzYWJsZUxCQTogYmlnaW50O1xuXHR1dWlkOiBzdHJpbmc7XG5cdHRhYmxlTEJBOiBiaWdpbnQ7XG5cdHBhcnRpdGlvbnM6IG51bWJlcjtcblx0cGFydGl0aW9uU2l6ZTogbnVtYmVyO1xuXHRwYXJ0aXRpb25DUkMzMjogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiByZWFkVXVpZEJ5dGVzKGJ1ZjogQnVmZmVyLCBwb3M6IG51bWJlcikge1xuXHRyZXR1cm4gQnVmZmVyLmZyb20oW1xuXHRcdGJ1Zltwb3MgKyAzXSxcblx0XHRidWZbcG9zICsgMl0sXG5cdFx0YnVmW3BvcyArIDFdLFxuXHRcdGJ1Zltwb3MgKyAwXSxcblx0XHRidWZbcG9zICsgNV0sXG5cdFx0YnVmW3BvcyArIDRdLFxuXHRcdGJ1Zltwb3MgKyA3XSxcblx0XHRidWZbcG9zICsgNl0sXG5cdFx0YnVmW3BvcyArIDhdLFxuXHRcdGJ1Zltwb3MgKyA5XSxcblx0XHRidWZbcG9zICsgMTBdLFxuXHRcdGJ1Zltwb3MgKyAxMV0sXG5cdFx0YnVmW3BvcyArIDEyXSxcblx0XHRidWZbcG9zICsgMTNdLFxuXHRcdGJ1Zltwb3MgKyAxNF0sXG5cdFx0YnVmW3BvcyArIDE1XSxcblx0XSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUdQVGFibGUoYnVmOiBCdWZmZXIpOiBHUFRQYXJ0aXRpb24ge1xuXHRjb25zdCB0eXBlSWQgPSB1dWlkUGFyc2UudW5wYXJzZShyZWFkVXVpZEJ5dGVzKGJ1ZiwgMCkpO1xuXHRjb25zdCB1dWlkID0gdXVpZFBhcnNlLnVucGFyc2UocmVhZFV1aWRCeXRlcyhidWYsIDE2KSk7XG5cdGNvbnN0IHN0YXJ0TEJBID0gYnVmLnJlYWRCaWdVSW50NjRMRSgzMik7XG5cdGNvbnN0IGVuZExCQSA9IGJ1Zi5yZWFkQmlnVUludDY0TEUoNDApO1xuXHRyZXR1cm4ge1xuXHRcdHR5cGVJZCxcblx0XHR0eXBlOiBncHRQYXJ0VHlwZXMuZ2V0TmFtZSh0eXBlSWQpLFxuXHRcdHV1aWQsXG5cdFx0YWN0aXZlOiB1dWlkID09IGdwdFBhcnRUeXBlcy5FTVBUWSA/IGZhbHNlIDogdHJ1ZSxcblx0XHRzdGFydExCQSxcblx0XHRlbmRMQkEsXG5cdFx0cGFydGl0aW9uU2l6ZTogZW5kTEJBIC0gc3RhcnRMQkEgKyAxbiwgLy8gKzE/XG5cdFx0YXR0cmlidXRlczogYnVmLnJlYWRCaWdVSW50NjRCRSg0OCksXG5cdFx0bGFiZWw6IGljb252LmRlY29kZShidWYuc2xpY2UoNTYsIDEyOCksICd1dGYxNmxlJykuc3BsaXQoJ1xcdTAwMDAnKVswXSwgLy8gYml0IGhhY2sgaW4gaGVyZVxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VHUFQoYnVmOiBCdWZmZXIpOiBJR3RwRGF0YSB7XG5cdC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dVSURfUGFydGl0aW9uX1RhYmxlXG5cdGlmIChidWYuaW5kZXhPZihFRklfUEFSVCkgIT0gMCkge1xuXHRcdHRocm93IEVycm9yKCdub3QgR1RQIGVudHJ5Jyk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRyZXZpc2lvbjogYnVmWzhdICsgJy4nICsgYnVmWzldICsgJy4nICsgYnVmWzEwXSArICcuJyArIGJ1ZlsxMV0sXG5cdFx0aGVhZGVyU2l6ZTogYnVmLnJlYWRVSW50MzJMRSgxMiksXG5cdFx0aGVhZGVyQ1JDMzI6IGJ1Zi5yZWFkVUludDMyTEUoMTYpLFxuXHRcdC8vIGJ1Zi5yZWFkVUludDMyTEUoMjApOyAvLyByZXNlcnZlZDsgbXVzdCBiZSB6ZXJvXG5cdFx0Y3VycmVudExCQTogYnVmLnJlYWRCaWdVSW50NjRMRSgyNCksXG5cdFx0YmFja3VwTEJBOiBidWYucmVhZEJpZ1VJbnQ2NExFKDMyKSxcblx0XHRmaXJzdFVzYWJsZUxCQTogYnVmLnJlYWRCaWdVSW50NjRMRSg0MCksXG5cdFx0bGFzdFVzYWJsZUxCQTogYnVmLnJlYWRCaWdVSW50NjRMRSg0OCksXG5cdFx0dXVpZDogdXVpZFBhcnNlLnVucGFyc2UocmVhZFV1aWRCeXRlcyhidWYsIDU2KSksXG5cdFx0dGFibGVMQkE6IGJ1Zi5yZWFkQmlnVUludDY0TEUoNzIpLFxuXHRcdHBhcnRpdGlvbnM6IGJ1Zi5yZWFkVUludDMyTEUoODApLFxuXHRcdHBhcnRpdGlvblNpemU6IGJ1Zi5yZWFkVUludDMyTEUoODQpLFxuXHRcdHBhcnRpdGlvbkNSQzMyOiBidWYucmVhZFVJbnQzMkxFKDg4KSxcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzR3B0UGFydGl0aW9uKHBhcnQ6IE1CUlBhcnRpdGlvbiB8IEdQVFBhcnRpdGlvbik6IHBhcnQgaXMgR1BUUGFydGl0aW9uIHtcblx0cmV0dXJuIHR5cGVvZiBwYXJ0LnR5cGUgPT09ICdzdHJpbmcnO1xufVxuIl19
package/dist/index.d.ts DELETED
@@ -1,9 +0,0 @@
1
- import { IMbrData } from './mbrPart';
2
- export declare function scan(fd: number): Promise<IMbrData>;
3
- export declare class Magic {
4
- private fd;
5
- constructor(fd: number);
6
- haveExt(offset: number): boolean;
7
- haveNtfs(offset: number): boolean;
8
- haveLvm2(offset: number): boolean;
9
- }
package/dist/index.js DELETED
@@ -1,69 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Magic = exports.scan = void 0;
4
- const fs = require("fs");
5
- const gptPart_1 = require("./gptPart");
6
- const mbrPart_1 = require("./mbrPart");
7
- const util_1 = require("./util");
8
- async function scan(fd) {
9
- const buffer = await util_1.readFile(fd, 0, 512, 0);
10
- let rootMbr = mbrPart_1.parseMBR(buffer);
11
- rootMbr.partitions.forEach(async function (p) {
12
- if (p.type == mbrPart_1.partTypes.EXTENDED) {
13
- // Extended partition reading
14
- if (!mbrPart_1.isMbrPartition(p)) {
15
- throw TypeError('we did get GPT partition as extended');
16
- }
17
- let extparts = mbrPart_1.parseMBR(await util_1.readFile(fd, 0, 512, 512));
18
- extparts.partitions.forEach(function (extpart) {
19
- if (!mbrPart_1.isMbrPartition(extpart)) {
20
- throw TypeError('we did get GPT partition as extended');
21
- }
22
- if (extpart.type != mbrPart_1.partTypes.EMPTY) {
23
- extpart.startLBA = extpart.startLBA + p.startLBA;
24
- rootMbr.partitions.push(extpart);
25
- }
26
- });
27
- }
28
- if (p.type == mbrPart_1.partTypes.GPT) {
29
- rootMbr.type = 'GPT';
30
- // GPT partition table reading
31
- let gpt = gptPart_1.parseGPT(await util_1.readFile(fd, 0, 512, 512));
32
- rootMbr.uuid = gpt.uuid;
33
- let gBuff = Buffer.allocUnsafe(gpt.partitions * gpt.partitionSize);
34
- fs.readSync(fd, gBuff, 0, gBuff.length, Number(gpt.tableLBA) * 512);
35
- let partitions = [];
36
- for (let i = 0; i < gpt.partitions * gpt.partitionSize; i += gpt.partitionSize) {
37
- let table = gptPart_1.parseGPTable(gBuff.slice(i, i + gpt.partitionSize));
38
- if (table.typeId != gptPart_1.gptPartTypes.EMPTY) {
39
- partitions.push(table);
40
- }
41
- }
42
- rootMbr.partitions = partitions;
43
- }
44
- });
45
- return rootMbr;
46
- }
47
- exports.scan = scan;
48
- class Magic {
49
- constructor(fd) {
50
- this.fd = fd;
51
- }
52
- haveExt(offset) {
53
- let data = Buffer.allocUnsafe(2048);
54
- fs.readSync(this.fd, data, 0, data.length, 512 * offset);
55
- return data.readInt16BE(1080) == 0x53ef;
56
- }
57
- haveNtfs(offset) {
58
- let data = Buffer.allocUnsafe(512);
59
- fs.readSync(this.fd, data, 0, data.length, 512 * offset);
60
- return data.readInt32BE(3) == 0x4e544653;
61
- }
62
- haveLvm2(offset) {
63
- let data = Buffer.allocUnsafe(1024);
64
- fs.readSync(this.fd, data, 0, data.length, 512 * offset);
65
- return data.readInt32BE(536) == 0x4c564d32;
66
- }
67
- }
68
- exports.Magic = Magic;
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsdUNBQStEO0FBQy9ELHVDQUF3RTtBQUV4RSxpQ0FBZ0M7QUFFekIsS0FBSyxVQUFVLElBQUksQ0FBQyxFQUFVO0lBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sZUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksT0FBTyxHQUFHLGtCQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxXQUFXLENBQUM7UUFDM0MsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLG1CQUFTLENBQUMsUUFBUSxFQUFFO1lBQ2pDLDZCQUE2QjtZQUM3QixJQUFJLENBQUMsd0JBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdkIsTUFBTSxTQUFTLENBQUMsc0NBQXNDLENBQUMsQ0FBQzthQUN4RDtZQUNELElBQUksUUFBUSxHQUFHLGtCQUFRLENBQUMsTUFBTSxlQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN6RCxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLE9BQU87Z0JBQzVDLElBQUksQ0FBQyx3QkFBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUM3QixNQUFNLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO2lCQUN4RDtnQkFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksbUJBQVMsQ0FBQyxLQUFLLEVBQUU7b0JBQ3BDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO29CQUNqRCxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FB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LENBQUM7Q0FDRDtBQXBCRCxzQkFvQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQge2dwdFBhcnRUeXBlcywgcGFyc2VHUFQsIHBhcnNlR1BUYWJsZX0gZnJvbSAnLi9ncHRQYXJ0JztcbmltcG9ydCB7SU1ickRhdGEsIGlzTWJyUGFydGl0aW9uLCBwYXJzZU1CUiwgcGFydFR5cGVzfSBmcm9tICcuL21iclBhcnQnO1xuaW1wb3J0IHtHUFRQYXJ0aXRpb259IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtyZWFkRmlsZX0gZnJvbSAnLi91dGlsJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNjYW4oZmQ6IG51bWJlcik6IFByb21pc2U8SU1ickRhdGE+IHtcblx0Y29uc3QgYnVmZmVyID0gYXdhaXQgcmVhZEZpbGUoZmQsIDAsIDUxMiwgMCk7XG5cdGxldCByb290TWJyID0gcGFyc2VNQlIoYnVmZmVyKTtcblx0cm9vdE1ici5wYXJ0aXRpb25zLmZvckVhY2goYXN5bmMgZnVuY3Rpb24gKHApIHtcblx0XHRpZiAocC50eXBlID09IHBhcnRUeXBlcy5FWFRFTkRFRCkge1xuXHRcdFx0Ly8gRXh0ZW5kZWQgcGFydGl0aW9uIHJlYWRpbmdcblx0XHRcdGlmICghaXNNYnJQYXJ0aXRpb24ocCkpIHtcblx0XHRcdFx0dGhyb3cgVHlwZUVycm9yKCd3ZSBkaWQgZ2V0IEdQVCBwYXJ0aXRpb24gYXMgZXh0ZW5kZWQnKTtcblx0XHRcdH1cblx0XHRcdGxldCBleHRwYXJ0cyA9IHBhcnNlTUJSKGF3YWl0IHJlYWRGaWxlKGZkLCAwLCA1MTIsIDUxMikpO1xuXHRcdFx0ZXh0cGFydHMucGFydGl0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChleHRwYXJ0KSB7XG5cdFx0XHRcdGlmICghaXNNYnJQYXJ0aXRpb24oZXh0cGFydCkpIHtcblx0XHRcdFx0XHR0aHJvdyBUeXBlRXJyb3IoJ3dlIGRpZCBnZXQgR1BUIHBhcnRpdGlvbiBhcyBleHRlbmRlZCcpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChleHRwYXJ0LnR5cGUgIT0gcGFydFR5cGVzLkVNUFRZKSB7XG5cdFx0XHRcdFx0ZXh0cGFydC5zdGFydExCQSA9IGV4dHBhcnQuc3RhcnRMQkEgKyBwLnN0YXJ0TEJBO1xuXHRcdFx0XHRcdHJvb3RNYnIucGFydGl0aW9ucy5wdXNoKGV4dHBhcnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKHAudHlwZSA9PSBwYXJ0VHlwZXMuR1BUKSB7XG5cdFx0XHRyb290TWJyLnR5cGUgPSAnR1BUJztcblx0XHRcdC8vIEdQVCBwYXJ0aXRpb24gdGFibGUgcmVhZGluZ1xuXHRcdFx0bGV0IGdwdCA9IHBhcnNlR1BUKGF3YWl0IHJlYWRGaWxlKGZkLCAwLCA1MTIsIDUxMikpO1xuXHRcdFx0cm9vdE1ici51dWlkID0gZ3B0LnV1aWQ7XG5cdFx0XHRsZXQgZ0J1ZmYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoZ3B0LnBhcnRpdGlvbnMgKiBncHQucGFydGl0aW9uU2l6ZSk7XG5cdFx0XHRmcy5yZWFkU3luYyhmZCwgZ0J1ZmYsIDAsIGdCdWZmLmxlbmd0aCwgTnVtYmVyKGdwdC50YWJsZUxCQSkgKiA1MTIpO1xuXHRcdFx0bGV0IHBhcnRpdGlvbnM6IEdQVFBhcnRpdGlvbltdID0gW107XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGdwdC5wYXJ0aXRpb25zICogZ3B0LnBhcnRpdGlvblNpemU7IGkgKz0gZ3B0LnBhcnRpdGlvblNpemUpIHtcblx0XHRcdFx0bGV0IHRhYmxlID0gcGFyc2VHUFRhYmxlKGdCdWZmLnNsaWNlKGksIGkgKyBncHQucGFydGl0aW9uU2l6ZSkpO1xuXHRcdFx0XHRpZiAodGFibGUudHlwZUlkICE9IGdwdFBhcnRUeXBlcy5FTVBUWSkge1xuXHRcdFx0XHRcdHBhcnRpdGlvbnMucHVzaCh0YWJsZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJvb3RNYnIucGFydGl0aW9ucyA9IHBhcnRpdGlvbnM7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHJvb3RNYnI7XG59XG5cbmV4cG9ydCBjbGFzcyBNYWdpYyB7XG5cdHByaXZhdGUgZmQ6IG51bWJlcjtcblx0Y29uc3RydWN0b3IoZmQ6IG51bWJlcikge1xuXHRcdHRoaXMuZmQgPSBmZDtcblx0fVxuXHRwdWJsaWMgaGF2ZUV4dChvZmZzZXQ6IG51bWJlcikge1xuXHRcdGxldCBkYXRhID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIwNDgpO1xuXHRcdGZzLnJlYWRTeW5jKHRoaXMuZmQsIGRhdGEsIDAsIGRhdGEubGVuZ3RoLCA1MTIgKiBvZmZzZXQpO1xuXHRcdHJldHVybiBkYXRhLnJlYWRJbnQxNkJFKDEwODApID09IDB4NTNlZjtcblx0fVxuXHRwdWJsaWMgaGF2ZU50ZnMob2Zmc2V0OiBudW1iZXIpIHtcblx0XHRsZXQgZGF0YSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSg1MTIpO1xuXHRcdGZzLnJlYWRTeW5jKHRoaXMuZmQsIGRhdGEsIDAsIGRhdGEubGVuZ3RoLCA1MTIgKiBvZmZzZXQpO1xuXHRcdHJldHVybiBkYXRhLnJlYWRJbnQzMkJFKDMpID09IDB4NGU1NDQ2NTM7XG5cdH1cblx0cHVibGljIGhhdmVMdm0yKG9mZnNldDogbnVtYmVyKSB7XG5cdFx0bGV0IGRhdGEgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMTAyNCk7XG5cdFx0ZnMucmVhZFN5bmModGhpcy5mZCwgZGF0YSwgMCwgZGF0YS5sZW5ndGgsIDUxMiAqIG9mZnNldCk7XG5cdFx0cmV0dXJuIGRhdGEucmVhZEludDMyQkUoNTM2KSA9PSAweDRjNTY0ZDMyO1xuXHR9XG59XG4iXX0=
package/dist/mbrPart.d.ts DELETED
@@ -1,23 +0,0 @@
1
- /// <reference types="node" />
2
- import { GPTPartition, MBRPartition } from './types';
3
- export declare const partTypes: {
4
- EMPTY: number;
5
- EXTENDED: number;
6
- NTFS: number;
7
- LINUX_SWAP: number;
8
- LINUX: number;
9
- LINUX_EXTENDED: number;
10
- LINUX_LVM: number;
11
- GPT: number;
12
- EFI: number;
13
- LINUX_RAID: number;
14
- getName: (val: number) => string;
15
- };
16
- export interface IMbrData {
17
- copyProtected: boolean;
18
- uuid: string;
19
- type: 'MBR' | 'GPT';
20
- partitions: (MBRPartition | GPTPartition)[];
21
- }
22
- export declare function parseMBR(mbr: Buffer): IMbrData;
23
- export declare function isMbrPartition(part: MBRPartition | GPTPartition): part is MBRPartition;
package/dist/mbrPart.js DELETED
@@ -1,58 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isMbrPartition = exports.parseMBR = exports.partTypes = void 0;
4
- exports.partTypes = {
5
- EMPTY: 0x00,
6
- EXTENDED: 0x05,
7
- NTFS: 0x07,
8
- LINUX_SWAP: 0x82,
9
- LINUX: 0x83,
10
- LINUX_EXTENDED: 0x85,
11
- LINUX_LVM: 0x8e,
12
- GPT: 0xee,
13
- EFI: 0xef,
14
- LINUX_RAID: 0xfd,
15
- getName: function (val) {
16
- // print names for values
17
- for (let k in exports.partTypes) {
18
- if (exports.partTypes[k] === val) {
19
- return k;
20
- }
21
- }
22
- return 'Unknown';
23
- },
24
- };
25
- function parseMBR(mbr) {
26
- if (mbr.length < 512 || mbr[0x1fe] != 85 || mbr[0x1ff] != 170) {
27
- // MBR signature
28
- throw Error('no MBR signature or buffer is less than 512 bytes');
29
- }
30
- let ret = {
31
- copyProtected: mbr[0x1bc] == 90 && mbr[0x1bc] == 90 ? true : false,
32
- uuid: Buffer.from([mbr[0x1bb], mbr[0x1ba], mbr[0x1b9], mbr[0x1b8]]).toString('hex'),
33
- partitions: [],
34
- type: 'MBR', // as default
35
- };
36
- for (let i = 446; i <= 508; i += 16) {
37
- // MBR table blocks
38
- ret.partitions.push(parseMBRPartition(mbr.slice(i, i + 16)));
39
- }
40
- return ret;
41
- }
42
- exports.parseMBR = parseMBR;
43
- function parseMBRPartition(part) {
44
- const startLBA = part.readUInt32LE(8);
45
- const partitionSize = part.readUInt32LE(12);
46
- return {
47
- active: part.readUInt8(0) == 0x80 ? true : false,
48
- type: part.readUInt8(4),
49
- startLBA,
50
- partitionSize,
51
- endLBA: startLBA + partitionSize,
52
- };
53
- }
54
- function isMbrPartition(part) {
55
- return typeof part.type === 'number';
56
- }
57
- exports.isMbrPartition = isMbrPartition;
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWJyUGFydC5qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbIm1iclBhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRWEsUUFBQSxTQUFTLEdBQUc7SUFDeEIsS0FBSyxFQUFFLElBQUk7SUFDWCxRQUFRLEVBQUUsSUFBSTtJQUNkLElBQUksRUFBRSxJQUFJO0lBQ1YsVUFBVSxFQUFFLElBQUk7SUFDaEIsS0FBSyxFQUFFLElBQUk7SUFDWCxjQUFjLEVBQUUsSUFBSTtJQUNwQixTQUFTLEVBQUUsSUFBSTtJQUNmLEdBQUcsRUFBRSxJQUFJO0lBQ1QsR0FBRyxFQUFFLElBQUk7SUFDVCxVQUFVLEVBQUUsSUFBSTtJQUNoQixPQUFPLEVBQUUsVUFBVSxHQUFXO1FBQzdCLHlCQUF5QjtRQUN6QixLQUFLLElBQUksQ0FBQyxJQUFJLGlCQUFTLEVBQUU7WUFDeEIsSUFBSSxpQkFBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtnQkFDekIsT0FBTyxDQUFDLENBQUM7YUFDVDtTQUNEO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbEIsQ0FBQztDQUNELENBQUM7QUFTRixTQUFnQixRQUFRLENBQUMsR0FBVztJQUNuQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsRUFBRTtRQUM5RCxnQkFBZ0I7UUFDaEIsTUFBTSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztLQUNqRTtJQUNELElBQUksR0FBRyxHQUFhO1FBQ25CLGFBQWEsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSztRQUNsRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNuRixVQUFVLEVBQUUsRUFBRTtRQUNkLElBQUksRUFBRSxLQUFLLEVBQUUsYUFBYTtLQUMxQixDQUFDO0lBQ0YsS0FBSyxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3BDLG1CQUFtQjtRQUNuQixHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzdEO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDWixDQUFDO0FBaEJELDRCQWdCQztBQUVELFNBQVMsaUJBQWlCLENBQUMsSUFBWTtJQUN0QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUMsT0FBTztRQUNOLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO1FBQ2hELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN2QixRQUFRO1FBQ1IsYUFBYTtRQUNiLE1BQU0sRUFBRSxRQUFRLEdBQUcsYUFBYTtLQUNoQyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQWdCLGNBQWMsQ0FBQyxJQUFpQztJQUMvRCxPQUFPLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7QUFDdEMsQ0FBQztBQUZELHdDQUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtHUFRQYXJ0aXRpb24sIE1CUlBhcnRpdGlvbn0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBwYXJ0VHlwZXMgPSB7XG5cdEVNUFRZOiAweDAwLFxuXHRFWFRFTkRFRDogMHgwNSxcblx0TlRGUzogMHgwNyxcblx0TElOVVhfU1dBUDogMHg4Mixcblx0TElOVVg6IDB4ODMsXG5cdExJTlVYX0VYVEVOREVEOiAweDg1LFxuXHRMSU5VWF9MVk06IDB4OGUsXG5cdEdQVDogMHhlZSxcblx0RUZJOiAweGVmLFxuXHRMSU5VWF9SQUlEOiAweGZkLFxuXHRnZXROYW1lOiBmdW5jdGlvbiAodmFsOiBudW1iZXIpOiBzdHJpbmcge1xuXHRcdC8vIHByaW50IG5hbWVzIGZvciB2YWx1ZXNcblx0XHRmb3IgKGxldCBrIGluIHBhcnRUeXBlcykge1xuXHRcdFx0aWYgKHBhcnRUeXBlc1trXSA9PT0gdmFsKSB7XG5cdFx0XHRcdHJldHVybiBrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gJ1Vua25vd24nO1xuXHR9LFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBJTWJyRGF0YSB7XG5cdGNvcHlQcm90ZWN0ZWQ6IGJvb2xlYW47XG5cdHV1aWQ6IHN0cmluZztcblx0dHlwZTogJ01CUicgfCAnR1BUJztcblx0cGFydGl0aW9uczogKE1CUlBhcnRpdGlvbiB8IEdQVFBhcnRpdGlvbilbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTUJSKG1icjogQnVmZmVyKTogSU1ickRhdGEge1xuXHRpZiAobWJyLmxlbmd0aCA8IDUxMiB8fCBtYnJbMHgxZmVdICE9IDg1IHx8IG1iclsweDFmZl0gIT0gMTcwKSB7XG5cdFx0Ly8gTUJSIHNpZ25hdHVyZVxuXHRcdHRocm93IEVycm9yKCdubyBNQlIgc2lnbmF0dXJlIG9yIGJ1ZmZlciBpcyBsZXNzIHRoYW4gNTEyIGJ5dGVzJyk7XG5cdH1cblx0bGV0IHJldDogSU1ickRhdGEgPSB7XG5cdFx0Y29weVByb3RlY3RlZDogbWJyWzB4MWJjXSA9PSA5MCAmJiBtYnJbMHgxYmNdID09IDkwID8gdHJ1ZSA6IGZhbHNlLFxuXHRcdHV1aWQ6IEJ1ZmZlci5mcm9tKFttYnJbMHgxYmJdLCBtYnJbMHgxYmFdLCBtYnJbMHgxYjldLCBtYnJbMHgxYjhdXSkudG9TdHJpbmcoJ2hleCcpLCAvLyBEaXNrSUQ6IDFCOCAoaGV4KSB0aHJvdWdoIDFCRSAoaGV4KSAobG9va3MgbGlrZSByZXZlcnNlKVxuXHRcdHBhcnRpdGlvbnM6IFtdLFxuXHRcdHR5cGU6ICdNQlInLCAvLyBhcyBkZWZhdWx0XG5cdH07XG5cdGZvciAobGV0IGkgPSA0NDY7IGkgPD0gNTA4OyBpICs9IDE2KSB7XG5cdFx0Ly8gTUJSIHRhYmxlIGJsb2Nrc1xuXHRcdHJldC5wYXJ0aXRpb25zLnB1c2gocGFyc2VNQlJQYXJ0aXRpb24obWJyLnNsaWNlKGksIGkgKyAxNikpKTtcblx0fVxuXHRyZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBwYXJzZU1CUlBhcnRpdGlvbihwYXJ0OiBCdWZmZXIpOiBNQlJQYXJ0aXRpb24ge1xuXHRjb25zdCBzdGFydExCQSA9IHBhcnQucmVhZFVJbnQzMkxFKDgpO1xuXHRjb25zdCBwYXJ0aXRpb25TaXplID0gcGFydC5yZWFkVUludDMyTEUoMTIpO1xuXHRyZXR1cm4ge1xuXHRcdGFjdGl2ZTogcGFydC5yZWFkVUludDgoMCkgPT0gMHg4MCA/IHRydWUgOiBmYWxzZSxcblx0XHR0eXBlOiBwYXJ0LnJlYWRVSW50OCg0KSxcblx0XHRzdGFydExCQSxcblx0XHRwYXJ0aXRpb25TaXplLFxuXHRcdGVuZExCQTogc3RhcnRMQkEgKyBwYXJ0aXRpb25TaXplLFxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNNYnJQYXJ0aXRpb24ocGFydDogTUJSUGFydGl0aW9uIHwgR1BUUGFydGl0aW9uKTogcGFydCBpcyBNQlJQYXJ0aXRpb24ge1xuXHRyZXR1cm4gdHlwZW9mIHBhcnQudHlwZSA9PT0gJ251bWJlcic7XG59XG4iXX0=
package/dist/types.d.ts DELETED
@@ -1,18 +0,0 @@
1
- export declare type MBRPartition = {
2
- active: boolean;
3
- type: number;
4
- startLBA: number;
5
- partitionSize: number;
6
- endLBA: number;
7
- };
8
- export declare type GPTPartition = {
9
- typeId: string;
10
- type: string;
11
- uuid: string;
12
- active: boolean;
13
- startLBA: bigint;
14
- endLBA: bigint;
15
- partitionSize: bigint;
16
- attributes: bigint;
17
- label: string;
18
- };
package/dist/types.js DELETED
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgTUJSUGFydGl0aW9uID0ge1xuXHRhY3RpdmU6IGJvb2xlYW47XG5cdHR5cGU6IG51bWJlcjtcblx0c3RhcnRMQkE6IG51bWJlcjtcblx0cGFydGl0aW9uU2l6ZTogbnVtYmVyO1xuXHRlbmRMQkE6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEdQVFBhcnRpdGlvbiA9IHtcblx0dHlwZUlkOiBzdHJpbmc7XG5cdHR5cGU6IHN0cmluZztcblx0dXVpZDogc3RyaW5nO1xuXHRhY3RpdmU6IGJvb2xlYW47XG5cdHN0YXJ0TEJBOiBiaWdpbnQ7XG5cdGVuZExCQTogYmlnaW50O1xuXHRwYXJ0aXRpb25TaXplOiBiaWdpbnQ7XG5cdGF0dHJpYnV0ZXM6IGJpZ2ludDtcblx0bGFiZWw6IHN0cmluZztcbn07XG4iXX0=
package/dist/util.d.ts DELETED
@@ -1,3 +0,0 @@
1
- /// <reference types="node" />
2
- import * as fs from 'fs';
3
- export declare function readFile(fd: number, offset: number, length: number, position: fs.ReadPosition | null): Promise<Buffer>;
package/dist/util.js DELETED
@@ -1,19 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.readFile = void 0;
4
- const fs = require("fs");
5
- function readFile(fd, offset, length, position) {
6
- return new Promise((resolve, reject) => {
7
- const buffer = Buffer.allocUnsafe(length);
8
- fs.read(fd, buffer, offset, buffer.length, position, (err) => {
9
- if (err) {
10
- reject(err);
11
- }
12
- else {
13
- resolve(buffer);
14
- }
15
- });
16
- });
17
- }
18
- exports.readFile = readFile;
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUJBQXlCO0FBQ3pCLFNBQWdCLFFBQVEsQ0FBQyxFQUFVLEVBQUUsTUFBYyxFQUFFLE1BQWMsRUFBRSxRQUFnQztJQUNwRyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzVELElBQUksR0FBRyxFQUFFO2dCQUNSLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNaO2lCQUFNO2dCQUNOLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNoQjtRQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBWEQsNEJBV0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5leHBvcnQgZnVuY3Rpb24gcmVhZEZpbGUoZmQ6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCBwb3NpdGlvbjogZnMuUmVhZFBvc2l0aW9uIHwgbnVsbCk6IFByb21pc2U8QnVmZmVyPiB7XG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0Y29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aCk7XG5cdFx0ZnMucmVhZChmZCwgYnVmZmVyLCBvZmZzZXQsIGJ1ZmZlci5sZW5ndGgsIHBvc2l0aW9uLCAoZXJyKSA9PiB7XG5cdFx0XHRpZiAoZXJyKSB7XG5cdFx0XHRcdHJlamVjdChlcnIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzb2x2ZShidWZmZXIpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcbn1cbiJdfQ==