根据盘符判断是不是U盘

wxz 2005-11-11 03:22:23
根据一个盘符,怎样判断是不是U盘?

注意:GetDiskType不准确,有些U盘把自己报告为硬盘,我手头就一个这样的。
...全文
290 点赞 收藏 13
写回复
13 条回复
truelove7283159 2006年06月12日
TO: xingzhou(往事悠悠,网事幽幽)
你在这个帖子中问我的问题,cfg.h是ddk中的头文件。

回复 点赞
xingzhou 2005年11月13日
这个帖子早结了,怎么还是未解决?

-----------------
行舟
欢迎使用CSDN论坛浏览器
http://blog.csdn.net/xingzhou/
回复 点赞
Joe 2005年11月13日
请再寄给我一下: liweiqiao@126.com
谢谢!
回复 点赞
wf2091139 2005年11月12日
UP一下,便与学习!
回复 点赞
wxz 2005年11月11日
非常感谢,另分10分给了感兴趣的朋友,不要见怪。
回复 点赞
truelove7283159 2005年11月11日
已发邮件
回复 点赞
ccrun.com 2005年11月11日
info@ccrun.com
回复 点赞
constantine 2005年11月11日
constantine.student@sina.com
非常感谢!
回复 点赞
xingzhou 2005年11月11日
非常感谢,wxz@csdn.net

-----------------
行舟
CSDN论坛浏览器
http://blog.xingzhou.com
http://blog.csdn.net/xingzhou/
回复 点赞
truelove7283159 2005年11月11日
不好意思,有点乱给我mail吧。发给你们
回复 点赞
truelove7283159 2005年11月11日
int iCount;
DWORD drive;
TCHAR cDriverPath,szBuf[300],szDrvName[33];

HANDLE hDevice;
PSTORAGE_DEVICE_DESCRIPTOR pDevDesc;
AnsiString pDriverPath;

BYTE pByte[STORAGE_DEVICE_DESCRIPTOR_SIZE];

memset(szDrvName,0x00,33);
memset(szBuf,0x00,300);

//ロジカル全ドライブを取得する
DWORD MaxDriveSet;
MaxDriveSet = GetLogicalDrives();

if(DriveList == NULL)
return 0;
//DriveListOld = DriveList;
DriveList->Clear();

//システムのusbロジックディスク
for ( drive = 0; drive < 32; ++drive )
{
if ((MaxDriveSet & (1 << drive)) != 0 )
{
DWORD tempDrive = 1<<drive;
sprintf( szDrvName, "%c:\\", 'A'+drive );
if((GetDriveType( szDrvName )== DRIVE_REMOVABLE)
||(GetDriveType( szDrvName )== DRIVE_FIXED)
||(GetDriveType( szDrvName )== DRIVE_CDROM))
{
sprintf(szBuf, "\\\\?\\%c:", 'A'+drive);
hDevice = CreateFile(szBuf,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
NULL,
NULL);

//ディスク属性の取得は、総線タイプにより、usbディバイスであるかを判明してから
if (hDevice != INVALID_HANDLE_VALUE)
{
memset(pByte,0x00,STORAGE_DEVICE_DESCRIPTOR_SIZE); //*A02*CH04*
pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)pByte; //*A02*CH04*
pDevDesc->Size = STORAGE_DEVICE_DESCRIPTOR_SIZE; //*A02*CH04*

if(GetDisksProperty(hDevice, pDevDesc))
{
if(pDevDesc->BusType == BusTypeUsb)
{
pDriverPath = FirstDriveFromMask(tempDrive);
pDriverPath +=":\\";
DriveList->Add(pDriverPath);
}
}
CloseHandle(hDevice);
}
}
}
}

iCount = DriveList->Count;

return iCount;

//=====================================================
BOOL __fastcall TNnUSBWatch::GetDisksProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)
{
DWORD dwOutBytes;
BOOL bResult;
STORAGE_PROPERTY_QUERY Query;
memset(&Query, 0, sizeof(Query));
Query.PropertyId = StorageDeviceProperty;
Query.QueryType = PropertyStandardQuery;

if(hDevice == INVALID_HANDLE_VALUE)
return false;
if(pDevDesc == NULL)
return false;

bResult = DeviceIoControl(hDevice,
IOCTL_STORAGE_QUERY_PROPERTY,
&Query, sizeof(STORAGE_PROPERTY_QUERY),
pDevDesc, pDevDesc->Size,
&dwOutBytes,
(LPOVERLAPPED)NULL);

return bResult;
}

看GetDisksProperty方法
回复 点赞
xingzhou 2005年11月11日
to truelove7283159:
那怎样取到这个盘的总线类型呢?
回复 点赞
truelove7283159 2005年11月11日
根据一个盘符,判断是不是U盘,要读取到这个盘的总线类型才可以知熬是不是u盘。
bustype == usb
回复 点赞
发动态
发帖子
Windows SDK/API
创建于2007-08-02

884

社区成员

8156

社区内容

C++ Builder Windows SDK/API
社区公告
暂无公告