阅读:1299回复:1
有没有98下的提取U盘名称的程序??
BOOL GetDisksProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)
{ STORAGE_PROPERTY_QUERY Query; DWORD dwOutBytes; BOOL bResult; Query.PropertyId = StorageDeviceProperty; Query.QueryType = PropertyStandardQuery; bResult = ::DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, &Query, sizeof(STORAGE_PROPERTY_QUERY), pDevDesc, pDevDesc->Size, &dwOutBytes, (LPOVERLAPPED)NULL); return bResult; } BOOL GetSubConfig::GetUdisk(LPCSTR lpUsbDevice, CString &strUsbName, PULARGE_INTEGER lpTotalNumberOfBytes) { CString strSec; int k = 0; DWORD drivetype; TCHAR szBuf[300]; HANDLE hDevice; PSTORAGE_DEVICE_DESCRIPTOR pDevDesc; char* p; CString str; _stprintf( szDrvName, _T("%s\\"), lpUsbDevice ); if(GetDriveType( szDrvName )== DRIVE_REMOVABLE) { drivetype = DRVREMOVE; sprintf(szBuf, "\\\\?\\%s", lpUsbDevice); hDevice = CreateFile(szBuf, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); if (hDevice != INVALID_HANDLE_VALUE) { pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1]; pDevDesc->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1; if(GetDisksProperty(hDevice, pDevDesc)) { p= (char*)pDevDesc; str = (pDevDesc->VendorIdOffset ? &p[pDevDesc->VendorIdOffset]:"(NULL)"); strSec += str; str=(pDevDesc->ProductIdOffset ? &p[pDevDesc->ProductIdOffset]:"(NULL)"); strSec += str; } delete pDevDesc; CloseHandle(hDevice); strUsbName = strSec; ULARGE_INTEGER FreeBytesAvailable, TotalNumberOfFreeBytes; GetDiskFreeSpaceEx(lpUsbDevice, &FreeBytesAvailable, lpTotalNumberOfBytes, &TotalNumberOfFreeBytes); return TRUE; } } return FALSE; 我的代码如下,但在98下无效,求各位帮个忙 |
|
沙发#
发布于:2004-12-24 13:36
据我所知,通过文件方式打开设备在2k以上才支持。所以
在98下是不成功的。 而且关于98下得到盘符在驱动开发网上面一直没有一个确切的解决方法。我现在的做法是: 一。使用wnaspi32.dll,找到系统的所有scsi设备,包括u盘,进而使用直接发scsi命令读取其设备的bpb(或更多其他数据)。 二。枚举系统所有逻辑盘,同样读取所有盘的bpb 三。比较,这样你就可以把盘符和AdapterID,TagrgetId,LUN对应起来了,即可以直接发scsi给设备,也可以知道其盘符。 虽然方法比较笨,但还是比较可靠的,例如相同厂家的两个u盘插在系统中,只要两个盘数据有不同,比较足够多的数据就可以分别得知期其盘符了。 |
|