fix(il2cpp): preserve recognized truncated metadata prefixes

This commit is contained in:
morluto
2026-10-21 01:47:09 +08:00
parent eb7acc70bf
commit b3aadaf474
10 changed files with 273 additions and 25 deletions
@@ -0,0 +1,59 @@
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),
};
};