nx_installed_census_gate.nx source
↩ module page · 209 lines · 13330 B
1// nx_installed_census_gate.nx -- GATE for the installed mode (/compare/intelmine IM20 ic_steam_library, IM22
2// ic_fingerprint, IM24 ic_tieout). A Steam library is PLANTED under /tmp/nx_installed_census_gate: a libraryfolders.vdf
3// naming the root, three app manifests (one Unreal+Wwise+EAC tree, one Unity+OpenXR tree, one whose install dir is
4// missing), a planted fingerprints conf and a planted review summary for one appid. No network. license_tier: ORIGINAL
5import "nx_syscalls.nx"
6import "nx_reviewmine_lib.nx"
7import "nx_installed_census_lib.nx"
8import "nx_gate_verdict.nx"
9
10const G_ROOT: *u8 = "/tmp/nx_installed_census_gate/steam"
11const G_APPS: *u8 = "/tmp/nx_installed_census_gate/steam/steamapps"
12const G_COMMON: *u8 = "/tmp/nx_installed_census_gate/steam/steamapps/common"
13const G_VDF: *u8 = "/tmp/nx_installed_census_gate/steam/steamapps/libraryfolders.vdf"
14const G_M100: *u8 = "/tmp/nx_installed_census_gate/steam/steamapps/appmanifest_100.acf"
15const G_M200: *u8 = "/tmp/nx_installed_census_gate/steam/steamapps/appmanifest_200.acf"
16const G_M300: *u8 = "/tmp/nx_installed_census_gate/steam/steamapps/appmanifest_300.acf"
17const G_A_BIN: *u8 = "/tmp/nx_installed_census_gate/steam/steamapps/common/GameA/GameA/Binaries/Win64"
18const G_A_EXE: *u8 = "/tmp/nx_installed_census_gate/steam/steamapps/common/GameA/GameA/Binaries/Win64/GameA-Win64-Shipping.exe"
19const G_A_WWISE: *u8 = "/tmp/nx_installed_census_gate/steam/steamapps/common/GameA/GameA/Content/WwiseAudio"
20const G_A_EAC: *u8 = "/tmp/nx_installed_census_gate/steam/steamapps/common/GameA/EasyAntiCheat"
21const G_A_DEEP: *u8 = "/tmp/nx_installed_census_gate/steam/steamapps/common/GameA/d1/d2/d3/d4/d5/d6"
22const G_A_DEEPFILE: *u8 = "/tmp/nx_installed_census_gate/steam/steamapps/common/GameA/d1/d2/d3/d4/d5/d6/fmod.dll"
23const G_B_DIR: *u8 = "/tmp/nx_installed_census_gate/steam/steamapps/common/GameB"
24const G_B_UNITY: *u8 = "/tmp/nx_installed_census_gate/steam/steamapps/common/GameB/UnityPlayer.dll"
25const G_B_XR: *u8 = "/tmp/nx_installed_census_gate/steam/steamapps/common/GameB/GameB_Data/Plugins/x86_64/openxr_loader.dll"
26const G_B_XRDIR: *u8 = "/tmp/nx_installed_census_gate/steam/steamapps/common/GameB/GameB_Data/Plugins/x86_64"
27const G_FP: *u8 = "/tmp/nx_installed_census_gate/fingerprints.conf"
28const G_REVIEWS: *u8 = "/tmp/nx_installed_census_gate/reviews/"
29const G_SUMMARY: *u8 = "/tmp/nx_installed_census_gate/reviews/100.summary"
30const G_SEEN: *u8 = "/tmp/nx_installed_census_gate/reviews/100.seen"
31const G_A_SIZE: i64 = 41177764991
32const G_A_BUILD: i64 = 24575825
33const G_ROW_CAP: i64 = 8192
34
35func g_put(path: *u8, s: *u8) -> i64 { return rm_file_put(path, s, rm_slen(s)) }
36func g_q(b: *u8, o: i64) -> i64 { b[o] = RM_Q as u8; return o + 1 }
37// "key"\t\t"value"\n
38func g_kv(b: *u8, o: i64, k: *u8, v: *u8) -> i64 {
39 var p: i64 = o
40 b[p] = RM_TAB as u8; p = p + 1
41 p = g_q(b, p); p = rm_cat(b, p, k); p = g_q(b, p)
42 b[p] = RM_TAB as u8; p = p + 1; b[p] = RM_TAB as u8; p = p + 1
43 p = g_q(b, p); p = rm_cat(b, p, v); p = g_q(b, p)
44 b[p] = RM_LF as u8; return p + 1
45}
46func g_manifest(path: *u8, appid: *u8, name: *u8, dir: *u8, size: *u8) -> i64 {
47 let b: *u8 = sys_mmap(4096)
48 var p: i64 = g_q(b, 0); p = rm_cat(b, p, "AppState" as *u8); p = g_q(b, p); b[p] = RM_LF as u8; p = p + 1
49 b[p] = RM_LBRACE as u8; p = p + 1; b[p] = RM_LF as u8; p = p + 1
50 p = g_kv(b, p, "appid" as *u8, appid)
51 p = g_kv(b, p, "name" as *u8, name)
52 p = g_kv(b, p, "installdir" as *u8, dir)
53 p = g_kv(b, p, "SizeOnDisk" as *u8, size)
54 p = g_kv(b, p, "buildid" as *u8, "24575825" as *u8)
55 p = g_kv(b, p, "LastUpdated" as *u8, "1787505456" as *u8)
56 p = g_kv(b, p, "LastPlayed" as *u8, "1788621116" as *u8)
57 b[p] = RM_TAB as u8; p = p + 1; p = g_q(b, p); p = rm_cat(b, p, "UserConfig" as *u8); p = g_q(b, p); b[p] = RM_LF as u8; p = p + 1
58 b[p] = RM_TAB as u8; p = p + 1; b[p] = RM_LBRACE as u8; p = p + 1; b[p] = RM_LF as u8; p = p + 1
59 b[p] = RM_TAB as u8; p = p + 1
60 p = g_kv(b, p, "language" as *u8, "english" as *u8)
61 b[p] = RM_TAB as u8; p = p + 1; b[p] = RM_RBRACE as u8; p = p + 1; b[p] = RM_LF as u8; p = p + 1
62 b[p] = RM_RBRACE as u8; p = p + 1; b[p] = RM_LF as u8; p = p + 1
63 return rm_file_put(path, b, p)
64}
65func g_vdf() -> i64 {
66 let b: *u8 = sys_mmap(1024)
67 var p: i64 = g_q(b, 0); p = rm_cat(b, p, "libraryfolders" as *u8); p = g_q(b, p); b[p] = RM_LF as u8; p = p + 1
68 b[p] = RM_LBRACE as u8; p = p + 1; b[p] = RM_LF as u8; p = p + 1
69 b[p] = RM_TAB as u8; p = p + 1; p = g_q(b, p); b[p] = RM_ZERO as u8; p = p + 1; p = g_q(b, p); b[p] = RM_LF as u8; p = p + 1
70 b[p] = RM_TAB as u8; p = p + 1; b[p] = RM_LBRACE as u8; p = p + 1; b[p] = RM_LF as u8; p = p + 1
71 b[p] = RM_TAB as u8; p = p + 1
72 p = g_kv(b, p, "path" as *u8, G_ROOT)
73 b[p] = RM_TAB as u8; p = p + 1; b[p] = RM_RBRACE as u8; p = p + 1; b[p] = RM_LF as u8; p = p + 1
74 b[p] = RM_RBRACE as u8; p = p + 1; b[p] = RM_LF as u8; p = p + 1
75 return rm_file_put(G_VDF, b, p)
76}
77// C:\Program Files (x86)\Steam\ assembled at runtime (backslash = 92) so no literal carries one
78func g_winpath() -> *u8 {
79 let b: *u8 = sys_mmap(64)
80 var o: i64 = rm_cat(b, 0, "C:" as *u8)
81 b[o] = 92 as u8; o = o + 1
82 o = rm_cat(b, o, "Program Files (x86)" as *u8)
83 b[o] = 92 as u8; o = o + 1
84 o = rm_cat(b, o, "Steam" as *u8)
85 b[o] = 92 as u8; o = o + 1
86 b[o] = 0 as u8
87 return b
88}
89func g_find_field(row: *u8, n: i64, idx: i64, out: *u8, cap: i64) -> i64 {
90 var f: i64 = 0
91 var s: i64 = 0
92 var i: i64 = 0
93 while i <= n {
94 var c: i64 = RM_PIPE
95 if i < n { c = row[i] as i64 }
96 if c == RM_PIPE { if f == idx { var l: i64 = i - s; if l > cap - 1 { l = cap - 1 } rm_catn(out, 0, (row as i64 + s) as *u8, l); out[l] = 0 as u8; return l } f = f + 1; s = i + 1 }
97 else { if c == RM_LF { i = n } }
98 i = i + 1
99 }
100 out[0] = 0 as u8
101 return 0 - 1
102}
103
104func main() -> i64 {
105 gv_head("=== nx_installed_census_gate -- installed mode: manifests, fingerprints, tie-out (intelmine IM20/IM22/IM24) ===" as *u8)
106 let c: *i64 = gv_ctr()
107 // ---- plant the library (idempotent: every file truncate-written) ----
108 rm_mkdirp(G_A_BIN); rm_mkdirp(G_A_WWISE); rm_mkdirp(G_A_EAC); rm_mkdirp(G_A_DEEP); rm_mkdirp(G_B_XRDIR); rm_mkdirp(G_REVIEWS)
109 g_put(G_A_EXE, "x" as *u8); g_put(G_A_DEEPFILE, "x" as *u8); g_put(G_B_UNITY, "x" as *u8); g_put(G_B_XR, "x" as *u8)
110 g_vdf()
111 g_manifest(G_M100, "100" as *u8, "Game A" as *u8, "GameA" as *u8, "41177764991" as *u8)
112 g_manifest(G_M200, "200" as *u8, "Game B" as *u8, "GameB" as *u8, "24626600946" as *u8)
113 g_manifest(G_M300, "300" as *u8, "Game C" as *u8, "GameC" as *u8, "0" as *u8)
114 g_put(G_FP, "; planted\nengine|UnityPlayer.dll|Unity\nengine|-Win64-Shipping.exe|Unreal\nanticheat|EasyAntiCheat|EAC\nvr|openxr_loader.dll|OpenXR\naudio|Wwise|Wwise\naudio|fmod|FMOD\nbogus|nothing|Nothing\n" as *u8)
115 g_put(G_SUMMARY, "100|205511|196730|8781|9|1788622500|3000\n" as *u8)
116 let seen: *u8 = sys_mmap(32)
117 var z: i64 = 0
118 while z < 24 { seen[z] = z as u8; z = z + 1 }
119 rm_file_put(G_SEEN, seen, 24)
120 ic_init()
121 ic_set_maxdepth(4)
122 let fps: i64 = ic_fp_load(G_FP)
123 gv_check_eq("fingerprints-loaded-six-valid-rows-bogus-class-refused" as *u8, fps, 6, c)
124 let libs: i64 = ic_libraries(G_ROOT)
125 gv_check_eq("libraries-root-plus-vdf-path-deduped-to-one" as *u8, libs, 1, c)
126 // ---- path mapping ----
127 let mp: *u8 = sys_mmap(IC_PATH_CAP)
128 let wp: *u8 = g_winpath()
129 ic_map_path(wp, mp, IC_PATH_CAP)
130 gv_check("windows-path-maps-to-wsl-mount" as *u8, rm_streq(mp, "/mnt/c/Program Files (x86)/Steam" as *u8), c)
131 ic_map_path("/opt/steam" as *u8, mp, IC_PATH_CAP)
132 gv_check("posix-path-passes-through" as *u8, rm_streq(mp, "/opt/steam" as *u8), c)
133 // ---- Game A: Unreal + Wwise + EAC, fmod planted BELOW maxdepth must NOT be seen ----
134 let okA: i64 = ic_census_app(G_ROOT, G_M100, G_REVIEWS)
135 gv_check("gameA-manifest-parsed" as *u8, okA, c)
136 gv_check_eq("gameA-appid" as *u8, ic_rec_get(IC_R_APPID), 100, c)
137 gv_check_eq("gameA-size-on-disk" as *u8, ic_rec_get(IC_R_SIZE), G_A_SIZE, c)
138 gv_check_eq("gameA-buildid" as *u8, ic_rec_get(IC_R_BUILDID), G_A_BUILD, c)
139 gv_check("gameA-name" as *u8, rm_streq(ic_name_get(), "Game A" as *u8), c)
140 gv_check("gameA-language-from-userconfig" as *u8, rm_streq(ic_lang_get(), "english" as *u8), c)
141 gv_check_eq("gameA-on-disk" as *u8, ic_rec_get(IC_R_ON_DISK), 1, c)
142 let lab: *u8 = sys_mmap(IC_LABELS_CAP)
143 ic_class_labels(0, lab, IC_LABELS_CAP)
144 gv_check("gameA-engine-unreal-from-shipping-exe" as *u8, rm_streq(lab, "Unreal" as *u8), c)
145 ic_class_labels(3, lab, IC_LABELS_CAP)
146 gv_check("gameA-audio-wwise-from-directory-name" as *u8, rm_streq(lab, "Wwise" as *u8), c)
147 ic_class_labels(1, lab, IC_LABELS_CAP)
148 gv_check("gameA-anticheat-eac" as *u8, rm_streq(lab, "EAC" as *u8), c)
149 ic_class_labels(2, lab, IC_LABELS_CAP)
150 gv_check("gameA-vr-none-reads-dash" as *u8, rm_streq(lab, "-" as *u8), c)
151 gv_check_eq("neg-control-file-below-maxdepth-not-seen-fmod-absent-from-audio" as *u8, rm_find(lab, rm_slen(lab), "FMOD" as *u8, 0), 0 - 1, c)
152 gv_check("gameA-walk-counted-files" as *u8, (ic_rec_get(IC_R_FILES) >= 1) as i64, c)
153 gv_check_eq("gameA-walk-not-capped" as *u8, ic_rec_get(IC_R_CAPPED), 0, c)
154 gv_check_eq("gameA-tieout-reviews-journaled-three" as *u8, ic_rec_get(IC_R_REVIEWS), 3, c)
155 gv_check_eq("gameA-tieout-review-score" as *u8, ic_rec_get(IC_R_SCORE), 9, c)
156 gv_check_eq("gameA-tieout-positive" as *u8, ic_rec_get(IC_R_POS), 196730, c)
157 gv_check_eq("gameA-tieout-negative" as *u8, ic_rec_get(IC_R_NEG), 8781, c)
158 gv_check_eq("gameA-assets-one-extension-seen" as *u8, ic_ext_count_get(), 1, c)
159 ic_assets_summary(lab, IC_LABELS_CAP, 8)
160 gv_check("gameA-assets-summary-exe-one-file-one-byte" as *u8, rm_streq(lab, "exe:1:1" as *u8), c)
161 gv_check_eq("gameA-walk-bytes-one" as *u8, ic_walk_bytes_get(), 1, c)
162 // ---- Game B: Unity + OpenXR, no review summary ----
163 let okB: i64 = ic_census_app(G_ROOT, G_M200, G_REVIEWS)
164 gv_check("gameB-manifest-parsed" as *u8, okB, c)
165 ic_class_labels(0, lab, IC_LABELS_CAP)
166 gv_check("gameB-engine-unity" as *u8, rm_streq(lab, "Unity" as *u8), c)
167 ic_class_labels(2, lab, IC_LABELS_CAP)
168 gv_check("gameB-vr-openxr-three-levels-deep" as *u8, rm_streq(lab, "OpenXR" as *u8), c)
169 ic_class_labels(1, lab, IC_LABELS_CAP)
170 gv_check("neg-control-gameB-anticheat-none" as *u8, rm_streq(lab, "-" as *u8), c)
171 gv_check_eq("neg-control-gameB-no-review-summary-reads-zero-not-error" as *u8, ic_rec_get(IC_R_REVIEWS) + ic_rec_get(IC_R_SCORE), 0, c)
172 ic_assets_summary(lab, IC_LABELS_CAP, 8)
173 gv_check("gameB-assets-summary-dll-two-files-two-bytes" as *u8, rm_streq(lab, "dll:2:2" as *u8), c)
174 // ---- Game C: install dir missing ----
175 let okC: i64 = ic_census_app(G_ROOT, G_M300, G_REVIEWS)
176 gv_check("gameC-manifest-parsed" as *u8, okC, c)
177 gv_check_eq("gameC-not-on-disk" as *u8, ic_rec_get(IC_R_ON_DISK), 0, c)
178 ic_class_labels(0, lab, IC_LABELS_CAP)
179 gv_check("gameC-engine-dash-when-no-tree" as *u8, rm_streq(lab, "-" as *u8), c)
180 ic_assets_summary(lab, IC_LABELS_CAP, 8)
181 gv_check("neg-control-gameC-assets-dash-when-no-tree" as *u8, rm_streq(lab, "-" as *u8), c)
182 // ---- row codec: Game A row carries its fields in the declared columns ----
183 ic_census_app(G_ROOT, G_M100, G_REVIEWS)
184 let row: *u8 = sys_mmap(G_ROW_CAP)
185 let rl: i64 = ic_row_emit(0, row, G_ROW_CAP)
186 gv_check("row-emitted" as *u8, (rl > 20) as i64, c)
187 let f: *u8 = sys_mmap(512)
188 g_find_field(row, rl, 1, f, 512)
189 gv_check("row-field1-appid" as *u8, rm_streq(f, "100" as *u8), c)
190 g_find_field(row, rl, 11, f, 512)
191 gv_check("row-field11-engine" as *u8, rm_streq(f, "Unreal" as *u8), c)
192 g_find_field(row, rl, 14, f, 512)
193 gv_check("row-field14-audio" as *u8, rm_streq(f, "Wwise" as *u8), c)
194 g_find_field(row, rl, 25, f, 512)
195 gv_check("row-field25-review-score" as *u8, rm_streq(f, "9" as *u8), c)
196 // ---- manifest name filter ----
197 gv_check("manifest-name-accepted" as *u8, ic_is_manifest("appmanifest_1623730.acf" as *u8), c)
198 gv_check_eq("neg-control-manifest-name-refused-tmp-suffix" as *u8, ic_is_manifest("appmanifest_1623730.acf.tmp" as *u8), 0, c)
199 gv_check_eq("neg-control-non-manifest-refused" as *u8, ic_is_manifest("libraryfolders.vdf" as *u8), 0, c)
200 // ---- idempotency: a second load of the conf yields the same count ----
201 gv_check_eq("fingerprints-reload-same-count" as *u8, ic_fp_load(G_FP), 6, c)
202 gv_values_head()
203 gv_kv("fingerprint_rows" as *u8, fps)
204 gv_kv("libraries" as *u8, libs)
205 gv_kv("gameA_files_seen" as *u8, ic_walk_files_seen())
206 gv_kv("gameA_dirs_seen" as *u8, ic_walk_dirs_seen())
207 gv_kv("row_bytes" as *u8, rl)
208 return gv_verdict("nx_installed_census_gate" as *u8, c, "the library reader, the manifest reader, the Windows-to-WSL path map, the bounded fingerprint walk, the per-class label join, the review tie-out and the row codec are proven on a planted three-title library with a below-depth file, a bogus conf class, a missing install tree and a missing review summary as the controls; no network, all scratch under /tmp" as *u8)
209}