阅读:1245回复:4
这段代码有什么问题呀?为什么不能卸载?给20分
下面这段代码,用beyondlogic的Install可以安装,但是卸载失败,为什么呀,高手指点呀
#pragma code_seg("INIT") NTSTATUS FileDiskCreateDevice ( IN PDRIVER_OBJECT DriverObject, IN ULONG Number, IN DEVICE_TYPE DeviceType ) { NTSTATUS status; UNICODE_STRING device_name; PVIRUAL_DEVICE_EXTENT device_extension; PDEVICE_OBJECT device_object; RtlInitUnicodeString(&device_name, L"\Device\TestDisk1"); status = IoCreateDevice( DriverObject, sizeof(VIRUAL_DEVICE_EXTENT), &device_name, DeviceType, 0, FALSE, &device_object ); if (!NT_SUCCESS(status)) { return status; } //初始化扩展结构中的内容 device_object->Flags |= DO_DIRECT_IO; device_object->Flags &= ~DO_DEVICE_INITIALIZING; device_extension = (PVIRUAL_DEVICE_EXTENT) device_object->DeviceExtension; device_extension->type = DEVICE_TYPE_VIRUALDISK; device_extension->media_in_device = FALSE; device_extension->fdo = device_object; return STATUS_SUCCESS; } extern "C" NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { UNICODE_STRING device_dir_name; //设备目录名称 NTSTATUS status; //返回状态 OBJECT_ATTRIBUTES object_attributes; //对象属性 USHORT n_created_devices; //创建设备计数 status = STATUS_SUCCESS; FileDiskCreateDevice(DriverObject, 0, FILE_DEVICE_DISK); DriverObject->DriverUnload = VirualWDM_Unload; DriverObject->MajorFunction[IRP_MJ_CREATE] = DriverObject->MajorFunction[IRP_MJ_CLOSE] = VirualWDM_CreateClose; DriverObject->MajorFunction[IRP_MJ_READ] = DriverObject->MajorFunction[IRP_MJ_WRITE] = VirualWDM_ReadWrite; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = VirualWDM_DeviceControl; return STATUS_SUCCESS; } #pragma code_seg() //卸载驱动 #pragma code_seg("PAGE") NTSTATUS CompleteIrp( PIRP Irp, NTSTATUS status, ULONG info); NTSTATUS VirualWDM_CreateClose( IN PDEVICE_OBJECT fdo, IN PIRP Irp) { return CompleteIrp(Irp,STATUS_SUCCESS,FILE_OPENED); } PDEVICE_OBJECT FileDiskDeleteDevice ( IN PDEVICE_OBJECT DeviceObject ) { PVIRUAL_DEVICE_EXTENT device_extension; PDEVICE_OBJECT next_device_object; next_device_object = DeviceObject->NextDevice; IoDeleteDevice(DeviceObject); return next_device_object; } VOID VirualWDM_Unload(IN PDRIVER_OBJECT DriverObject) { PDEVICE_OBJECT device_object; device_object = DriverObject->DeviceObject; FileDiskDeleteDevice(device_object); } #pragma code_seg() NTSTATUS CompleteIrp( PIRP Irp, NTSTATUS status, ULONG info); NTSTATUS VirualWDM_ReadWrite(IN PDEVICE_OBJECT fdo, IN PIRP Irp) { return CompleteIrp(Irp,STATUS_NO_MEDIA_IN_DEVICE,0); } NTSTATUS VirualWDM_DeviceControl( IN PDEVICE_OBJECT fdo,IN PIRP Irp) { return CompleteIrp(Irp,STATUS_NO_MEDIA_IN_DEVICE,0); } NTSTATUS CompleteIrp( PIRP Irp, NTSTATUS status, ULONG info) { Irp->IoStatus.Status = status; Irp->IoStatus.Information = info; IoCompleteRequest(Irp,IO_NO_INCREMENT); return status; } [编辑 - 6/10/04 by landwolf] |
|
沙发#
发布于:2004-06-12 00:34
我知道问题出在哪儿了,是因为我的source文件中指定了
DRIVERTYPE=WDM; 如果我把这行删除,就可以正常卸载了。 但是这引来了另外的问题: 这个标志表示我的驱动是WDM类型的,那么如果不设这个标志,默认应该是什么类型的? WDM是不是不能利用CreateService系列函数安装和启动,停止?必须用inf文件? 在DriverEntry中直接创建驱动设备是否WDM类型的驱动?WDM是否有严格的定义必须在AddDevice中创建设备? 希望各位高手能够指点迷津,先谢谢了 |
|
板凳#
发布于:2004-06-12 19:44
NT式驱动在DriverEntry中直接调用IoCreateDevice来创建设备。
WDM的驱动需要在AddDevice中创建,当然如果你有多个DO(比如Filter),你可能不一定都严格按照这个规律。 |
|
|
地板#
发布于:2004-06-13 10:37
WDM是不是不能利用CreateService系列函数安装和启动,停止?
|
|
地下室#
发布于:2004-06-13 17:30
WDM通常使用专用安装函数
|
|
|