luluwenwen
驱动牛犊
驱动牛犊
  • 注册日期2004-12-23
  • 最后登录2007-08-14
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:1299回复:1

有没有98下的提取U盘名称的程序??

楼主#
更多 发布于:2004-12-23 15:33
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下无效,求各位帮个忙
Zhongyh
驱动牛犊
驱动牛犊
  • 注册日期2001-09-04
  • 最后登录2012-04-09
  • 粉丝1
  • 关注1
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-24 13:36
据我所知,通过文件方式打开设备在2k以上才支持。所以

hDevice = CreateFile(szBuf, GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL)


在98下是不成功的。
而且关于98下得到盘符在驱动开发网上面一直没有一个确切的解决方法。我现在的做法是:
一。使用wnaspi32.dll,找到系统的所有scsi设备,包括u盘,进而使用直接发scsi命令读取其设备的bpb(或更多其他数据)。
二。枚举系统所有逻辑盘,同样读取所有盘的bpb
三。比较,这样你就可以把盘符和AdapterID,TagrgetId,LUN对应起来了,即可以直接发scsi给设备,也可以知道其盘符。

虽然方法比较笨,但还是比较可靠的,例如相同厂家的两个u盘插在系统中,只要两个盘数据有不同,比较足够多的数据就可以分别得知期其盘符了。
游客

返回顶部