Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить путь к устройству, открытия устройства фунцией CreateFile() 
:(
    Опции темы
fear
  Дата 23.11.2006, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: нет
Всего: 1



1. Приведённый ниже код успешно находит устройства по GUID. Некоторые параметры устройств можно получить функцией SetupDiGetDeviceRegistryProperty(), но где взять путь к устройству?

Код

#include <windows.h>
#pragma pack(push,1)
#include <setupapi.h>
#pragma pack(pop)
#pragma comment(lib,"Setupapi.lib")

#include <iostream>
#include <string>
using namespace std;

const unsigned long PROPERTY_BUFFER_SIZE = 1024;

void printRegistryProperty(HDEVINFO deviceInfo, PSP_DEVINFO_DATA deviceInfoData, unsigned long deviceProperty);

void main()
{
  GUID guid = CLSID_NULL;
  HRESULT hres = CLSIDFromString(L"{36FC9E60-C465-11CF-8056-444553540000}", &guid);

  HDEVINFO hardwareDeviceInfo = SetupDiGetClassDevs(&guid, 0, 0, DIGCF_PRESENT);

  if(hardwareDeviceInfo == INVALID_HANDLE_VALUE)
    return;

  bool result = true;
  int deviceIndex = 0;

  while(result)
  {
    SP_DEVINFO_DATA deviceInfoData;
    deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

    result = SetupDiEnumDeviceInfo(hardwareDeviceInfo, deviceIndex, &deviceInfoData);

    if(result)
      printRegistryProperty(hardwareDeviceInfo, &deviceInfoData, SPDRP_DEVICEDESC);

    deviceIndex++;
  }

  SetupDiDestroyDeviceInfoList(hardwareDeviceInfo);
  while(1);
}

void printRegistryProperty(HDEVINFO deviceInfo, PSP_DEVINFO_DATA deviceInfoData, unsigned long deviceProperty)
{
  unsigned long requiredSize = 0;
  unsigned char buffer[PROPERTY_BUFFER_SIZE];

  SetupDiGetDeviceRegistryPropertyA(deviceInfo, deviceInfoData, deviceProperty, 0, buffer, PROPERTY_BUFFER_SIZE, &requiredSize);

  cout<<buffer<<endl;
}


Это сообщение отредактировал(а) fear - 23.11.2006, 17:52
PM MAIL   Вверх
fear
Дата 25.11.2006, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: нет
Всего: 1



Думаю приведённый код будет полезен для тех кому итнересна эта тема. Программа выводит hardwareID и путь к устройствам CDROM. Чтобы получить информацию о других устройствах нужно подставить вместо GUID_DEVCLASS_CDROM и GUID_DEVINTERFACE_CDROM GUID`ы необходимых устройств. Писалось на VC++ 8 + DDK XP.

Код

#include <windows.h>
#pragma pack(push,1)
#include <setupapi.h>
#pragma pack(pop)
#pragma comment(lib,"Setupapi.lib")

#include <devguid.h>
#include <ntddstor.h>

#include <iostream>
#include <string>
using namespace std;

bool GetRegistryProperty(HDEVINFO devInfo, int index, unsigned long regProperty);
bool GetDeviceProperty(HDEVINFO intDevInfo, int index, GUID &interfaceGuid);

void main()
{
  unsigned long error;

  GUID classGuid = GUID_DEVCLASS_CDROM;
  GUID interfaceGuid = GUID_DEVINTERFACE_CDROM;

  HDEVINFO hDevInfo = SetupDiGetClassDevs(&classGuid, 0, 0, DIGCF_PRESENT);
  if(hDevInfo == INVALID_HANDLE_VALUE)
  {
    error = GetLastError();
    cout<<"SetupDiGetClassDevs failed with error: "<<error<<endl;
    return;
  }
  HDEVINFO hIntDevInfo = SetupDiGetClassDevs(&interfaceGuid, 0, 0, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));
  if(hIntDevInfo == INVALID_HANDLE_VALUE)
  {
    error = GetLastError();
    cout<<"SetupDiGetClassDevs failed with error: "<<error<<endl;
    return;
  }

  for(int index=0; true; index++)
  {
    if(!GetRegistryProperty(hDevInfo, index, SPDRP_HARDWAREID))
      break;
    if(!GetDeviceProperty(hIntDevInfo, index, interfaceGuid))
      break;
  }

  SetupDiDestroyDeviceInfoList(hDevInfo);
  SetupDiDestroyDeviceInfoList(hIntDevInfo);
  while(1);
}

bool GetRegistryProperty(HDEVINFO devInfo, int index, unsigned long regProperty)
{
  unsigned long dataType, bufferSize, reqSize, error;
  unsigned char *buffer;

  //// Получаем список устройств ////////////////////////////////////////////////
  SP_DEVINFO_DATA deviceInfoData;
  deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
  if(!SetupDiEnumDeviceInfo(devInfo, index, &deviceInfoData))
  {
    error = GetLastError();
    if(error == ERROR_NO_MORE_ITEMS)
      cout<<"No more devices."<<endl;
    else
      cout<<"SetupDiEnumDeviceInfo failed with error: "<<error<<endl;

    return false;
  }

  //// Получаем размер свойства устройства //////////////////////////////////////
  if(!SetupDiGetDeviceRegistryPropertyA(devInfo, &deviceInfoData, regProperty, &dataType, 0, 0, &reqSize))
  {
    error = GetLastError();
    if(error != ERROR_INSUFFICIENT_BUFFER)
    {
      if(error == ERROR_INVALID_DATA)
      {
        cout<<"Property not avalible."<<endl;
        return true;
      }
      else
      {
        cout<<"SetupDiEnumDeviceInfo failed with error: "<<error<<endl;
        return false;
      }
    }
  }

  //// Получаем свойство устройства /////////////////////////////////////////////
  bufferSize = reqSize;
  buffer = new unsigned char[bufferSize];
  if(!SetupDiGetDeviceRegistryPropertyA(devInfo, &deviceInfoData, regProperty, &dataType, buffer, bufferSize, &reqSize))
  {
    error = GetLastError();
    if(error == ERROR_INVALID_DATA)
    {
      cout<<"Property not avalible."<<endl;
      return true;
    }
    else
    {
      cout<<"SetupDiEnumDeviceInfo failed with error: "<<error<<endl;
      return false;
    }
  }

  cout<<buffer<<endl;

  delete [] buffer;
  return true;
}

bool GetDeviceProperty(HDEVINFO intDevInfo, int index, GUID &interfaceGuid)
{
  unsigned long reqSize, interfaceDetailDataSize, error;

  ///// Получаем список интерфейсов устройств ///////////////////////////////////////////////
  SP_INTERFACE_DEVICE_DATA interfaceData;
  interfaceData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA);
  if(!SetupDiEnumDeviceInterfaces(intDevInfo, 0, &interfaceGuid, index, &interfaceData))
  {
    error = GetLastError();
    if(error == ERROR_NO_MORE_ITEMS)
      cout<<"No more interfaces."<<endl;
    else
      cout<<"SetupDiEnumDeviceInterfaces failed with error: "<<error<<endl;

    return false;
  }

  ///// Получаем размер структуры интерфейса устройства /////////////////////////////////////
  if(!SetupDiGetDeviceInterfaceDetail(intDevInfo, &interfaceData, 0, 0, &reqSize, 0))
  {
    error = GetLastError();
    if(error != ERROR_INSUFFICIENT_BUFFER)  
    {
      cout<<"SetupDiGetDeviceInterfaceDetail failed with error: "<<error<<endl;
      return false;
    }
  }

  ///// Получаем структуру интерфейса устройства ////////////////////////////////////////////
  interfaceDetailDataSize = reqSize;
  PSP_INTERFACE_DEVICE_DETAIL_DATA_A interfaceDetailData = static_cast<PSP_INTERFACE_DEVICE_DETAIL_DATA_A> (malloc(interfaceDetailDataSize));
  interfaceDetailData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA_A);
  
  if(!SetupDiGetDeviceInterfaceDetailA(intDevInfo, &interfaceData, interfaceDetailData, interfaceDetailDataSize, &reqSize, 0))
  {
    error = GetLastError();
    cout<<"SetupDiGetDeviceInterfaceDetail failed with error: "<<error<<endl;
    return false;  
  }

  cout<<interfaceDetailData->DevicePath<<endl;

  free(interfaceDetailData);  
  return true;
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0384 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.