阅读:1118回复:2
请高手看看问题
我编的驱动加载时StartService()总是返回0,我想是因为驱动中的DriverEntry()没有返回STATUS_SUCCESS所引起的的吧,请看看我的
源码,找找问题,我的程序一个禁用光驱的驱动。 #include "filter.h" #define NT_DEVICE_NAME L"\\Device\\SeaCdromFilter" #define DOS_DEVICE_NAME L"\\DosDevices\\SeaCdromFilter" extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { fSymbolicLink = FALSE; DriverObject->DriverUnload = DriverUnload; DriverObject->DriverExtension->AddDevice = MyAddDevice; ULONG i; for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) { DriverObject->MajorFunction = MySendToNextDriver; } DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyDrvDeviceControl; DriverObject->MajorFunction[IRP_MJ_READ]= MyDrvDeviceControl; DriverObject->MajorFunction[IRP_MJ_WRITE]= MyDrvDeviceControl; return STATUS_SUCCESS; } VOID DriverUnload(IN PDRIVER_OBJECT DriverObject) { UNICODE_STRING win32DeviceName; RtlInitUnicodeString(&win32DeviceName, DOS_DEVICE_NAME); if(fido) { IoDeleteDevice(fido); } if(fSymbolicLink) { IoDeleteSymbolicLink(&win32DeviceName); } } NTSTATUS MyAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo) { NTSTATUS status; //PDEVICE_OBJECT fido; UNICODE_STRING ntDeviceName; UNICODE_STRING win32DeviceName; RtlInitUnicodeString(&ntDeviceName, NT_DEVICE_NAME); status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), &ntDeviceName, FILE_DEVICE_CD_ROM, 0, FALSE, &fido); if( !NT_SUCCESS(status)) { } else { RtlInitUnicodeString(&win32DeviceName, DOS_DEVICE_NAME); status = IoCreateSymbolicLink(&win32DeviceName, &ntDeviceName); if (!NT_SUCCESS(status)) { } else { fSymbolicLink = TRUE; } PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fido->DeviceExtension; pdx->fdo = fido; PDEVICE_OBJECT fdo = IoAttachDeviceToDeviceStack(fido, pdo); pdx->NextStackDevice = fdo; fido->Flags |= fdo->Flags & (DO_DIRECT_IO|DO_BUFFERED_IO); fido->Flags |= DO_POWER_PAGABLE; // fido->DeviceType = fdo->DeviceType; // fido->Characteristics = fdo->Characteristics; fido->Flags &= ~DO_DEVICE_INITIALIZING; } if (!NT_SUCCESS(status)) { if(fido) { IoDeleteDevice(fido); } if(fSymbolicLink) { IoDeleteSymbolicLink(&win32DeviceName); } } return status; } NTSTATUS MySendToNextDriver(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) { PDEVICE_EXTENSION deviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(deviceExtension->NextStackDevice, Irp); } NTSTATUS MyDrvDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { NTSTATUS ntStatus; ntStatus = Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; IoCompleteRequest(Irp, IO_NO_INCREMENT); return ntStatus; } |
|
沙发#
发布于:2004-11-18 13:40
StartService()返回0(Success)说明正常????看过MSDN吗老兄
|
|
板凳#
发布于:2004-11-18 15:04
不好意思,刚刚没仔细看你的问题。:(
不过应该不是你所说得原因,不知道你StartService返回0时,GetLastError是多少。 |
|
|