阅读:1434回复:0
u盘只读驱动,郁闷中...出了什么问题,请看下
//u盘只读过滤驱动程序 qq:41701315 msn:cztianyu@hotmail.com
NTSTATUS FilterSCSI( PDEVICE_OBJECT Device_Object, PIRP irp ) { ULONG ioControlCode; int opCode; PSCSI_REQUEST_BLOCK CurSrb; PCDB cdb; PMODE_PARAMETER_HEADER modeData;//mode sense PIO_STACK_LOCATION irpStack; ULONG i; PDEVICE_EXTENSION deviceExtension; KEVENT event; ULONG length; DbgPrint(\"IRP_MJ_SCSI\"); irpStack = IoGetCurrentIrpStackLocation(irp); //Handle opCode of SCSI CurSrb=irpStack->Parameters.Scsi.Srb;//Get Current Scsi SRB, Analysis SCSI Command here! cdb=(PCDB)CurSrb->Cdb; opCode=cdb->CDB6GENERIC.OperationCode; DbgPrint(\"opCode (%d) 0x(%x) CtlFlag(%d)\",opCode,opCode=cdb->CDB6GENERIC.OperationCode,CtlFlag); //按照道理,opCode的值应该是1a ,但是始终等于不了1a,郁闷中... if(opCode==SCSIOP_MODE_SENSE) { DbgPrint(\"SCSIOP_MODE_SENSE\"); IoCopyCurrentIrpStackLocationToNext(irp); IoSetCompletionRoutine(irp, (PIO_COMPLETION_ROUTINE) FilterModeSenseCompletionRoutine, &event, TRUE, TRUE, TRUE); deviceExtension = (PDEVICE_EXTENSION) Device_Object->DeviceExtension; return IoCallDriver (deviceExtension->topDevObj, irp); } if(opCode==SCSIOP_WRITE||opCode==SCSIOP_WRITE6)//这两个参数也始终等于不了 { DbgPrint(\"SCSI_WRITE\"); DbgPrint(\"Write Device Here,BLOCK\"); irp->IoStatus.Status = STATUS_MEDIA_WRITE_PROTECTED;//STATUS_ACCESS_DENIED; irp->IoStatus.Information = 0; CurSrb->SrbStatus=SRB_STATUS_ERROR; IoCompleteRequest(irp, IO_NO_INCREMENT); return STATUS_MEDIA_WRITE_PROTECTED;//ACCESS_DENIED; } return FilterPass(Device_Object,irp); } |
|