//--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1995 // // File: servhlp.hxx // // Contents: helper functions for winnt service object // // // History: 12/11/95 ramv (Ram Viswanathan) Created. // //-------------------------------------------------------------------------- #include "winnt.hxx" #pragma hdrstop // // mapping WinNT Status Codes to ADs Status Codes and vice versa // typedef struct _ServiceStatusList { DWORD dwWinNTServiceStatus; DWORD dwADsServiceStatus; } SERVICE_STATUS_LIST, *PSERVICE_STATUS_LIST; SERVICE_STATUS_LIST ServiceStatusList[] = { {SERVICE_STOPPED, ADS_SERVICE_STOPPED }, {SERVICE_START_PENDING, ADS_SERVICE_START_PENDING }, {SERVICE_STOP_PENDING, ADS_SERVICE_STOP_PENDING }, {SERVICE_RUNNING, ADS_SERVICE_RUNNING }, {SERVICE_CONTINUE_PENDING, ADS_SERVICE_CONTINUE_PENDING }, {SERVICE_PAUSE_PENDING, ADS_SERVICE_PAUSE_PENDING }, {SERVICE_PAUSED, ADS_SERVICE_PAUSED }, }; typedef struct _ServiceTypeList { DWORD dwWinNTServiceType; DWORD dwADsServiceType; } SERVICETYPELIST, *PSERVICETYPELIST; typedef struct _StartTypeList { DWORD dwWinNTStartType; DWORD dwADsStartType; } STARTTYPELIST, *PSTARTTYPELIST; typedef struct _ErrorList { DWORD dwWinNTErrorControl; DWORD dwADsErrorControl; } ERRORLIST, *PERRORLIST; SERVICETYPELIST ServiceTypeList[] = { { SERVICE_WIN32_OWN_PROCESS,ADS_SERVICE_OWN_PROCESS }, { SERVICE_WIN32_SHARE_PROCESS,ADS_SERVICE_SHARE_PROCESS }, { SERVICE_KERNEL_DRIVER,ADS_SERVICE_KERNEL_DRIVER}, { SERVICE_FILE_SYSTEM_DRIVER,ADS_SERVICE_FILE_SYSTEM_DRIVER} }; STARTTYPELIST StartTypeList[] = { {SERVICE_BOOT_START,ADS_SERVICE_BOOT_START }, {SERVICE_SYSTEM_START, ADS_SERVICE_SYSTEM_START}, {SERVICE_AUTO_START,ADS_SERVICE_AUTO_START }, {SERVICE_DEMAND_START, ADS_SERVICE_DEMAND_START}, {SERVICE_DISABLED, ADS_SERVICE_DISABLED} }; ERRORLIST ErrorList[] = { {SERVICE_ERROR_IGNORE,ADS_SERVICE_ERROR_IGNORE }, {SERVICE_ERROR_NORMAL,ADS_SERVICE_ERROR_NORMAL }, {SERVICE_ERROR_SEVERE,ADS_SERVICE_ERROR_SEVERE }, {SERVICE_ERROR_CRITICAL,ADS_SERVICE_ERROR_CRITICAL} }; BOOL ServiceStatusWinNTToADs( DWORD dwWinNTStatus, DWORD *pdwADsStatus) { BOOL found = FALSE; int i; for (i=0;i<7;i++){ if(dwWinNTStatus == ServiceStatusList[i].dwWinNTServiceStatus){ *pdwADsStatus = ServiceStatusList[i].dwADsServiceStatus; found = TRUE; break; } } return (found); } BOOL ServiceStatusADsToWinNT( DWORD dwADsStatus, DWORD *pdwWinNTStatus) { BOOL found = FALSE; int i; for (i=0;i<7;i++){ if(dwADsStatus == ServiceStatusList[i].dwADsServiceStatus){ *pdwWinNTStatus = ServiceStatusList[i].dwWinNTServiceStatus; found = TRUE; break; } } return (found); } HRESULT WinNTEnumServices( LPTSTR szComputerName, LPDWORD pdwServiceObjectReturned, LPBYTE *ppMem ) { SC_HANDLE schSCManager = NULL; LPBYTE pMem = NULL; DWORD dwBytesNeeded =0; DWORD dwBufLen = 0; DWORD dwResumeHandle = 0; BOOL fStatus; DWORD dwLastError = NULL; HRESULT hr = S_OK; ADsAssert(pdwServiceObjectReturned); ADsAssert(ppMem); schSCManager = OpenSCManager(szComputerName, NULL, SC_MANAGER_ENUMERATE_SERVICE ); if(schSCManager == NULL){ hr =HRESULT_FROM_WIN32(GetLastError()); goto cleanup; } // // enumerate all win32 services // fStatus = EnumServicesStatus(schSCManager, SERVICE_WIN32, SERVICE_ACTIVE| SERVICE_INACTIVE, (LPENUM_SERVICE_STATUS)pMem, dwBufLen, &dwBytesNeeded, pdwServiceObjectReturned, &dwResumeHandle ); if(dwBytesNeeded==0){ hr = S_FALSE; goto cleanup; } if (!fStatus) { dwLastError = GetLastError(); switch (dwLastError) { case ERROR_INSUFFICIENT_BUFFER: case ERROR_MORE_DATA : pMem = (LPBYTE)AllocADsMem(dwBytesNeeded); dwBufLen = dwBytesNeeded; if (!pMem) { hr = E_OUTOFMEMORY; break; } fStatus = EnumServicesStatus(schSCManager, SERVICE_WIN32, SERVICE_ACTIVE| SERVICE_INACTIVE, (LPENUM_SERVICE_STATUS)pMem, dwBufLen, &dwBytesNeeded, pdwServiceObjectReturned, &dwResumeHandle ); if (!fStatus) { hr = HRESULT_FROM_WIN32(GetLastError()); break; } break; default: hr = HRESULT_FROM_WIN32(GetLastError()); break; } BAIL_IF_ERROR(hr); } *ppMem = pMem; cleanup: if(FAILED(hr)){ if(pMem){ FreeADsMem(pMem); } } // // Close the handle to service control manager // if (schSCManager) { CloseServiceHandle(schSCManager); } RRETURN(hr); } BOOL ServiceTypeWinNTToADs(DWORD dwServiceType, DWORD *pdwADsServiceType ) { BOOL found = FALSE; int i; for (i=0; i<4; i++){ if(dwServiceType == ServiceTypeList[i].dwWinNTServiceType){ *pdwADsServiceType = ServiceTypeList[i].dwADsServiceType; found = TRUE; break; } break; } return(found); } BOOL StartTypeWinNTToADs(DWORD dwStartType, DWORD *pdwADsStartType ) { BOOL found = FALSE; int i; for (i=0; i<5; i++){ if(dwStartType == StartTypeList[i].dwWinNTStartType){ *pdwADsStartType = StartTypeList[i].dwADsStartType; found = TRUE; break; } } return(found); } BOOL ErrorControlWinNTToADs(DWORD dwErrorControl, DWORD *pdwADsErrorControl) { BOOL found = FALSE; int i; for (i=0; i<4; i++){ if(dwErrorControl == ErrorList[i].dwWinNTErrorControl){ *pdwADsErrorControl = ErrorList[i].dwADsErrorControl; found = TRUE; break; } } return(found); } BOOL ServiceTypeADsToWinNT(DWORD dwADsServiceType, DWORD *pdwServiceType) { BOOL found = FALSE; int i; for (i=0; i<4; i++){ if(dwADsServiceType == ServiceTypeList[i].dwADsServiceType){ *pdwServiceType = ServiceTypeList[i].dwWinNTServiceType; found = TRUE; break; } break; } return(found); } BOOL StartTypeADsToWinNT(DWORD dwADsStartType, DWORD *pdwStartType) { BOOL found = FALSE; int i; for (i=0; i<5; i++){ if(dwADsStartType == StartTypeList[i].dwADsStartType){ *pdwStartType = StartTypeList[i].dwWinNTStartType; found = TRUE; break; } } return(found); } BOOL ErrorControlADsToWinNT(DWORD dwADsErrorControl, DWORD *pdwErrorControl ) { BOOL found = FALSE; int i; for (i=0; i<4; i++){ if(dwADsErrorControl == ErrorList[i].dwADsErrorControl){ *pdwErrorControl = ErrorList[i].dwWinNTErrorControl; found = TRUE; break; } } return(found); } HRESULT WinNTDeleteService(POBJECTINFO pObjectInfo) { SC_HANDLE schService = NULL; SC_HANDLE schSCManager = NULL; HRESULT hr = S_OK; BOOL fRetval = FALSE; schSCManager = OpenSCManager(pObjectInfo->ComponentArray[1], NULL, SC_MANAGER_ALL_ACCESS ); if(schSCManager == NULL){ hr = HRESULT_FROM_WIN32(GetLastError()); goto cleanup; } schService = OpenService(schSCManager, pObjectInfo->ComponentArray[2], DELETE ); if(schService == NULL){ hr = HRESULT_FROM_WIN32(GetLastError()); goto cleanup; } fRetval = DeleteService(schService); if(!fRetval){ hr = HRESULT_FROM_WIN32(GetLastError()); goto cleanup; } cleanup: if(schSCManager){ fRetval = CloseServiceHandle(schSCManager); if(!fRetval && SUCCEEDED(hr)){ RRETURN(HRESULT_FROM_WIN32(GetLastError())); } } if(schService){ fRetval = CloseServiceHandle(schService); if(!fRetval && SUCCEEDED(hr)){ RRETURN(HRESULT_FROM_WIN32(GetLastError())); } } RRETURN(hr); }