Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

сЕРВИСЫ

319
27 февраля 2004 года
xelos
577 / / 27.02.2003
такая проблема есть, когда листаешь сервисы, то можно посмотреть какие сервисы (драйвера) кернела запущены.
это когда вторым параметром в EnumServicesState указываешь SERVICE_DRIVER :

EnumServicesStatus(schSCManager, SERVICE_DRIVER, SERVICE_STATE_ALL,
&service, sizeof(ENUM_SERVICE_STATUS), &dwBytesNeeded, &dwServicesReturned, &dwResumedHandle);

так вот, можно ли как-нибудь управлять этими драйверами (запуск/останов)? Из простого приложения это не получится, имхо, надо запустить процесс от пользователя SYSTEM. Вопрос можно ли это вообще сделать? Через драйвера можно ли получить доступ к этим ресурсам?
4.8K
28 февраля 2004 года
Владислав
19 / / 28.09.2003
Цитата:
Originally posted by xelos
такая проблема есть, когда листаешь сервисы, то можно посмотреть какие сервисы (драйвера) кернела запущены.
это когда вторым параметром в EnumServicesState указываешь SERVICE_DRIVER :


Да. Можно смотреть.

Цитата:

так вот, можно ли как-нибудь управлять этими драйверами (запуск/останов)? Из простого приложения это не получится, имхо, надо запустить процесс от пользователя SYSTEM. Вопрос можно ли это вообще сделать? Через драйвера можно ли получить доступ к этим ресурсам?



Нет. Приложение запущенное в контексте учётной записи с правами администратора может стартовать и останавливать драйвера.
Я лично прописывал/запускал/останавливал/выгружал динамически драйвер с использованием SCM.

319
29 февраля 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by Владислав
Нет. Приложение запущенное в контексте учётной записи с правами администратора может стартовать и останавливать драйвера.


у меня приложение запущена с учетной записи администратора. Так вот, если драйвер уже запущен, то когда я пытаюсь получить на него HANDLE через OpenService:

SC_HANDLE schService = OpenService(
schSCManager, // SCM database
strn, // service name
SERVICE_ALL_ACCESS);

то он не открывается.
такая фишка при уже запущенном сервисе, через ControlService он не управляется.
Или ты не про это говорил?

Цитата:

Я лично прописывал/запускал/останавливал/выгружал динамически драйвер с использованием SCM.


SCM - Service Control Manager?? так и я через него пытаюсь все сделать, сначала хандл манагера получаю:
SC_HANDLE schSCManager=OpenSCManager(m_stHost,NULL,SC_MANAGER_ENUMERATE_SERVICE);

а потом пытаюсь работать с сервисами из базы этого манагера.

4.8K
01 марта 2004 года
Владислав
19 / / 28.09.2003
Цитата:
Originally posted by xelos

у меня приложение запущена с учетной записи администратора. Так вот, если драйвер уже запущен, то когда я пытаюсь получить на него HANDLE через OpenService:

SC_HANDLE schService = OpenService(
schSCManager, // SCM database
strn, // service name
SERVICE_ALL_ACCESS);

то он не открывается.
такая фишка при уже запущенном сервисе, через ControlService он не управляется.
Или ты не про это говорил?


Он должен открываться, по крайней мере, в случае если ты динамически работаешь с драйвером (я не пробовал открывать статический драйвер, поэтому ХЗ). Видимо ошибка в твоём коде.
Вот код Руссиновича для работы с драйверами, может тебе поможет:

Код:
/****************************************************************************
*
*    FUNCTION: InstallDriver( IN SC_HANDLE, IN LPCTSTR, IN LPCTSTR)
*
*    PURPOSE: Creates a driver service.
*
****************************************************************************/
BOOL AEM::FileMonitor::CDriverOperation::InstallDriver (IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName, IN LPCTSTR ServiceExe)
{
    SC_HANDLE  schService;

    //
    // NOTE: This creates an entry for a standalone driver. If this
    //       is modified for use with a driver that requires a Tag,
    //       Group, and/or Dependencies, it may be necessary to
    //       query the registry for existing driver information
    //       (in order to determine a unique Tag, etc.).
    //

    schService = ::CreateService( SchSCManager,          // SCManager database
                                DriverName,           // name of service
                                DriverName,           // name to display
                                SERVICE_ALL_ACCESS,    // desired access
                                SERVICE_KERNEL_DRIVER, // service type
                                SERVICE_DEMAND_START,  // start type
                                SERVICE_ERROR_NORMAL,  // error control type
                                ServiceExe,            // service's binary
                                NULL,                  // no load ordering group
                                NULL,                  // no tag identifier
                                NULL,                  // no dependencies
                                NULL,                  // LocalSystem account
                                NULL                   // no password
                                );
    if (schService == NULL)
        return FALSE;

    ::CloseServiceHandle (schService);

    return TRUE;
}

/****************************************************************************
*
*    FUNCTION: StartDriver( IN SC_HANDLE, IN LPCTSTR)
*
*    PURPOSE: Starts the driver service.
*
****************************************************************************/
BOOL AEM::FileMonitor::CDriverOperation::StartDriver (IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName)
{
    SC_HANDLE  schService;
    BOOL       ret;

    schService = ::OpenService (SchSCManager,
                              DriverName,
                              SERVICE_ALL_ACCESS
                              );
    if (schService == NULL)
        return FALSE;

    ret = ::StartService (schService, 0, NULL)
       || GetLastError() == ERROR_SERVICE_ALREADY_RUNNING
       || GetLastError() == ERROR_SERVICE_DISABLED;

    CloseServiceHandle (schService);

    return ret;
}

