阅读:4541回复: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-11-17 10:56
几个疑问
1、#define NT_DEVICE_NAME L"DeviceCdRom0" 这个没有写错吗 2、你的MySendToNextDriver处理不了power irp吧 3、你的MyAddDevice处理完后,需不需要调用原来的AddDevice??? 4、你已经替换了dispatch routine,为什么还需要创建过滤设备呢 [编辑 - 11/17/04 by tooflat] |
|
板凳#
发布于:2004-11-17 11:50
你的MyAddDevice处理完后,需不需要调用原来的AddDevice???
还要调用原来的AddDevice? 已经替换了dispatch routine,为什么还需要创建过滤设备呢 老兄是说不用IoCreateDevice()了? |
|
地板#
发布于:2004-11-17 12:26
我觉得不需要替换AddDevice,也不需要创建设备,直接替换devicecontrol,然后在里面返回失败即可。
另外: fileSysDevice = IoGetRelatedDeviceObject(FileObject); DriverObject = fileSysDevice->DriverObject; 改成-〉 DriverObject = DeviceObject->DriverObject; 直接替换Cdrom设备所属的驱动对象的派遣函数。 大概例子: #include <ntddk.h> NTSTATUS DriverEntry( IN PDRIVER_OBJECT driver_object, IN PUNICODE_STRING registry_path ); VOID DriverUnload( IN PDRIVER_OBJECT driver_object ); NTSTATUS CfCommonDispatch( IN PDEVICE_OBJECT device_object, IN PIRP irp ); #pragma alloc_text(INIT, DriverEntry) #define TARGET_DEVICE_NAME L"\\Device\\CdRom0" PDRIVER_DISPATCH g_p_real_dispatch_device_control = NULL; PDRIVER_OBJECT g_p_target_driver_object = NULL; NTSTATUS DriverEntry( IN PDRIVER_OBJECT driver_object, IN PUNICODE_STRING registry_path ) { UNICODE_STRING target_device_name; PDEVICE_OBJECT target_device_object; PFILE_OBJECT target_file_object; NTSTATUS status; RtlInitUnicodeString(&target_device_name, TARGET_DEVICE_NAME); status = IoGetDeviceObjectPointer( &target_device_name, 0, &target_file_object, &target_device_object ); if (!NT_SUCCESS(status)) { KdPrint(("IoGetDeviceObjectPointer return %X\n", status)); return status; } g_p_target_driver_object = target_device_object->DriverObject; if (!g_p_target_driver_object) { KdPrint(("target_device_object->DriverObject == NULL\n")); return STATUS_UNSUCCESSFUL; } g_p_real_dispatch_device_control = g_p_target_driver_object->MajorFunction[IRP_MJ_DEVICE_CONTROL]; g_p_target_driver_object->MajorFunction[IRP_MJ_DEVICE_CONTROL] = CfCommonDispatch; driver_object->DriverUnload = DriverUnload; return STATUS_SUCCESS; } VOID DriverUnload( IN PDRIVER_OBJECT driver_object ) { g_p_target_driver_object->MajorFunction[IRP_MJ_DEVICE_CONTROL] = g_p_real_dispatch_device_control; } NTSTATUS CfCommonDispatch( IN PDEVICE_OBJECT device_object, IN PIRP irp ) { irp->IoStatus.Status = STATUS_ACCESS_DENIED; irp->IoStatus.Information = 0; IoCompleteRequest(irp, IO_NO_INCREMENT); return STATUS_ACCESS_DENIED; } |
|
地下室#
发布于:2004-11-17 14:25
谢谢了,有个问题,当我动态加载时,CreateService()总不成功
hServiceTwdm = CreateService( hServiceMgr, TEXT("Twdm1"), TEXT("Twdm1"), SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, lpszBinaryPathName, NULL, NULL, NULL, NULL, NULL); |
|
5楼#
发布于:2004-11-17 15:48
Twdm1是指device name,与你驱动文件内定义NT_DEVICE_NAME应该相同吧,lpszBinaryPathName就是sys文件了。你用的是Tomgin的一个例子吧,他的驱动起的device name就是Twdm1。
|
|
|
6楼#
发布于:2004-11-18 09:29
怎么样,楼主,通过了没有啊,成功了给俺们说一下,分享一下你的经验。
|
|
|
7楼#
发布于:2004-11-18 10:31
谢谢了,有个问题,当我动态加载时,CreateService()总不成功 这个你看一下GetLastError不就行了,我上面给的代码经测试可行。 参考一下下面的代码 BOOL SC_InstallService(LPCTSTR lpszService, DWORD dwStart, LPCTSTR lpszImagePath, LPCTSTR lpszGroup) { SC_HANDLE hSCManager = OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS); if (!hSCManager) { return FALSE; } SC_HANDLE hService = CreateService( hSCManager, lpszService, lpszService, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, dwStart, SERVICE_ERROR_NORMAL, lpszImagePath, lpszGroup, NULL, NULL, NULL, NULL ); if (!hService) { if (GetLastError() == ERROR_SERVICE_EXISTS) { CloseServiceHandle(hSCManager); return TRUE; } CloseServiceHandle(hSCManager); return FALSE; } CloseServiceHandle(hService); CloseServiceHandle(hSCManager); return TRUE; } |
|
8楼#
发布于:2004-11-18 11:55
用IoGetDeviceObjectPointer可以得到光驱的DeviceObject,请问如果用类似的方法禁止U盘,如何得到DeviceObject呢?
谢谢!! |
|
|
9楼#
发布于:2004-11-18 15:36
感谢tooflat大虾的无私奉献,我试过了,可以,可惜这贴不是我发的,想送点分的,不知道怎么给。
[编辑 - 11/18/04 by GeorgeSun] [编辑 - 11/18/04 by GeorgeSun] |
|
|
10楼#
发布于:2004-11-23 14:36
各位可否具体讲讲
|
|
11楼#
发布于:2004-11-24 16:38
去处了语法错误,安装后发现,windows推出时蓝屏。还是有问题。
|
|
12楼#
发布于:2004-11-25 13:45
我测试了下没问题,就是在UNLOAD里应该调用ObDereferenceObject解除对文件对象的引用.不然有可能对该设备对象的其他过滤驱动产生影响.
|
|
|
13楼#
发布于:2004-11-25 16:16
tooflat的驱动用startservice()总是返回失败,我在驱动代码中加上
debugprint,一到startservice()就黑屏重启了,???????? |
|
14楼#
发布于:2004-11-25 16:32
请调试成功的兄弟把代码贴出来看看啊!
|
|
15楼#
发布于:2004-11-25 23:15
一到startservice()就黑屏重启了,意味着你的DRIVERENTRY有问题,你下断点看看是什么问题.
|
|
|
16楼#
发布于: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" //--------------------------------------------------------------------------- |
|
17楼#
发布于: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; } //--------------------------------------------------------------------------- |
|
18楼#
发布于:2004-11-26 16:13
好像格式有问题,我打包上传一个
|
|
|
19楼#
发布于:2004-11-26 17:55
修改了dj_ukyo的代码,增加了一些错误处理和对IRP_POWER的支持,启动起来没有问题,但是光驱还是可以打开。
不知道什么原因。 |
|
上一页
下一页