|
|
|||||||||||||||||||||||||||||
|
Использование SCM для управления драйверами в C# реализованной с помощью dll на C++/cliИсточник: habrahabr
SCM - это сервер, реализованный в Windows, для удаленного управления сервисами (вызовом процедур). Для того, чтобы запустить драйвер в Windows, ему в соответствие ставится сервис, который обеспечивает управление этим драйвером. Не путать с устройством, которое создает драйвер в системе, через которое происходит обмен сообщениями с драйвером. Это устройство создается уже после старта драйвера, а вот SCM обеспечивает само внесение драйвера в систему. С помощью SCM можно: добавлять, удалять, запускать или останавливать службы. Постановка задачиНаписать буферный класс позволяющий упростить работу SCM в C#. Сам внешний вид этого класса можно обознать очень просто: public ref class ServiceControlManager : public IDisposable Конструктор, деструктор, финализатор, основные методы, из атрибутов только HANDLE объекта SCM. Из этого следует, что экземпляр объекта этого класса будет содержать в себе созданный объект SCM, а методы упрощают с ним работу. Класс является буферным, и поскольку он реализован в C++/cli он будет автоматически масштабируем для работы в среде .NET, соответственно и в C#. Решение проблемы с ошибкамиОсновная проблема работы с таким классом - это возвращение кодов ошибок, которые произошли в ходе работы SCM, которое желательно на самом первом этапе работы заменить на более привычные для .NET среды исключения. Для этого можно создать подобный класс: [Serializable] Как мы видим, экземпляр этого класса будет содержать, как атрибут только номер кода, который будет получен от GetLastError(). А при попытке привести экземлляр к типу System::String выведет полный текст описания сообщения средствами Windows. Класс имеет два конструктора, первый - по умолчанию: сохраняет код ошибки при выполнении. Второй - получает код ошибки, как аргумент. Второй необходимо использовать в тех случаях, когда необходимо вызвать исключение, но перед этим выполнить какие-либо действия, после которых команда GetLastError() вернет не верные значения. Для этого сохраняется код ошибки, выполняются действия, затем вызывается исключение. Пример таких действий можно найти ниже: очиста PTR, исползуемой для маршалинга (PTR необходимо очистить до вызова исключения, т.к. вернуться к этому куску кода в дальнейшем не получится). KernelErrorException::KernelErrorException(void) KernelErrorException::KernelErrorException(DWORD Errorsource) При этом реализация методов будет самой, что ни на есть элементарной: String^ KernelErrorException::Message::get() DWORD KernelErrorException::Errorsource::get() String^ KernelErrorException::ToString() SCM не бессмертныйUPG: Вторая проблема работы с SCM в .NET: handle SCM не может жить долго, иначе это приведет к зависанию системы. Поэтому при использовании необходимо следить за тем, чтобы удалением занимался не сбощик мусора, а сам программист. Придется строго описать конструктор и финализатор, в деструкторе же, по логике Dispose-паттерна, вызывается финализатор [спасибо GraD_Kh]. В финализаторе описывается высвобождение unmanage объектов: ServiceControlManager::ServiceControlManager(void) ServiceControlManager::~ServiceControlManager() ServiceControlManager::!ServiceControlManager() РеализацияРеализация всех методов очень проста, основа ее - это вызов конкретной соответствующей процедуры, но корректное выполнение обязательно нуждается во всех проверках на исключительные ситуации. Поскольку этот класс является буферным, выносить в аргументы можно не только те ключевые поля, которые указал я, но я подобрал параметры для запуска самых стандартных драйверов… void ServiceControlManager::AddDriver(String^ ServiceName, String^ BinaryPathName) void ServiceControlManager::DeleteDriver(String^ ServiceName) void ServiceControlManager::StartDriver(String^ ServiceName) void ServiceControlManager::StopDriver(String^ ServiceName) Первый метод связывает sys файл с сервисом, добавляя этот сервис в систему. Второй - удаляет драйвер из системы, остальные две - запускают и останавливают сервис, соответственно. Примеры использования в C#: try }
|
Главная страница - Программные продукты - Статьи - Разработка ПО, Microsoft |
Распечатать »
Правила публикации » |
Написать редактору | |||
Рекомендовать » | Дата публикации: 19.01.2012 | |||
|
Новости по теме |
Microsoft заменит приложения "Почта" и "Календарь" на Outlook с нового года
|
Рассылки Subscribe.ru |
Статьи по теме |
Новинки каталога Download |
5 бесплатных приложений, которые будут напоминать вам отдохнуть от экрана компьютера или смартфона
|
Исходники |
Отдам код в хорошие руки. Мошенничество в ИТ-сфере
|
Документация |