/****************************************************************************
*
*    FUNCTION: OpenDevice( IN LPCTSTR, HANDLE *)
*
*    PURPOSE: Opens the device and returns a handle if desired.
*
****************************************************************************/
BOOL AEM::FileMonitor::CDriverOperation::OpenDevice (IN LPCTSTR DriverName, HANDLE * lphDevice)
{
    TCHAR    completeDeviceName[64];
    HANDLE   hDevice;

    //
    // Create a \\.\XXX device name that CreateFile can use
    //
    // NOTE: We're making an assumption here that the driver
    //       has created a symbolic link using it's own name
    //       (i.e. if the driver has the name "XXX" we assume
    //       that it used IoCreateSymbolicLink to create a
    //       symbolic link "\DosDevices\XXX". Usually, there
    //       is this understanding between related apps/drivers.
    //
    //       An application might also peruse the DEVICEMAP
    //       section of the registry, or use the QueryDosDevice
    //       API to enumerate the existing symbolic links in the
    //       system.
    //

    if ((::GetVersion() & 0xFF) >= 5)
    {
        //
        // We reference the global name so that the application can
        // be executed in Terminal Services sessions on Win2K
        //
        wsprintf (completeDeviceName, TEXT("\\\\.\\Global\\%s"), DriverName);
    }
    else
    {
        wsprintf (completeDeviceName, TEXT("\\\\.\\%s"), DriverName);
    }

    hDevice = ::CreateFile (completeDeviceName,
                          GENERIC_READ | GENERIC_WRITE,
                          0,
                          NULL,
                          OPEN_EXISTING,
                          FILE_ATTRIBUTE_NORMAL,
                          NULL
                          );
    if (hDevice == (reinterpret_cast <HANDLE>(-1)))
        return FALSE;

    // If user wants handle, give it to them.  Otherwise, just close it.
    if (lphDevice)
        *lphDevice = hDevice;
    else
        ::CloseHandle (hDevice);

    return TRUE;
}

/****************************************************************************
*
*    FUNCTION: StopDriver( IN SC_HANDLE, IN LPCTSTR)
*
*    PURPOSE: Has the configuration manager stop the driver (unload it)
*
****************************************************************************/
BOOL AEM::FileMonitor::CDriverOperation::StopDriver (IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName)
{
    SC_HANDLE       schService;
    BOOL            ret;
    SERVICE_STATUS  serviceStatus;

    schService = ::OpenService (SchSCManager, DriverName, SERVICE_ALL_ACCESS);
    if (schService == NULL)
        return FALSE;

    ret = ::ControlService (schService, SERVICE_CONTROL_STOP, &serviceStatus);

    CloseServiceHandle (schService);
    return ret;
}

/****************************************************************************
*
*    FUNCTION: RemoveDriver( IN SC_HANDLE, IN LPCTSTR)
*
*    PURPOSE: Deletes the driver service.
*
****************************************************************************/
BOOL AEM::FileMonitor::CDriverOperation::RemoveDriver (IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName)
{
    SC_HANDLE  schService;
    BOOL       ret;

    schService = ::OpenService (SchSCManager,
                              DriverName,
                              SERVICE_ALL_ACCESS
                              );

    if (schService == NULL)
        return FALSE;

    ret = ::DeleteService (schService);

    ::CloseServiceHandle (schService);

    return ret;
}


/****************************************************************************
*
*    FUNCTION: UnloadDeviceDriver( const TCHAR *)
*
*    PURPOSE: Stops the driver and has the configuration manager unload it.
*
****************************************************************************/
BOOL AEM::FileMonitor::CDriverOperation::UnloadDeviceDriver (const TCHAR* Name)
{
    SC_HANDLE   schSCManager;

    schSCManager = ::OpenSCManager (    NULL,                 // machine (NULL == local)
                                    NULL,                 // database (NULL == default)
                                    SC_MANAGER_ALL_ACCESS // access required
                                );

    StopDriver (schSCManager, Name);
    RemoveDriver (schSCManager, Name);
     
    CloseServiceHandle (schSCManager);

    return TRUE;
}

/****************************************************************************
*
*    FUNCTION: LoadDeviceDriver( const TCHAR, const TCHAR, HANDLE *)
*
*    PURPOSE: Registers a driver with the system configuration manager
*    and then loads it.
*
****************************************************************************/
BOOL AEM::FileMonitor::CDriverOperation::LoadDeviceDriver (const TCHAR* Name, const TCHAR* Path,
                      HANDLE* lphDevice, PDWORD Error)
{
    SC_HANDLE   schSCManager;
    BOOL        okay;

    schSCManager = ::OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);

    // Remove previous instance
    RemoveDriver (schSCManager, Name);

    // Ignore success of installation: it may already be installed.
    InstallDriver (schSCManager, Name, Path);

    // Ignore success of start: it may already be started.
    StartDriver (schSCManager, Name);

    // Do make sure we can open it.
    okay = OpenDevice( Name, lphDevice );
    *Error = ::GetLastError();
    ::CloseServiceHandle( schSCManager );

    return okay;
}


Вот это тоже посмотри - там инфо для работы с сервисами через SCM:
http://www.rsdn.ru/article/baseserv/svcadmin-1.xml
http://www.rsdn.ru/article/baseserv/svcadmin-2.xml
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог