阅读:1862回复:2
移动硬盘或u盘识别问题--熟悉的人请进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 也不成 |
|
|
沙发#
发布于: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; } } |
|
|
板凳#
发布于:2009-06-10 23:12
它的就是楼上的驱动实现版本:)
你看到的是下面的总线类型,这个是正确的。 你的判断为3,IDE接口,是不是看错分区了? |
|
|