U盘过滤驱动程序Word格式.docx
- 文档编号:21645999
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:21
- 大小:754.94KB
U盘过滤驱动程序Word格式.docx
《U盘过滤驱动程序Word格式.docx》由会员分享,可在线阅读,更多相关《U盘过滤驱动程序Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
5.2模块结构:
入口例程
分派例程
DeviceIoContro例程
SCSI
例程
PNP
AddDevice
其它
入口例程:
创建控制设备对象,初始化驱动的例程入口指针,初始化全局变量。
分派例程:
分派IRP到其他例程。
DeviceIoContro例程:
接收U盘状态设置命令进行解析,修改U盘设置状态记录,与应用层进行通信。
SCSI例程:
分析并过滤读或者写请求,查询U盘状态,若禁止读则直接返回拒绝访问。
在Windows2000中还要处理MODESENSE请求,对U盘的只读状态进行设置。
AddDevice例程:
得到属于USB大容量存储设备的功能设备,对其进行绑定。
PNP例程:
在PNP例程中处理总线关联查询的请求,绑定USB大容量存储设备的物理设备;
其它例程或是请求不作处理。
6.程序源代码:
#include"
ZLLY_Driver.h"
#include<
srb.h>
scsi.h>
/************************************************************************
*函数名称:
DriverEntry
*功能描述:
初始化驱动程序,定位和申请硬件资源,创建内核对象
*参数列表:
pDriverObject:
从I/O管理器中传进来的驱动对象
pRegistryPath:
驱动程序在注册表的中的路径
*返回值:
返回初始化驱动状态
*************************************************************************/
#pragmaINITCODE//用#pragma指明将此例程分派在分页内存中下同
extern"
C"
NTSTATUSDriverEntry(INPDRIVER_OBJECTDriverObject,
INPUNICODE_STRINGRegistryPath)
{//驱动函数入口
KdPrint(("
进入驱动函数入口\n"
));
DriverObject->
DriverUnload=ZLLY_Driver_DriverUnload;
//设置卸载函数指针
DriverExtension->
AddDevice=ZLLY_Driver_AddDevice;
//设置AddDevice函数指针
for(inti=0;
i<
arraysize(DriverObject->
MajorFunction);
++i)
DriverObject->
MajorFunction[i]=ZLLY_Driver_DispatchAny;
//所有IRP派遣函数设为ZLLY_Driver_DispatchAny;
MajorFunction[IRP_MJ_POWER]=ZLLY_Driver_DispatchPower;
//对操作系统处理电源消息时产生的IRP派遣函数设为ZLLY_Driver_DispatchPower
MajorFunction[IRP_MJ_PNP]=ZLLY_Driver_DispatchPnp;
//即插即用消息IRP派遣函数设为ZLLY_Driver_DispatchPnp;
MajorFunction[IRP_MJ_SCSI]=ZLLY_Driver_DispatchForSCSI;
//处理读写操作IRP派遣函数设为ZLLY_Driver_DispatchForSCSI
returnSTATUS_SUCCESS;
}
ZLLY_Driver_DriverUnload
负责驱动程序的卸载操作
DriverObject:
驱动对象
void
#pragmaPAGEDCODE
VOIDZLLY_Driver_DriverUnload(INPDRIVER_OBJECTDriverObject)
{
PAGED_CODE();
进入ZLLY_Driver_DriverUnload\n"
离开ZLLY_Driver_DriverUnload\n"
}
ZLLY_Driver_AddDevice
添加新设备
pdo:
从I/O管理器中传进来的物理设备对象
返回添加新设备状态
NTSTATUSZLLY_Driver_AddDevice(INPDRIVER_OBJECTDriverObject,
INPDEVICE_OBJECTpdo)
{
NTSTATUSstatus;
PDEVICE_OBJECTfido;
status=IoCreateDevice(DriverObject,sizeof(DEVICE_EXTENSION),NULL,
ZLLY_Driver_GetDeviceTypeToUse(pdo),0,FALSE,&
fido);
//创建设备对象
if(!
NT_SUCCESS(status))//判断是否成功创建设备对象
{
KdPrint(("
创建设备对象失败"
returnstatus;
//如果不能成功创建设备对象就返回
}
PDEVICE_EXTENSIONpdx=(PDEVICE_EXTENSION)fido->
DeviceExtension;
//得到设备对象扩展
do
IoInitializeRemoveLock(&
pdx->
RemoveLock,0,0,0);
//初始化自旋锁
pdx->
DeviceObject=fido;
//设置扩展设备对象属于fido
Pdo=pdo;
//设置扩展设备对象的物理设备对象
PDEVICE_OBJECTfdo=IoAttachDeviceToDeviceStack(fido,pdo);
//将过滤驱动附加在底层驱动之上
if(!
fdo)
{
KdPrint(("
附加操作失败\n"
status=STATUS_DEVICE_REMOVED;
break;
}//“附加”操作失败
LowerDeviceObject=fdo;
//记录底层驱动
fido->
Flags|=fdo->
Flags&
(DO_DIRECT_IO|DO_BUFFERED_IO|DO_POWER_PAGABLE);
=~DO_DEVICE_INITIALIZING;
//由于不知道底层驱动是直接IO还是BufferIO,因此将标志都置上
}while(FALSE);
NT_SUCCESS(status))
{//如果没有成功,则从设备堆栈删除设备
if(pdx->
LowerDeviceObject)
IoDetachDevice(pdx->
LowerDeviceObject);
IoDeleteDevice(fido);
}
returnstatus;
ZLLY_Driver_CompleteRequest
将“睡眠”的线程恢复运行,结束IRP请求
Irp:
当前派遣函数中的IRP数据
status:
IRP完成状态
info:
IRP操作了多少字节
返回Irp完成状态
#pragmaLOCKEDCODE
NTSTATUSZLLY_Driver_CompleteRequest(INPIRPIrp,INNTSTATUSstatus,
INULONG_PTRinfo)
Irp->
IoStatus.Status=status;
//设置IRP完成状态为status
IoStatus.Information=info;
//设置IRP操作了info字节
IoCompleteRequest(Irp,IO_NO_INCREMENT);
//用IoCompleteRequest结束IRP请求并返回
//IO_NO_INCREMENT不增加优先级
ZLLY_Driver_USBSCSICompletion
将设备变为只读
DriverObject:
Context:
一级指针
返回设备状态
NTSTATUSZLLY_Driver_USBSCSICompletion(INPDEVICE_OBJECTDeviceObject,
INPIRPIrp,INPVOIDContext)
{
//获取设备扩展
PDEVICE_EXTENSIONpdx=(PDEVICE_EXTENSION)
DeviceObject->
//获取自旋锁
IoAcquireRemoveLock(&
RemoveLock,Irp);
//获得当前IO堆栈
PIO_STACK_LOCATIONirpStack=IoGetCurrentIrpStackLocation(Irp);
//获取当前IRP处理状态
PSCSI_REQUEST_BLOCKCurSrb=irpStack->
Parameters.Scsi.Srb;
PCDBcdb=(PCDB)CurSrb->
Cdb;
UCHARopCode=cdb->
CDB6GENERIC.OperationCode;
//获取操作码
if(opCode==SCSIOP_MODE_SENSE&
&
CurSrb->
DataBuffer
&
DataTransferLength>
=
sizeof(MODE_PARAMETER_HEADER))//判断是否是SCSIOP_MODE_SENSE操作
{
SCSIOP_MODE_SENSE操作!
\n"
PMODE_PARAMETER_HEADERmodeData=(PMODE_PARAMETER_HEADER)CurSrb->
DataBuffer;
//得到模式参数头
modeData->
DeviceSpecificParameter|=MODE_DSP_WRITE_PROTECT;
//设置U盘只读
}
if(Irp->
PendingReturned)//判断是否需要挂起
IoMarkIrpPending(Irp);
//挂起IRP
IoReleaseRemoveLock(&
//释放自旋锁
returnIrp->
IoStatus.Status;
}
ZLLY_Driver_DispatchForSCSI
对IRP_MJ_SCSI这个IRP的截获
fido:
过滤器设备对象
Irp:
底层设备对象状态
NTSTATUSZLLY_Driver_DispatchForSCSI(INPDEVICE_OBJECTfido,INPIRPIrp)
//获得设备扩展
//获得当前I/O堆栈
PIO_STACK_LOCATIONirpStack=IoGetCurrentIrpStackLocation(Irp);
//向下层设备发送TRP
status=IoAcquireRemoveLock(&
RemoveLock,Irp);
//获取自旋锁
returnZLLY_Driver_CompleteRequest(Irp,status,0);
//将“睡眠”的线程恢复运行,结束IRP请求
IoCopyCurrentIrpStackLocationToNext(Irp);
//将当前I/O堆栈复制到下层I/O堆栈
IoSetCompletionRoutine(Irp,ZLLY_Driver_USBSCSICompletion,NULL,
TRUE,TRUE,TRUE);
//设置完成例程
status=IoCallDriver(pdx->
LowerDeviceObject,Irp);
//调用底层设备对象行
ZLLY_Driver_DispatchAny
//让IRP穿过本层驱动
#pragmaLOCKEDCODE
NTSTATUSZLLY_Driver_DispatchAny(INPDEVICE_OBJECTfido,INPIRPIrp)
PIO_STACK_LOCATIONstack=IoGetCurrentIrpStackLocation(Irp);
//获得I/O堆栈
#ifDBG
staticchar*irpname[]=
"
IRP_MJ_CREATE"
//创建设备
IRP_MJ_CREATE_NAMED_PIPE"
IRP_MJ_CLOSE"
//关闭设备
IRP_MJ_READ"
//读取设备内容
IRP_MJ_WRITE"
//对设备进行WriteFile时会产生此IRP
IRP_MJ_QUERY_INFORMATION"
//获取文件长度
IRP_MJ_SET_INFORMATION"
//设置文件长度
IRP_MJ_QUERY_EA"
IRP_MJ_SET_EA"
IRP_MJ_FLUSH_BUFFERS"
IRP_MJ_QUERY_VOLUME_INFORMATION"
IRP_MJ_SET_VOLUME_INFORMATION"
IRP_MJ_DIRECTORY_CONTROL"
IRP_MJ_FILE_SYSTEM_CONTROL"
//系统内部产生的控制信息
IRP_MJ_DEVICE_CONTROL"
//DeviceIoControl函数会产生此IRP
IRP_MJ_INTERNAL_DEVICE_CONTROL"
IRP_MJ_SHUTDOWN"
//关闭系统前会产生此IRP
IRP_MJ_LOCK_CONTROL"
IRP_MJ_CLEANUP"
//清除工作
IRP_MJ_CREATE_MAILSLOT"
IRP_MJ_QUERY_SECURITY"
IRP_MJ_SET_SECURITY"
IRP_MJ_POWER"
//在操作系统处理电源消息时产生此IRP
IRP_MJ_SYSTEM_CONTROL"
IRP_MJ_DEVICE_CHANGE"
IRP_MJ_QUERY_QUOTA"
IRP_MJ_SET_QUOTA"
IRP_MJ_PNP"
//即插即用消息
};
UCHARtype=stack->
MajorFunction;
if(type>
=arraysize(irpname))
存在不明IRP"
#endif
NT_SUCCESS(status))//判断是否成功获取自选锁
//结束TRP请求
IoSkipCurrentIrpStackLocation(Irp);
//调用底层驱动程序
//释放删除锁以及目前未处理的删除操作
ZLLY_Driver_DispatchPower
处理电源管理器发出的主功能码为IRP_MJ_PNP的i/o请求,
实现设备对电源管理的支持
NTSTATUSZLLY_Driver_DispatchPower(INPDEVICE_OBJECTfido,INPIRPIrp)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 过滤 驱动程序
![提示](https://static.bdocx.com/images/bang_tan.gif)