mirror of
https://github.com/morluto/rea
synced 2026-10-26 06:16:17 -04:00
60 lines
1.7 KiB
TypeScript
60 lines
1.7 KiB
TypeScript
import { IL2CPP_METADATA_MAGIC } from "./il2cppMetadata.js";
|
|
|
|
/** Parsed identity facts available before the complete IL2CPP header exists. */
|
|
export type Il2cppMetadataHeaderPrefix =
|
|
| {
|
|
readonly kind: "unavailable-magic";
|
|
readonly magic: null;
|
|
readonly rawVersion: null;
|
|
readonly version: null;
|
|
}
|
|
| {
|
|
readonly kind: "other-magic";
|
|
readonly magic: number;
|
|
readonly rawVersion: null;
|
|
readonly version: null;
|
|
}
|
|
| {
|
|
readonly kind: "il2cpp";
|
|
readonly magic: typeof IL2CPP_METADATA_MAGIC;
|
|
/** Unsigned bytes as stored; null means fewer than eight prefix bytes. */
|
|
readonly rawVersion: number | null;
|
|
/** The decoder's signed Int32 interpretation; null means unavailable. */
|
|
readonly version: number | null;
|
|
};
|
|
|
|
/** Parse the shared magic/version prefix once, retaining incomplete identity explicitly. */
|
|
export const observeIl2cppMetadataHeaderPrefix = (
|
|
bytes: Uint8Array,
|
|
): Il2cppMetadataHeaderPrefix => {
|
|
if (bytes.byteLength < 4)
|
|
return {
|
|
kind: "unavailable-magic",
|
|
magic: null,
|
|
rawVersion: null,
|
|
version: null,
|
|
};
|
|
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
const magic = view.getUint32(0, true);
|
|
if (magic !== IL2CPP_METADATA_MAGIC)
|
|
return {
|
|
kind: "other-magic",
|
|
magic,
|
|
rawVersion: null,
|
|
version: null,
|
|
};
|
|
if (bytes.byteLength < 8)
|
|
return {
|
|
kind: "il2cpp",
|
|
magic: IL2CPP_METADATA_MAGIC,
|
|
rawVersion: null,
|
|
version: null,
|
|
};
|
|
return {
|
|
kind: "il2cpp",
|
|
magic: IL2CPP_METADATA_MAGIC,
|
|
rawVersion: view.getUint32(4, true),
|
|
version: view.getInt32(4, true),
|
|
};
|
|
};
|