阅读:1122回复:3
求教驱动的问题
忙了好几天,在各位高手的点拨下,做了个禁用CDROM的驱动,本以为成功了,可还有问题:若光驱里已有光盘时,加载驱动,这时是禁用不了的,拿出光盘后光驱就被禁用了,还有就是卸载后要重启才生效,请看看
我的代码: ////////////////////////////filter.cpp///////////////////////////////////////////// #include "filter.h" extern "C" /*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/ NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) { UNICODE_STRING target_device_name; //目标设备名 PDEVICE_OBJECT target_device_object; PFILE_OBJECT target_file_object; NTSTATUS status; UNICODE_STRING ntDeviceName; UNICODE_STRING win32DeviceName; fSymbolicLink = FALSE; RtlInitUnicodeString(&target_device_name, TARGET_DEVICE_NAME); status = IoGetDeviceObjectPointer(&target_device_name, 0, &target_file_object, &target_device_object ); if(!NT_SUCCESS(status)) { return status; } RtlInitUnicodeString(&ntDeviceName, NT_DEVICE_NAME); PDEVICE_OBJECT fido; /////////////建立设备fido/////////////////////////////////////////////////// status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), &ntDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &fido); if(!NT_SUCCESS(status)) { return status; } else { PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fido->DeviceExtension; pdx->fdo = fido; //新设备对象放到堆栈上,返给你下一层设备对象的地址 PDEVICE_OBJECT fdo = IoAttachDeviceToDeviceStack(fido,target_device_object); pdx->NextStackDevice = fdo; //初始化设备标志 //DO_DIRECT_IO读写操作使用直接方式(内存描述符表)访问用户模式数据) //DO_BUFFERED_IO读写操作使用缓冲方式(系统复制缓冲区)访问用户模式数据) fido->Flags |= fdo->Flags & (DO_DIRECT_IO|DO_BUFFERED_IO); fido->Flags |= DO_POWER_PAGABLE; //必须在PASSIVE_LEVEL级上处理IRP_MJ_PNP请求 fido->DeviceType = fdo->DeviceType; fido->Characteristics = fdo->Characteristics; //清除DO_DEVICE_INITIALIZING 标志 fido->Flags &= ~DO_DEVICE_INITIALIZING; RtlInitUnicodeString(&win32DeviceName, DOS_DEVICE_NAME); //建立符号连接 status = IoCreateSymbolicLink(&win32DeviceName, &ntDeviceName); if (!NT_SUCCESS(status)) { return status; } else { fSymbolicLink = TRUE; } } if (!NT_SUCCESS(status)) { if(fido) { IoDeleteDevice(fido); } if(fSymbolicLink) { IoDeleteSymbolicLink(&win32DeviceName); } return status; } ULONG i; for(i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) { DriverObject->MajorFunction = MySendToNextDriver; } DriverObject->MajorFunction[IRP_MJ_READ] = MyDrvDeviceControl; DriverObject->MajorFunction[IRP_MJ_CREATE] = MyDrvDeviceControl; DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = MyDrvDeviceControl; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyDrvDeviceControl; DriverObject->DriverUnload = DriverUnload; return STATUS_SUCCESS; } /*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/ VOID DriverUnload(IN PDRIVER_OBJECT DeviceObject) { UNICODE_STRING win32DeviceName; RtlInitUnicodeString(&win32DeviceName, DOS_DEVICE_NAME); /* if(fido) { IoDeleteDevice(fido); } */ if(fSymbolicLink) { IoDeleteSymbolicLink(&win32DeviceName); } } /*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/ NTSTATUS MySendToNextDriver(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) { PDEVICE_EXTENSION deviceExtension; IoSkipCurrentIrpStackLocation(Irp); deviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; return IoCallDriver(deviceExtension->NextStackDevice, Irp); } /*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/ NTSTATUS MyDrvDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { //Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_INSUFFICIENT_RESOURCES; } ///////////////////////////filter.h//////////////////////////////////////////// #ifdef __cplusplus extern "C" { #endif #include <ntddk.h> #ifdef __cplusplus } #endif typedef struct _DEVICE_EXTENSION { PDEVICE_OBJECT fdo; PDEVICE_OBJECT NextStackDevice; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; VOID DriverUnload(IN PDRIVER_OBJECT DeviceObject); NTSTATUS MySendToNextDriver(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp); NTSTATUS MyDrvDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); //BOOLEAN fSymbolicLink; #define TARGET_DEVICE_NAME L"\\Device\\CdRom0" #define NT_DEVICE_NAME L"\\Device\\SeaCdromFilter" #define DOS_DEVICE_NAME L"\\DosDevices\\SeaCdromFilter" |
|
沙发#
发布于:2004-11-19 14:42
卸载的问题已搞定
|
|
板凳#
发布于:2004-11-24 15:05
介绍一下呢
|
|
地板#
发布于:2004-11-25 09:11
介绍一下呀
|
|