code wiki / (root) / nx_installed_census_gate.nx

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}