@shockpkg/dir-projector
Version:
Package for creating Shockwave Director projectors
1 lines • 23.2 kB
Source Map (JSON)
{"version":3,"sources":["util/windows.ts"],"names":["signatureGet","signatureSet","resedit","fse","bufferToArrayBuffer","launcher","ResEditNtExecutable","NtExecutable","default","ResEditNtExecutableResource","NtExecutableResource","ResEditResource","Resource","ResEditData","Data","peVersionInts","version","parts","split","numbers","part","n","test","NaN","push","length","peResourceReplace","path","options","iconData","versionStrings","removeSignature","exeOriginal","readFile","signedData","exeData","exe","from","res","ico","IconFile","iconGroup","IconGroupEntry","fromEntries","entries","replaceIconsForResource","id","lang","icons","map","icon","data","versionInfo","VersionInfo","languages","getAllLanguagesForStringValues","language","setStringValues","FileVersion","ProductVersion","uints","ms","ls","fixedInfo","fileVersionMS","fileVersionLS","productVersionMS","productVersionLS","outputToResourceEntries","outputResource","generate","writeFile","Buffer","windowsLauncher","type","resources","Error","ignoreCert","resIconGroups","Map","known","get","set","iconGroups","Set","iconDatas","group","add","iconID","typeVersionInfo","typeIcon","typeIconGroup","filter","entry","has","patchHexToBytes","str","replace","match","s","parseInt","patchShockwave3dInstalledDisplayDriversSizePatches","find","join","patchDataOnce","candidates","name","foundOffset","foundPatch","patch","end","i","found","j","b","patchFileOnce","file","windowsPatchShockwave3dInstalledDisplayDriversSize"],"mappings":"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","sourcesContent":["import {\n\tsignatureGet,\n\tsignatureSet\n} from 'portable-executable-signature';\nimport * as resedit from 'resedit';\nimport fse from 'fs-extra';\n\nimport {\n\tbufferToArrayBuffer,\n\tlauncher\n} from '../util';\n\nconst ResEditNtExecutable =\n\tresedit.NtExecutable ||\n\t(resedit as any).default.NtExecutable;\n\nconst ResEditNtExecutableResource =\n\tresedit.NtExecutableResource ||\n\t(resedit as any).default.NtExecutableResource;\n\nconst ResEditResource =\n\tresedit.Resource ||\n\t(resedit as any).default.Resource;\n\nconst ResEditData =\n\tresedit.Data ||\n\t(resedit as any).default.Data;\n\nexport interface IPeResourceReplace {\n\n\t/**\n\t * Replace icons if not null.\n\t *\n\t * @default null\n\t */\n\ticonData?: Readonly<Buffer> | 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 : NaN;\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// eslint-disable-next-line no-bitwise\n\t\t(((numbers[0] || 0) << 16) | (numbers[1] || 0)) >>> 0,\n\t\t// eslint-disable-next-line no-bitwise\n\t\t(((numbers[2] || 0) << 16) | (numbers[3] || 0)) >>> 0\n\t] : null;\n}\n\n/**\n * Replace resources in Windows PE file.\n *\n * @param path File path.\n * @param options Replacement options.\n */\nexport async function peResourceReplace(\n\tpath: string,\n\toptions: Readonly<IPeResourceReplace>\n) {\n\tconst {\n\t\ticonData,\n\t\tversionStrings,\n\t\tremoveSignature\n\t} = options;\n\n\t// Read EXE file and remove signature if present.\n\tconst exeOriginal = await fse.readFile(path);\n\tconst signedData = removeSignature ? null : signatureGet(exeOriginal);\n\tlet exeData = signatureSet(exeOriginal, null, true, true);\n\n\t// Parse resources.\n\tconst exe = ResEditNtExecutable.from(exeData);\n\tconst res = ResEditNtExecutableResource.from(exe);\n\n\t// Replace all the icons in all icon groups.\n\tif (iconData) {\n\t\tconst ico = ResEditData.IconFile.from(\n\t\t\tbufferToArrayBuffer(iconData)\n\t\t);\n\t\tfor (const iconGroup of ResEditResource.IconGroupEntry.fromEntries(\n\t\t\tres.entries\n\t\t)) {\n\t\t\tResEditResource.IconGroupEntry.replaceIconsForResource(\n\t\t\t\tres.entries,\n\t\t\t\ticonGroup.id,\n\t\t\t\ticonGroup.lang,\n\t\t\t\tico.icons.map(icon => icon.data)\n\t\t\t);\n\t\t}\n\t}\n\n\t// Update strings if present for all the languages.\n\tif (versionStrings) {\n\t\tfor (const versionInfo of ResEditResource.VersionInfo.fromEntries(\n\t\t\tres.entries\n\t\t)) {\n\t\t\t// Get all the languages, not just available languages.\n\t\t\tconst languages = versionInfo.getAllLanguagesForStringValues();\n\t\t\tfor (const language of languages) {\n\t\t\t\tversionInfo.setStringValues(language, versionStrings);\n\t\t\t}\n\n\t\t\t// Update integer values from parsed strings if possible.\n\t\t\tconst {FileVersion, ProductVersion} = versionStrings;\n\t\t\tif (FileVersion) {\n\t\t\t\tconst uints = peVersionInts(FileVersion);\n\t\t\t\tif (uints) {\n\t\t\t\t\tconst [ms, ls] = uints;\n\t\t\t\t\tversionInfo.fixedInfo.fileVersionMS = ms;\n\t\t\t\t\tversionInfo.fixedInfo.fileVersionLS = ls;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ProductVersion) {\n\t\t\t\tconst uints = peVersionInts(ProductVersion);\n\t\t\t\tif (uints) {\n\t\t\t\t\tconst [ms, ls] = uints;\n\t\t\t\t\tversionInfo.fixedInfo.productVersionMS = ms;\n\t\t\t\t\tversionInfo.fixedInfo.productVersionLS = ls;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tversionInfo.outputToResourceEntries(res.entries);\n\t\t}\n\t}\n\n\t// Update resources.\n\tres.outputResource(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// Write updated EXE file.\n\tawait fse.writeFile(path, Buffer.from(exeData));\n}\n\n/**\n * Get Windows launcher for the specified type.\n *\n * @param type Executable type.\n * @param resources File to optionally copy resources from.\n * @returns Launcher data.\n */\nexport async function windowsLauncher(\n\ttype: 'i686' | 'x86_64',\n\tresources: string | 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}`);\n\t\t}\n\t}\n\n\t// Check if copying resources.\n\tif (!resources) {\n\t\treturn data;\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// Read resources from file.\n\tconst res = ResEditNtExecutableResource.from(\n\t\tResEditNtExecutable.from(\n\t\t\tawait fse.readFile(resources),\n\t\t\t{\n\t\t\t\tignoreCert: true\n\t\t\t}\n\t\t)\n\t);\n\n\t// Find the first icon group for each language.\n\tconst resIconGroups = new Map();\n\tfor (const iconGroup of ResEditResource.IconGroupEntry.fromEntries(\n\t\tres.entries\n\t)) {\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\tres.entries = res.entries.filter(entry => (\n\t\tentry.type === typeVersionInfo ||\n\t\t(entry.type === typeIcon && iconDatas.has(entry.id)) ||\n\t\t(entry.type === typeIconGroup && iconGroups.has(entry.id))\n\t));\n\n\t// Apply resources to launcher.\n\tconst exe = ResEditNtExecutable.from(exeData);\n\tres.outputResource(exe);\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 Buffer.from(exeData);\n}\n\ninterface IPatcherPatch {\n\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\\r\\n]/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\treturn /[0-9A-F]{2}/i.test(s) ? parseInt(s, 16) : null;\n\t});\n}\n\n/* eslint-disable no-multi-spaces */\n/* eslint-disable line-comment-position */\n/* eslint-disable no-inline-comments */\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 patchShockwave3dInstalledDisplayDriversSizePatches: IPatcherPatch[] = [\n\t// director-8.5.0 - director-11.0.0-hotfix-1:\n\t{\n\t\tfind: patchHexToBytes([\n\t\t\t'FF 15 -- -- -- --', // call DWORD PTR ds:-- -- -- --\n\t\t\t'BE 04 01 00 00', // mov esi, 0x104\n\t\t\t'56', // push esi\n\t\t\t'E8 -- -- -- --' // call -- -- -- --\n\t\t].join(' ')),\n\t\treplace: patchHexToBytes([\n\t\t\t'FF 15 -- -- -- --', // call DWORD PTR ds:-- -- -- --\n\t\t\t// Change:\n\t\t\t'BE 00 00 01 00', // mov esi, 0x10000\n\t\t\t'56', // push esi\n\t\t\t'E8 -- -- -- --' // call -- -- -- --\n\t\t].join(' '))\n\t},\n\t// director-11.0.0-hotfix-3 - director-11.5.0:\n\t{\n\t\tfind: patchHexToBytes([\n\t\t\t'FF 15 -- -- -- --', // call DWORD PTR ds:-- -- -- --\n\t\t\t'BF 04 01 00 00', // mov edi, 0x104\n\t\t\t'57', // push edi\n\t\t\t'E8 -- -- -- --' // call -- -- -- --\n\t\t].join(' ')),\n\t\treplace: patchHexToBytes([\n\t\t\t'FF 15 -- -- -- --', // call DWORD PTR ds:-- -- -- --\n\t\t\t// Change:\n\t\t\t'BF 00 00 01 00', // mov edi, 0x10000\n\t\t\t'57', // push edi\n\t\t\t'E8 -- -- -- --' // call -- -- -- --\n\t\t].join(' '))\n\t},\n\t// director-11.5.8 - director-11.5.9:\n\t{\n\t\tfind: patchHexToBytes([\n\t\t\t'68 -- -- -- --', // push -- -- -- --\n\t\t\t'57', // push edi\n\t\t\t'FF D6', // call esi\n\t\t\t'68 08 02 00 00', // push 0x208\n\t\t\t'E8 -- -- -- --' // call -- -- -- --\n\t\t].join(' ')),\n\t\treplace: patchHexToBytes([\n\t\t\t'68 -- -- -- --', // push -- -- -- --\n\t\t\t'57', // push edi\n\t\t\t'FF D6', // call esi\n\t\t\t// Change:\n\t\t\t'68 00 00 02 00', // push 0x20000\n\t\t\t'E8 -- -- -- --' // call -- -- -- --\n\t\t].join(' '))\n\t},\n\t// director-12.0.0:\n\t{\n\t\tfind: patchHexToBytes([\n\t\t\t'68 -- -- -- --', // push -- -- -- --\n\t\t\t'53', // push ebx\n\t\t\t'FF D7', // call edi\n\t\t\t'68 08 02 00 00', // push 0x208\n\t\t\t'E8 -- -- -- --' // call -- -- -- --\n\t\t].join(' ')),\n\t\treplace: patchHexToBytes([\n\t\t\t'68 -- -- -- --', // push -- -- -- --\n\t\t\t'53', // push ebx\n\t\t\t'FF D7', // call edi\n\t\t\t// Change:\n\t\t\t'68 00 00 02 00', // push 0x20000\n\t\t\t'E8 -- -- -- --' // call -- -- -- --\n\t\t].join(' '))\n\t}\n];\n/* eslint-enable no-multi-spaces */\n/* eslint-enable line-comment-position */\n/* eslint-enable no-inline-comments */\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: Buffer,\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\tfor (let j = 0; j < find.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(\n\t\t\t\t\t`Multiple patch candidates found for: ${name}`\n\t\t\t\t);\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\tfor (let i = 0; i < foundPatch.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 a file once.\n *\n * @param file File path.\n * @param candidates Patch candidates.\n * @param name Patch name.\n */\nasync function patchFileOnce(\n\tfile: string,\n\tcandidates: Readonly<IPatcherPatch[]>,\n\tname: string\n) {\n\tconst data = await fse.readFile(file);\n\tpatchDataOnce(data, candidates, name);\n\tawait fse.writeFile(file, data);\n}\n\n/**\n * Patch Windows Shockwave 3D InstalledDisplayDrivers size.\n *\n * @param file File path.\n */\nexport async function windowsPatchShockwave3dInstalledDisplayDriversSize(\n\tfile: string\n) {\n\tawait patchFileOnce(\n\t\tfile,\n\t\tpatchShockwave3dInstalledDisplayDriversSizePatches,\n\t\t'Windows Shockwave 3D InstalledDisplayDrivers Size'\n\t);\n}\n"],"file":"windows.mjs","sourceRoot":"../../src"}