fix(desktop): probe GameMaker data filenames

Select conventional Linux and macOS game data files for the existing bounded FORM/GEN8 probe. Add service-boundary regressions and document the selected names.

Fixes #6659
This commit is contained in:
morluto
2026-10-23 19:15:08 +08:00
parent 0e3e577568
commit 79b3f4694d
3 changed files with 34 additions and 2 deletions
+1 -1
View File
@@ -97,7 +97,7 @@ same bundle. Export writes only the caller-selected output file.
| Unity Mono | A managed assembly below `*_Data/Managed` or `Contents/Resources/Data/Managed` has an exact UnityEngine assembly reference. |
| Unity IL2CPP | A recognized IL2CPP metadata magic (with the raw version when complete) coexists with a conventionally named native `GameAssembly.dll`, `GameAssembly.so`, `GameAssembly.dylib` or `libil2cpp.so` image. Build correspondence remains unknown. |
| Godot | A `GDPC` header at file start or a validated executable trailer offset. |
| GameMaker | A bounded `FORM` container starts with a `GEN8` chunk. |
| GameMaker | A bounded `FORM` container starts with a `GEN8` chunk. The scan probes conventional `data.win`, `game.unx`, and `game.ios` data files for that header. |
| Unreal | `Content/Paks` path conventions or an IoStore TOC signature; arbitrary `.pak` filenames are insufficient. |
| Electron | A `resources/app.asar` or `resources/default_app.asar` path convention; archive validity is unverified. |
+1 -1
View File
@@ -476,6 +476,6 @@ const addPathFacts = (row: DesktopFile): string | null => {
const probeSelected = (entry: DirectoryArtifactEntry): boolean =>
entry.executable ||
/(?:\.(?:exe|dll|so|dylib|pck|utoc)|(?:^|\/)global-metadata\.dat|(?:^|\/)data\.win)$/iu.test(
/(?:\.(?:exe|dll|so|dylib|pck|utoc)|(?:^|\/)(?:global-metadata\.dat|data\.win|game\.(?:unx|ios)))$/iu.test(
entry.path,
);
@@ -787,6 +787,38 @@ it.each([
},
);
it.each([
"assets/game.unx",
"Example.app/Contents/Resources/game.ios",
])("probes the GameMaker data file at %s", async (path) => {
const root = await createTestTempDirectory("rea-desktop-gamemaker-data-");
const form = Buffer.alloc(16);
form.write("FORM");
form.writeUInt32LE(8, 4);
form.write("GEN8", 8);
form.writeUInt32LE(0, 12);
await put(root, path, form);
const { report } = await inspect(root);
expect(report.candidates.map((candidate) => candidate.family)).toContain(
"gamemaker",
);
expect(report.files).toContainEqual(
expect.objectContaining({
path,
read_status: "examined",
facts: [
expect.objectContaining({
kind: "gamemaker-form-header",
offset: 0,
value: { container: "FORM", first_chunk: "GEN8" },
}),
],
}),
);
expect(report.coverage.status).toBe("complete-within-scan");
});
it("compares exact signature bytes without masking high bits in engine headers or trailers", async () => {
const root = await createTestTempDirectory("rea-desktop-exact-signatures-");
const pck = Buffer.alloc(20);