{"version":3,"file":"title.mjs","names":["Resource","encodeUtf16","getUtf16","findExact","findFuzzy","IDD_EXCEPTION","IMAGE_SCN_MEM_EXECUTE","IMAGE_SCN_MEM_READ","IMAGE_SCN_MEM_SHARED","IMAGE_SCN_MEM_WRITE","exeCodeSection","patchWindowTitleRsrc","rsrc","title","titleMatch","typeStringTable","titleStringTableId","titleStringTableEntryId","entry","entries","type","table","StringTable","fromEntries","lang","text","getAllStrings","startsWith","id","strings","map","s","length","test","setById","replaceStringEntriesForExecutable","patchWindowTitleData","exe","address","excluded","idd","getSectionByEntry","push","info","virtualAddress","dataSections","getAllSections","filter","characteristics","sizeOfRawData","virtualSize","a","titles","oldAddress","data","d","Uint8Array","pre","reg","pred","index","Error","references","code","view","DataView","newHeader","is32bit","imageBase","optionalHeader","oldA","patches","o","patch","i","off","getUint32","setUint32","l","rip"],"sources":["../../../../src/util/internal/windows/title.ts"],"sourcesContent":["import {NtExecutable, NtExecutableResource, Resource} from '@shockpkg/resedit';\n\nimport {encodeUtf16, getUtf16} from '../data.ts';\nimport {findExact, findFuzzy} from '../patch.ts';\n\nimport {\n\tIDD_EXCEPTION,\n\tIMAGE_SCN_MEM_EXECUTE,\n\tIMAGE_SCN_MEM_READ,\n\tIMAGE_SCN_MEM_SHARED,\n\tIMAGE_SCN_MEM_WRITE\n} from './constants.ts';\nimport {exeCodeSection} from './exe.ts';\n\n/**\n * Patch projector window title stored in resources (versions before 11.2).\n *\n * @param rsrc NtExecutableResource instance.\n * @param title Window title.\n * @returns Returns true if found, else false.\n */\nexport function patchWindowTitleRsrc(\n\trsrc: NtExecutableResource,\n\ttitle: string\n) {\n\t// Match all known titles.\n\tconst titleMatch =\n\t\t/^((Shockwave )?Flash|(Adobe|Macromedia) Flash Player \\d+([,.]\\d+)*)$/;\n\n\t// Find ID of string table with the title and ID of title if present.\n\tconst typeStringTable = 6;\n\tlet titleStringTableId = null;\n\tlet titleStringTableEntryId = null;\n\tfor (const entry of rsrc.entries) {\n\t\tif (entry.type !== typeStringTable) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst table = Resource.StringTable.fromEntries(entry.lang, [entry]);\n\t\tfor (const {text} of table.getAllStrings()) {\n\t\t\tif (text.startsWith('Projector ')) {\n\t\t\t\ttitleStringTableId = entry.id;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (titleStringTableId === null) {\n\t\t\t// 2.0.0.11 (does not support projectors, but can patch title).\n\t\t\tconst strings = table.getAllStrings().map(s => s.text);\n\t\t\tif (\n\t\t\t\tstrings.length === 2 &&\n\t\t\t\tstrings[0] === 'Shockwave Flash' &&\n\t\t\t\tstrings[1].startsWith('Shockwave Flash ')\n\t\t\t) {\n\t\t\t\ttitleStringTableId = entry.id;\n\t\t\t}\n\t\t}\n\t\tif (titleStringTableId === null) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const {id, text} of table.getAllStrings()) {\n\t\t\tif (titleMatch.test(text)) {\n\t\t\t\ttitleStringTableEntryId = id;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\tif (titleStringTableId === null || titleStringTableEntryId === null) {\n\t\treturn false;\n\t}\n\n\t// Replace all the entries.\n\tfor (const entry of rsrc.entries) {\n\t\tif (entry.type !== typeStringTable || entry.id !== titleStringTableId) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst table = Resource.StringTable.fromEntries(entry.lang, [entry]);\n\t\ttable.setById(titleStringTableEntryId, title);\n\t\ttable.replaceStringEntriesForExecutable(rsrc);\n\t}\n\treturn true;\n}\n\n/**\n * Patch projector window title stored in data (versions from 11.2).\n *\n * @param exe NtExecutable instance.\n * @param address The virtualAddress of inserted section title.\n */\nexport function patchWindowTitleData(exe: NtExecutable, address: number) {\n\t// Get read-only data sections excluding the exception and inserted ones.\n\tconst excluded = [address];\n\tfor (const idd of [IDD_EXCEPTION]) {\n\t\tconst s = exe.getSectionByEntry(idd);\n\t\tif (s) {\n\t\t\texcluded.push(s.info.virtualAddress);\n\t\t}\n\t}\n\tconst dataSections = exe\n\t\t.getAllSections()\n\t\t.filter(\n\t\t\t({\n\t\t\t\tinfo: {\n\t\t\t\t\tcharacteristics,\n\t\t\t\t\tsizeOfRawData,\n\t\t\t\t\tvirtualAddress,\n\t\t\t\t\tvirtualSize\n\t\t\t\t}\n\t\t\t}) => {\n\t\t\t\tif (\n\t\t\t\t\t!sizeOfRawData ||\n\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\t!(characteristics & IMAGE_SCN_MEM_READ) ||\n\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\tcharacteristics & IMAGE_SCN_MEM_WRITE ||\n\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\tcharacteristics & IMAGE_SCN_MEM_EXECUTE ||\n\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\tcharacteristics & IMAGE_SCN_MEM_SHARED\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tfor (const a of excluded) {\n\t\t\t\t\tif (\n\t\t\t\t\t\ta >= virtualAddress &&\n\t\t\t\t\t\ta < virtualAddress + virtualSize\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t);\n\n\t// Search for known titles (only one format known).\n\tconst titles: [string, RegExp][] = [\n\t\t['Adobe Flash Player ', /^Adobe Flash Player \\d+([,.]\\d+)*$/]\n\t];\n\tlet oldAddress = 0;\n\tfor (const {\n\t\tinfo: {virtualAddress},\n\t\tdata\n\t} of dataSections) {\n\t\tif (!data) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst d = new Uint8Array(data);\n\t\tfor (const [pre, reg] of titles) {\n\t\t\tconst pred = encodeUtf16(pre, true);\n\t\t\tfor (const index of findExact(d, pred)) {\n\t\t\t\tconst s = getUtf16(d, index, true);\n\t\t\t\tif (!s || !reg.test(s)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Only one match expected.\n\t\t\t\tif (oldAddress) {\n\t\t\t\t\tthrow new Error('Multiple window titles found');\n\t\t\t\t}\n\n\t\t\t\t// Remember address for later.\n\t\t\t\toldAddress = virtualAddress + index;\n\t\t\t}\n\t\t}\n\t}\n\tif (!oldAddress) {\n\t\tthrow new Error('No window titles found');\n\t}\n\n\tlet references = 0;\n\tconst code = exeCodeSection(exe);\n\tconst {virtualAddress} = code.info;\n\tconst data = new Uint8Array(code.data);\n\tconst view = new DataView(code.data);\n\tconst {newHeader} = exe;\n\tif (newHeader.is32bit()) {\n\t\tconst {imageBase} = newHeader.optionalHeader;\n\t\tconst oldA = imageBase + oldAddress;\n\t\tconst patches: [number, number[]][] = [\n\t\t\t// All versions.\n\t\t\t// push    ...\n\t\t\t[1, [0x68, -1, -1, -1, -1]]\n\t\t];\n\t\tfor (const [o, patch] of patches) {\n\t\t\tfor (const i of findFuzzy(data, patch)) {\n\t\t\t\tconst off = i + o;\n\t\t\t\tconst a = view.getUint32(off, true);\n\t\t\t\tif (a !== oldA) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tview.setUint32(off, imageBase + address, true);\n\t\t\t\treferences++;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tconst patches: [number, number[]][] = [\n\t\t\t// All versions.\n\t\t\t// lea     r9, [rip+...]\n\t\t\t[3, [0x4c, 0x8d, 0x0d, -1, -1, -1, -1]]\n\t\t];\n\t\tfor (const [o, patch] of patches) {\n\t\t\tconst l = patch.length;\n\t\t\tfor (const i of findFuzzy(data, patch)) {\n\t\t\t\tconst rip = virtualAddress + i + l;\n\t\t\t\tconst off = i + o;\n\t\t\t\tconst a = rip + view.getUint32(off, true);\n\t\t\t\tif (a !== oldAddress) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tview.setUint32(off, address - rip, true);\n\t\t\t\treferences++;\n\t\t\t}\n\t\t}\n\t}\n\tif (references !== 1) {\n\t\tthrow new Error(`Unexpected window title references: ${references}`);\n\t}\n}\n"],"mappings":"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","ignoreList":[]}