#include "stdafx.h" #include "test.h" #include "usbhead.h"
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0;
// initialize MFC and print and error on failure if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: change error code to suit your needs cerr << _T("Fatal Error: MFC initialization failed") << endl; nRetCode = 1; } else { // TODO: code your application's behavior here.
int i;
CString str; HKEY hkey; CStringArray strArrayInfo; //存放移动硬盘的信息 CStringArray strArrayDrive; DWORD dwtype,sl = 256; char sz[256];
//首先通过注册表检测,最多检测到8个移动硬盘 for(i=1;i<8;i++) { if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum",\ NULL,KEY_ALL_ACCESS,&hkey)==ERROR_SUCCESS) { CString id; id.Format("%d",i); if(::RegQueryValueEx(hkey,id,NULL,&dwtype,(LPBYTE)sz,&sl)==ERROR_SUCCESS) { strArrayInfo.Add(sz); cout<<sz<<endl;
strArrayDrive.Add("\\\\.\\PHYSICALDRIVE"+id); } } }
//类据移动硬盘的属性 for (i=0;i < strArrayDrive.GetSize();i++) { CString strDrive = strArrayDrive[i]; HANDLE hDevice=CreateFile(strDrive,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL); if(hDevice==INVALID_HANDLE_VALUE) { AfxMessageBox("Error!"); continue; }
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(hDevice, pDevDesc)) { char *p =NULL;
cout<<"\r\n找到移动盘\n\n"<<endl;
p= (char*)pDevDesc; str = (pDevDesc->VendorIdOffset ? &p[pDevDesc->VendorIdOffset]:"(NULL)"); //名称 cout<<"名称:\t"<<(const char *)str<<endl;
str=(pDevDesc->ProductIdOffset ? &p[pDevDesc->ProductIdOffset]:"(NULL)"); //产品ID cout<<"产品ID:\t"<<(const char *)str<<endl;
str = (pDevDesc->ProductRevisionOffset ? &p[pDevDesc->ProductRevisionOffset] : "(NULL)"); // cout<<"n产品版本:\t"<<(const char *)str<<endl;
str = (pDevDesc->SerialNumberOffset ? &p[pDevDesc->SerialNumberOffset] : "(NULL)"); cout<<"n序列号:\t"<<(const char *)str<<"\n\n";
}
}
//列举移动硬盘的盘符usbhead.h for( TCHAR cLetter = _T('C'); cLetter <= _T('Z'); cLetter++ ) { CString sDrive (cLetter); sDrive += _T(":\\"); if(GetDriveType(sDrive)==DRIVE_REMOVABLE) { cout<<(const char *)sDrive<<endl; } }
cout<<endl<<endl; }
return nRetCode; }
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; }
用到的头文件 #include "devioctl.h" #include "usbdi.h" #include <dbt.h> #include <winioctl.h>
extern "C" { #include "hidsdi.h" #include <setupapi.h> } #define DRVUNKNOWN 0 #define DRVFIXED 1 #define DRVREMOTE 2 #define DRVRAM 3 #define DRVCD 4 #define DRVREMOVE 5 typedef enum _STORAGE_BUS_TYPE { BusTypeUnknown = 0x00, BusTypeScsi, BusTypeAtapi, BusTypeAta, BusType1394, BusTypeSsa, BusTypeFibre, BusTypeUsb, BusTypeRAID, BusTypeMaxReserved = 0x7F } STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE; typedef struct _STORAGE_DEVICE_DESCRIPTOR { ULONG Version; ULONG Size; UCHAR DeviceType; UCHAR DeviceTypeModifier; BOOLEAN RemovableMedia; BOOLEAN CommandQueueing; ULONG VendorIdOffset; ULONG ProductIdOffset; ULONG ProductRevisionOffset; ULONG SerialNumberOffset; STORAGE_BUS_TYPE BusType; ULONG RawPropertiesLength; UCHAR RawDeviceProperties[1];
} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR; typedef enum _STORAGE_QUERY_TYPE { PropertyStandardQuery = 0, PropertyExistsQuery, PropertyMaskQuery, PropertyQueryMaxDefined
} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;
typedef enum _STORAGE_PROPERTY_ID { StorageDeviceProperty = 0, StorageAdapterProperty, StorageDeviceIdProperty
} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;
typedef struct _STORAGE_PROPERTY_QUERY { STORAGE_PROPERTY_ID PropertyId; STORAGE_QUERY_TYPE QueryType; UCHAR AdditionalParameters[1];
} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;
typedef struct _STRING_DESCRIPTOR_NODE { struct _STRING_DESCRIPTOR_NODE *Next; UCHAR DescriptorIndex; USHORT LanguageID; USB_STRING_DESCRIPTOR StringDescriptor[0]; } STRING_DESCRIPTOR_NODE, *PSTRING_DESCRIPTOR_NODE; extern void WINAPI HIDIOCompletionRoutine(DWORD, DWORD, LPOVERLAPPED); #define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
(编辑:aniston)
|