阅读:3705回复:6
关于usb storage driver的问题(附源码)
在dazzy的\"UsbStorage驱动程序的开发\"文章里,介绍了USB STORAGE DRIVER是不对irp_mj_write做实际的处理工作的,也就是说如果我们给USB STORAGE DRIVER发送一个主功能代码为IRP_MJ_WRITE的irp,它应该是不做任何事情的,但我却发现,当我试图从u盘的起始位置开始写若干个字节后,windows就会出现提示:我的u盘没有格式化,我想,这一定是u盘起始位置的一些固有信息已经被我发送的数据覆盖掉了,那也就是说USB STORAGE DRIVER已经处理了IRP_MJ_WRITE的IRP,这是怎么回事呢?
以下是我的一部分源代码: //得到U盘插入的信息。 IoRegisterPlugPlayNotification( EventCategoryDeviceInterfaceChange, PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES, (PVOID)&MY_USBSTOR_GUID, //我的u盘的guid DriverObject, MyCallback, //回调历程 DriverObject, &diNotificationEntry); NTSTATUS MyCallback( IN PVOID NotificationStructure, IN PVOID Context) { PDEVICE_INTERFACE_CHANGE_NOTIFICATION dicn = (PDEVICE_INTERFACE_CHANGE_NOTIFICATION)NotificationStructure; PDRIVER_OBJECT DriverObject = (PDRIVER_OBJECT)Context; if( IsEqualGUID( dicn->Event, GUID_DEVICE_INTERFACE_ARRIVAL)) //得到USB STORAGE DRIVER的设备名,并把它传到 //我的“写” 函数中去。 WriteUsb( DriverObject, dicn->SymbolicLinkName); } WriteUsb( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING UsbSymLinkName) { //得到指向USB STORAGE DRIVER的指针。我没有用IOATTACHDEVICETODEVICESTACK()把我的驱动放到U盘的设备栈上去。 //因为我只是往U盘上发数据而已。 IoGetDeviceObjectPointer( UsbSymLinkName,FILE_ALL_ACCESS, &UsbFileObject, &UsbDevice ); PUCHAR WriteBuffer = \"1234567890\" //为作验证,任意写一串数。 LARGE_INTEGER FilePointer; //我想把那串数从U盘的起始位置写进去。 FilePointer.QuadPart = 0; //构造我的IRP. PIRP Irp = IoBuildSynchronousFsdRequest( IRP_MJ_WRITE, UsbDevice, WriteBuffer, 512, &FilePointer, &event, &IoStatus); PIO_STACK_LOCATION IrpStack = IoGetNextIrpStackLocation(Irp); IrpStack->FileObject = UsbFileObject; //发送到USB STORAGE DEVICE. NTSTATUS status = IoCallDriver( UsbDevice, Irp); } :P |
|
沙发#
发布于:2002-10-05 16:56
要了解USBSTOR.SYS的工作过程,先的了解disk.sys和classpnp.sys, disk.sys为class driver,它负责处理上层传来的一切IRP_MJ_XXX,它会将IRP_MJ_WRITE/READ转换为IRP_MJ_SCSI,然后传递给USBSTOR.SYS。你可以看一看disk.sys和classpnp.sys的源代码就能了解到这一点了,相信不用我多说。
你所坐的操作是对disk.sys的操作,然后经过转换后传递给USBSTOR.SYS的。 另外,你可以把SymbolicLinkName打印出来看一看就知道了。 |
|
板凳#
发布于:2002-10-05 17:50
dazzy:
那你是说,我的确已经向u盘里写入了数据了?如果是这样的话, 紧接着当我向disk.sys发送了一个irp_mj_read的irp后,为何无法读出我刚才写的数据呢? 还有,到哪里找disk.sys的源代码? |
|
地板#
发布于:2002-10-06 01:16
USBSTOR.SYS的IRP_MJ_WRITE/READ的代码如下:
NTSTATUS UsbStore_ReadWrite( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { Irp->IoStatus.Information = 0; Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_INVALID_PARAMETER; } 这段代码你可以反汇编USBSTOR.SYS得到。 如果你直接向USBSTOR.SYS发送了IRP_MJ_WRITE/RAED,IoCallDriver返回的status肯定是STATUS_INVALID_PARAMETER。 是否写入数据,在写入时可以用busbound检测到。 你所使用的SymbolicLinkName及其dos name是什么? disk.sys与classpnp.sys的源代码在ddk里有的。 我只是根据常规进行推测而已。因为我没有进行相同的测试,也不能得到你测试的更详细的信息。 能否给出你读取的代码? [编辑 - 10/6/02 by dazzy] |
|
地下室#
发布于:2002-10-06 09:39
用我的方法,得到的u盘的符号连接名(即源代码中的UsbSymLinkName->Buffer)请见附件.而他的dosname是没有的,也就是你说的,usbstor.sys并没有定义dosname。只是在建立设备对象时让系统随意生成了nt设备名。如果我将我的程序附到usbstor所在的堆栈上,可以看到实际上在我的程序和usbstor.sys之间还有disk、partmgr、diskperf这三个过滤设备。有没有什么办法直接将我的设备附到usbstor上呢?通过修改安装文件恐怕不行,因为我的设备是动态附到设备上去的。
我昨天也找到disk.sys和classpnp.sys了,但我不知道他们能否完全替代system32\\drivers\\下的系统自带的两个同名的文件?我覆盖了一下,结果重新启动后,还是原来系统的那两个,我想应该是这两个文件已经被嵌入到内核了。 如果ddk下的这两个文件功能与windows自带的文件完全一样的话,我用什么方法可以改这两个文件然后将他们覆盖安装上? |
|
5楼#
发布于:2002-10-06 11:19
可以把你的driver放到usbstor.sys上,作为UpperFilters
|
|
|
6楼#
发布于:2002-10-06 14:39
能告诉我ddk下面的disk.sys与\\system32\\drivers下面的disk.sys对读写irp的操作机制是否一样?
|
|