From df33edc04970e10262ac04c9b80ad1d7e7c26327 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 26 Mar 2004 06:39:23 +0000 Subject: [PATCH 1/1] win-xp-sp2-20040325 Support for punching holes in the Win XP SP2 Firewall for AFS Cache Manager Callbacks --- src/WINNT/afsd/afsd_init.c | 21 +++++++++++++++++++++ src/WINNT/afsd/afsd_service.c | 29 +++++++++++++++++------------ 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/WINNT/afsd/afsd_init.c b/src/WINNT/afsd/afsd_init.c index 5094885..1d4ca3e 100644 --- a/src/WINNT/afsd/afsd_init.c +++ b/src/WINNT/afsd/afsd_init.c @@ -571,6 +571,27 @@ int afsd_InitCM(char **reasonP) afsi_log("rx_SetMaxMTU %d successful", rx_mtu); } + /* Open Microsoft Firewall to allow in port 7001 */ + { + HKEY hk; + DWORD dwDisp; + TCHAR value = TEXT("7001:UDP:*:Enabled:AFS Cache Manager Callback"); + if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, + "SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile\GloballyOpenP", + 0, TEXT("container"), 0, KEY_SET_VALUE, NULL, &hk, &dwDisp) == ERROR_SUCCESS) + { + RegSetValueEx (hk, TEXT("7001:UDP"), NULL, REG_SZ, (PBYTE)value, sizeof(TCHAR) * (1+lstrlen(value))); + RegCloseKey (hk); + } + if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, + "SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\GloballyOpenP", + 0, TEXT("container"), 0, KEY_SET_VALUE, NULL, &hk, &dwDisp) == ERROR_SUCCESS) + { + RegSetValueEx (hk, TEXT("7001:UDP"), NULL, REG_SZ, (PBYTE)value, sizeof(TCHAR) * (1+lstrlen(value))); + RegCloseKey (hk); + } + } + /* initialize RX, and tell it to listen to port 7001, which is used for * callback RPC messages. */ diff --git a/src/WINNT/afsd/afsd_service.c b/src/WINNT/afsd/afsd_service.c index 0cc4387..99f7c1a 100644 --- a/src/WINNT/afsd/afsd_service.c +++ b/src/WINNT/afsd/afsd_service.c @@ -40,6 +40,8 @@ extern void afsi_log(char *pattern, ...); +HANDLE hAFSDMainThread = NULL; + HANDLE WaitToTerminate; int GlobalStatus; @@ -189,7 +191,7 @@ afsd_ServiceControlHandlerEx( ServiceStatus.dwWin32ExitCode = NO_ERROR; ServiceStatus.dwCheckPoint = 1; ServiceStatus.dwWaitHint = 10000; - ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_POWEREVENT; + ServiceStatus.dwControlsAccepted = 0; SetServiceStatus(StatusHandle, &ServiceStatus); SetEvent(WaitToTerminate); dwRet = NO_ERROR; @@ -317,7 +319,9 @@ void afsd_Main(DWORD argc, LPTSTR *argv) { long code; char *reason; +#ifdef JUMP int jmpret; +#endif /* JUMP */ HANDLE hInitHookDll; AfsdInitHook initHook; @@ -331,6 +335,8 @@ void afsd_Main(DWORD argc, LPTSTR *argv) GlobalStatus = 0; + afsi_start(); + WaitToTerminate = CreateEvent(NULL, TRUE, FALSE, TEXT("afsd_service_WaitToTerminate")); if ( GetLastError() == ERROR_ALREADY_EXISTS ) afsi_log("Event Object Already Exists: %s", TEXT("afsd_service_WaitToTerminate")); @@ -365,8 +371,6 @@ void afsd_Main(DWORD argc, LPTSTR *argv) PowerNotificationThreadCreate(); #endif - afsi_start(); - /* allow an exit to be called prior to any initialization */ hInitHookDll = LoadLibrary(AFSD_HOOK_DLL); if (hInitHookDll) @@ -459,13 +463,6 @@ void afsd_Main(DWORD argc, LPTSTR *argv) WaitForSingleObject(WaitToTerminate, INFINITE); - ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING; - ServiceStatus.dwWin32ExitCode = NO_ERROR; - ServiceStatus.dwCheckPoint = 0; - ServiceStatus.dwWaitHint = 5000; - ServiceStatus.dwControlsAccepted = 0; - SetServiceStatus(StatusHandle, &ServiceStatus); - { HANDLE h; char *ptbuf[1]; h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); @@ -483,7 +480,10 @@ void afsd_Main(DWORD argc, LPTSTR *argv) /* Remove the ExceptionFilter */ SetUnhandledExceptionFilter(NULL); - ServiceStatus.dwCurrentState = SERVICE_STOPPED; + if ( hInitHookDll ) + FreeLibrary(hInitHookDll); + + ServiceStatus.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwWin32ExitCode = GlobalStatus ? ERROR_EXCEPTION_IN_SERVICE : NO_ERROR; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; @@ -511,12 +511,17 @@ main(void) if (status == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) { DWORD tid; - CreateThread(NULL, 0, afsdMain_thread, 0, 0, &tid); + hAFSDMainThread = CreateThread(NULL, 0, afsdMain_thread, 0, 0, &tid); printf("Hit to terminate OpenAFS Client Service\n"); getchar(); SetEvent(WaitToTerminate); } } + + if ( hAFSDMainThread ) { + WaitForSingleObject( hAFSDMainThread, INFINITE ); + CloseHandle( hAFSDMainThread ); + } return(0); } -- 1.9.4