Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2011, 14:14   #1
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию Получить буквы USB накопителей.

Здравствуйте. Я получаю список подключенных USB носителей вот таким образом
Код:
#include <windows.h>
#include <Setupapi.h>
#include <tchar.h>
#include <iostream>
 
void OutFormatMsg(const TCHAR *Msg){
        LPVOID lpMsgBuf;
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM |
                FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL, GetLastError(),
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (TCHAR*) &lpMsgBuf,0,NULL);
        _tprintf(_T("%s: %s\n"), Msg, (TCHAR*)lpMsgBuf);
        LocalFree(lpMsgBuf);
}
 
#define LocalFreeIf(Pointer) if(Pointer) { LocalFree(Pointer); Pointer = NULL; }

int main()
{
        setlocale(0, "");
 
        PSP_DEVICE_INTERFACE_DETAIL_DATA pDeviceInterfaceDetailData = NULL;
        SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
        SP_DEVINFO_DATA DeviceInfoData;
        HDEVINFO hDevInfo;
        TCHAR *lpBuffer = NULL;
 
        const GUID InterfaceGuid = { 0x53F56307,0xB6BF,0x11D0,{0x94,0xF2,0x00,0xA0,0xC9,0x1E,0xFB,0x8B} };
 
        hDevInfo = SetupDiGetClassDevs( &InterfaceGuid,0, 0, DIGCF_PRESENT  | DIGCF_DEVICEINTERFACE  );
 
        if (hDevInfo == INVALID_HANDLE_VALUE) {
                OutFormatMsg(_T("SetupDiGetClassDevs"));
                return 1;
        }
 
        DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
        DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
 
        for(DWORD i = 0; SetupDiEnumDeviceInterfaces(hDevInfo, 0, &InterfaceGuid, i, &DeviceInterfaceData); ++i)
        {
                ULONG RequiredLength = 0;
 
                while ( !SetupDiGetDeviceInterfaceDetail( hDevInfo, 
                        &DeviceInterfaceData, pDeviceInterfaceDetailData, RequiredLength, &RequiredLength,
                        &DeviceInfoData ) )
                {
                        if( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
                        {
                                LocalFreeIf( pDeviceInterfaceDetailData );
                                pDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LMEM_FIXED, RequiredLength );
                                pDeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
                        } else {
                                OutFormatMsg(_T("SetupDiGetDeviceInterfaceDetail"));
                                continue;
                        }
                }
 
                RequiredLength = 0;
 
                while ( !SetupDiGetDeviceRegistryProperty(hDevInfo, 
                        &DeviceInfoData, SPDRP_ENUMERATOR_NAME, NULL, 
                        (PBYTE)lpBuffer, RequiredLength, &RequiredLength) )
                {
                        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) 
                        {
                                LocalFreeIf(lpBuffer);
                                lpBuffer = (TCHAR*)LocalAlloc(LPTR, (RequiredLength + 1) * sizeof(TCHAR));
                        } else {
                                OutFormatMsg(_T("SetupDiGetDeviceRegistryProperty"));
                                break;
                        }
                }
 
                if( !_tcscmp(lpBuffer, _T("USBSTOR")) ) 
                {
                        // Точно USB накопитель...
                        _tprintf(_T("%s\n"), pDeviceInterfaceDetailData->DevicePath);
                        /* \\?\usbstor#disk&ven_generic&prod_usb_flash_disk&rev_0.00#000000000000ec&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} */
 
                        RequiredLength = 0;
 
                        while ( !SetupDiGetDeviceRegistryProperty(hDevInfo, 
                                &DeviceInfoData, SPDRP_FRIENDLYNAME, NULL, 
                                (PBYTE)lpBuffer, RequiredLength, &RequiredLength) )
                        {
                                if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) 
                                {
                                        LocalFreeIf(lpBuffer);
                                        lpBuffer = (TCHAR*)LocalAlloc(LPTR, (RequiredLength + 1) * sizeof(TCHAR));
                                } else {
                                        OutFormatMsg(_T("SetupDiGetDeviceRegistryProperty2"));
                                        break;
                                }
                        }
                        _tprintf(_T("%s\n"),lpBuffer);
                }
                
                LocalFreeIf(lpBuffer);
                LocalFreeIf(pDeviceInterfaceDetailData);
        }
        SetupDiDestroyDeviceInfoList(hDevInfo);
 
        return 0;
}
Теперь мне нужно как то получить нормальный путь к этим устройствам, в виде (G:\ .. ), но как это сделать? Кто знает натолкните на мысль.
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 14.05.2011, 14:48   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx
f.hump вне форума Ответить с цитированием
Старый 14.05.2011, 16:22   #3
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

