阅读:1812回复:1
驱动卸载和加载的问题
我做了个U盘过滤驱动,是挂载在DISK磁盘类下面。驱动根据读取U盘扇区的内容为标识,决定是否禁用该U盘。现在禁用和读标识的问题已经基本没问题了,不过在测试效果的时候出现了个问题。当我插入没有标识的U盘时候禁用可以实现,但是当我在设备管理器中将这个U盘的磁盘驱动器卸载掉后,在重新插入U盘,奇怪的问题出现了,这个U盘是有经过过滤驱动,但是没有达到预期禁用的效果,该U盘又可以用了。等过段时间后重新插拔U盘,则U盘又禁用了。我想应该是同步问题,可是我本身对这个不熟悉,所以恳请高手给点意见。下面是我禁用的一段源码,是在IRP_MN_START_DEVICE例程中处理的
if (fcn == IRP_MN_START_DEVICE) { // device start status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp); if (!NT_SUCCESS(status)) return CompleteRequest(Irp, status, 0); PVOID Buffer; Buffer = (PVOID)ExAllocatePool(NonPagedPool,512); status = ReadWriteSector(fido,Buffer,5,1); if(status != STATUS_SUCCESS) { ExFreePool(Buffer); Irp->IoStatus.Status = STATUS_ACCESS_DENIED; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp,IO_NO_INCREMENT); IoReleaseRemoveLock(&pdx->RemoveLock,Irp); return STATUS_ACCESS_DENIED; } PVOID Buffer1; Buffer1 = (PVOID)ExAllocatePool(NonPagedPool,512); RtlFillMemory(Buffer1,512,0x69); ULONG ulRet = RtlCompareMemory(Buffer,Buffer1,512); if(ulRet != 512) { ExFreePool(Buffer); Irp->IoStatus.Status = STATUS_ACCESS_DENIED; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp,IO_NO_INCREMENT); IoReleaseRemoveLock(&pdx->RemoveLock,Irp); return STATUS_ACCESS_DENIED; } IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE) StartDeviceCompletionRoutine, (PVOID) pdx, TRUE, TRUE, TRUE); IoReleaseRemoveLock(&pdx->RemoveLock,Irp); return IoCallDriver(pdx->LowerDeviceObject, Irp); } // device start |
|
沙发#
发布于:2011-01-15 16:36
如果未能禁用,确认是否返回了STATUS_ACCESS_DENIED;
我估计你问题出在扇区内容比较上。 |
|
|