阅读:4776回复:32
请高手看看禁用CDROM的代码
#include "filter.h"
#define NT_DEVICE_NAME L"\\Device\CdRom0" extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { UNICODE_STRING DeviceName; PDEVICE_OBJECT DeviceObject; PFILE_OBJECT FileObject; PDEVICE_OBJECT fileSysDevice; RtlInitUnicodeString(&DeviceName, NT_DEVICE_NAME); NTSTATUS status = IoGetDeviceObjectPointer(&DeviceName,0, &FileObject, &DeviceObject); fileSysDevice = IoGetRelatedDeviceObject(FileObject); DriverObject = fileSysDevice->DriverObject; ULONG i; for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) { DriverObject->MajorFunction = MySendToNextDriver; } DriverObject->DriverExtension->AddDevice = MyAddDevice; DriverObject->MajorFunction[IRP_MJ_CREATE]= MyDrvDeviceControl; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyDrvDeviceControl; DriverObject->DriverUnload = DriverUnload; return STATUS_SUCCESS; } VOID DriverUnload(IN PDRIVER_OBJECT DriverObject) { } NTSTATUS MyAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo) { NTSTATUS status; PDEVICE_OBJECT fido; status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), NULL, FILE_DEVICE_UNKNOWN, 0, FALSE, &fido); if( !NT_SUCCESS(status)) { return status; } PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fido->DeviceExtension; pdx->fdo = fido; pdx->NextStackDevice = IoAttachDeviceToDeviceStack(fido, pdo); fido->Flags |= fido->Flags & (DO_DIRECT_IO|DO_BUFFERED_IO); fido->Flags |= DO_POWER_PAGABLE; fido->DeviceType = fido->DeviceType; fido->Characteristics = fido->Characteristics; fido->Flags &= ~DO_DEVICE_INITIALIZING; if (!NT_SUCCESS(status)) { IoDeleteDevice(fido); } return STATUS_SUCCESS; } 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 = STATUS_UNSUCCESSFUL; IoCompleteRequest( Irp, IO_NO_INCREMENT); return ntStatus; } 我以CreateService(),StartService()加载,机子一下就黑屏重启了 请高手别嫌我菜,给找找问题 |
|
沙发#
发布于:2004-12-09 13:30
你可以用softice自带的drivermonitor加载启动试试,如果还启动部成功,那就是你的DriverEntry有问题了
|
|
板凳#
发布于:2004-12-09 00:38
tooflat可以把你的CreateService和StartService的启动服务程序贴上来吗?我CreateService和OpenService都正常就是一StartService返回值就是error
|
|
地板#
发布于:2004-12-08 17:14
可以给我一份例子吗?我的QQ:37376159,或者邮箱:ljkong323@hotmail.com,我调不通呀,再问一个问题,看你们说要用什么CreateSevice,怎么用呢?
|
|
地下室#
发布于:2004-12-08 15:13
我在3楼的例子就可以,再把12楼的意见加上就完全了
|
|
5楼#
发布于:2004-12-08 11:01
到底有人调通了吗,上来说一下 |
|
6楼#
发布于:2004-12-08 01:21
到底有人调通了吗,上来说一下
|
|
7楼#
发布于:2004-12-04 10:25
大家关注啊
|
|
8楼#
发布于:2004-11-30 14:34
我加载了,或者关机的时候蓝屏,或者安装失败,大家有什么好建议。
|
|
9楼#
发布于:2004-11-29 09:07
最新的版本到底效果如何?
|
|
10楼#
发布于:2004-11-27 03:23
那过滤CDROM class就可以吗 ?
|
|
11楼#
发布于:2004-11-27 02:53
用device tree看了一下, 如果光驱里面有盘, 那么多数情况下文件系统已经MOUNT好了, 你这时再去做磁盘过滤当然没用. 详情见 ifsddk -> ifs documents -> ifs kit -> design guide -> file system fundamentals -> mounting a volume -> how the volume is mounted -> note toad |
|
12楼#
发布于:2004-11-26 22:03
tooflat,你三楼的程序我试了一下,可以锁住光驱阿,为什么后面又要改其它的呢?
|
|
13楼#
发布于:2004-11-26 18:01
用device tree看了一下,
cdrom0上面挂了一个redbook,redbook上面挂了我们的过滤驱动, 但是cdfs直接把irp发给redbook了,没有发给我们的过滤驱动, 所以光驱还是可以打开。 |
|
14楼#
发布于:2004-11-26 17:55
修改了dj_ukyo的代码,增加了一些错误处理和对IRP_POWER的支持,启动起来没有问题,但是光驱还是可以打开。
不知道什么原因。 |
|
15楼#
发布于:2004-11-26 16:13
好像格式有问题,我打包上传一个
|
|
|
16楼#
发布于:2004-11-26 16:09
////////////////////////////bj751212.cpp///////////////////////////////////////
#include "bj751212.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); //11111111111111111111111111111111111111111111111111111111111111111111111 if(!NT_SUCCESS(status)) { return status; } //11111111111111111111111111111111111111111111111111111111111111111111111 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);//|=--or_eq 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); //2222222222222222222222222222222222222222222222222222222222222222222 if (!NT_SUCCESS(status)) { return status; } //2222222222222222222222222222222222222222222222222222222222222222222 else { fSymbolicLink = TRUE; } //2222222222222222222222222222222222222222222222222222222222222222222 } //11111111111111111111111111111111111111111111111111111111111111111111111 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;//-ukyo } //----------------------------------------------------------------------- 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; } //--------------------------------------------------------------------------- |
|
17楼#
发布于:2004-11-26 16:08
///////////////////////////bj751212.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" //--------------------------------------------------------------------------- |
|
18楼#
发布于:2004-11-25 23:15
一到startservice()就黑屏重启了,意味着你的DRIVERENTRY有问题,你下断点看看是什么问题.
|
|
|
19楼#
发布于:2004-11-25 16:32
请调试成功的兄弟把代码贴出来看看啊!
|
|
上一页
下一页