После вызова
::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 ));
}