сЕРВИСЫ
это когда вторым параметром в EnumServicesState указываешь SERVICE_DRIVER :
EnumServicesStatus(schSCManager, SERVICE_DRIVER, SERVICE_STATE_ALL,
&service, sizeof(ENUM_SERVICE_STATUS), &dwBytesNeeded, &dwServicesReturned, &dwResumedHandle);
так вот, можно ли как-нибудь управлять этими драйверами (запуск/останов)? Из простого приложения это не получится, имхо, надо запустить процесс от пользователя SYSTEM. Вопрос можно ли это вообще сделать? Через драйвера можно ли получить доступ к этим ресурсам?
такая проблема есть, когда листаешь сервисы, то можно посмотреть какие сервисы (драйвера) кернела запущены.
это когда вторым параметром в EnumServicesState указываешь SERVICE_DRIVER :
Да. Можно смотреть.
так вот, можно ли как-нибудь управлять этими драйверами (запуск/останов)? Из простого приложения это не получится, имхо, надо запустить процесс от пользователя SYSTEM. Вопрос можно ли это вообще сделать? Через драйвера можно ли получить доступ к этим ресурсам?
Нет. Приложение запущенное в контексте учётной записи с правами администратора может стартовать и останавливать драйвера.
Я лично прописывал/запускал/останавливал/выгружал динамически драйвер с использованием SCM.
Нет. Приложение запущенное в контексте учётной записи с правами администратора может стартовать и останавливать драйвера.
у меня приложение запущена с учетной записи администратора. Так вот, если драйвер уже запущен, то когда я пытаюсь получить на него 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);
а потом пытаюсь работать с сервисами из базы этого манагера.
у меня приложение запущена с учетной записи администратора. Так вот, если драйвер уже запущен, то когда я пытаюсь получить на него 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