waterice_2005
驱动牛犊
驱动牛犊
  • 注册日期2006-02-15
  • 最后登录2007-02-05
  • 粉丝0
  • 关注0
  • 积分250分
  • 威望26点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
阅读:1291回复:2

请问znsoft.wocook,toolflat等各位大虾!

楼主#
更多 发布于:2007-02-01 11:45
我已经能够在驱动层实现U盘的以及对应盘符的识别,不过,不知什么原因,同样的代码识别移动硬盘就有问题,识别对了但是找不到对应的盘符,不知u盘和移动硬盘有何区别?请教各位大虾!
识别u盘代码如下:
NTSTATUS
SfFsControlMountVolumeComplete(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PDEVICE_OBJECT NewDeviceObject
    )

NewDevExt = NewDeviceObject->DeviceExtension;
。。。
if (NewDevExt->DriveLetter == L'\0')
    {
        UNICODE_STRING DosName;
        Status = SfVolumeDeviceNameToDosName(&NewDevExt->DeviceName, &DosName);
        if (NT_SUCCESS(Status))
        {
            NewDevExt->DriveLetter = DosName.Buffer[0];            
            KdPrint(("sfilter!SfFsControlMountVolumeComplete: SfVolumeDeviceNameToDosName newusbdriver:%ws!\n",DosName.Buffer));
            ExFreePool(DosName.Buffer);
            if ((NewDevExt->DriveLetter >= L'a') && (NewDevExt->DriveLetter <= L'z'))
            {
                NewDevExt->DriveLetter += L'A' - L'a';
            }
        }
        else
        {
            KdPrint(("sfilter!SfCreate: SfVolumeDeviceNameToDosName(%x) failed(%x)\n",
                NewDevExt->StorageStackDeviceObject, Status));
        }
    }
    pNextDeviceObject = NewDevExt->StorageStackDeviceObject->NextDevice;
    //pNextDeviceObject = NewDevExt->StorageStackDeviceObject;
    if (pNextDeviceObject)
    {
        Status = SfFsRecogniseUsbDevice(pNextDeviceObject,&IsUsbDeviceFlag);
        if(NT_SUCCESS(Status)&&IsUsbDeviceFlag)
        {
            KdPrint(("sfilter!SfFsControlMountVolume: @@@@This is a NewUsbDevice@@@@\n"));        
            wcscat(g_pMonitorDriver,(wchar_t *)(&(NewDevExt->DriveLetter)));
        }
    }    
    KdPrint(("sfilter!SfFsControlMountVolumeComplete: g_pMonitorDriver new usb driver:%ws!\n",g_pMonitorDriver));

对应的usb设备的盘符就存在于g_pMonitorDriver中,但是,移动硬盘如果SfFsRecogniseUsbDevice函数得到其物理设备名字中有“usbstor”字符,则证明是usb设备,但是在上边的SfVolumeDeviceNameToDosName函数中就不能得到卷名,好像是因为不是卷设备;如果上边得到了usb的卷名,则下边得到的设备类型为“storage”类型,也不对!不知如何解决这个难题,望大家踊跃发言,指点一二!
冰水混合物
waterice_2005
驱动牛犊
驱动牛犊
  • 注册日期2006-02-15
  • 最后登录2007-02-05
  • 粉丝0
  • 关注0
  • 积分250分
  • 威望26点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-02-02 16:32
大家给个思路呀!我按照toolflat写的教程:
VPB是Volume parameter block.一个数据结构.它的主要作用是把实际存储媒介设备对象和文件系统上的卷设备对象联系起来.
wd_dev_vbp可以让你从一个Storage Device Object得到一个VPB,而wd_vbp_dev这个函数可以得到这个VPB所对应的Volmue设备.
现在首先要得到Storage Device Object.实际上这个东西保存在当前IO_STACK_LOCATION中.
// ------------------wdf.h 中的内容 -----------------------
_inline wd_dev *wd_irpsp_mount_storage(wd_io_stack *irpsp)
{
return irpsp->Parameters.MountVolume.Vpb->RealDevice;
};

那么,从irp出发,我最终可以通过以下的方式得到Volumue设备:
wd_irpsp *irpsp = wd_cur_io_stack(irp);
wd_dev *storage_dev = wd_irpsp_mount_storage(irpsp);
wd_vpb *vpb = wd_dev_vbp(storage_dev);
wd_dev *volume_dev = wd_vbp_dev(vpb);
按理说在mount的完成例程中应该可以得到Volumue设备;得到卷名称:
if (NewDevExt->DriveLetter == L'\0')
    {
        UNICODE_STRING DosName;
        Status = SfVolumeDeviceNameToDosName(&NewDevExt->DeviceName, &DosName);
        if (NT_SUCCESS(Status))
        {
            NewDevExt->DriveLetter = DosName.Buffer[0];            
            KdPrint(("sfilter!SfFsControlMountVolumeComplete: SfVolumeDeviceNameToDosName newusbdriver:%ws!\n",DosName.Buffer));
            ExFreePool(DosName.Buffer);
            if ((NewDevExt->DriveLetter >= L'a') && (NewDevExt->DriveLetter <= L'z'))
            {
                NewDevExt->DriveLetter += L'A' - L'a';
            }
        }
        else
        {
            KdPrint(("sfilter!SfCreate: SfVolumeDeviceNameToDosName(%x) failed(%x)\n",
                NewDevExt->StorageStackDeviceObject, Status));
        }
    }
,不知道为什么当物理设备为usbstor时,总是得不到卷名称,为什么?纳闷中。。。,各位给点指教,学习一下!以解决物理设备在sfilter驱动层的识别问题,先谢谢啦!我顶

 
冰水混合物
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
板凳#
发布于:2007-02-02 20:44
做过应用层区别,驱动没有做过。你是一定要在驱动曾作吗?不知道看看usb的命令符里面是否能够找到答案!
走走看看开源好 Solaris vs Linux
游客

返回顶部