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

求教驱动的问题

楼主#
更多 发布于:2004-11-19 11:32
忙了好几天,在各位高手的点拨下,做了个禁用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"


freeboy8218
驱动牛犊
驱动牛犊
  • 注册日期2004-11-07
  • 最后登录2005-05-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-25 09:11
介绍一下呀
dj_ukyo
驱动小牛
驱动小牛
  • 注册日期2003-03-13
  • 最后登录2009-06-02
  • 粉丝0
  • 关注0
  • 积分118分
  • 威望16点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-24 15:05
介绍一下呢
bj751212
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-19 14:42
卸载的问题已搞定
游客

返回顶部