renxianfu
驱动牛犊
驱动牛犊
  • 注册日期2003-02-28
  • 最后登录2016-01-09
  • 粉丝2
  • 关注2
  • 积分48分
  • 威望365点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分1分
阅读:1753回复:2

移动硬盘或u盘识别问题--熟悉的人请进

楼主#
更多 发布于:2009-06-05 15:52

ULONG GetStorageDeviceBusType(
                              __in PDEVICE_OBJECT DeviceObject
                              )
{
    PIRP NewIrp;
    PSTORAGE_DEVICE_DESCRIPTOR Descriptor;
    STORAGE_PROPERTY_QUERY Query;
    CHAR Buffer[sizeof(STORAGE_DEVICE_DESCRIPTOR)];
    KEVENT WaitEvent;
    NTSTATUS Status;
    IO_STATUS_BLOCK IoStatus;
    
    // first set the query properties
    Query.PropertyId = StorageDeviceProperty;
    Query.QueryType = PropertyStandardQuery;
    
    // initialize the waitable event
    KeInitializeEvent(&WaitEvent, NotificationEvent, FALSE);
    
    // we should build the query irp ourselves
    NewIrp = IoBuildDeviceIoControlRequest(IOCTL_STORAGE_QUERY_PROPERTY, DeviceObject,
        (PVOID)&Query, sizeof(Query), (PVOID)Buffer, sizeof(STORAGE_DEVICE_DESCRIPTOR), FALSE, &WaitEvent, &IoStatus);
    
    if (NULL == NewIrp)    // can't create new irp
    {
        KdPrint(( "[%s] [%u] I can't create a new irp to query the property of device (%p)!\n",
            __FILE__, __LINE__, DeviceObject));
        return BusTypeUnknown;
    }
    
    // send this irp to the storage device
    Status = IoCallDriver(DeviceObject, NewIrp);
    
    if (Status == STATUS_PENDING)
    {
        Status = KeWaitForSingleObject(&WaitEvent, Executive, KernelMode, FALSE, NULL);
        Status = IoStatus.Status;
    }
    
    if (!NT_SUCCESS(Status))
    {
        KdPrint(("[%s] [%u] Query IOCTL_STORAGE_QUERY_PROPERTY of device (%p) failed, Status=0x%08X!\n",
            __FILE__, __LINE__, DeviceObject, Status));
        return BusTypeUnknown;
    }
    
    Descriptor = (PSTORAGE_DEVICE_DESCRIPTOR)Buffer;
    return Descriptor->BusType;
}


这函数大部分情况下没问题,u口接进来的能判断为 BusTypeUsb
但问题是,当我对移动硬盘分区后,BusType变为3了

有高人知道更完美的办法么

现在应用层用DeviceIoControl, code为: IOCTL_DISK_GET_DRIVE_GEOMETRY
也不成
谢谢关注!
renxianfu
驱动牛犊
驱动牛犊
  • 注册日期2003-02-28
  • 最后登录2016-01-09
  • 粉丝2
  • 关注2
  • 积分48分
  • 威望365点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分1分
沙发#
发布于:2009-06-05 18:06
在应用层找到了一种方法,看能不能在驱动里面实现
有用的就看看吧


BOOL IsInFixedMedia(char *lpszPathName)
{
    
    char dvName[32] = "\\\\.\\";
    
    CString str = lpszPathName;
    
    str = str.Left(str.GetLength() - 1);
    
    strcat(dvName,str);
    
    HANDLE hDisk = CreateFile(dvName,GENERIC_READ ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    
    if(hDisk != INVALID_HANDLE_VALUE)
    {
        PSTORAGE_DEVICE_DESCRIPTOR  pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1];
        
        pDevDesc->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1;
        
        if(GetDisksProperty(hDisk, pDevDesc))
        {
            if(pDevDesc->BusType == BusTypeUsb)
            {
                delete pDevDesc;
                CloseHandle(hDisk);
                
                return TRUE;
            }
            
        }
        
        delete pDevDesc;
        
        CloseHandle(hDisk);
    }
    
    return FALSE;
}

BOOL IsRemovable(char *lpszPathName)
{
    
    DWORD dwType = GetDriveType(lpszPathName);
    
    switch(dwType)
    {
    case DRIVE_REMOVABLE:
        
        return TRUE;
        
        break;
        
    case DRIVE_FIXED:
        
           return IsInFixedMedia(lpszPathName);
          
           break;
          
    default:
        
        return FALSE;
    }
    
}
谢谢关注!
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
板凳#
发布于:2009-06-10 23:12
它的就是楼上的驱动实现版本:)

你看到的是下面的总线类型,这个是正确的。

你的判断为3,IDE接口,是不是看错分区了?
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
游客

返回顶部