在Windows7 – 32位系统上获取有关磁盘驱动器结果的信息
当我在
Windows XP – 32上运行以下代码时,我得到以下结果.
我只插了一个usb笔式驱动器 On Windows XP - 32 Bit ----------------------- Drive C: ProductId: ST3160215AS ProductRevision: 3.AAD DeviceType: 7,DeviceNumber: 0,PartitionNumber: 1 DevicePath: ?ide#diskst3160215as_____________________________3.aad___#5&2 7db0ed4&0&0.0.0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} Class: DiskDrive Hardware ID: IDEDiskST3160215AS_____________________________3.AAD___ Friendly Name: ST3160215AS Physical Device Object Name: DeviceIdeIdeDeviceP2T0L0-5 Device Description: Disk drive Parent Device Instance ID: PCIIDEIDECHANNEL4&1C1E8A11&0&0 Parent of Parent Device Instance ID: PCIVEN_8086&DEV_27C0&SUBSYS_72671462&R EV_013&11583659&0&FA DeviceInstanceId: IDEDISKST3160215AS_____________________________3.AAD___5 &27DB0ED4&0&0.0.0 Drive D: ProductId: ST3160215AS ProductRevision: 3.AAD DeviceType: 7,PartitionNumber: 2 DevicePath: ?ide#diskst3160215as_____________________________3.aad___#5&2 7db0ed4&0&0.0.0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} Class: DiskDrive Hardware ID: IDEDiskST3160215AS_____________________________3.AAD___ Friendly Name: ST3160215AS Physical Device Object Name: DeviceIdeIdeDeviceP2T0L0-5 Device Description: Disk drive Parent Device Instance ID: PCIIDEIDECHANNEL4&1C1E8A11&0&0 Parent of Parent Device Instance ID: PCIVEN_8086&DEV_27C0&SUBSYS_72671462&R EV_013&11583659&0&FA DeviceInstanceId: IDEDISKST3160215AS_____________________________3.AAD___5 &27DB0ED4&0&0.0.0 Drive E: ProductId: ST3160215AS ProductRevision: 3.AAD DeviceType: 7,PartitionNumber: 3 DevicePath: ?ide#diskst3160215as_____________________________3.aad___#5&2 7db0ed4&0&0.0.0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} Class: DiskDrive Hardware ID: IDEDiskST3160215AS_____________________________3.AAD___ Friendly Name: ST3160215AS Physical Device Object Name: DeviceIdeIdeDeviceP2T0L0-5 Device Description: Disk drive Parent Device Instance ID: PCIIDEIDECHANNEL4&1C1E8A11&0&0 Parent of Parent Device Instance ID: PCIVEN_8086&DEV_27C0&SUBSYS_72671462&R EV_013&11583659&0&FA DeviceInstanceId: IDEDISKST3160215AS_____________________________3.AAD___5 &27DB0ED4&0&0.0.0 Drive F: ProductId: ST3160215AS ProductRevision: 3.AAD DeviceType: 7,PartitionNumber: 4 DevicePath: ?ide#diskst3160215as_____________________________3.aad___#5&2 7db0ed4&0&0.0.0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} Class: DiskDrive Hardware ID: IDEDiskST3160215AS_____________________________3.AAD___ Friendly Name: ST3160215AS Physical Device Object Name: DeviceIdeIdeDeviceP2T0L0-5 Device Description: Disk drive Parent Device Instance ID: PCIIDEIDECHANNEL4&1C1E8A11&0&0 Parent of Parent Device Instance ID: PCIVEN_8086&DEV_27C0&SUBSYS_72671462&R EV_013&11583659&0&FA DeviceInstanceId: IDEDISKST3160215AS_____________________________3.AAD___5 &27DB0ED4&0&0.0.0 Drive G: VendorId: JetFlash ProductId: Transcend 2GB ProductRevision: 8.07 DeviceType: 7,DeviceNumber: 1,PartitionNumber: 1 DevicePath: ?usbstor#disk&ven_jetflash&prod_transcend_2gb&rev_8.07#e3o29u 13&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} Class: DiskDrive Hardware ID: USBSTORDiskJetFlashTranscend_2GB___8.07 Friendly Name: JetFlash Transcend 2GB USB Device Physical Device Object Name: Device 0000080 Device Description: Disk drive Parent Device Instance ID: USBVID_058F&PID_6387E3O29U13 Parent of Parent Device Instance ID: USBROOT_HUB204&2B6971CE&0 DeviceInstanceId: USBSTORDISK&VEN_JETFLASH&PROD_TRANSCEND_2GB&REV_8.07E3O2 9U13&0 Drive G: is removeable Drive X: When i run the below code on windows7 - 32,i get the below result i have plugged the same usb pen drive which is used on windows xp - 32 bit... On Windows 7 - 32 Bit ----------------------- Drive C: ProductId: Hitachi HDS721616PLA380 ProductRevision: P22OAB3A DeviceType: 7,PartitionNumber: 2 DevicePath: ?ide#diskhitachi_hds721616pla380_________________p22oab3a#5&4 be38f&0&0.0.0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} Class: DiskDrive Hardware ID: USBSTORDiskJetFlashTranscend_2GB___8.07 Friendly Name: JetFlash Transcend 2GB USB Device Physical Device Object Name: Device 000006f Device Description: Disk drive Parent Device Instance ID: USBVID_058F&PID_6387E3O29U13 Parent of Parent Device Instance ID: USBROOT_HUB204&4E31217&0 DeviceInstanceId: USBSTORDISK&VEN_JETFLASH&PROD_TRANSCEND_2GB&REV_8.07E3O2 9U13&0 Drive C: is removeable Drive D: ProductId: Hitachi HDS721616PLA380 ProductRevision: P22OAB3A DeviceType: 7,PartitionNumber: 3 DevicePath: ?ide#diskhitachi_hds721616pla380_________________p22oab3a#5&4 be38f&0&0.0.0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} Class: DiskDrive Hardware ID: USBSTORDiskJetFlashTranscend_2GB___8.07 Friendly Name: JetFlash Transcend 2GB USB Device Physical Device Object Name: Device 000006f Device Description: Disk drive Parent Device Instance ID: USBVID_058F&PID_6387E3O29U13 Parent of Parent Device Instance ID: USBROOT_HUB204&4E31217&0 DeviceInstanceId: USBSTORDISK&VEN_JETFLASH&PROD_TRANSCEND_2GB&REV_8.07E3O2 9U13&0 Drive D: is removeable Drive E: ProductId: Hitachi HDS721616PLA380 ProductRevision: P22OAB3A DeviceType: 7,PartitionNumber: 4 DevicePath: ?ide#diskhitachi_hds721616pla380_________________p22oab3a#5&4 be38f&0&0.0.0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} Class: DiskDrive Hardware ID: USBSTORDiskJetFlashTranscend_2GB___8.07 Friendly Name: JetFlash Transcend 2GB USB Device Physical Device Object Name: Device 000006f Device Description: Disk drive Parent Device Instance ID: USBVID_058F&PID_6387E3O29U13 Parent of Parent Device Instance ID: USBROOT_HUB204&4E31217&0 DeviceInstanceId: USBSTORDISK&VEN_JETFLASH&PROD_TRANSCEND_2GB&REV_8.07E3O2 9U13&0 Drive E: is removeable Drive F: ProductId: Hitachi HDS721616PLA380 ProductRevision: P22OAB3A DeviceType: 7,PartitionNumber: 5 DevicePath: ?ide#diskhitachi_hds721616pla380_________________p22oab3a#5&4 be38f&0&0.0.0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} Class: DiskDrive Hardware ID: USBSTORDiskJetFlashTranscend_2GB___8.07 Friendly Name: JetFlash Transcend 2GB USB Device Physical Device Object Name: Device 000006f Device Description: Disk drive Parent Device Instance ID: USBVID_058F&PID_6387E3O29U13 Parent of Parent Device Instance ID: USBROOT_HUB204&4E31217&0 DeviceInstanceId: USBSTORDISK&VEN_JETFLASH&PROD_TRANSCEND_2GB&REV_8.07E3O2 9U13&0 Drive F: is removeable Drive G: VendorId: JetFlash ProductId: Transcend 2GB ProductRevision: 8.07 DeviceType: 7,PartitionNumber: 1 DevicePath: ?usbstor#disk&ven_jetflash&prod_transcend_2gb&rev_8.07#e3o29u 13&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} Class: DiskDrive Hardware ID: IDEDiskHitachi_HDS721616PLA380_________________P22OAB3A Friendly Name: Hitachi HDS721616PLA380 ATA Device Physical Device Object Name: DeviceIdeIdeDeviceP1T0L0-1 Device Description: Disk drive Parent Device Instance ID: PCIIDEIDECHANNEL4&35CD87E&0&0 Parent of Parent Device Instance ID: PCIVEN_8086&DEV_27C0&SUBSYS_27C08086&R EV_013&2411E6FE&1&FA DeviceInstanceId: IDEDISKHITACHI_HDS721616PLA380_________________P22OAB3A5 &4BE38F&0&0.0.0 Drive G: is removeable Drive Z:
--------------------------------------------------------------------------------- 请看两个结果…… 我在两个系统(xp和windows7)上插入了一个相同的USB设备,但结果各不相同…… 请检查驱动器G:两者的结果…… Drive G: ( On Windows 7 - 32 bit ) ----------------------------------- VendorId: JetFlash ProductId: Transcend 2GB ProductRevision: 8.07 DeviceType: 7,PartitionNumber: 1 DevicePath: ?usbstor#disk&ven_jetflash&prod_transcend_2gb&rev_8.07#e3o29u 13&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} Class: DiskDrive Hardware ID: IDEDiskHitachi_HDS721616PLA380_________________P22OAB3A Friendly Name: Hitachi HDS721616PLA380 ATA Device Physical Device Object Name: DeviceIdeIdeDeviceP1T0L0-1 Device Description: Disk drive Parent Device Instance ID: PCIIDEIDECHANNEL4&35CD87E&0&0 Parent of Parent Device Instance ID: PCIVEN_8086&DEV_27C0&SUBSYS_27C08086&R EV_013&2411E6FE&1&FA DeviceInstanceId: IDEDISKHITACHI_HDS721616PLA380_________________P22OAB3A5 &4BE38F&0&0.0.0 Drive G: is removeable Drive G: ( On Windows XP - 32 bit ) ----------------------------------- VendorId: JetFlash ProductId: Transcend 2GB ProductRevision: 8.07 DeviceType: 7,PartitionNumber: 1 DevicePath: ?usbstor#disk&ven_jetflash&prod_transcend_2gb&rev_8.07#e3o29u 13&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} Class: DiskDrive Hardware ID: USBSTORDiskJetFlashTranscend_2GB___8.07 Friendly Name: JetFlash Transcend 2GB USB Device Physical Device Object Name: Device 0000080 Device Description: Disk drive Parent Device Instance ID: USBVID_058F&PID_6387E3O29U13 Parent of Parent Device Instance ID: USBROOT_HUB204&2B6971CE&0 DeviceInstanceId: USBSTORDISK&VEN_JETFLASH&PROD_TRANSCEND_2GB&REV_8.07E3O2 9U13&0 Drive G: is removeable 感谢您的任何帮助 解决方法
我在C中编写了一个程序,演示了如何接收所需的信息
#include <windows.h> #include <devguid.h> // for GUID_DEVCLASS_CDROM etc #include <setupapi.h> #include <cfgmgr32.h> // for MAX_DEVICE_ID_LEN,CM_Get_Parent and CM_Get_Device_ID #include <tchar.h> #include <stdio.h> #define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0])) #pragma comment (lib,"setupapi.lib") // // Define the various device characteristics flags (defined in wdm.h) // #define FILE_REMOVABLE_MEDIA 0x00000001 #define FILE_READ_ONLY_DEVICE 0x00000002 #define FILE_FLOPPY_DISKETTE 0x00000004 #define FILE_WRITE_ONCE_MEDIA 0x00000008 #define FILE_REMOTE_DEVICE 0x00000010 #define FILE_DEVICE_IS_MOUNTED 0x00000020 #define FILE_VIRTUAL_VOLUME 0x00000040 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 #define FILE_DEVICE_SECURE_OPEN 0x00000100 #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000 #pragma warning (disable: 4201) typedef struct _IO_STATUS_BLOCK { union { NTSTATUS Status; PVOID Pointer; } DUMMYUNIONNAME; ULONG_PTR Information; } IO_STATUS_BLOCK,*PIO_STATUS_BLOCK; #pragma warning (default: 4201) typedef enum _FSINFOCLASS { FileFsVolumeInformation = 1,FileFsLabelInformation,// 2 FileFsSizeInformation,// 3 FileFsDeviceInformation,// 4 FileFsAttributeInformation,// 5 FileFsControlInformation,// 6 FileFsFullSizeInformation,// 7 FileFsObjectIdInformation,// 8 FileFsDriverPathInformation,// 9 FileFsVolumeFlagsInformation,// 10 FileFsMaximumInformation } FS_INFORMATION_CLASS,*PFS_INFORMATION_CLASS; typedef struct _FILE_FS_DEVICE_INFORMATION { DEVICE_TYPE DeviceType; ULONG Characteristics; } FILE_FS_DEVICE_INFORMATION,*PFILE_FS_DEVICE_INFORMATION; typedef NTSTATUS (NTAPI *LPFN_NT_QUERY_VOLUME_INFORMATION_FILE) (HANDLE FileHandle,PIO_STATUS_BLOCK IoStatusBlock,PVOID FsInformation,ULONG Length,FS_INFORMATION_CLASS FsInformationClass); BOOL GetDriveTypeAndCharacteristics (HANDLE hDevice,DEVICE_TYPE *pDeviceType,ULONG *pCharacteristics) { HMODULE hNtDll; LPFN_NT_QUERY_VOLUME_INFORMATION_FILE lpfnNtQueryVolumeInformationFile; NTSTATUS ntStatus; IO_STATUS_BLOCK IoStatusBlock; FILE_FS_DEVICE_INFORMATION FileFsDeviceInfo; BOOL bSuccess = FALSE; hNtDll = GetModuleHandle (TEXT("ntdll.dll")); if (hNtDll == NULL) return FALSE; lpfnNtQueryVolumeInformationFile = (LPFN_NT_QUERY_VOLUME_INFORMATION_FILE)GetProcAddress (hNtDll,"NtQueryVolumeInformationFile"); if (lpfnNtQueryVolumeInformationFile == NULL) return FALSE; ntStatus = lpfnNtQueryVolumeInformationFile (hDevice,&IoStatusBlock,&FileFsDeviceInfo,sizeof(FileFsDeviceInfo),FileFsDeviceInformation); if (ntStatus == NO_ERROR) { bSuccess = TRUE; *pDeviceType = FileFsDeviceInfo.DeviceType; *pCharacteristics = FileFsDeviceInfo.Characteristics; } return bSuccess; } void FildVolumeName (LPCTSTR pszDeviceName) { TCHAR szVolumeName[MAX_PATH] = TEXT(""); TCHAR szDeviceName[MAX_PATH] = TEXT(""); HANDLE hFind = INVALID_HANDLE_VALUE; DWORD dwCharCount; BOOL bSuccess; hFind = FindFirstVolume (szVolumeName,ARRAYSIZE(szVolumeName)); if (hFind == INVALID_HANDLE_VALUE) return; while(TRUE) { // Skip the ? prefix and remove the trailing backslash. size_t Index = lstrlen(szVolumeName) - 1; if (szVolumeName[0] != TEXT('') || szVolumeName[1] != TEXT('') || szVolumeName[2] != TEXT('?') || szVolumeName[3] != TEXT('') || szVolumeName[Index] != TEXT('')) return; // error // QueryDosDeviceW doesn't allow a trailing backslash,// so temporarily remove it. szVolumeName[Index] = TEXT(' '); dwCharCount = QueryDosDevice (&szVolumeName[4],szDeviceName,ARRAYSIZE(szDeviceName)); szVolumeName[Index] = TEXT(''); if (dwCharCount == 0) return; // error if (lstrcmp (pszDeviceName,szDeviceName) == 0) { _tprintf (TEXT(" Volume Device Name: %sn"),szVolumeName); return; } bSuccess = FindNextVolume (hFind,szVolumeName,ARRAYSIZE(szVolumeName)); if (!bSuccess) { DWORD dwErrorCode = GetLastError(); if (dwErrorCode == ERROR_NO_MORE_ITEMS) break; else break; // ERROR!!! } } } void DumpVidPidMi (LPCTSTR pszDeviceInstanceId) { TCHAR szDeviceInstanceId[MAX_DEVICE_ID_LEN]; const static LPCTSTR arPrefix[3] = {TEXT("VID_"),TEXT("PID_"),TEXT("MI_")}; LPTSTR pszToken,pszNextToken; int j; lstrcpy (szDeviceInstanceId,pszDeviceInstanceId); pszToken = _tcstok_s (szDeviceInstanceId,TEXT("#&"),&pszNextToken); while(pszToken != NULL) { for (j = 0; j < 3; j++) { if (_tcsncmp(pszToken,arPrefix[j],lstrlen(arPrefix[j])) == 0) { switch(j) { case 0: _tprintf (TEXT(" vid: "%s"n"),pszToken + lstrlen(arPrefix[j])); break; case 1: _tprintf (TEXT(" pid: "%s"n"),pszToken + lstrlen(arPrefix[j])); break; case 2: _tprintf (TEXT(" mi: "%s"n"),pszToken + lstrlen(arPrefix[j])); break; default: break; } } } pszToken = _tcstok_s (NULL,&pszNextToken); } } BOOL FindDiInfos (LPCGUID pGuidInferface,LPCGUID pGuidClass,LPCTSTR pszEnumerator,DEVICE_TYPE DeviceType,DWORD DeviceNumber,DWORD dwDeviceInstanceIdSize,// MAX_DEVICE_ID_LEN OUT LPTSTR pszDeviceInstanceId,OUT PDWORD pdwRemovalPolicy) //#define CM_REMOVAL_POLICY_EXPECT_NO_REMOVAL 1 //#define CM_REMOVAL_POLICY_EXPECT_ORDERLY_REMOVAL 2 //#define CM_REMOVAL_POLICY_EXPECT_SURPRISE_REMOVAL 3 { HDEVINFO hIntDevInfo = NULL; DWORD dwIndex; BOOL bFound = FALSE; HANDLE hDev = INVALID_HANDLE_VALUE; PSP_DEVICE_INTERFACE_DETAIL_DATA pInterfaceDetailData = NULL; // set defaults *pdwRemovalPolicy = 0; pszDeviceInstanceId[0] = TEXT(' '); __try { hIntDevInfo = SetupDiGetClassDevs (pGuidInferface,pszEnumerator,NULL,pGuidInferface != NULL? DIGCF_PRESENT | DIGCF_DEVICEINTERFACE: DIGCF_ALLCLASSES | DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if (hIntDevInfo == INVALID_HANDLE_VALUE) __leave; for (dwIndex = 0; ;dwIndex ++) { SP_DEVICE_INTERFACE_DATA interfaceData; SP_DEVINFO_DATA deviceInfoData; DWORD dwDataType,dwRequiredSize; BOOL bSuccess; ZeroMemory (&interfaceData,sizeof(interfaceData)); interfaceData.cbSize = sizeof(interfaceData); bSuccess = SetupDiEnumDeviceInterfaces (hIntDevInfo,pGuidInferface,dwIndex,&interfaceData); if (!bSuccess) { DWORD dwErrorCode = GetLastError(); if (dwErrorCode == ERROR_NO_MORE_ITEMS) break; else break; // ERROR!!! } dwRequiredSize = 0; bSuccess = SetupDiGetDeviceInterfaceDetail (hIntDevInfo,&interfaceData,&dwRequiredSize,NULL); if ((!bSuccess && GetLastError() != ERROR_INSUFFICIENT_BUFFER) || dwRequiredSize == 0) continue; // ERROR!!! if (pInterfaceDetailData) pInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA) LocalFree (pInterfaceDetailData); pInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA) LocalAlloc (LPTR,dwRequiredSize); pInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); ZeroMemory (&deviceInfoData,sizeof(deviceInfoData)); deviceInfoData.cbSize = sizeof(deviceInfoData); bSuccess = SetupDiGetDeviceInterfaceDetail (hIntDevInfo,pInterfaceDetailData,dwRequiredSize,&deviceInfoData); if (!bSuccess) continue; hDev = CreateFile (pInterfaceDetailData->DevicePath,// no access to the drive FILE_SHARE_READ | FILE_SHARE_WRITE,// share mode NULL,// default security attributes OPEN_EXISTING,// disposition 0,// file attributes NULL); // do not copy file attributes if (hDev != INVALID_HANDLE_VALUE) { STORAGE_DEVICE_NUMBER sdn; DWORD cbBytesReturned; bSuccess = DeviceIoControl (hDev,// device to be queried IOCTL_STORAGE_GET_DEVICE_NUMBER,// no input buffer (LPVOID)&sdn,sizeof(sdn),// output buffer &cbBytesReturned,// # bytes returned (LPOVERLAPPED) NULL); // synchronous I/O if (bSuccess) { if (sdn.DeviceType == DeviceType && sdn.DeviceNumber == DeviceNumber) { DEVINST dnDevInstParent,dnDevInstParentParent; CONFIGRET ret; // device found !!! TCHAR szBuffer[4096]; _tprintf (TEXT(" DevicePath: %sn"),pInterfaceDetailData->DevicePath); bSuccess = SetupDiGetDeviceInstanceId (hIntDevInfo,&deviceInfoData,pszDeviceInstanceId,dwDeviceInstanceIdSize,&dwRequiredSize); if (dwRequiredSize > MAX_DEVICE_ID_LEN) continue; bSuccess = SetupDiGetDeviceRegistryProperty (hIntDevInfo,SPDRP_REMOVAL_POLICY,&dwDataType,(PBYTE)pdwRemovalPolicy,sizeof(DWORD),&dwRequiredSize); // SPDRP_CHARACTERISTICS - Device characteristics // FILE_FLOPPY_DISKETTE,FILE_REMOVABLE_MEDIA,and FILE_WRITE_ONCE_MEDIA characteristics // FILE_READ_ONLY_DEVICE bSuccess = SetupDiGetDeviceRegistryProperty (hIntDevInfo,SPDRP_CLASS,(PBYTE)szBuffer,sizeof(szBuffer),&dwRequiredSize); if (bSuccess) _tprintf (TEXT(" Class: "%s"n"),szBuffer); bSuccess = SetupDiGetDeviceRegistryProperty (hIntDevInfo,SPDRP_HARDWAREID,&dwRequiredSize); if (bSuccess) { LPCTSTR pszId; _tprintf (TEXT(" Hardware IDs:n")); for (pszId=szBuffer; *pszId != TEXT(' ') && pszId + dwRequiredSize/sizeof(TCHAR) <= szBuffer + ARRAYSIZE(szBuffer); pszId += lstrlen(pszId)+1) { _tprintf (TEXT(" "%s"n"),pszId); } } bSuccess = SetupDiGetDeviceRegistryProperty (hIntDevInfo,SPDRP_FRIENDLYNAME,&dwRequiredSize); if (bSuccess) _tprintf (TEXT(" Friendly Name: "%s"n"),szBuffer); bSuccess = SetupDiGetDeviceRegistryProperty (hIntDevInfo,SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,&dwRequiredSize); if (bSuccess) _tprintf (TEXT(" Physical Device Object Name: "%s"n"),SPDRP_DEVICEDESC,&dwRequiredSize); if (bSuccess) _tprintf (TEXT(" Device Description: "%s"n"),szBuffer); bFound = TRUE; ret = CM_Get_Parent (&dnDevInstParent,deviceInfoData.DevInst,0); if (ret == CR_SUCCESS) { TCHAR szDeviceInstanceID[MAX_DEVICE_ID_LEN]; ret = CM_Get_Device_ID (dnDevInstParent,szDeviceInstanceID,ARRAY_SIZE(szDeviceInstanceID),0); if (ret == CR_SUCCESS) { _tprintf (TEXT(" Parent Device Instance ID: %sn"),szDeviceInstanceID); DumpVidPidMi (szDeviceInstanceID); ret = CM_Get_Parent (&dnDevInstParentParent,dnDevInstParent,0); if (ret == CR_SUCCESS) { ret = CM_Get_Device_ID (dnDevInstParentParent,0); if (ret == CR_SUCCESS) _tprintf (TEXT(" Parent of Parent Device Instance ID: %sn"),szDeviceInstanceID); } } } break; } } CloseHandle (hDev); hDev = INVALID_HANDLE_VALUE; } } } __finally { if (pInterfaceDetailData) pInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA) LocalFree (pInterfaceDetailData); if (hDev != INVALID_HANDLE_VALUE) CloseHandle (hDev); if (hIntDevInfo) SetupDiDestroyDeviceInfoList (hIntDevInfo); } return bFound; } LPCTSTR DumpBusTypeAsString (STORAGE_BUS_TYPE type) { const static LPCTSTR arStorageBusTypeNames[] = { TEXT("Unknown"),// BusTypeUnknown = 0 TEXT("SCSI"),// BusTypeScsi = 1 TEXT("ATAPI"),// BusTypeAtapi = 2 TEXT("ATA"),// BusTypeAta = 3 TEXT("IEEE-1394"),// BusType1394 = 4 TEXT("SSA"),// BusTypeSsa = 5 TEXT("Fibre Channel"),// BusTypeFibre = 6 TEXT("USB"),// BusTypeUsb = 7 TEXT("RAID"),// BusTypeRAID = 8 TEXT("iSCSI"),// BusTypeiScsi = 9 TEXT("Serial Attached SCSI (SAS)"),// BusTypeSas = 10 TEXT("SATA"),// BusTypeSata = 11 TEXT("SD"),// BusTypeSd = 12 TEXT("MMC"),// BusTypeMmc = 13 TEXT("Virtual"),// BusTypeVirtual = 14 TEXT("FileBackedVirtual") // BusTypeFileBackedVirtual = 15 }; if (type <= BusTypeFileBackedVirtual) return arStorageBusTypeNames[type]; else return NULL; } int main() { HANDLE hDevice; DWORD cbBytesReturned; STORAGE_DEVICE_NUMBER sdn; BOOL bSuccess; LPTSTR pszLogicalDrives,pszDriveRoot; TCHAR szDeviceInstanceId[MAX_DEVICE_ID_LEN]; GUID *pGuidInferface = NULL,*pGuidClass = NULL; LPCTSTR pszEnumerator = NULL; TCHAR szVolumeName[MAX_PATH+1],szFileSystemName[MAX_PATH+1],szNtDeviceName[MAX_PATH+1]; //TCHAR szVolumeSerialNumber[1024]; DWORD dwVolumeSerialNumber,dwMaximumComponentLength,dwFileSystemFlags; //HMODULE hm = LoadLibrary (TEXT("C:Program FilesMicrosoft OfficeOffice14OUTLOOK.EXE")); __try { //pszEnumerator = TEXT("USB"); cbBytesReturned = GetLogicalDriveStrings (0,NULL); pszLogicalDrives = (LPTSTR) LocalAlloc (LMEM_ZEROINIT,cbBytesReturned*sizeof(TCHAR)); cbBytesReturned = GetLogicalDriveStrings (cbBytesReturned,pszLogicalDrives); for (pszDriveRoot = pszLogicalDrives; *pszDriveRoot != TEXT(' '); pszDriveRoot += lstrlen(pszDriveRoot) + 1) { TCHAR szDeviceName[7] = TEXT("\."); BOOL bIsRemoveable = FALSE; DWORD dwRemovalPolicy; STORAGE_PROPERTY_QUERY spq; BYTE byBuffer[4096]; //ULONG ulOutBuffer; szDeviceName[4] = pszDriveRoot[0]; szDeviceName[5] = TEXT(':'); szDeviceName[6] = TEXT(' '); _tprintf (TEXT("Drive %c:n"),pszDriveRoot[0]); // see http://msdn.microsoft.com/en-us/library/cc542456.aspx // how to find Volume name: ?Volume{4c1b02c1-d990-11dc-99ae-806e6f6e6963} // for the Paths: C: // or device name like DeviceHarddiskVolume2 or DeviceCdRom0 cbBytesReturned = QueryDosDevice (&szDeviceName[4],szNtDeviceName,ARRAYSIZE(szNtDeviceName)); if (cbBytesReturned) { _tprintf (TEXT(" Dos Device Name: %sn"),szNtDeviceName); FildVolumeName(szNtDeviceName); } bSuccess = GetVolumeInformation (pszDriveRoot,ARRAYSIZE(szVolumeName),&dwVolumeSerialNumber,&dwMaximumComponentLength,&dwFileSystemFlags,szFileSystemName,ARRAYSIZE(szFileSystemName)); if (bSuccess) { _tprintf (TEXT(" Volume Name: "%s"n"),szVolumeName); } hDevice = CreateFile (szDeviceName,//FILE_READ_DATA,//0 - no access to the drive,for IOCTL_STORAGE_CHECK_VERIFY is FILE_READ_DATA needed FILE_READ_ATTRIBUTES,// for IOCTL_STORAGE_CHECK_VERIFY2 FILE_SHARE_READ | FILE_SHARE_WRITE,// share mode NULL,OPEN_EXISTING,NULL); if (hDevice == INVALID_HANDLE_VALUE) __leave; bIsRemoveable = FALSE; spq.PropertyId = StorageDeviceProperty; spq.QueryType = PropertyStandardQuery; spq.AdditionalParameters[0] = 0; bSuccess = DeviceIoControl (hDevice,// device to be queried IOCTL_STORAGE_QUERY_PROPERTY,// operation to perform &spq,sizeof(spq),// input buffer &byBuffer,sizeof(byBuffer),// output buffer &cbBytesReturned,// # bytes returned (LPOVERLAPPED) NULL); // synchronous I/O if (bSuccess) { STORAGE_DEVICE_DESCRIPTOR *psdp = (STORAGE_DEVICE_DESCRIPTOR *)byBuffer; LPCTSTR pszBusType = DumpBusTypeAsString(psdp->BusType); if (pszBusType) _tprintf (TEXT(" Bus Type: %sn"),pszBusType); else _tprintf (TEXT(" Bus Type: Unknown (%d)n"),psdp->BusType); if (psdp->VendorIdOffset) _tprintf (TEXT(" VendorId: "%hs"n"),(LPCSTR)((PBYTE)psdp + psdp->VendorIdOffset)); if (psdp->ProductIdOffset) _tprintf (TEXT(" ProductId: "%hs"n"),(LPCSTR)((PBYTE)psdp + psdp->ProductIdOffset)); if (psdp->ProductRevisionOffset) _tprintf (TEXT(" ProductRevision: "%hs"n"),(LPCSTR)((PBYTE)psdp + psdp->ProductRevisionOffset)); if (psdp->RemovableMedia) bIsRemoveable = TRUE; } cbBytesReturned = 0; bSuccess = DeviceIoControl (hDevice,// device to be queried IOCTL_STORAGE_CHECK_VERIFY2,// no input buffer NULL,// no output buffer &cbBytesReturned,// # bytes returned (LPOVERLAPPED) NULL); // synchronous I/O if (bSuccess) _tprintf (TEXT(" the device media are accessiblen")); else if (GetLastError() == ERROR_NOT_READY) _tprintf (TEXT(" the device media are not accessiblen")); bSuccess = DeviceIoControl (hDevice,// device to be queried IOCTL_STORAGE_GET_DEVICE_NUMBER,// no input buffer (LPVOID)&sdn,// # bytes returned (LPOVERLAPPED) NULL); // synchronous I/O // GetLastError of ERROR_MORE_DATA indicates to the caller that the buffer was not large enough to accommodate the data requested if (!bSuccess) __leave; _tprintf (TEXT(" DeviceType: %d,DeviceNumber: %d,PartitionNumber: %dn"),sdn.DeviceType,sdn.DeviceNumber,sdn.PartitionNumber); pGuidInferface = NULL; pGuidClass = NULL; if (sdn.DeviceType == FILE_DEVICE_CD_ROM || sdn.DeviceType == FILE_DEVICE_DVD) { pGuidInferface = (GUID*)&GUID_DEVINTERFACE_CDROM; pGuidClass = (GUID*)&GUID_DEVCLASS_CDROM; } else if (sdn.DeviceType == FILE_DEVICE_DISK) { DEVICE_TYPE DeviceType; ULONG ulCharacteristics; bSuccess = GetDriveTypeAndCharacteristics (hDevice,&DeviceType,&ulCharacteristics); if (bSuccess) { if ((ulCharacteristics & FILE_FLOPPY_DISKETTE) == FILE_FLOPPY_DISKETTE) { pGuidInferface = (GUID*)&GUID_DEVINTERFACE_FLOPPY; pGuidClass = (GUID*)&GUID_DEVCLASS_FLOPPYDISK; } else { pGuidInferface = (GUID*)&GUID_DEVINTERFACE_DISK; pGuidClass = (GUID*)&GUID_DEVCLASS_DISKDRIVE; } if ((ulCharacteristics & FILE_REMOVABLE_MEDIA) == FILE_REMOVABLE_MEDIA) bIsRemoveable = TRUE; } } // GUID_DEVCLASS_MEDIUM_CHANGER if (CloseHandle (hDevice)) hDevice = INVALID_HANDLE_VALUE; bSuccess = FindDiInfos (pGuidInferface,pGuidClass,ARRAY_SIZE(szDeviceInstanceId),// MAX_DEVICE_ID_LEN szDeviceInstanceId,&dwRemovalPolicy); if (bSuccess) { if (dwRemovalPolicy == CM_REMOVAL_POLICY_EXPECT_SURPRISE_REMOVAL || dwRemovalPolicy == CM_REMOVAL_POLICY_EXPECT_ORDERLY_REMOVAL) bIsRemoveable = TRUE; _tprintf (TEXT(" DeviceInstanceId: %sn"),szDeviceInstanceId); if (bIsRemoveable) _tprintf (TEXT(" Drive %c: is removeablen"),pszDriveRoot[0]); } } } __finally { if (pszLogicalDrives) pszLogicalDrives = (LPTSTR) LocalFree (pszLogicalDrives); if (hDevice != INVALID_HANDLE_VALUE) bSuccess = CloseHandle (hDevice); } return 0; } 可以在没有安装Windows DDK的情况下编译该程序(仅需要Windows SDK,例如需要与Visual Studio一起安装).该程序产生如下输出: .... Drive L: Dos Device Name: DeviceCdRom2 Volume Device Name: ?Volume{2c5f6a93-2b50-11df-aa6a-005056c00008} Volume Name: "SONYPICTUTIL" Bus Type: USB VendorId: "HL-DT-ST" ProductId: "DVDRAM GE20LU11 " ProductRevision: "CL01" the device media are accessible DeviceType: 2,DeviceNumber: 2,PartitionNumber: -1 DevicePath: ?usbstor#cdrom&ven_hl-dt-st&prod_dvdram_ge20lu11&rev_cl01#0010101640008b615&0#{53f56308-b6bf-11d0-94f2-00a0c91efb8b} Class: "CDROM" Hardware IDs: "USBSTORCdRomHL-DT-STDVDRAM_GE20LU11_CL01" "USBSTORCdRomHL-DT-STDVDRAM_GE20LU11_" "USBSTORCdRomHL-DT-ST" "USBSTORHL-DT-STDVDRAM_GE20LU11_C" "HL-DT-STDVDRAM_GE20LU11_C" "USBSTORGenCdRom" "GenCdRom" Friendly Name: "HL-DT-ST DVDRAM GE20LU11 USB Device" Physical Device Object Name: "Device 0000096" Device Description: "CD-ROM Drive" Parent Device Instance ID: USBVID_152E&PID_1640 010101640008B615 vid: "152E" pid: "1640" Parent of Parent Device Instance ID: USBROOT_HUB204&29A1BD9B&0 DeviceInstanceId: USBSTORCDROM&VEN_HL-DT-ST&PROD_DVDRAM_GE20LU11&REV_CL01 010101640008B615&0 Drive L: is removeable Drive N: Dos Device Name: DeviceHarddiskVolume8 Volume Device Name: ?Volume{ae08a3c8-71cf-11de-bc1d-005056c00008} Volume Name: "" Bus Type: USB VendorId: "SanDisk " ProductId: "Cruzer " ProductRevision: "8.01" the device media are accessible DeviceType: 7,DeviceNumber: 5,PartitionNumber: 1 DevicePath: ?usbstor#disk&ven_sandisk&prod_cruzer&rev_8.01#1740030578903736&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} Class: "DiskDrive" Hardware IDs: "USBSTORDiskSanDisk_Cruzer__________8.01" "USBSTORDiskSanDisk_Cruzer__________" "USBSTORDiskSanDisk_" "USBSTORSanDisk_Cruzer__________8" "SanDisk_Cruzer__________8" "USBSTORGenDisk" "GenDisk" Friendly Name: "SanDisk Cruzer USB Device" Physical Device Object Name: "Device 00000aa" Device Description: "Disk drive" Parent Device Instance ID: USBVID_0781&PID_54061740030578903736 vid: "0781" pid: "5406" Parent of Parent Device Instance ID: USBROOT_HUB204&128079C2&0 DeviceInstanceId: USBSTORDISK&VEN_SANDISK&PROD_CRUZER&REV_8.011740030578903736&0 Drive N: is removeable 因为我们只对通过驱动器号可访问的设备感兴趣,所以程序首先枚举系统中与GetLogicalDriveStrings函数相关的所有逻辑驱动器.对于每个驱动器,我们都可以使用IOCTL_STORAGE_QUERY_PROPERTY来获取VendorId,ProductId和ProductRevision等信息. IOCTL_STORAGE_GET_DEVICE_NUMBER的使用允许我们获取驱动器类型(如CD / DVD或磁盘/软盘).此外,两个数字:DeviceType和DeviceNumber在系统中是唯一的,我们可以使用它们作为基础来精确驱动器的设备实例(使用SetupDi-功能). 因为软盘和磁盘设备具有相同的定义类型FILE_DEVICE_DISK,所以我使用FileFsDeviceInformation参数演示另一个函数NtQueryVolumeInformationFile,以获得设备的所谓命名特性.特性是从其他磁盘转发软盘的最佳方法,并为设备枚举选择相应的类和接口GUID(GUID_DEVINTERFACE_FLOPPY或GUID_DEVINTERFACE_DISK).我们获取了与SetupDi API相关的所有枚举设备的DeviceType和DeviceNumber.在我们找出哪个设备有哪个驱动器号的方式. 更重要的是设备的层次结构:父/子关系.为了演示这一点,我在代码示例中使用了CM_Get_Parent和CM_Get_Device_ID函数.因此,我们可以看到哪个USB设备具有哪个存储设备作为孩子. 我显示了有关找到的设备的一些信息.您可以将示例中的API与IOCTL_MOUNTMGR_QUERY_POINTS(请参阅Using IOCTL_MOUNTMGR_QUERY_POINTS)或FindFirstVolumeW,FindNextVolumeW和GetVolumePathNamesForVolumeNameW(请参阅http://msdn.microsoft.com/en-us/library/cc542456(VS.85).aspx)结合使用,以便在需要时接收更多详细信息. 更新:顺便说一下,IOCTL_STORAGE_QUERY_PROPERTY返回的缓冲区有另一个字段,如STORAGE_BUS_TYPE BusType(BusTypeUsb,BusTypeFibre,BusTypeSd等)等.您还可以使用IOCTL_STORAGE_QUERY_PROPERTY来询问另一个信息,如StorageDeviceUniqueIdProperty或StorageDeviceUniqueIdProperty等.如果您想要更多USB特定的信息,我建议你http://www.emmet-gray.com/Articles/USB_SerialNumbers.htm显示IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX,IOCTL_USB_GET_NODE_INFORMATION和IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION的用法. 更新2:由于stackoverflow.com中的邮件大小限制,我将程序的扩展版本置于http://www.ok-soft-gmbh.com/ForStackOverflow/EnumMassStorage.c之下.测试输出类似于http://www.ok-soft-gmbh.com/ForStackOverflow/EnumMassStorage.txt 更新3:我发现了一个错误并更新了代码.请使用最新版本的代码并验证您的问题是否已解决. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何从MSBuild获取当前登录的Windows用户
- 创建Microsoft Access表的SQL转储
- windows-xp – 如何通知内网用户不使用客户端应用程序?
- .net – 与Windows兼容的文件系统的文件时间分辨率
- windows-server-2008 – 在Windows Server 2008中安装服务
- Powershell load dll出错:Add-Type:无法加载文件或程序集
- Windows – 查看给定计算机上的活动远程桌面连接
- Windows上的python libclang绑定无法从sublime文本初始化翻
- windows与linux下执行.class(包含main方法)
- windows-7 – 使用代理和远程桌面网关连接到远程桌面?
- 如何通过名称引用Windows窗体控件(C#/ VB)
- windows-server-2008 – 通过Powershell创建网络
- Windows下安装Python、pip、Django
- windows-server-2012 – Receiver将TCP窗口大小限
- 与Windows 10的初始RDP连接缓慢
- 如何将Windows本机虚拟密钥代码转换为Qt :: Key?
- windows向ubuntu传送文件(不用SAMBA)
- Windows Phone – 如何在Windows 10上获取设备平
- Windows – MongoDB与CouchDB(速度优化)
- 列出没有远程服务器管理工??具(RSAT)的Windows域