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 +228 -0
- package/dist/index.d.cts +48 -0
- package/dist/index.d.mts +48 -0
- package/dist/index.mjs +203 -0
- package/package.json +55 -60
- package/dist/gptPart.d.ts +0 -31
- package/dist/gptPart.js +0 -91
- package/dist/index.d.ts +0 -9
- package/dist/index.js +0 -69
- package/dist/mbrPart.d.ts +0 -23
- package/dist/mbrPart.js +0 -58
- package/dist/types.d.ts +0 -18
- package/dist/types.js +0 -3
- package/dist/util.d.ts +0 -3
- package/dist/util.js +0 -19
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;
|
package/dist/index.d.cts
ADDED
|
@@ -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.d.mts
ADDED
|
@@ -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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
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==
|