{"version":3,"file":"windows.mjs","names":["signatureGet","signatureSet","NtExecutable","NtExecutableResource","Resource","launcher","align","patchOnce","IDD_RESERVED","IDD_RESOURCE","IMAGE_SCN_CNT_INITIALIZED_DATA","IMAGE_SCN_MEM_READ","exeAssertLastSection","exeCodeSection","exeRemoveReloc","exeUpdateSizes","ood32","ood64","rsrcPatchIcon","rsrcPatchVersion","patchWindowTitleData","patchWindowTitleRsrc","windowsProjectorPatch","data","options","iconData","versionStrings","removeCodeSignature","patchWindowTitle","patchOutOfDateDisable","signature","d","exe","from","code","Uint8Array","newHeader","is32bit","relocRestore","rsrc","setSectionByEntry","sdTitle","l","length","ArrayBuffer","v","DataView","i","setUint16","charCodeAt","entry","info","name","virtualSize","byteLength","virtualAddress","sizeOfRawData","pointerToRawData","pointerToRelocations","pointerToLineNumbers","numberOfRelocations","numberOfLineNumbers","characteristics","s","getSectionByEntry","optionalHeaderDataDirectory","set","size","Error","outputResource","generate","windowsLauncher","type","resources","ignoreCert","resIconGroups","Map","iconGroup","IconGroupEntry","fromEntries","entries","known","get","lang","id","iconGroups","Set","iconDatas","group","add","icon","icons","iconID","typeVersionInfo","typeIcon","typeIconGroup","filter","has","signedData","exeData"],"sources":["../../src/util/windows.ts"],"sourcesContent":["import {signatureGet, signatureSet} from 'portable-executable-signature';\nimport {NtExecutable, NtExecutableResource, Resource} from '@shockpkg/resedit';\n\nimport {launcher} from '../util.ts';\n\nimport {align} from './internal/data.ts';\nimport {patchOnce} from './internal/patch.ts';\nimport {\n\tIDD_RESERVED,\n\tIDD_RESOURCE,\n\tIMAGE_SCN_CNT_INITIALIZED_DATA,\n\tIMAGE_SCN_MEM_READ\n} from './internal/windows/constants.ts';\nimport {\n\texeAssertLastSection,\n\texeCodeSection,\n\texeRemoveReloc,\n\texeUpdateSizes\n} from './internal/windows/exe.ts';\nimport {ood32} from './internal/windows/ood32.ts';\nimport {ood64} from './internal/windows/ood64.ts';\nimport {rsrcPatchIcon, rsrcPatchVersion} from './internal/windows/rsrc.ts';\nimport {\n\tpatchWindowTitleData,\n\tpatchWindowTitleRsrc\n} from './internal/windows/title.ts';\n\n/**\n * Windows projector patch.\n */\nexport interface IWindowsProjectorPatch {\n\t/**\n\t * Replace icons if not null.\n\t *\n\t * @default null\n\t */\n\ticonData?: Readonly<Uint8Array> | null;\n\n\t/**\n\t * Replace version strings if not null.\n\t *\n\t * @default null\n\t */\n\tversionStrings?: Readonly<{[key: string]: string}> | null;\n\n\t/**\n\t * Remove signature if present and true.\n\t *\n\t * @default false\n\t */\n\tremoveCodeSignature?: boolean;\n\n\t/**\n\t * Attempt to replace Windows window title if not null.\n\t *\n\t * @default null\n\t */\n\tpatchWindowTitle?: string | null;\n\n\t/**\n\t * Attempt to disable the out-of-date check if true.\n\t *\n\t * @default false\n\t */\n\tpatchOutOfDateDisable?: boolean;\n}\n\n/**\n * Apply patches to projector.\n *\n * @param data Projector data.\n * @param options Patch options.\n * @returns Patched projector.\n */\nexport function windowsProjectorPatch(\n\tdata: Readonly<Uint8Array>,\n\toptions: Readonly<IWindowsProjectorPatch>\n) {\n\tconst {\n\t\ticonData,\n\t\tversionStrings,\n\t\tremoveCodeSignature,\n\t\tpatchWindowTitle,\n\t\tpatchOutOfDateDisable\n\t} = options;\n\n\t// Remove signature, possibly preserved for later.\n\tconst signature = removeCodeSignature ? null : signatureGet(data);\n\tlet d = signatureSet(data, null, true, true);\n\n\t// Parse the EXE once, if needed.\n\tlet exe: NtExecutable | null = null;\n\n\t// Patch the out-of-date check.\n\tif (patchOutOfDateDisable) {\n\t\texe = exe || NtExecutable.from(d);\n\n\t\t// Narrow the search to just the code section and patch.\n\t\tconst code = exeCodeSection(exe);\n\t\tconst {data} = code;\n\t\tpatchOnce(\n\t\t\tnew Uint8Array(data),\n\t\t\texe.newHeader.is32bit() ? ood32 : ood64,\n\t\t\t'Out Of Date Disable'\n\t\t);\n\t\tcode.data = data;\n\t}\n\n\t// Do patches that require changing size.\n\tif (iconData || versionStrings || patchWindowTitle) {\n\t\texe = exe || NtExecutable.from(d);\n\n\t\t// Remove reloc so rsrc can safely be resized.\n\t\tconst relocRestore = exeRemoveReloc(exe);\n\n\t\t// Remove rsrc to modify and so sections can be added.\n\t\texeAssertLastSection(exe, IDD_RESOURCE, '.rsrc');\n\t\tconst rsrc = NtExecutableResource.from(exe);\n\t\texe.setSectionByEntry(IDD_RESOURCE, null);\n\n\t\tif (iconData) {\n\t\t\trsrcPatchIcon(rsrc, iconData);\n\t\t}\n\n\t\tif (versionStrings) {\n\t\t\trsrcPatchVersion(rsrc, versionStrings);\n\t\t}\n\n\t\t// If patching title and cannot be done by resource changes.\n\t\tlet sdTitle: ArrayBuffer | null = null;\n\t\tif (\n\t\t\ttypeof patchWindowTitle === 'string' &&\n\t\t\t!patchWindowTitleRsrc(rsrc, patchWindowTitle)\n\t\t) {\n\t\t\tconst l = patchWindowTitle.length;\n\t\t\tsdTitle = new ArrayBuffer(align((l + 1) * 2, 16));\n\t\t\tconst v = new DataView(sdTitle);\n\t\t\tfor (let i = 0; i < l; i++) {\n\t\t\t\t// eslint-disable-next-line unicorn/prefer-code-point\n\t\t\t\tv.setUint16(i * 2, patchWindowTitle.charCodeAt(i), true);\n\t\t\t}\n\t\t}\n\n\t\t// Assemble new data section if any.\n\t\tif (sdTitle) {\n\t\t\t// PE library lacks a way to add an arbitrary section.\n\t\t\t// Using the reserved index temporarily, then clearing it.\n\t\t\tconst entry = IDD_RESERVED as number;\n\t\t\texe.setSectionByEntry(entry, {\n\t\t\t\tinfo: {\n\t\t\t\t\tname: '.shockd',\n\t\t\t\t\tvirtualSize: sdTitle.byteLength,\n\t\t\t\t\tvirtualAddress: 0,\n\t\t\t\t\tsizeOfRawData: sdTitle.byteLength,\n\t\t\t\t\tpointerToRawData: 0,\n\t\t\t\t\tpointerToRelocations: 0,\n\t\t\t\t\tpointerToLineNumbers: 0,\n\t\t\t\t\tnumberOfRelocations: 0,\n\t\t\t\t\tnumberOfLineNumbers: 0,\n\t\t\t\t\tcharacteristics:\n\t\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\t\tIMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ\n\t\t\t\t},\n\t\t\t\tdata: sdTitle\n\t\t\t});\n\t\t\tconst s = exe.getSectionByEntry(entry);\n\t\t\texe.newHeader.optionalHeaderDataDirectory.set(entry, {\n\t\t\t\tvirtualAddress: 0,\n\t\t\t\tsize: 0\n\t\t\t});\n\t\t\tif (!s) {\n\t\t\t\tthrow new Error('Internal error');\n\t\t\t}\n\n\t\t\t// Patch title if in the data.\n\t\t\tif (sdTitle) {\n\t\t\t\tpatchWindowTitleData(exe, s.info.virtualAddress);\n\t\t\t}\n\t\t}\n\n\t\t// Add rsrc back.\n\t\trsrc.outputResource(exe, false, true);\n\n\t\t// Add reloc back.\n\t\trelocRestore();\n\n\t\t// Update sizes.\n\t\texeUpdateSizes(exe);\n\t}\n\n\t// If the EXE was parsed generate new data from it.\n\tif (exe) {\n\t\td = exe.generate();\n\t}\n\n\t// Add back signature if one preserved.\n\tif (signature) {\n\t\td = signatureSet(d, signature, true, true);\n\t}\n\n\treturn new Uint8Array(d);\n}\n\n/**\n * Get Windows launcher for the specified type.\n *\n * @param type Executable type.\n * @param resources Data to optionally copy resources from.\n * @returns Launcher data.\n */\nexport async function windowsLauncher(\n\ttype: 'i686' | 'x86_64',\n\tresources: (() => Promise<Uint8Array>) | null = null\n) {\n\tlet data;\n\tswitch (type) {\n\t\tcase 'i686': {\n\t\t\tdata = await launcher('windows-i686');\n\t\t\tbreak;\n\t\t}\n\t\tcase 'x86_64': {\n\t\t\tdata = await launcher('windows-x86_64');\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid type: ${type as string}`);\n\t\t}\n\t}\n\n\t// Check if copying resources.\n\tif (!resources) {\n\t\treturn data;\n\t}\n\n\t// Read resources from file.\n\tconst rsrc = NtExecutableResource.from(\n\t\tNtExecutable.from(await resources(), {\n\t\t\tignoreCert: true\n\t\t})\n\t);\n\n\t// Find the first icon group for each language.\n\tconst resIconGroups = new Map<string | number, Resource.IconGroupEntry>();\n\tfor (const iconGroup of Resource.IconGroupEntry.fromEntries(rsrc.entries)) {\n\t\tconst known = resIconGroups.get(iconGroup.lang) || null;\n\t\tif (!known || iconGroup.id < known.id) {\n\t\t\tresIconGroups.set(iconGroup.lang, iconGroup);\n\t\t}\n\t}\n\n\t// List the groups and icons to be kept.\n\tconst iconGroups = new Set();\n\tconst iconDatas = new Set();\n\tfor (const [, group] of resIconGroups) {\n\t\ticonGroups.add(group.id);\n\t\tfor (const icon of group.icons) {\n\t\t\ticonDatas.add(icon.iconID);\n\t\t}\n\t}\n\n\t// Filter out the resources to keep.\n\tconst typeVersionInfo = 16;\n\tconst typeIcon = 3;\n\tconst typeIconGroup = 14;\n\trsrc.entries = rsrc.entries.filter(\n\t\tentry =>\n\t\t\tentry.type === typeVersionInfo ||\n\t\t\t(entry.type === typeIcon && iconDatas.has(entry.id)) ||\n\t\t\t(entry.type === typeIconGroup && iconGroups.has(entry.id))\n\t);\n\n\t// Remove signature if present.\n\tconst signedData = signatureGet(data);\n\tlet exeData = signatureSet(data, null, true, true);\n\n\t// Parse launcher.\n\tconst exe = NtExecutable.from(exeData);\n\n\t// Remove reloc so rsrc can safely be resized.\n\tconst relocRestore = exeRemoveReloc(exe);\n\n\t// Apply resources to launcher.\n\trsrc.outputResource(exe, false, true);\n\n\t// Add reloc back.\n\trelocRestore();\n\n\t// Update sizes.\n\texeUpdateSizes(exe);\n\n\t// Generated the updated launcher.\n\texeData = exe.generate();\n\n\t// Add back signature if one present.\n\tif (signedData) {\n\t\texeData = signatureSet(exeData, signedData, true, true);\n\t}\n\n\treturn new Uint8Array(exeData);\n}\n"],"mappings":"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","ignoreList":[]}