Автор Тема: Usb программирование  (Прочитано 2433 раз)

Оффлайн КнязЬ

  • ЛюдиХ
  • Newbie
  • *
  • Сообщений: 1 390
Usb программирование
« : Июнь 21, 2009, 00:10:30 »
Пишу, диплом, тема USB-мониторинг и блаблабла.... вообщем написал прогу которая отображает все хосты и порты и что в них соответсвенно воткнуто, считывает все дискрипторы усб устройств но не в этом суть. Возник попутный вопрос: как иницировать программно отключение того или иного USB устройства? если впринцепе знаем где оно воткнуто ну и по сути знаем наверно все о нем. Пишу на делфях, с сями не очень дружу но попробую разобратся если подкините идею
Nothing personal...just a business...
Si vis pacem, para bellum.

Оффлайн Flanker

  • ЛюдиХ
  • Newbie
  • *
  • Сообщений: 1 138
Usb программирование
« Ответ #1 : Июнь 22, 2009, 17:14:55 »
Как ты это делаешь? Я думал, что для общения с USB устройством нужно писать драйвер. И только в Висте есть библиотека WinUSB, которая позволяет user-mode программам работать напрямую.

Оффлайн КнязЬ

  • ЛюдиХ
  • Newbie
  • *
  • Сообщений: 1 390
Usb программирование
« Ответ #2 : Июнь 22, 2009, 20:00:57 »
не совсем так, драйвер нужен для работы с конкретным устройством , для обработки информации приходящей от него. А такие вещи как подключение/отключение устройства происходят на уровне системы. После подключения устройства считываются данные с дескрипторов, так система распознает что за устройство подключено и настраивает шину на работу с ним, а вот для обработки уже данных от устройства нужен драйвер.Все остальное стандарты USB.

вообще по этой теме маловато информации но коли, я с дипломом влез туда то приходится разбиратся. Есть книга Агуров П. В. "Интерфейс USB практика использования и программирования" там можно что то почитать интересное хотя и не все понятно но лучше увы книжек нету

вопрос остался открытым если кто то может подсказать как на уровне системы отключить тот или иной девайс буду признателен.
Nothing personal...just a business...
Si vis pacem, para bellum.

Оффлайн Alik

  • Newbie
  • *
  • Сообщений: 27
Usb программирование
« Ответ #3 : Июнь 23, 2009, 12:38:41 »
http://www.codeproject.com/KB/system/Remov...veByLetter.aspx

вот тут пишут - чистый юзер мод.. ещё было у сисинтерналс по этому поводу гдето..

Оффлайн Flanker

  • ЛюдиХ
  • Newbie
  • *
  • Сообщений: 1 138
Usb программирование
« Ответ #4 : Июнь 23, 2009, 17:25:24 »
У Агурова есть более поздняя книжка "Практика программирования USB". Там в главе 11 приведены аж 2 способа оключения - одной из функций Plug and Play и прямым обращением к драйверу.
Книжка в электронном виде: \\Flanker\Share\4 КнязЬ\. Там же читалка для формата DjVu, если что.

Ну и если в Гуглояндексе набрать что-нибудь типа "извлечение USB", можно накопать статейки.

Ссылка Alikа тоже наверно покатит.

Оффлайн КнязЬ

  • ЛюдиХ
  • Newbie
  • *
  • Сообщений: 1 390
Usb программирование
« Ответ #5 : Июнь 23, 2009, 18:11:05 »
спасибо за помошь
2Алик посмотрел статейку , спасибо пригадится
2Фланкер угу я эту книжку тоже качал но по поверхностному взгляду показалась мне аналогом моей и неуглядел тех способов, спасибо
сдам диплом выйду на каникулы подумаю посижу над этим вопросом.
Nothing personal...just a business...
Si vis pacem, para bellum.

Оффлайн КнязЬ

  • ЛюдиХ
  • Newbie
  • *
  • Сообщений: 1 390
Re: Usb программирование
« Ответ #6 : Март 15, 2010, 14:42:51 »
Господа программисты подскажите
Пишу инженера, необходимо подключать/отключать устройства(желательно усб устройства). Отключаю пока что мышки, флэш накопители. Возник вопрос с принтером. Те две функции которые я использую для отключения первых двух девайсов не помогают
SetupDiSetClassInstallParams
SetupDiCallClassInstaller
подскажите как можно заставить винду забыть о принтере или скажите может есть какие то особенности работы принтера в винде?
буду очень признаетелен а то я уже весь мозг поломал  :-X
Nothing personal...just a business...
Si vis pacem, para bellum.

Оффлайн ZED

  • ЛюдиХ
  • Newbie
  • *
  • Сообщений: 1 654
  • Добрейшина сети
Re: Usb программирование
« Ответ #7 : Март 16, 2010, 02:56:56 »
Мб поможет
Цитата: http://pblog.ru/?p=105
Включение и отключение устройств.

   Состоянием устройства управляет функция SetupDiSetClassInstallParams. Её описание:
WINSETUPAPI BOOL WINAPI
  SetupDiSetClassInstallParams(
    IN HDEVINFO DeviceInfoSet,
    IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL
    IN PSP_CLASSINSTALL_HEADER ClassInstallParams, OPTIONAL
    IN DWORD ClassInstallParamsSize
    );
С первыми двумя параметрами я думаю всё ясно. Третий параметр задаёт указатель на структуру SP_CLASSINSTALL_HEADER. Четвёртый параметр задаёт размер третьего параметра. С помощью этой функции можно производить различные действия с устройствами и, разумеется, для каждого действия используются различные структуры. Но у каждой из структур первая составляющая одинаковая – структура SP_CLASSINSTALL_HEADER, вот она:
typedef struct _SP_CLASSINSTALL_HEADER {
  DWORD cbSize;
  DI_FUNCTION InstallFunction;
} SP_CLASSINSTALL_HEADER, *PSP_CLASSINSTALL_HEADER;
Поле InstallFunction задаёт производимую над устройством операцию. Для включения/отключения это поле будет равно константе DIF_PROPERTYCHANGE. Для включения/отключения устройства используется следующая структура:
typedef struct _SP_PROPCHANGE_PARAMS {
  SP_CLASSINSTALL_HEADER ClassInstallHeader;
  DWORD StateChange;
  DWORD Scope;
  DWORD HwProfile;
} SP_PROPCHANGE_PARAMS, *PSP_PROPCHANGE_PARAMS;
Если поле StateChange будет равно DICS_ENABLE, то устройство будет включено иначе DICS_DISABLE. Если поле Scope равно DICS_FLAG_GLOBAL, то изменения вступят в силу для всех аппаратных профилей, если DICS_FLAG_CONFIGSPECIFIC, то изменения вступят в силу только для указанного аппаратного профиля. Поле HwProfile задаёт ID аппаратного профиля, к которому будут применяться изменения, если он равен нулю, то текущий аппаратный профиль. Все параметры нуждаются в «утверждении» перед любыми изменениями. Поэтому функцию надо вызывать два раза. Если после первого вызова функция возвратила истинное значение, значит можно вызывать функцию второй раз.
   После изменения состояния устройства надо вызвать установщик класса, т.к. после изменения состояния устройства может потребоваться перезагрузка системы или другие действия, для того чтобы изменения вступили в силу. Это осуществляется функцией SetupDiCallClassInstaller
WINSETUPAPI BOOL WINAPI
  SetupDiCallClassInstaller(
    IN DI_FUNCTION InstallFunction,
    IN HDEVINFO DeviceInfoSet,
    IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL
    );
Первый параметр задаёт код произведённой операции. Два остальных параметра я думаю, проблем не вызовут.
В качестве примера можно привести код включения и отключения сетевого подключения. Для того чтобы включить/выключить сетевое подключение достаточно включить/выключить сетевое устройство, через которое осуществляется сетевое подключение. Это производит следующая функция:
procedure EnableNetDevice(aState:boolean;index:integer);
var
  NetPnPHandle:HDEVINFO;
  PCHP:TSPPropChangeParams;
  DeviceData:TSPDevInfoData;
begin
  NetPnPHandle:=SetupDiGetClassDevs(@GUID_DEVCLASS_NET, 0, 0, DIGCF_PRESENT);
  if NetPnPHandle=INVALID_HANDLE_VALUE then exit;
  DeviceData.cbSize:=sizeof(TSPDevInfoData);
  SetupDiEnumDeviceInfo(NetPnPHandle, index, DeviceData);
  PCHP.ClassInstallHeader.cbSize:=sizeof(TSPClassInstallHeader);
  if SetupDiSetClassInstallParams(NetPnPHandle,@DeviceData,@PCHP,sizeof(TSPPropChangeParams)) then
    begin
      PCHP.ClassInstallHeader.cbSize := sizeof(TSPClassInstallHeader);
      PCHP.ClassInstallHeader.InstallFunction := DIF_PROPERTYCHANGE;
      PCHP.Scope := DICS_FLAG_CONFIGSPECIFIC;
    if aState then
      PCHP.StateChange := DICS_ENABLE
      else
      PCHP.StateChange := DICS_DISABLE;
    SetupDiSetClassInstallParams(NetPnPHandle,@DeviceData,@PCHP,sizeof(TSPPropChangeParams));
    SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,NetPnPHandle,@DeviceData);
  end;
  DeviceData.cbSize := sizeof(TSPDevInfoData);
  SetupDiDestroyDeviceInfoList(NetPnPHandle);
end;
Параметр index задаёт индекс сетевого устройства в списке сетевых устройств.
Говорю, что думаю и думаю, что говорю...
"Спам придумали боги в отместку за наши молитвы" ©
http://www.the-west.ru/?ref=westplayer_invite_linkrl&player_id=432973&world_id=10&hash=ed64&inviteVia=reflink

Оффлайн КнязЬ

  • ЛюдиХ
  • Newbie
  • *
  • Сообщений: 1 390
Re: Usb программирование
« Ответ #8 : Март 16, 2010, 09:37:21 »
Zed почитай внимательно код который ты закинул , там как раз те две функции которые я написал :) , они на принтер не работают.
Я не знаю что с ним делать весь инет перерыл , может он работает типа как нить через виртуальный порт?
« Последнее редактирование: Март 16, 2010, 09:50:29 от КнязЬ »
Nothing personal...just a business...
Si vis pacem, para bellum.

Оффлайн ZED

  • ЛюдиХ
  • Newbie
  • *
  • Сообщений: 1 654
  • Добрейшина сети
Re: Usb программирование
« Ответ #9 : Март 16, 2010, 10:06:34 »
я видел, что они там есть, но мало ли вдруг ты, что забыл да и описано все там детально. Кстати в статье писалось, что выключать можно и принтеры тоже. Можешь оставить свой вопрос на той странице там ответят.
Говорю, что думаю и думаю, что говорю...
"Спам придумали боги в отместку за наши молитвы" ©
http://www.the-west.ru/?ref=westplayer_invite_linkrl&player_id=432973&world_id=10&hash=ed64&inviteVia=reflink