bj751212
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4776回复: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-12-09 13:30
你可以用softice自带的drivermonitor加载启动试试,如果还启动部成功,那就是你的DriverEntry有问题了
ljkong
驱动小牛
驱动小牛
  • 注册日期2004-05-16
  • 最后登录2011-10-26
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望112点
  • 贡献值0点
  • 好评度111点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-09 00:38
tooflat可以把你的CreateService和StartService的启动服务程序贴上来吗?我CreateService和OpenService都正常就是一StartService返回值就是error
ljkong
驱动小牛
驱动小牛
  • 注册日期2004-05-16
  • 最后登录2011-10-26
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望112点
  • 贡献值0点
  • 好评度111点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-08 17:14
可以给我一份例子吗?我的QQ:37376159,或者邮箱:ljkong323@hotmail.com,我调不通呀,再问一个问题,看你们说要用什么CreateSevice,怎么用呢?
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-08 15:13
我在3楼的例子就可以,再把12楼的意见加上就完全了
dj_ukyo
驱动小牛
驱动小牛
  • 注册日期2003-03-13
  • 最后登录2009-06-02
  • 粉丝0
  • 关注0
  • 积分118分
  • 威望16点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-08 11:01
到底有人调通了吗,上来说一下
ljkong
驱动小牛
驱动小牛
  • 注册日期2004-05-16
  • 最后登录2011-10-26
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望112点
  • 贡献值0点
  • 好评度111点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-08 01:21
到底有人调通了吗,上来说一下
dj_ukyo
驱动小牛
驱动小牛
  • 注册日期2003-03-13
  • 最后登录2009-06-02
  • 粉丝0
  • 关注0
  • 积分118分
  • 威望16点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-04 10:25
大家关注啊
dj_ukyo
驱动小牛
驱动小牛
  • 注册日期2003-03-13
  • 最后登录2009-06-02
  • 粉丝0
  • 关注0
  • 积分118分
  • 威望16点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-11-30 14:34
我加载了,或者关机的时候蓝屏,或者安装失败,大家有什么好建议。
dj_ukyo
驱动小牛
驱动小牛
  • 注册日期2003-03-13
  • 最后登录2009-06-02
  • 粉丝0
  • 关注0
  • 积分118分
  • 威望16点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-11-29 09:07
最新的版本到底效果如何?
KMK
KMK
驱动大牛
驱动大牛
  • 注册日期2001-09-12
  • 最后登录2017-10-06
  • 粉丝2
  • 关注0
  • 积分42分
  • 威望404点
  • 贡献值2点
  • 好评度58点
  • 原创分1分
  • 专家分1分
  • 社区居民
10楼#
发布于:2004-11-27 03:23
那过滤CDROM class就可以吗 ?
toadwolf
驱动牛犊
驱动牛犊
  • 注册日期2003-11-30
  • 最后登录2013-11-12
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望67点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-11-27 02:53
用device tree看了一下,
cdrom0上面挂了一个redbook,redbook上面挂了我们的过滤驱动,
但是cdfs直接把irp发给redbook了,没有发给我们的过滤驱动,
所以光驱还是可以打开。


如果光驱里面有盘, 那么多数情况下文件系统已经MOUNT好了, 你这时再去做磁盘过滤当然没用. 详情见 ifsddk -> ifs documents -> ifs kit -> design guide -> file system fundamentals -> mounting a volume -> how the volume is mounted -> note

toad
sean198148
驱动牛犊
驱动牛犊
  • 注册日期2003-01-22
  • 最后登录2014-10-08
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望26点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-11-26 22:03
tooflat,你三楼的程序我试了一下,可以锁住光驱阿,为什么后面又要改其它的呢?
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-11-26 18:01
用device tree看了一下,
cdrom0上面挂了一个redbook,redbook上面挂了我们的过滤驱动,
但是cdfs直接把irp发给redbook了,没有发给我们的过滤驱动,
所以光驱还是可以打开。
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-11-26 17:55
修改了dj_ukyo的代码,增加了一些错误处理和对IRP_POWER的支持,启动起来没有问题,但是光驱还是可以打开。

不知道什么原因。
dj_ukyo
驱动小牛
驱动小牛
  • 注册日期2003-03-13
  • 最后登录2009-06-02
  • 粉丝0
  • 关注0
  • 积分118分
  • 威望16点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-11-26 16:13
好像格式有问题,我打包上传一个
附件名称/大小 下载次数 最后更新
2004-11-26_bj751212.rar (598KB)  103
dj_ukyo
驱动小牛
驱动小牛
  • 注册日期2003-03-13
  • 最后登录2009-06-02
  • 粉丝0
  • 关注0
  • 积分118分
  • 威望16点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
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;
}
//---------------------------------------------------------------------------
dj_ukyo
驱动小牛
驱动小牛
  • 注册日期2003-03-13
  • 最后登录2009-06-02
  • 粉丝0
  • 关注0
  • 积分118分
  • 威望16点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
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"
//---------------------------------------------------------------------------
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
18楼#
发布于:2004-11-25 23:15
一到startservice()就黑屏重启了,意味着你的DRIVERENTRY有问题,你下断点看看是什么问题.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
bj751212
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-11-25 16:32
请调试成功的兄弟把代码贴出来看看啊!
上一页
游客

返回顶部