我的U盘过滤驱动程序为什么不能读取U盘扇区?

matrix2009 matrix2009 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近一直在研究U盘过滤驱动,在这个版块发了不少贴,谢谢大家帮忙。
现在一个主要的问题是不能读取U盘扇区,试了很多办法,就是不行。
后来参考机器狗读写硬盘扇区的代码,加到我的代码里面,但是不论我怎么试都不能读取U盘扇区,真郁闷。
我把代码贴一下,劳烦大家再给我看看。先谢谢了。

ULONG AtapiReadWriteDisk(PDEVICE_OBJECT dev_object,ULONG MajorFunction, PVOID buffer,ULONG DiskPos, int BlockCount,PIRP Irp)
{
NTSTATUS status;
PSCSI_REQUEST_BLOCK srb;
PSENSE_DATA sense;
KEVENT Event;
PIRP irp;
PMDL mdl;
IO_STATUS_BLOCK isb;
PIO_STACK_LOCATION isl;
PVOID psense;
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) dev_object->DeviceExtension;
PDEVICE_OBJECT DeviceObject = pdx->DeviceObject;
int count = 8;

while(1)
{
srb = (PSCSI_REQUEST_BLOCK)ExAllocatePool(NonPagedPool,sizeof(SCSI_REQUEST_BLOCK));
if(!srb)
break;
sense = (PSENSE_DATA)ExAllocatePool(NonPagedPool,sizeof(SENSE_DATA));
psense=sense;
if(!sense)
break;
memset(srb,0,sizeof(SCSI_REQUEST_BLOCK));
memset(sense,0,sizeof(SENSE_DATA));

srb->Length=sizeof(SCSI_REQUEST_BLOCK);
srb->Function=0;
srb->DataBuffer=buffer;
srb->DataTransferLength=BlockCount*512; //sector size*number of sector
srb->QueueAction=SRB_FLAGS_DISABLE_AUTOSENSE;
srb->SrbStatus=0;
srb->ScsiStatus=0;
srb->NextSrb=0;
srb->SenseInfoBuffer=sense;
srb->SenseInfoBufferLength=sizeof(SENSE_DATA);

if(MajorFunction==IRP_MJ_READ)
srb->SrbFlags=SRB_FLAGS_DATA_IN;

if(MajorFunction==IRP_MJ_READ)
srb->SrbFlags|=SRB_FLAGS_ADAPTER_CACHE_ENABLE;

srb->SrbFlags|=SRB_FLAGS_DISABLE_AUTOSENSE;
srb->TimeOutValue=(srb->DataTransferLength>>10)+1;
srb->QueueSortKey=DiskPos;
srb->CdbLength=10;

srb->Cdb[0] = SCSIOP_READ;
srb->Cdb[1] = 0x80;
srb->Cdb[2] = (unsigned char)(DiskPos>>0x18);
srb->Cdb[3] = (unsigned char)(DiskPos>>0x10);
srb->Cdb[4] = (unsigned char)(DiskPos>>0x08);
srb->Cdb[5] = (UCHAR)DiskPos; //填写sector位置
srb->Cdb[7] = BlockCount>>0x08;
srb->Cdb[8] = (UCHAR)BlockCount;

KeInitializeEvent(&Event, NotificationEvent, FALSE);
irp=IoAllocateIrp(DeviceObject->StackSize,0);
mdl=IoAllocateMdl(buffer, BlockCount*512, 0, 0, irp);
Irp->MdlAddress=mdl;
if(!mdl)
{
ExFreePool(srb);
ExFreePool(psense);
IoFreeIrp(irp);
return STATUS_INSUFFICIENT_RESOURCES;
}
MmProbeAndLockPages(mdl,0,(MajorFunction==IRP_MJ_READ?IoReadAccess:IoWriteAccess));
srb->OriginalRequest=irp;
irp->UserIosb=&isb;
irp->UserEvent=&Event;
irp->IoStatus.Status=0;
irp->IoStatus.Information=0;
irp->Flags=IRP_SYNCHRONOUS_API|IRP_NOCACHE;
irp->AssociatedIrp.SystemBuffer=0;
irp->Cancel=0;
irp->RequestorMode=0;
irp->CancelRoutine=0;
irp->Tail.Overlay.Thread=PsGetCurrentThread(); //delete by scott

isl=IoGetNextIrpStackLocation(irp);
isl->DeviceObject=DeviceObject;
isl->MajorFunction=IRP_MJ_SCSI;
isl->Parameters.Scsi.Srb=srb;
//isl->CompletionRoutine=IrpCompletionRoutine_0;
isl->Context=srb;
isl->Control=SL_INVOKE_ON_CANCEL|SL_INVOKE_ON_SUCCESS|SL_INVOKE_ON_ERROR;
IoSetCompletionRoutine(irp,IrpCompletionRoutine_0,srb,1,1,1);


status=IoCallDriver(pdx->LowerDeviceObject,irp);
KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, 0);

if(srb->SenseInfoBuffer!=psense&&srb->SenseInfoBuffer)
ExFreePool(srb->SenseInfoBuffer);

ExFreePool(srb);
ExFreePool(psense);

if ( status >= 0 || !count )
return status;

DbgPrint("Send XXX Failed..%08x\r\n", status);
KeStallExecutionProcessor(1u);
--count;
}
return STATUS_INSUFFICIENT_RESOURCES;
}
...全文

相关推荐

U盘只读过滤驱动程序

去年做U盘保密系统时从网上下载参考的代码之一,演示了U盘的只读过滤驱动,有驱动程序和应用程序的全部代码,有用到的请下载学习。

xqchang

嵌入式Linux启动全解析:U-Boot、Kernel与Rootfs的协作与调试

在嵌入式Linux系统中,系统启动是一个由Bootloader、内核与根文件系统协同完成的精密过程。Bootloader(如U-Boot)负责初始化硬件、加载内核镜像与设备树,并传递启动参数。内核作为系统核心,接管硬件管理、驱动加载,并依据参数挂载根文件系统。根文件系统则为用户空间提供必要的运行环境与应用程序。理解三者关系是解决启动问题的关键,例如当出现“uboot 和内核 修改”不同步或“the initrd of default start item is mismatched with running

weixin_33681778

QorIQ处理器U-Boot内存映射与以太网配置实战指南

在嵌入式系统开发中,内存映射与以太网配置是决定系统稳定性和网络性能的核心基础。内存映射定义了处理器访问所有物理设备(如DDR、Flash、外设寄存器)的地址空间与规则,其设计需综合考虑处理器工作模式、设备访问特性及地址冲突,是系统软件运行的基石。以太网配置则涉及硬件链路层与软件驱动的协同,尤其在集成DPAA(数据路径加速架构)的高性能多核处理器中,需通过复位配置字(RCW)和U-Boot环境变量(如hwconfig)精确启用SerDes通道与MAC接口。正确的配置能充分发挥硬件加速价值,广泛应用于网络通信、

chenghao8469

扇区u盘读写

正确读写硬盘、u盘扇区、调试通过。源码,没有什么问题的

dingchangkejigongsi

android对外置U盘进行读取

android通过otg去读取U盘的内容并进行读写操作.

qq_34435079
评论 9
收藏 已收藏
分享
返回顶部