HANDLE WaitToTerminate;
-int GlobalStatus;
+static int GlobalStatus;
#ifdef JUMP
unsigned int MainThreadId;
extern int traceOnPanic;
extern HANDLE afsi_file;
-int powerEventsRegistered = 0;
+static int powerEventsRegistered = 0;
+extern int powerStateSuspended = 0;
/*
* Notifier function for use by osi_panic
#ifdef AFSIFS
int i;
#endif
+ if (!msgp)
+ msgp = "unspecified assert";
if (filep)
LogEvent(EVENTLOG_ERROR_TYPE, MSG_SERVICE_ERROR_STOP_WITH_MSG_AND_LOCATION,
buf_ForceTrace(TRUE);
afsi_log("--- begin dump ---");
+ cm_MemDumpDirStats(afsi_file, "a", 0);
+ cm_MemDumpBPlusStats(afsi_file, "a", 0);
+ cm_DumpCells(afsi_file, "a", 0);
+ cm_DumpVolumes(afsi_file, "a", 0);
cm_DumpSCache(afsi_file, "a", 0);
#ifdef keisa
cm_dnlcDump(afsi_file, "a");
afsi_log("--- end dump ---");
#ifdef DEBUG
- if (IsDebuggerPresent())
- DebugBreak();
+ if (IsDebuggerPresent())
+ DebugBreak();
#endif
SetEvent(WaitToTerminate);
{
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
+ if (ctrlCode == SERVICE_CONTROL_SHUTDOWN)
+ afsi_log("SERVICE_CONTROL_SHUTDOWN");
+ else
+ afsi_log("SERVICE_CONTROL_STOP");
+
ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
ServiceStatus.dwWin32ExitCode = NO_ERROR;
ServiceStatus.dwCheckPoint = 1;
case PBT_APMQUERYSUSPEND:
afsi_log("SERVICE_CONTROL_APMQUERYSUSPEND");
/* Write all dirty buffers back to server */
- if ( !lana_OnlyLoopback() )
+ if ( !lana_OnlyLoopback() ) {
buf_CleanAndReset();
+ cm_SuspendSCache();
+ }
afsi_log("SERVICE_CONTROL_APMQUERYSUSPEND buf_CleanAndReset complete");
dwRet = NO_ERROR;
break;
case PBT_APMQUERYSTANDBY:
afsi_log("SERVICE_CONTROL_APMQUERYSTANDBY");
/* Write all dirty buffers back to server */
- if ( !lana_OnlyLoopback() )
+ if ( !lana_OnlyLoopback() ) {
buf_CleanAndReset();
+ cm_SuspendSCache();
+ }
afsi_log("SERVICE_CONTROL_APMQUERYSTANDBY buf_CleanAndReset complete");
dwRet = NO_ERROR;
break;
/* allow remaining case PBT_WhatEver */
case PBT_APMSUSPEND:
afsi_log("SERVICE_CONTROL_APMSUSPEND");
- if (osVersion.dwMajorVersion >= 6)
- smb_StopListeners();
+ powerStateSuspended = 1;
+ if (osVersion.dwMajorVersion >= 6) {
+ cm_SuspendSCache();
+ smb_StopListeners(0);
+ }
dwRet = NO_ERROR;
break;
case PBT_APMSTANDBY:
afsi_log("SERVICE_CONTROL_APMSTANDBY");
- if (osVersion.dwMajorVersion >= 6)
- smb_StopListeners();
+ powerStateSuspended = 1;
+ if (osVersion.dwMajorVersion >= 6) {
+ cm_SuspendSCache();
+ smb_StopListeners(0);
+ }
dwRet = NO_ERROR;
break;
case PBT_APMRESUMECRITICAL:
afsi_log("SERVICE_CONTROL_APMRESUMECRITICAL");
if (osVersion.dwMajorVersion >= 6)
- smb_RestartListeners();
+ smb_RestartListeners(0);
dwRet = NO_ERROR;
break;
case PBT_APMRESUMESUSPEND:
+ /* User logged in after suspend */
afsi_log("SERVICE_CONTROL_APMRESUMESUSPEND");
- if (osVersion.dwMajorVersion >= 6)
- smb_RestartListeners();
dwRet = NO_ERROR;
break;
- case PBT_APMRESUMESTANDBY:
+ case PBT_APMRESUMESTANDBY:
+ /* User logged in after standby */
afsi_log("SERVICE_CONTROL_APMRESUMESTANDBY");
- if (osVersion.dwMajorVersion >= 6)
- smb_RestartListeners();
dwRet = NO_ERROR;
break;
case PBT_APMBATTERYLOW:
#endif
dwRet = NO_ERROR;
break;
- case PBT_APMRESUMEAUTOMATIC:
+ case PBT_APMRESUMEAUTOMATIC:
+ /* This is the message delivered once all devices are up */
afsi_log("SERVICE_CONTROL_APMRESUMEAUTOMATIC");
- if (osVersion.dwMajorVersion >= 6)
- smb_RestartListeners();
+ powerStateSuspended = 0;
+ if (osVersion.dwMajorVersion >= 6) {
+ smb_SetLanAdapterChangeDetected();
+ }
dwRet = NO_ERROR;
break;
default:
dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_QUERY_VALUE, &hKey);
if (dwResult != ERROR_SUCCESS)
- return;
+ return 0;
while (dwIndex < MAX_DRIVES) {
dwDriveSize = sizeof(szDriveToMapTo);
RegCloseKey (parmKey);
}
- if (verifyServiceSig && cacheSize < 716800) {
+ if (verifyServiceSig
+#ifndef _WIN64
+ && cacheSize < 716800
+#endif
+ ) {
trustVerified = VerifyTrust(filename);
} else {
afsi_log("Signature Verification disabled");
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwWin32ExitCode = NO_ERROR;
ServiceStatus.dwCheckPoint = 1;
- ServiceStatus.dwWaitHint = 30000;
+ ServiceStatus.dwWaitHint = 120000;
/* accept Power Events */
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_POWEREVENT | SERVICE_ACCEPT_PARAMCHANGE;
SetServiceStatus(StatusHandle, &ServiceStatus);
}
else
{
- /* allow another 15 seconds to start */
+ /* allow another 120 seconds to start */
ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwWin32ExitCode = NO_ERROR;
ServiceStatus.dwCheckPoint = 2;
- ServiceStatus.dwWaitHint = 20000;
+ ServiceStatus.dwWaitHint = 120000;
/* accept Power Events */
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_POWEREVENT | SERVICE_ACCEPT_PARAMCHANGE;
SetServiceStatus(StatusHandle, &ServiceStatus);
}
}
+ /* Perform Volume Status Notification Initialization */
+ cm_VolStatus_Initialization();
+
#ifdef JUMP
MainThreadId = GetCurrentThreadId();
jmpret = setjmp(notifier_jmp);
}
#ifndef NOTSERVICE
- ServiceStatus.dwCheckPoint++;
- ServiceStatus.dwWaitHint -= 5000;
+ ServiceStatus.dwCheckPoint = 3;
+ ServiceStatus.dwWaitHint = 30000;
SetServiceStatus(StatusHandle, &ServiceStatus);
#endif
code = afsd_InitDaemons(&reason);
}
#ifndef NOTSERVICE
- ServiceStatus.dwCheckPoint++;
- ServiceStatus.dwWaitHint -= 5000;
+ ServiceStatus.dwCheckPoint = 4;
+ ServiceStatus.dwWaitHint = 15000;
SetServiceStatus(StatusHandle, &ServiceStatus);
#endif
+ /* Notify any volume status handlers that the cache manager has started */
+ cm_VolStatus_Service_Started();
+
/* the following ifdef chooses the mode of operation for the service. to enable
* a runtime flag (instead of compile-time), pioctl() would need to dynamically
* determine the mode, in order to use the correct ioctl special-file path. */
#ifndef NOTSERVICE
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
ServiceStatus.dwWin32ExitCode = NO_ERROR;
- ServiceStatus.dwCheckPoint = 0;
+ ServiceStatus.dwCheckPoint = 5;
ServiceStatus.dwWaitHint = 0;
/* accept Power events */
CloseHandle(hAFSDWorkerThread[cnt]);
#endif
+ ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
+ ServiceStatus.dwWin32ExitCode = NO_ERROR;
+ ServiceStatus.dwCheckPoint = 6;
+ ServiceStatus.dwWaitHint = 120000;
+ ServiceStatus.dwControlsAccepted = 0;
+ SetServiceStatus(StatusHandle, &ServiceStatus);
+
afsi_log("Received Termination Signal, Stopping Service");
if ( GlobalStatus )
}
FreeLibrary(hHookDll);
hHookDll = NULL;
-
- if (hookRc == FALSE)
- {
- ServiceStatus.dwCurrentState = SERVICE_STOPPED;
- ServiceStatus.dwWin32ExitCode = NO_ERROR;
- ServiceStatus.dwCheckPoint = 0;
- ServiceStatus.dwWaitHint = 0;
- ServiceStatus.dwControlsAccepted = 0;
- SetServiceStatus(StatusHandle, &ServiceStatus);
-
- /* exit if initialization failed */
- return;
- }
}
PowerNotificationThreadExit();
#endif
+ cm_DirDumpStats();
+#ifdef USE_BPLUS
+ cm_BPlusDumpStats();
+#endif
+
+ /* Notify any Volume Status Handlers that we are stopped */
+ cm_VolStatus_Service_Stopped();
+
+ /* Cleanup any Volume Status Notification Handler */
+ cm_VolStatus_Finalize();
+
/* allow an exit to be called after stopping the service */
hHookDll = LoadLibrary(AFSD_HOOK_DLL);
if (hHookDll)
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServiceStatus.dwWin32ExitCode = GlobalStatus ? ERROR_EXCEPTION_IN_SERVICE : NO_ERROR;
- ServiceStatus.dwCheckPoint = 0;
+ ServiceStatus.dwCheckPoint = 7;
ServiceStatus.dwWaitHint = 0;
ServiceStatus.dwControlsAccepted = 0;
SetServiceStatus(StatusHandle, &ServiceStatus);