basalloy
驱动牛犊
驱动牛犊
  • 注册日期2002-03-20
  • 最后登录2006-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3705回复:6

关于usb storage driver的问题(附源码)

楼主#
更多 发布于:2002-10-05 13:02
在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

最新喜欢:

li375268037li3752... mapoflmapofl
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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打印出来看一看就知道了。
basalloy
驱动牛犊
驱动牛犊
  • 注册日期2002-03-20
  • 最后登录2006-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-10-05 17:50
dazzy:
那你是说,我的确已经向u盘里写入了数据了?如果是这样的话,
紧接着当我向disk.sys发送了一个irp_mj_read的irp后,为何无法读出我刚才写的数据呢?
还有,到哪里找disk.sys的源代码?
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地板#
发布于: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]
basalloy
驱动牛犊
驱动牛犊
  • 注册日期2002-03-20
  • 最后登录2006-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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自带的文件完全一样的话,我用什么方法可以改这两个文件然后将他们覆盖安装上?
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-06 11:19
可以把你的driver放到usbstor.sys上,作为UpperFilters
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
basalloy
驱动牛犊
驱动牛犊
  • 注册日期2002-03-20
  • 最后登录2006-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-06 14:39
能告诉我ddk下面的disk.sys与\\system32\\drivers下面的disk.sys对读写irp的操作机制是否一样?
游客

返回顶部