Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: SCManager: не запускает сервис.  (Прочитано 6692 раз)
0 Пользователей и 1 Гость смотрят эту тему.
xakac
Гость
« : 16-05-2006 07:09 » 

После вызова
Код:
::StartService( _hService, 0, NULL );
GetLastError() == ERROR_SERVICE_DISABLED :
The service cannot be started, either because it is disabled or because it has no enabled
devices associated with it.


DebugView перехватывает вот это:
Код:
*** Shadow ***
DriverEntry: RegistryPath = \REGISTRY\MACHINE\SYSTEM\ControlSet001\Services\Shadow
*** Shadow ***
DriverUnload: pDriverObject = 8186F7F0
Т.е. в AddDevice не попадаем, в которой создание DeviceObject (видимо, поэтому сервис и не запускается...).
Вызывается ли AddDevice только при подключении какого-то реального устройства? Если так, то что делать, если мне нужен функциональный драйвер, который не связан ни с какой железкой и предполагается абсолютно самостоятельным, т.е. он один в своём стеке драйверов (надо ли вообще его цеплять с помощью IoAttachDeviceToDeviceStack)?

Код:
NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath )
{
PDRIVER_DISPATCH * majorFunction;
 
DBG_PRINT(( "DriverEntry: RegistryPath = %ws\n", pRegistryPath->Buffer ));
 
// Specifying entry-points:
pDriverObject->DriverExtension->AddDevice = ShadowAddDevice;
pDriverObject->DriverUnload = ShadowDriverUnload;
 
majorFunction = pDriverObject->MajorFunction;
majorFunction[ IRP_MJ_CREATE        ] = ShadowDispatchCreate;
majorFunction[ IRP_MJ_CLOSE         ] = ShadowDispatchClose;
majorFunction[ IRP_MJ_PNP           ] = ShadowDispatchPnp;
// majorFunction[ IRP_MJ_FLUSH_BUFFERS ] = ShadowDispatchFlushBuffers; // ! make NULL if fails
// majorFunction[ IRP_MJ_SHUTDOWN      ] = ShadowDispatchShutdown; // ! make NULL if fails
 
return ( STATUS_SUCCESS );
}
 
 
NTSTATUS ShadowAddDevice( IN PDRIVER_OBJECT pDriverObject, IN PDEVICE_OBJECT pPhysicalDeviceObject )
{
NTSTATUS status;
PDEVICE_OBJECT pDeviceObject;
PDEVICE_EXTENSION pDeviceExtension;
 
PAGED_CODE();
 
DBG_PRINT(( "AddDevice: pDriverObject = %X\tpPhysicalDeviceObject = %X", pDriverObject, pPhysicalDeviceObject ));
 
status = IoCreateDevice
(
pDriverObject,
sizeof( DEVICE_EXTENSION ),
NULL,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&pDeviceObject
);
 
if ( !NT_SUCCESS( status ) )
{
DBG_PRINT(( "IoCreateDevice failed:\t%d\n", status ));
return ( status );
}
 
pDeviceExtension = ( PDEVICE_EXTENSION )pDeviceObject->DeviceExtension;
pDeviceExtension->pDeviceObject = pDeviceObject;
 
pDeviceExtension->pUnderlying =
IoAttachDeviceToDeviceStack( pDeviceObject, pPhysicalDeviceObject );
 
if ( pDeviceExtension->pUnderlying == NULL )
{
status = STATUS_NO_SUCH_DEVICE;
DBG_PRINT(( "IoAttachDeviceToDeviceStack failed:\t%d\n", status ));
IoDeleteDevice( pDeviceObject );
        return ( status );
    }
 
// ? Initialize Kernel dispatcher objects here...
// ? Initialize Spin-blocks here...
 
return ( status );
}
 
 
VOID ShadowDriverUnload( IN PDRIVER_OBJECT pDriverObject )
{
PAGED_CODE();
 
DBG_PRINT(( "DriverUnload: pDriverObject = %X", pDriverObject ));
}
Записан
IRP
Постоялец

ua
Offline Offline

« Ответ #1 : 16-05-2006 09:39 » 

Приехали... у тебя же Pnp-шный драйвер с функцией AddDevice которая вызовется если будет подключено реально устройство или виртуальное устройство. Самостоятельно запустить такой драйвер нельзя т.к. в систему ни каких устройств не подключалось. Тебе нужен обычный LEGACY драйвер. AddDevice - не нужна и IoAttachDeviceToDeviceStack - тоже делать не нужно!
Записан
xakac
Гость
« Ответ #2 : 16-05-2006 16:39 » 

IRP
Самостоятельно запустить такой драйвер нельзя т.к. в систему ни каких устройств не подключалось.
Ты хочешь сказать, что WDM-драйвера, не работающие с реальными устройствами, писать нельзя?
Записан
IRP
Постоялец

ua
Offline Offline

« Ответ #3 : 17-05-2006 07:07 » 

Можно. Только тогда нужно создавать виртуально устройство. Архитектура WDM подразумевает наличие физического(или виртуального устройства) Для этого в системе присутвтует специальный драйвер шины который создает для твоего WDM драйвера так называемое PDO (Physical Device Object). Как только такой PDO создан система спрашивает у шины HardwareID устройство которое создано и на основе этой информации просматривает *.inf файлы в надежде найти нужный драйвер для обслуживания этого устройства. Как только нужный драйвер был найден то для твоего драйвера вызывается процедура AddDevice которой передается указатель на созданный шиной PDO и к которому присоединятся твой FDO созданный в AddDevice.
Здесь я описал этот процесс очень коротко. Более детально читай книги посвещенные WDM.
Если нужен просто драйвер который будет работать в системе и выполнять какуюто задачу на уровне ядра - то нужен именно LEGACY драйвер
Записан
xakac
Гость
« Ответ #4 : 17-05-2006 11:19 » 

IRP
Всё понятно. Спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines