Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как получить путь к устройству, для открытия его ф-цией CreateFile()?  (Прочитано 18639 раз)
0 Пользователей и 1 Гость смотрят эту тему.
fear
Гость
« : 23-11-2006 19:36 » 

Приведённый ниже код успешно находит устройства по 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;
}
Записан
Greysfi
Гость
« Ответ #1 : 24-11-2006 10:06 » 

Вообще то насколько я понимаю имя файла устройства задается в драйвере при регистрации драйвера. Тоесть оно может быть и не опубликовано
Записан
fear
Гость
« Ответ #2 : 24-11-2006 11:08 » 

Вообще то насколько я понимаю имя файла устройства задается в драйвере при регистрации драйвера. Тоесть оно может быть и не опубликовано
Всмысле не опубликовано? Система ведь берёт где-то это значение при обрашении к устройству. Вопрос где она его берёт.
Записан
Greysfi
Гость
« Ответ #3 : 24-11-2006 11:18 » 

к какому устройству?

Например для обращения к ком порту используется стандартное имя.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 24-11-2006 11:54 » 

А в CreateFile используется в формате \\.\имя устройства

Например \\.\COM112

Надо только не забывать, что back slash начинает спец последовательность, поэтому в коде его надо повторить

CreateFile(_T("\\\\.\\COM12"), ...
CreateFile
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 24-11-2006 11:58 » 

Например для обращения к ком порту используется стандартное имя.

Это только для первых 9ти есть "стандартные" имена СОМ1-СОМ9.

Попробуй просто с СОМ64 или СОМ112 - уже не прокатит Ага

Кстати всё это подробно описано в MSDN
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
fear
Гость
« Ответ #6 : 24-11-2006 12:14 » 

С com портами всё предельно просто. Интерисует чтение/запись информации в USB устройство. Где искать к нему путь?
По идее можно его можно получить из структуры, возвращаемой ф-цией SetupDiEnumDeviceInterfaceDetail(), но у меня что-то ни как не выходит это сделать Жаль. Хотя может есть и альтернативные способы .?
Записан
Greysfi
Гость
« Ответ #7 : 24-11-2006 12:52 » 

Это вообще конкретное USB усройство или что то абстрактное? Улыбаюсь
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 24-11-2006 12:53 » 

fear, я думаю непонятки вот из-за чего - что ты понимаешь под "путь к устройству"?
Как путь к файлу?
Если ты собираешься использовать CreateFile, то ему "путь" не нужен - нужно имя устройства, в том виде в каком оно известно драйверу. Для чтения/записи в USB в системе может быть два драйвера. Драйвер самого устройства и драйвер USB шины. В первом случае тебе надо знать как драйвер "обзывает" устройство. В случае с драйвером шины тебе нужно знать как он их перечисляет.

Например, имя устройства  "USBIO_Device" + порядковый номер (это кстати вещь динамическая), тогда для первого USB-устройства:

::CreateFile(_T("\\\\.\\USBIO_Device1", ...

Другой способ - для это нужен спец. драйвер который позволяет это делать - прочитать инфу из интерфейса USB устройства. Подробности уже не помню, но это всё есть в спецификации.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
fear
Гость
« Ответ #9 : 24-11-2006 16:05 » 

Немного переработал рограмму Улыбаюсь, разобрался как получить путь к устройству.
Думаю приведённый код будет полезен для тех кому итнересна эта тема. Программа выводит 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;
}
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 24-11-2006 19:17 » new

Думаю приведённый код будет полезен для тех кому итнересна эта тема.

ЭТо обязательно. В любом случае - полезно писать ответы в темах. Иначе потом не ясно - правильно - не правильно, помогло - не помогло.

Про решение. У меня был драйвер, с помощью которого я получал интерфейсную инфу. Поэтому, я особенно и не искал в этом направлении. А оно вишь как, с setupapi тоже можно.
И хоть я уже нескоьлко лет USB не занимаюсь, всё-равно полезно узнать об альтернативном решении.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines