From a36618213694f37cd1cec660336267a38cee9344 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 6 Nov 2008 19:18:32 +0000 Subject: [PATCH] windows-afsd-hook-20081106 LICENSE MIT When loading the afsdhook.dll require that it be in the same directory as afsd_service.exe. This prevents LoadLibrary() from searching the PATH environment variable if it cannot be found. If the PATH environment variable contains a path in AFS, the library will fail to load and take a very long time doing so. --- src/WINNT/afsd/afsd_service.c | 12 ++++++------ src/WINNT/afsd/cm_daemon.c | 2 +- src/WINNT/afsd/cm_utils.c | 22 ++++++++++++++++++++++ src/WINNT/afsd/cm_utils.h | 2 ++ 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/WINNT/afsd/afsd_service.c b/src/WINNT/afsd/afsd_service.c index 4a75d033e..290eee3a5 100644 --- a/src/WINNT/afsd/afsd_service.c +++ b/src/WINNT/afsd/afsd_service.c @@ -1215,7 +1215,7 @@ afsd_Main(DWORD argc, LPTSTR *argv) } /* allow an exit to be called prior to any initialization */ - hHookDll = LoadLibrary(AFSD_HOOK_DLL); + hHookDll = cm_LoadAfsdHookLib(); if (hHookDll) { BOOL hookRc = TRUE; @@ -1287,7 +1287,7 @@ afsd_Main(DWORD argc, LPTSTR *argv) } /* allow an exit to be called post rx initialization */ - hHookDll = LoadLibrary(AFSD_HOOK_DLL); + hHookDll = cm_LoadAfsdHookLib(); if (hHookDll) { BOOL hookRc = TRUE; @@ -1335,7 +1335,7 @@ afsd_Main(DWORD argc, LPTSTR *argv) } /* allow an exit to be called post smb initialization */ - hHookDll = LoadLibrary(AFSD_HOOK_DLL); + hHookDll = cm_LoadAfsdHookLib(); if (hHookDll) { BOOL hookRc = TRUE; @@ -1381,7 +1381,7 @@ afsd_Main(DWORD argc, LPTSTR *argv) } /* allow an exit to be called when started */ - hHookDll = LoadLibrary(AFSD_HOOK_DLL); + hHookDll = cm_LoadAfsdHookLib(); if (hHookDll) { BOOL hookRc = TRUE; @@ -1426,7 +1426,7 @@ afsd_Main(DWORD argc, LPTSTR *argv) LogEvent(EVENTLOG_INFORMATION_TYPE, MSG_SERVICE_STOPPING); /* allow an exit to be called prior to stopping the service */ - hHookDll = LoadLibrary(AFSD_HOOK_DLL); + hHookDll = cm_LoadAfsdHookLib(); if (hHookDll) { BOOL hookRc = TRUE; @@ -1486,7 +1486,7 @@ afsd_Main(DWORD argc, LPTSTR *argv) cm_VolStatus_Finalize(); /* allow an exit to be called after stopping the service */ - hHookDll = LoadLibrary(AFSD_HOOK_DLL); + hHookDll = cm_LoadAfsdHookLib(); if (hHookDll) { BOOL hookRc = TRUE; diff --git a/src/WINNT/afsd/cm_daemon.c b/src/WINNT/afsd/cm_daemon.c index 478b5e116..e511561a9 100644 --- a/src/WINNT/afsd/cm_daemon.c +++ b/src/WINNT/afsd/cm_daemon.c @@ -533,7 +533,7 @@ void cm_Daemon(long parm) } /* allow an exit to be called prior to stopping the service */ - hHookDll = LoadLibrary(AFSD_HOOK_DLL); + hHookDll = cm_LoadAfsdHookLib(); if (hHookDll) { BOOL hookRc = TRUE; diff --git a/src/WINNT/afsd/cm_utils.c b/src/WINNT/afsd/cm_utils.c index c3abe8439..575f78dec 100644 --- a/src/WINNT/afsd/cm_utils.c +++ b/src/WINNT/afsd/cm_utils.c @@ -762,3 +762,25 @@ cm_TargetPerceivedAsDirectory(const fschar_t *target) return FALSE; } + +HANDLE +cm_LoadAfsdHookLib(void) +{ + char dllname[260]; + char *p; + HANDLE hLib; + + if (!GetModuleFileName(NULL, dllname, sizeof(dllname))) + return NULL; + + p = strrchr(dllname, '\\'); + if (p) { + p++; + strcpy(p, AFSD_HOOK_DLL); + hLib = LoadLibrary(dllname); + } else { + hLib = LoadLibrary(AFSD_HOOK_DLL); + } + + return hLib; +} diff --git a/src/WINNT/afsd/cm_utils.h b/src/WINNT/afsd/cm_utils.h index b852902b1..f1708cc04 100644 --- a/src/WINNT/afsd/cm_utils.h +++ b/src/WINNT/afsd/cm_utils.h @@ -83,4 +83,6 @@ extern int cm_MatchMask(clientchar_t *namep, clientchar_t *maskp, int flags); extern BOOL cm_TargetPerceivedAsDirectory(const fschar_t *target); +extern HANDLE cm_LoadAfsdHookLib(void); + #endif /* __CM_UTILS_H_ENV__ */ -- 2.39.5