From 53e98cc1b44203147c0abdc03eb0e57e34c4274d Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Tue, 24 Mar 2015 21:00:12 -0700 Subject: [PATCH] win,node-gyp: enable delay-load hook by default The delay-load hook allows node.exe/iojs.exe to be renamed. See efadffe for more background. This commit is a combined squash of the following previous patches: ba93c583bca993be9d16d9a1819ecdb23697b73a, 3bda6cbfa4a9bb073790d53bc14e85b6e575bbe5, 0d6d3dda95e3fff30996c224197fac88fba85b5b. PR-URL: https://github.com/nodejs/io.js/pull/1763 Reviewed-By: Jeremiah Senkpiel --- deps/npm/node_modules/node-gyp/addon.gypi | 25 ++++++++++++++ .../node-gyp/src/win_delay_load_hook.c | 33 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 deps/npm/node_modules/node-gyp/src/win_delay_load_hook.c diff --git a/deps/npm/node_modules/node-gyp/addon.gypi b/deps/npm/node_modules/node-gyp/addon.gypi index 63fefe3d16..1fe142f70d 100644 --- a/deps/npm/node_modules/node-gyp/addon.gypi +++ b/deps/npm/node_modules/node-gyp/addon.gypi @@ -1,7 +1,9 @@ { 'target_defaults': { 'type': 'loadable_module', + 'win_delay_load_hook': 'true', 'product_prefix': '', + 'include_dirs': [ '<(node_root_dir)/src', '<(node_root_dir)/deps/uv/include', @@ -13,11 +15,34 @@ 'product_extension': 'node', 'defines': [ 'BUILDING_NODE_EXTENSION' ], }], + ['_type=="static_library"', { # set to `1` to *disable* the -T thin archive 'ld' flag. # older linkers don't support this flag. 'standalone_static_library': '<(standalone_static_library)' }], + + ['_win_delay_load_hook=="true"', { + # If the addon specifies `'win_delay_load_hook': 'true'` in its + # binding.gyp, link a delay-load hook into the DLL. This hook ensures + # that the addon will work regardless of whether the node/iojs binary + # is named node.exe, iojs.exe, or something else. + 'conditions': [ + [ 'OS=="win"', { + 'sources': [ + 'src/win_delay_load_hook.c', + ], + 'msvs_settings': { + 'VCLinkerTool': { + 'DelayLoadDLLs': [ 'iojs.exe', 'node.exe' ], + # Don't print a linker warning when no imports from either .exe + # are used. + 'AdditionalOptions': [ '/ignore:4199' ], + }, + }, + }], + ], + }], ], 'conditions': [ diff --git a/deps/npm/node_modules/node-gyp/src/win_delay_load_hook.c b/deps/npm/node_modules/node-gyp/src/win_delay_load_hook.c new file mode 100644 index 0000000000..f397cfa195 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/src/win_delay_load_hook.c @@ -0,0 +1,33 @@ +/* + * When this file is linked to a DLL, it sets up a delay-load hook that + * intervenes when the DLL is trying to load 'node.exe' or 'iojs.exe' + * dynamically. Instead of trying to locate the .exe file it'll just return + * a handle to the process image. + * + * This allows compiled addons to work when node.exe or iojs.exe is renamed. + */ + +#ifdef _MSC_VER + +#define WIN32_LEAN_AND_MEAN +#include + +#include +#include + +static FARPROC WINAPI load_exe_hook(unsigned int event, DelayLoadInfo* info) { + HMODULE m; + if (event != dliNotePreLoadLibrary) + return NULL; + + if (_stricmp(info->szDll, "iojs.exe") != 0 && + _stricmp(info->szDll, "node.exe") != 0) + return NULL; + + m = GetModuleHandle(NULL); + return (FARPROC) m; +} + +PfnDliHook __pfnDliNotifyHook2 = load_exe_hook; + +#endif