bj751212
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4541回复:32

请高手看看禁用CDROM的代码

楼主#
更多 发布于:2004-11-16 16:43
#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()加载,机子一下就黑屏重启了
请高手别嫌我菜,给找找问题

最新喜欢:

pilixuankepilixu... shevstenshevst...
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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]
bj751212
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-17 11:50
你的MyAddDevice处理完后,需不需要调用原来的AddDevice???
还要调用原来的AddDevice?

已经替换了dispatch routine,为什么还需要创建过滤设备呢

老兄是说不用IoCreateDevice()了?


tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
地板#
发布于: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;
}


bj751212
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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);
GeorgeSun
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2007-06-18
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望7点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-11-17 15:48
Twdm1是指device name,与你驱动文件内定义NT_DEVICE_NAME应该相同吧,lpszBinaryPathName就是sys文件了。你用的是Tomgin的一个例子吧,他的驱动起的device name就是Twdm1。
虚心学习中......
GeorgeSun
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2007-06-18
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望7点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-11-18 09:29
怎么样,楼主,通过了没有啊,成功了给俺们说一下,分享一下你的经验。
虚心学习中......
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-11-18 10:31
谢谢了,有个问题,当我动态加载时,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);
 



这个你看一下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;
}
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-11-18 11:55
用IoGetDeviceObjectPointer可以得到光驱的DeviceObject,请问如果用类似的方法禁止U盘,如何得到DeviceObject呢?
谢谢!!
在交流中学习。。。
GeorgeSun
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2007-06-18
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望7点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-11-18 15:36
感谢tooflat大虾的无私奉献,我试过了,可以,可惜这贴不是我发的,想送点分的,不知道怎么给。

[编辑 -  11/18/04 by  GeorgeSun]

[编辑 -  11/18/04 by  GeorgeSun]
虚心学习中......
dj_ukyo
驱动小牛
驱动小牛
  • 注册日期2003-03-13
  • 最后登录2009-06-02
  • 粉丝0
  • 关注0
  • 积分118分
  • 威望16点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-11-23 14:36
各位可否具体讲讲
dj_ukyo
驱动小牛
驱动小牛
  • 注册日期2003-03-13
  • 最后登录2009-06-02
  • 粉丝0
  • 关注0
  • 积分118分
  • 威望16点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-11-24 16:38
去处了语法错误,安装后发现,windows推出时蓝屏。还是有问题。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
12楼#
发布于:2004-11-25 13:45
我测试了下没问题,就是在UNLOAD里应该调用ObDereferenceObject解除对文件对象的引用.不然有可能对该设备对象的其他过滤驱动产生影响.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
bj751212
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-11-25 16:16
tooflat的驱动用startservice()总是返回失败,我在驱动代码中加上
debugprint,一到startservice()就黑屏重启了,????????
bj751212
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-11-25 16:32
请调试成功的兄弟把代码贴出来看看啊!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
15楼#
发布于:2004-11-25 23:15
一到startservice()就黑屏重启了,意味着你的DRIVERENTRY有问题,你下断点看看是什么问题.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
dj_ukyo
驱动小牛
驱动小牛
  • 注册日期2003-03-13
  • 最后登录2009-06-02
  • 粉丝0
  • 关注0
  • 积分118分
  • 威望16点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
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"
//---------------------------------------------------------------------------
dj_ukyo
驱动小牛
驱动小牛
  • 注册日期2003-03-13
  • 最后登录2009-06-02
  • 粉丝0
  • 关注0
  • 积分118分
  • 威望16点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
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;
}
//---------------------------------------------------------------------------
dj_ukyo
驱动小牛
驱动小牛
  • 注册日期2003-03-13
  • 最后登录2009-06-02
  • 粉丝0
  • 关注0
  • 积分118分
  • 威望16点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-11-26 16:13
好像格式有问题,我打包上传一个
附件名称/大小 下载次数 最后更新
2004-11-26_bj751212.rar (598KB)  103
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-11-26 17:55
修改了dj_ukyo的代码,增加了一些错误处理和对IRP_POWER的支持,启动起来没有问题,但是光驱还是可以打开。

不知道什么原因。
上一页
游客

返回顶部