DWORD ScmControlDriver(PSERVICE lpService, DWORD dwControl, LPSERVICE_STATUS lpServiceStatus) { DWORD dwError; DPRINT("ScmControlDriver() called\n"); switch (dwControl) { case SERVICE_CONTROL_STOP: /* Check the drivers status */ dwError = ScmGetDriverStatus(lpService, lpServiceStatus); if (dwError != ERROR_SUCCESS) goto done; /* Fail, if it is not running */ if (lpService->Status.dwCurrentState != SERVICE_RUNNING) { dwError = ERROR_INVALID_SERVICE_CONTROL; goto done; } /* Unload the driver */ dwError = ScmUnloadDriver(lpService); if (dwError == ERROR_INVALID_SERVICE_CONTROL) { /* The driver cannot be stopped, mark it non-stoppable */ lpService->Status.dwControlsAccepted = 0; goto done; } /* Make the driver 'stop pending' */ lpService->Status.dwCurrentState = SERVICE_STOP_PENDING; /* Check the drivers status again */ dwError = ScmGetDriverStatus(lpService, lpServiceStatus); break; case SERVICE_CONTROL_INTERROGATE: dwError = ScmGetDriverStatus(lpService, lpServiceStatus); break; default: dwError = ERROR_INVALID_SERVICE_CONTROL; } done: DPRINT("ScmControlDriver() done (Erorr: %lu)\n", dwError); return dwError; }
DWORD ScmControlDriver(PSERVICE lpService, DWORD dwControl, LPSERVICE_STATUS lpServiceStatus) { DWORD dwError; DPRINT("ScmControlDriver() called\n"); switch (dwControl) { case SERVICE_CONTROL_STOP: if (lpService->Status.dwCurrentState != SERVICE_RUNNING) { dwError = ERROR_INVALID_SERVICE_CONTROL; goto done; } dwError = ScmUnloadDriver(lpService); if (dwError == ERROR_SUCCESS) { lpService->Status.dwControlsAccepted = 0; lpService->Status.dwCurrentState = SERVICE_STOPPED; } break; case SERVICE_CONTROL_INTERROGATE: dwError = ScmGetDriverStatus(lpService, lpServiceStatus); break; default: dwError = ERROR_INVALID_SERVICE_CONTROL; } done:; DPRINT("ScmControlDriver() done (Erorr: %lu)\n", dwError); return dwError; }