Skip to content

Commit

Permalink
win: Adds delay load hook to allow renaming exe.
Browse files Browse the repository at this point in the history
Fix inherited by @piscisaureus's work:
 * nodejs/node#1251 and
 * nodejs/node#1266

Issue URL: #4.
PR URL: rvagg#5.
  • Loading branch information
am11 committed Mar 29, 2015
1 parent 952ec63 commit 251a416
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 0 deletions.
25 changes: 25 additions & 0 deletions addon.gypi
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
{
'target_defaults': {
'type': 'loadable_module',
'win_delay_load_hook': 'false',
'product_prefix': '',

'include_dirs': [
'<(node_root_dir)/src',
'<(node_root_dir)/deps/uv/include',
Expand All @@ -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 has the 'win_delay_load_hook' option set to 'true', link a
# delay-load hook into the DLL. That 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': [
Expand Down
32 changes: 32 additions & 0 deletions src/win_delay_load_hook.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* 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 <windows.h>

#include <delayimp.h>
#include <string.h>

static FARPROC WINAPI load_exe_hook(unsigned int event, DelayLoadInfo* info) {
if (event != dliNotePreLoadLibrary)
return NULL;

if (_stricmp(info->szDll, "iojs.exe") != 0 &&
_stricmp(info->szDll, "node.exe") != 0)
return NULL;

HMODULE m = GetModuleHandle(NULL);
return (FARPROC) m;
}

PfnDliHook __pfnDliNotifyHook2 = load_exe_hook;

#endif

0 comments on commit 251a416

Please sign in to comment.