353807973
驱动牛犊
驱动牛犊
  • 注册日期2010-08-26
  • 最后登录2012-05-01
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望181点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1812回复:1

驱动卸载和加载的问题

楼主#
更多 发布于:2010-12-30 15:16
我做了个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
Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
沙发#
发布于:2011-01-15 16:36
如果未能禁用,确认是否返回了STATUS_ACCESS_DENIED;
我估计你问题出在扇区内容比较上。
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
游客

返回顶部