首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

关于windows上的卷过滤

2013-01-22 
关于windows下的卷过滤我使用的原型是寒江独钓下的例子磁盘的虚拟,我现在只想要实现对于E盘的写的拒绝嗯,

关于windows下的卷过滤
我使用的原型是寒江独钓下的例子磁盘的虚拟,我现在只想要实现对于E盘的写的拒绝嗯,代码:


#include<ntddk.h>
#include< Ntddvol.h>
PDEVICE_OBJECT DesDev;//要记录的D盘的过滤设备
typedef struct _DevExt
{
WCHAR VolumeLetter;//卷的名字如C或D
PDEVICE_OBJECT FltDev;
PDEVICE_OBJECT LowerDev;
PDEVICE_OBJECT PhyDev;
}DevExt,*PDevExt;
typedef struct _Parameter
{
DevExt ParDexExt;
KEVENT Event;
}Par,*PPar;
//下发请求的分发函数
NTSTATUS Dispatch(PDEVICE_OBJECT Device,PIRP irp)
{
PDevExt lp=(PDevExt)Device->DeviceExtension ;
IoSkipCurrentIrpStackLocation(irp);
return IoCallDriver(lp->LowerDev ,irp);
}
NTSTATUS DispatchPower(PDEVICE_OBJECT Device,PIRP irp)
{
PDevExt lp=(PDevExt)Device->DeviceExtension ;
PoStartNextPowerIrp(irp);
IoSkipCurrentIrpStackLocation(irp);
return PoCallDriver(lp->LowerDev ,irp);
}
NTSTATUS DispatchReadWrite(PDEVICE_OBJECT Device,PIRP irp)
{
if(DesDev==Device)
{
return STATUS_SUCCESS;
}
else
{
 return Dispatch( Device, irp);
}
}
NTSTATUS MyProc(PDEVICE_OBJECT Device,PIRP irp,PVOID Context)
{
PPar lp=(PPar)Device->DeviceExtension ;
NTSTATUS status=STATUS_SUCCESS;
UNICODE_STRING DosName={0};
ASSERT(Context!=NULL);
status=IoVolumeDeviceToDosName(lp->ParDexExt .PhyDev,&DosName);
//将dos名字改为大写
lp->ParDexExt.VolumeLetter  =DosName.Buffer [0];
if(DosName.Length >0)
DbgPrint("The Str is: %ws\n",DosName.Buffer );
else
KdPrint(("对不起,没有获得卷的名称"));
_asm
{
int 3;
}
KeSetEvent(&lp->Event ,0,FALSE);
return STATUS_SUCCESS;
}
NTSTATUS DispatchCtrl(PDEVICE_OBJECT Device,PIRP irp)
{
PDevExt lp=(PDevExt)Device->DeviceExtension ;
NTSTATUS status=STATUS_SUCCESS;
PIO_STACK_LOCATION irpsp=IoGetCurrentIrpStackLocation(irp);
PKEVENT Event=NULL;
Event=new KEVENT;
KeInitializeEvent(Event,NotificationEvent,FALSE);
Par nowPar={0};
nowPar.ParDexExt=*lp;
nowPar.Event=*Event;
switch(irpsp->Parameters .DeviceIoControl .IoControlCode )
{
case IOCTL_VOLUME_ONLINE:
{
IoCopyCurrentIrpStackLocationToNext(irp);
IoSetCompletionRoutine(irp,MyProc,&nowPar,TRUE,TRUE,TRUE);
status=IoCallDriver(lp->LowerDev ,irp);
KeWaitForSingleObject(&nowPar.Event ,Executive,KernelMode,FALSE,NULL);

delete Event;
return status;
}
default:
break;
}
IoSkipCurrentIrpStackLocation(irp);
return IoCallDriver(lp->LowerDev ,irp);
}
NTSTATUS DispatchAdd(PDRIVER_OBJECT Driver,PDEVICE_OBJECT Device)
{
NTSTATUS status=STATUS_SUCCESS;
PDevExt lp=NULL;
PDEVICE_OBJECT FltDev=NULL;
PDEVICE_OBJECT LowerDev=NULL;
PDEVICE_OBJECT PhyDev=Device;
status=IoCreateDevice(Driver,sizeof(DevExt),NULL,FILE_DEVICE_DISK,FILE_DEVICE_SECURE_OPEN,FALSE,&FltDev);
if(!NT_SUCCESS(status))
{
goto ERROUT;
}
lp=(PDevExt)FltDev->DeviceExtension ;
//清空过滤设备的扩展
RtlZeroMemory(lp,sizeof(DevExt));
LowerDev=IoAttachDeviceToDeviceStack(FltDev,Device);
if(NULL==LowerDev)
{
status=STATUS_NO_SUCH_DEVICE;
goto ERROUT;
}
FltDev->Flags |=LowerDev->Flags ;
FltDev->Flags &=~DO_DEVICE_INITIALIZING;


//进行初始化设备扩展
lp->FltDev =FltDev;
lp->LowerDev =LowerDev;
lp->PhyDev =Device;
ERROUT:
if(!NT_SUCCESS(status))
{
//如果上面有不成功的地方首先需要接触可能存在的附加
if(NULL!=LowerDev)
{
IoDetachDevice(LowerDev);
lp->LowerDev =NULL;
}
//然后删除可能建立的过滤设备
if(NULL!=FltDev)
{
IoDeleteDevice(FltDev);
lp->FltDev =NULL;
}
}
return status;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
ULONG i=0;
for(i=0;i<=IRP_MJ_MAXIMUM_FUNCTION;i++)
{
DriverObject->MajorFunction [i]=Dispatch;
}
DriverObject->MajorFunction [IRP_MJ_POWER]=DispatchPower;
DriverObject->MajorFunction [IRP_MJ_WRITE]=DispatchReadWrite;
DriverObject->MajorFunction [IRP_MJ_DEVICE_CONTROL]=DispatchCtrl;
DriverObject->DriverExtension ->AddDevice =DispatchAdd;
return STATUS_SUCCESS;
}


