public ref class ServiceControlManager : public IDisposable { public: ServiceControlManager(void); void AddDriver(String^ ServiceName, String^ BinaryPathName); void DeleteDriver(String^ ServiceName); void StartDriver(String^ ServiceName); void StopDriver(String^ ServiceName); protected: ~ServiceControlManager(); !ServiceControlManager(); private: SC_HANDLE SCMHandle; };
[Serializable] public ref class KernelErrorException : Exception { public: KernelErrorException(void); virtual String^ ToString() override; property virtual String^ Message { String^ get() override; }; property virtual DWORD Errorsource { DWORD get(); }; private: DWORD errorsource; internal: KernelErrorException(DWORD Errorsource); };
KernelErrorException::KernelErrorException(void) { this->errorsource = GetLastError(); } KernelErrorException::KernelErrorException(DWORD Errorsource) { this->errorsource = Errorsource; }
String^ KernelErrorException::Message::get() { LPTSTR message = NULL; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, this->errorsource, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&message, 0, NULL); String^ messageString = gcnew String(message); LocalFree(message); return messageString; } DWORD KernelErrorException::Errorsource::get() { return this->errorsource; } String^ KernelErrorException::ToString() { return this->Message::get(); }
ServiceControlManager::ServiceControlManager(void) { this->SCMHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (!this->SCMHandle) throw gcnew KernelErrorException(); } ServiceControlManager::~ServiceControlManager() { this->!ServiceControlManager(); GC::SuppressFinalize(this); } ServiceControlManager::!ServiceControlManager() { CloseServiceHandle(this->SCMHandle)); }
void ServiceControlManager::AddDriver(String^ ServiceName, String^ BinaryPathName) { IntPtr serviceNamePtr = Marshal::StringToHGlobalUni(ServiceName); IntPtr binaryPathNamePtr = Marshal::StringToHGlobalUni(BinaryPathName); SC_HANDLE SCMHandleService = CreateService(this->SCMHandle, (LPCTSTR)serviceNamePtr.ToPointer(), (LPCTSTR)serviceNamePtr.ToPointer(), SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, (LPCTSTR)binaryPathNamePtr.ToPointer(), NULL, NULL, NULL, NULL, NULL); DWORD errorsource = GetLastError(); Marshal::FreeHGlobal(serviceNamePtr); Marshal::FreeHGlobal(binaryPathNamePtr); if (!SCMHandleService) throw gcnew KernelErrorException(errorsource); if (!CloseServiceHandle(SCMHandleService)) throw gcnew KernelErrorException(); } void ServiceControlManager::DeleteDriver(String^ ServiceName) { IntPtr serviceNamePtr = Marshal::StringToHGlobalUni(ServiceName); SC_HANDLE SCMHandleService = OpenService(this->SCMHandle, (LPCTSTR)serviceNamePtr.ToPointer(), SERVICE_ALL_ACCESS); DWORD errorsource = GetLastError(); Marshal::FreeHGlobal(serviceNamePtr); if (!SCMHandleService ) throw gcnew KernelErrorException(errorsource); if (!DeleteService(SCMHandleService)) throw gcnew KernelErrorException(); if (!CloseServiceHandle(SCMHandleService)) throw gcnew KernelErrorException(); } void ServiceControlManager::StartDriver(String^ ServiceName) { IntPtr serviceNamePtr = Marshal::StringToHGlobalUni(ServiceName); SC_HANDLE SCMHandleService = OpenService(this->SCMHandle, (LPCTSTR)serviceNamePtr.ToPointer(), SERVICE_ALL_ACCESS); DWORD errorsource = GetLastError(); Marshal::FreeHGlobal(serviceNamePtr); if (!SCMHandleService) throw gcnew KernelErrorException(errorsource); if (!StartService(SCMHandleService, 0, 0)) throw gcnew KernelErrorException(); if (!CloseServiceHandle(SCMHandleService)) throw gcnew KernelErrorException(); } void ServiceControlManager::StopDriver(String^ ServiceName) { IntPtr serviceNamePtr = Marshal::StringToHGlobalUni(ServiceName); SC_HANDLE SCMHandleService = OpenService(this->SCMHandle, (LPCTSTR)serviceNamePtr.ToPointer(), SERVICE_ALL_ACCESS); DWORD errorsource = GetLastError(); Marshal::FreeHGlobal(serviceNamePtr); if (!SCMHandleService) throw gcnew KernelErrorException(errorsource); SERVICE_STATUS serviceStatus; if (!ControlService(SCMHandleService, SERVICE_CONTROL_STOP, &serviceStatus)) throw gcnew KernelErrorException(); if (!CloseServiceHandle(SCMHandleService)) throw gcnew KernelErrorException(); }
try { using (ServiceControlManager scm = new ServiceControlManager()) { scm.AddDriver(serviceName, filePath); scm.StartDriver(serviceName); scm.StopDriver(serviceName); scm.DeleteDriver(serviceName); } } catch (Exception ex) { }
using namespace System::Runtime::InteropServices;
#pragma comment(lib, "Advapi32.lib")
Source: https://habr.com/ru/post/135410/
All Articles