f.hump, Уже побывал.. Функция постоянно с ошибкой завершается..
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 14.05.2011, 22:19   #4
blazonic
Videor venisse
Пользователь
 
Регистрация: 23.03.2010
Сообщений: 58
По умолчанию

ISergeyN
f.hump скорее всего, имел ввиду не столько одну функцию GetVolumePathNamesForVolumeName сколько пример с её применением:
http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx
Пример интересный, я проверил, он рабочий.
Речь идёт о совсем другом наборе функций для достижения поставленной вами задачи. Чтобы получить путь к устройству типа "E:\" необходимо применить последовательно набор функций:
FindFirstVolumeW
QueryDosDeviceW
GetVolumePathNamesForVolumeNameW
FindNextVolumeW
FindVolumeClose

Этот набор необходимо включить в вашу программу.
Facimus opus communis

Последний раз редактировалось blazonic; 15.05.2011 в 01:30.
blazonic вне форума Ответить с цитированием
Старый 15.05.2011, 10:59   #5
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Ну, еще можно и так:
Код:
#include <Windows.h>
#include <setupapi.h>
#include <stdio.h>
#include <conio.h>
#include <WinIoctl.h>


#define BUFFER_SIZE 1024


int main()
{
	int result(0);
	HDEVINFO hwInfo(0);	
			
	hwInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_VOLUME,0,0,DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
	
	if (hwInfo != INVALID_HANDLE_VALUE) {
		SP_DEVICE_INTERFACE_DATA ifaceData;		
		DWORD bcount(0);
		wchar_t buffer[BUFFER_SIZE], * volumeName(0), * driveLetter;
		PSP_DEVICE_INTERFACE_DETAIL_DATA ifaceDetail((PSP_DEVICE_INTERFACE_DETAIL_DATA)buffer);

		ifaceDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
		ifaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

		for (unsigned int i(0);;i++) {
			if (SetupDiEnumDeviceInterfaces(hwInfo,0,&GUID_DEVINTERFACE_VOLUME,i,&ifaceData)) {
				
				if (SetupDiGetDeviceInterfaceDetail(hwInfo,&ifaceData,ifaceDetail,BUFFER_SIZE,0,0)) {
					if (!wcsstr(ifaceDetail->DevicePath,L"usbstor")) continue;

					int len = wcslen(ifaceDetail->DevicePath);

					wprintf(L"\n=====================================================================%04d=====\n",i);
					wprintf(L"\n  Device Path:\n%s\n",ifaceDetail->DevicePath);
						
					ifaceDetail->DevicePath[len] = L'\\';
					ifaceDetail->DevicePath[len+1] = L'\0';
					volumeName = buffer + len + 4;

					if (GetVolumeNameForVolumeMountPoint(ifaceDetail->DevicePath,volumeName,BUFFER_SIZE)) {
						wprintf(L"\n  Volume Name: %s",volumeName);
						len += (wcslen(volumeName)+5);
						driveLetter = buffer+len;
						if (GetVolumePathNamesForVolumeName(volumeName,driveLetter,BUFFER_SIZE-len,&bcount)) {
							wprintf(L"\n  Drive Letter: %s\n",driveLetter);								
							
						} else {
							result = GetLastError();
						}

					} else {
						result = GetLastError();
					}

				} else {
					result = GetLastError();					
				}
			} else {
				result = GetLastError();
				if (result == ERROR_NO_MORE_ITEMS) result = 0;
				break;

			}
		}


		SetupDiDestroyDeviceInfoList(hwInfo);
	}

	_getch();
	return result;
}
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить буквы существующих дисков SoftKoc Помощь студентам 3 20.11.2010 00:03
Программный запрет использования Flash-накопителей FaTaL Общие вопросы Delphi 3 27.04.2010 21:05
Вопрос про объем флеш-накопителей ilgar-90 Компьютерное железо 1 29.01.2010 07:36
утилита для отключения usb-накопителей VanaLuk Win Api 1 08.09.2009 13:35