UNPKG

@shockpkg/dir-projector

Version:

Package for creating Shockwave Director projectors

1 lines 28.8 kB
{"version":3,"file":"windows.mjs","names":["signatureGet","signatureSet","NtExecutable","NtExecutableResource","Resource","Data","align","launcher","IDD_RESOURCE","IDD_BASE_RELOCATION","IMAGE_SCN_CNT_CODE","IMAGE_SCN_CNT_INITIALIZED_DATA","IMAGE_SCN_CNT_UNINITIALIZED_DATA","peVersionInts","version","parts","split","numbers","part","n","test","push","length","exeAssertLastSection","exe","index","name","section","getSectionByEntry","Error","allSections","getAllSections","last","info","pointerToRawData","exeRemoveReloc","size","newHeader","optionalHeaderDataDirectory","get","setSectionByEntry","virtualAddress","set","exeUpdateSizes","optionalHeader","fileAlignment","sizeOfCode","sizeOfInitializedData","sizeOfUninitializedData","characteristics","sizeOfRawData","virtualSize","Math","max","rsrcPatchIcon","rsrc","iconData","byteOffset","byteLength","ico","IconFile","from","buffer","slice","iconGroup","IconGroupEntry","fromEntries","entries","replaceIconsForResource","id","lang","icons","map","icon","data","rsrcPatchVersion","versionStrings","versionInfo","VersionInfo","languages","getAllLanguagesForStringValues","language","setStringValues","FileVersion","ProductVersion","uints","ms","ls","fixedInfo","fileVersionMS","fileVersionLS","productVersionMS","productVersionLS","outputToResourceEntries","peResourceReplace","options","removeSignature","signedData","exeData","relocRestore","outputResource","generate","Uint8Array","windowsLauncher","type","resources","ignoreCert","resIconGroups","Map","known","iconGroups","Set","iconDatas","group","add","iconID","typeVersionInfo","typeIcon","typeIconGroup","filter","entry","has","patchHexToBytes","str","replace","match","s","parseInt","patch3dDisplayDriversSizePatches","find","join","patchDataOnce","candidates","foundOffset","foundPatch","patch","end","i","found","j","b","windowsPatch3dDisplayDriversSize"],"sources":["../../src/util/windows.ts"],"sourcesContent":["import {signatureGet, signatureSet} from 'portable-executable-signature';\nimport {\n\tNtExecutable,\n\tNtExecutableResource,\n\tResource,\n\tData\n} from '@shockpkg/resedit';\n\nimport {align, launcher} from '../util.ts';\n\n// IMAGE_DATA_DIRECTORY indexes.\nconst IDD_RESOURCE = 2;\nconst IDD_BASE_RELOCATION = 5;\n\n// IMAGE_SECTION_HEADER characteristics.\nconst IMAGE_SCN_CNT_CODE = 0x00000020;\nconst IMAGE_SCN_CNT_INITIALIZED_DATA = 0x00000040;\nconst IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080;\n\n/**\n * PE Resource replace config.\n */\nexport interface IPeResourceReplace {\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 * If true remove signature if present.\n\t *\n\t * @default false\n\t */\n\tremoveSignature?: boolean | null;\n}\n\n/**\n * Parse PE version string to integers (MS then LS bits) or null.\n *\n * @param version Version string.\n * @returns Version integers ([MS, LS]) or null.\n */\nexport function peVersionInts(version: string): [number, number] | null {\n\tconst parts = version.split(/[,.]/);\n\tconst numbers = [];\n\tfor (const part of parts) {\n\t\tconst n = /^\\d+$/.test(part) ? +part : -1;\n\t\tif (n < 0 || n > 0xffff) {\n\t\t\treturn null;\n\t\t}\n\t\tnumbers.push(n);\n\t}\n\treturn numbers.length\n\t\t? [\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t(((numbers[0] || 0) << 16) | (numbers[1] || 0)) >>> 0,\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t(((numbers[2] || 0) << 16) | (numbers[3] || 0)) >>> 0\n\t\t\t]\n\t\t: null;\n}\n\n/**\n * Assert the given section is last section.\n *\n * @param exe NtExecutable instance.\n * @param index ImageDirectory index.\n * @param name Friendly name for messages.\n */\nfunction exeAssertLastSection(exe: NtExecutable, index: number, name: string) {\n\tconst section = exe.getSectionByEntry(index);\n\tif (!section) {\n\t\tthrow new Error(`Missing section: ${index}:${name}`);\n\t}\n\tconst allSections = exe.getAllSections();\n\tlet last = allSections[0].info;\n\tfor (const {info} of allSections) {\n\t\tif (info.pointerToRawData > last.pointerToRawData) {\n\t\t\tlast = info;\n\t\t}\n\t}\n\tconst {info} = section;\n\tif (info.pointerToRawData < last.pointerToRawData) {\n\t\tthrow new Error(`Not the last section: ${index}:${name}`);\n\t}\n}\n\n/**\n * Removes the reloc section if exists, fails if not the last section.\n *\n * @param exe NtExecutable instance.\n * @returns Restore function.\n */\nfunction exeRemoveReloc(exe: NtExecutable) {\n\tconst section = exe.getSectionByEntry(IDD_BASE_RELOCATION);\n\tif (!section) {\n\t\treturn () => {};\n\t}\n\tconst {size} =\n\t\texe.newHeader.optionalHeaderDataDirectory.get(IDD_BASE_RELOCATION);\n\texeAssertLastSection(exe, IDD_BASE_RELOCATION, '.reloc');\n\texe.setSectionByEntry(IDD_BASE_RELOCATION, null);\n\treturn () => {\n\t\texe.setSectionByEntry(IDD_BASE_RELOCATION, section);\n\t\tconst {virtualAddress} =\n\t\t\texe.newHeader.optionalHeaderDataDirectory.get(IDD_BASE_RELOCATION);\n\t\texe.newHeader.optionalHeaderDataDirectory.set(IDD_BASE_RELOCATION, {\n\t\t\tvirtualAddress,\n\t\t\tsize\n\t\t});\n\t};\n}\n\n/**\n * Update the sizes in EXE headers.\n *\n * @param exe NtExecutable instance.\n */\nfunction exeUpdateSizes(exe: NtExecutable) {\n\tconst {optionalHeader} = exe.newHeader;\n\tconst {fileAlignment} = optionalHeader;\n\tlet sizeOfCode = 0;\n\tlet sizeOfInitializedData = 0;\n\tlet sizeOfUninitializedData = 0;\n\tfor (const {\n\t\tinfo: {characteristics, sizeOfRawData, virtualSize}\n\t} of exe.getAllSections()) {\n\t\t// eslint-disable-next-line no-bitwise\n\t\tif (characteristics & IMAGE_SCN_CNT_CODE) {\n\t\t\tsizeOfCode += sizeOfRawData;\n\t\t}\n\t\t// eslint-disable-next-line no-bitwise\n\t\tif (characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA) {\n\t\t\tsizeOfInitializedData += Math.max(\n\t\t\t\tsizeOfRawData,\n\t\t\t\talign(virtualSize, fileAlignment)\n\t\t\t);\n\t\t}\n\t\t// eslint-disable-next-line no-bitwise\n\t\tif (characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA) {\n\t\t\tsizeOfUninitializedData += align(virtualSize, fileAlignment);\n\t\t}\n\t}\n\toptionalHeader.sizeOfCode = sizeOfCode;\n\toptionalHeader.sizeOfInitializedData = sizeOfInitializedData;\n\toptionalHeader.sizeOfUninitializedData = sizeOfUninitializedData;\n}\n\n/**\n * Replace all the icons in all icon groups.\n *\n * @param rsrc NtExecutableResource instance.\n * @param iconData Icon data.\n */\nfunction rsrcPatchIcon(\n\trsrc: NtExecutableResource,\n\ticonData: Readonly<Uint8Array>\n) {\n\tconst {byteOffset, byteLength} = iconData;\n\tconst ico = Data.IconFile.from(\n\t\ticonData.buffer.slice(byteOffset, byteOffset + byteLength)\n\t);\n\tfor (const iconGroup of Resource.IconGroupEntry.fromEntries(rsrc.entries)) {\n\t\tResource.IconGroupEntry.replaceIconsForResource(\n\t\t\trsrc.entries,\n\t\t\ticonGroup.id,\n\t\t\ticonGroup.lang,\n\t\t\tico.icons.map(icon => icon.data)\n\t\t);\n\t}\n}\n\n/**\n * Update strings if present for all the languages.\n *\n * @param rsrc NtExecutableResource instance.\n * @param versionStrings Version strings.\n */\nfunction rsrcPatchVersion(\n\trsrc: NtExecutableResource,\n\tversionStrings: Readonly<{[key: string]: string}>\n) {\n\tfor (const versionInfo of Resource.VersionInfo.fromEntries(rsrc.entries)) {\n\t\t// Get all the languages, not just available languages.\n\t\tconst languages = versionInfo.getAllLanguagesForStringValues();\n\t\tfor (const language of languages) {\n\t\t\tversionInfo.setStringValues(language, versionStrings);\n\t\t}\n\n\t\t// Update integer values from parsed strings if possible.\n\t\tconst {FileVersion, ProductVersion} = versionStrings;\n\t\tif (FileVersion) {\n\t\t\tconst uints = peVersionInts(FileVersion);\n\t\t\tif (uints) {\n\t\t\t\tconst [ms, ls] = uints;\n\t\t\t\tversionInfo.fixedInfo.fileVersionMS = ms;\n\t\t\t\tversionInfo.fixedInfo.fileVersionLS = ls;\n\t\t\t}\n\t\t}\n\t\tif (ProductVersion) {\n\t\t\tconst uints = peVersionInts(ProductVersion);\n\t\t\tif (uints) {\n\t\t\t\tconst [ms, ls] = uints;\n\t\t\t\tversionInfo.fixedInfo.productVersionMS = ms;\n\t\t\t\tversionInfo.fixedInfo.productVersionLS = ls;\n\t\t\t}\n\t\t}\n\n\t\tversionInfo.outputToResourceEntries(rsrc.entries);\n\t}\n}\n\n/**\n * Replace resources in Windows PE file.\n *\n * @param data File data.\n * @param options Replacement options.\n * @returns Modified data.\n */\nexport function peResourceReplace(\n\tdata: Readonly<Uint8Array>,\n\toptions: Readonly<IPeResourceReplace>\n) {\n\tconst {iconData, versionStrings, removeSignature} = options;\n\n\t// Read EXE file and remove signature if present.\n\tconst signedData = removeSignature ? null : signatureGet(data);\n\tlet exeData = signatureSet(data, null, true, true);\n\n\t// Parse EXE.\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// Remove rsrc to modify.\n\texeAssertLastSection(exe, IDD_RESOURCE, '.rsrc');\n\tconst rsrc = NtExecutableResource.from(exe);\n\texe.setSectionByEntry(IDD_RESOURCE, null);\n\n\tif (iconData) {\n\t\trsrcPatchIcon(rsrc, iconData);\n\t}\n\n\tif (versionStrings) {\n\t\trsrcPatchVersion(rsrc, versionStrings);\n\t}\n\n\t// Update resources.\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// Generate EXE.\n\texeData = exe.generate();\n\n\t// Add back signature if not removing.\n\tif (signedData) {\n\t\texeData = signatureSet(exeData, signedData, true, true);\n\t}\n\n\t// Return updated EXE file.\n\treturn new Uint8Array(exeData);\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: string,\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\tdefault: {\n\t\t\tthrow new Error(`Invalid type: ${type}`);\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\n/**\n * Patcher patch.\n */\ninterface IPatcherPatch {\n\t/**\n\t * The bytes to find.\n\t */\n\tfind: (number | null)[];\n\n\t/**\n\t * The bytes replaced with.\n\t */\n\treplace: (number | null)[];\n}\n\n/**\n * Converts a hex string into a series of byte values, with unknowns being null.\n *\n * @param str Hex string.\n * @returns Bytes and null values.\n */\nfunction patchHexToBytes(str: string) {\n\treturn (str.replace(/\\s/g, '').match(/.{1,2}/g) || []).map(s => {\n\t\tif (s.length !== 2) {\n\t\t\tthrow new Error('Internal error');\n\t\t}\n\t\t// eslint-disable-next-line unicorn/prefer-number-properties\n\t\treturn /[\\da-f]{2}/i.test(s) ? parseInt(s, 16) : null;\n\t});\n}\n\n// A list of patch candidates, made to be partially position independant.\n// Basically these patches just increase the temporary buffer sizes.\n// Enough to provide amply room for anything that should be in the registry.\n// Sizes 0x10000 for ASCII, and 0x20000 for WCHAR.\n// Not enough room to calculate the correct size, and use it directly.\nconst patch3dDisplayDriversSizePatches: IPatcherPatch[] = [\n\t// director-8.5.0 - director-11.0.0-hotfix-1:\n\t{\n\t\tfind: patchHexToBytes(\n\t\t\t[\n\t\t\t\t// call DWORD PTR ds:-- -- -- --\n\t\t\t\t'FF 15 -- -- -- --',\n\n\t\t\t\t// Change:\n\t\t\t\t// mov esi, 0x104\n\t\t\t\t'BE 04 01 00 00',\n\n\t\t\t\t// push esi\n\t\t\t\t'56',\n\t\t\t\t// call -- -- -- --\n\t\t\t\t'E8 -- -- -- --'\n\t\t\t].join(' ')\n\t\t),\n\t\treplace: patchHexToBytes(\n\t\t\t[\n\t\t\t\t// call DWORD PTR ds:-- -- -- --\n\t\t\t\t'FF 15 -- -- -- --',\n\n\t\t\t\t// Changed:\n\t\t\t\t// mov esi, 0x10000\n\t\t\t\t'BE 00 00 01 00',\n\n\t\t\t\t// push esi\n\t\t\t\t'56',\n\t\t\t\t// call -- -- -- --\n\t\t\t\t'E8 -- -- -- --'\n\t\t\t].join(' ')\n\t\t)\n\t},\n\t// director-11.0.0-hotfix-3 - director-11.5.0:\n\t{\n\t\tfind: patchHexToBytes(\n\t\t\t[\n\t\t\t\t// call DWORD PTR ds:-- -- -- --\n\t\t\t\t'FF 15 -- -- -- --',\n\n\t\t\t\t// Change:\n\t\t\t\t// mov edi, 0x104\n\t\t\t\t'BF 04 01 00 00',\n\n\t\t\t\t// push edi\n\t\t\t\t'57',\n\t\t\t\t// call -- -- -- --\n\t\t\t\t'E8 -- -- -- --'\n\t\t\t].join(' ')\n\t\t),\n\t\treplace: patchHexToBytes(\n\t\t\t[\n\t\t\t\t// call DWORD PTR ds:-- -- -- --\n\t\t\t\t'FF 15 -- -- -- --',\n\n\t\t\t\t// Changed:\n\t\t\t\t// mov edi, 0x10000\n\t\t\t\t'BF 00 00 01 00',\n\n\t\t\t\t// push edi\n\t\t\t\t'57',\n\t\t\t\t// call -- -- -- --\n\t\t\t\t'E8 -- -- -- --'\n\t\t\t].join(' ')\n\t\t)\n\t},\n\t// director-11.5.8 - director-11.5.9:\n\t{\n\t\tfind: patchHexToBytes(\n\t\t\t[\n\t\t\t\t// push -- -- -- --\n\t\t\t\t'68 -- -- -- --',\n\t\t\t\t// push edi\n\t\t\t\t'57',\n\t\t\t\t// call esi\n\t\t\t\t'FF D6',\n\n\t\t\t\t// Change:\n\t\t\t\t// push 0x208\n\t\t\t\t'68 08 02 00 00',\n\n\t\t\t\t// call -- -- -- --\n\t\t\t\t'E8 -- -- -- --'\n\t\t\t].join(' ')\n\t\t),\n\t\treplace: patchHexToBytes(\n\t\t\t[\n\t\t\t\t// push -- -- -- --\n\t\t\t\t'68 -- -- -- --',\n\t\t\t\t// push edi\n\t\t\t\t'57',\n\t\t\t\t// call esi\n\t\t\t\t'FF D6',\n\n\t\t\t\t// Changed:\n\t\t\t\t// push 0x20000\n\t\t\t\t'68 00 00 02 00',\n\n\t\t\t\t// call -- -- -- --\n\t\t\t\t'E8 -- -- -- --'\n\t\t\t].join(' ')\n\t\t)\n\t},\n\t// director-12.0.0 - director-12.0.2:\n\t{\n\t\tfind: patchHexToBytes(\n\t\t\t[\n\t\t\t\t// push -- -- -- --\n\t\t\t\t'68 -- -- -- --',\n\t\t\t\t// push ebx\n\t\t\t\t'53',\n\t\t\t\t// call edi\n\t\t\t\t'FF D7',\n\n\t\t\t\t// Change:\n\t\t\t\t// push 0x208\n\t\t\t\t'68 08 02 00 00',\n\n\t\t\t\t// call -- -- -- --\n\t\t\t\t'E8 -- -- -- --'\n\t\t\t].join(' ')\n\t\t),\n\t\treplace: patchHexToBytes(\n\t\t\t[\n\t\t\t\t// push -- -- -- --\n\t\t\t\t'68 -- -- -- --',\n\t\t\t\t// push ebx\n\t\t\t\t'53',\n\t\t\t\t// call edi\n\t\t\t\t'FF D7',\n\n\t\t\t\t// Changed:\n\t\t\t\t// push 0x20000\n\t\t\t\t'68 00 00 02 00',\n\n\t\t\t\t// call -- -- -- --\n\t\t\t\t'E8 -- -- -- --'\n\t\t\t].join(' ')\n\t\t)\n\t}\n];\n\n/**\n * Patch data buffer once.\n *\n * @param data Data buffer.\n * @param candidates Patch candidates.\n * @param name Patch name.\n */\nfunction patchDataOnce(\n\tdata: Uint8Array,\n\tcandidates: readonly IPatcherPatch[],\n\tname: string\n) {\n\t// Search the buffer for patch candidates.\n\tlet foundOffset = -1;\n\tlet foundPatch: (number | null)[] = [];\n\tfor (const patch of candidates) {\n\t\tconst {find, replace} = patch;\n\t\tif (replace.length !== find.length) {\n\t\t\tthrow new Error('Internal error');\n\t\t}\n\n\t\tconst end = data.length - find.length;\n\t\tfor (let i = 0; i < end; i++) {\n\t\t\tlet found = true;\n\t\t\tconst {length} = find;\n\t\t\tfor (let j = 0; j < length; j++) {\n\t\t\t\tconst b = find[j];\n\t\t\t\tif (b !== null && data[i + j] !== b) {\n\t\t\t\t\tfound = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!found) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (foundOffset !== -1) {\n\t\t\t\tthrow new Error(`Multiple patch candidates found for: ${name}`);\n\t\t\t}\n\n\t\t\t// Remember patch to apply.\n\t\t\tfoundOffset = i;\n\t\t\tfoundPatch = replace;\n\t\t}\n\t}\n\tif (foundOffset === -1) {\n\t\tthrow new Error(`No patch candidates found for: ${name}`);\n\t}\n\n\t// Apply the patch to the buffer, and write to file.\n\tconst {length} = foundPatch;\n\tfor (let i = 0; i < length; i++) {\n\t\tconst b = foundPatch[i];\n\t\tif (b !== null) {\n\t\t\tdata[foundOffset + i] = b;\n\t\t}\n\t}\n}\n\n/**\n * Patch Windows Shockwave 3D InstalledDisplayDrivers size.\n *\n * @param data File data.\n */\nexport function windowsPatch3dDisplayDriversSize(data: Uint8Array) {\n\tpatchDataOnce(\n\t\tdata,\n\t\tpatch3dDisplayDriversSizePatches,\n\t\t'Windows Shockwave 3D InstalledDisplayDrivers Size'\n\t);\n}\n"],"mappings":"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","ignoreList":[]}