windows-afsd-hook-20081106
authorJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 6 Nov 2008 19:18:32 +0000 (19:18 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 6 Nov 2008 19:18:32 +0000 (19:18 +0000)
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
src/WINNT/afsd/cm_daemon.c
src/WINNT/afsd/cm_utils.c
src/WINNT/afsd/cm_utils.h

index 4a75d03..290eee3 100644 (file)
@@ -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;
index 478b5e1..e511561 100644 (file)
@@ -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;
index c3abe84..575f78d 100644 (file)
@@ -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;
+}
index b852902..f1708cc 100644 (file)
@@ -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__ */