之前调试出现过 'C'  'E',应该没什么大的问题
调试信息是:
DEFAULT_BUCKET_ID:  DRIVER_FAULT

BUGCHECK_STR:  0x7B

PROCESS_NAME:  System

LAST_CONTROL_TRANSFER:  from 804f8b9d to 80528bdc

STACK_TEXT:  
f8ac1090 804f8b9d 00000003 f8ac13ec 00000000 nt!RtlpBreakWithStatusInstruction
f8ac10dc 804f978a 00000003 00000000 80087000 nt!KiBugCheckDebugBreak+0x19
f8ac14bc 804f9cb5 0000007b f8ac1528 c000000e nt!KeBugCheck2+0x574
f8ac14dc 80687ce9 0000007b f8ac1528 c000000e nt!KeBugCheckEx+0x1b
f8ac1644 8068be0a 80087000 00000000 80087000 nt!IopMarkBootPartition+0xf5
f8ac1694 80688b48 80087000 f8ac16b0 00043000 nt!IopInitializeBootDrivers+0x4ba
f8ac183c 80686fdd 80087000 00000000 821b95b8 nt!IoInitSystem+0x712
f8ac1dac 805c7160 80087000 00000000 00000000 nt!Phase1Initialization+0x9b5
f8ac1ddc 80542dd2 80686628 80087000 00000000 nt!PspSystemThreadStartup+0x34
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16


STACK_COMMAND:  kb

FOLLOWUP_IP: 
nt!IopMarkBootPartition+f5
80687ce9 8d85e0feffff    lea     eax,[ebp-120h]

SYMBOL_STACK_INDEX:  4

SYMBOL_NAME:  nt!IopMarkBootPartition+f5

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: nt

IMAGE_NAME:  ntkrnlpa.exe

DEBUG_FLR_IMAGE_TIMESTAMP:  4802516a

FAILURE_BUCKET_ID:  0x7B_nt!IopMarkBootPartition+f5

BUCKET_ID:  0x7B_nt!IopMarkBootPartition+f5

Followup: MachineOwner
我是新手,请大侠指教

[解决办法]
Bug Check 0x7B: INACCESSIBLE_BOOT_DEVICE (Windows Debuggers)

你如果在系统里面生成了系统分区,那么系统就会对该分区进行管理。这种情况下,你把所有的Read/Write都拒绝了,系统会出于安全考虑,产生Bugcheck,不再继续。



[解决办法]
引用:
我想写的是如果是D盘,就拒绝写入,只是练手,在虚拟机下,

我是说,你是要完成请求还是向下传递???这是驱动中必须要做的。

热点排行