Как вручную обработать все подключенные USB-устройства к MacBook - PullRequest
0 голосов
/ 05 января 2019

моя проблема в том, что я хочу вручную обработать, как обрабатываются USB-устройства, когда они подключены. Я не хочу, чтобы операционная система что-либо делала с подключенными USB-устройствами, кроме как уведомлять меня об их типе и их ID, когда они подключены. Оттуда я могу затем выбрать соответствующий драйвер, чтобы применить к нему, или вручную сделать что-то с ним с пользовательским кодом.

Я прочитал об этом о том, как MacOS работает с USB, и там написано:

Если вы хотите, чтобы ваш драйвер был выбран выше других, все, что вам нужно сделать, это добавить пары ключ-значение для устройства, для которого ваш драйвер, чтобы ваш драйвер получил действительно высокий балл. Обычно достаточно просто ввести ключи для идентификатора / модели вашего поставщика. Однако я думаю, что вы можете переопределить метод сопоставления (драйверы устройств написаны в ограниченном наборе C ++), чтобы дать вашему драйверу действительно высокий балл.

Я также нашел эти 3 библиотеки для получения уведомлений о вещах на USB-накопителе:

Я просто не уверен, что эти библиотеки прервут обработку всех USB-устройств операционной системой до того, как произойдет что-либо (до того, как какой-либо драйвер устройства будет выбран и применен автоматически). Я бы хотел, чтобы ничего не произошло, кроме как получить доступ к устройству и его типу в одной из перечисленных выше библиотек, но я не уверен, что они это сделают.

У меня пока нет большого кода, кроме этого:

var usb = require('usb')
usb.getDeviceList()

Но я предполагаю, что это разрешит подключенные устройства после ОС уже выбрала и применила к ней драйвер по умолчанию. Я хочу сделать что-то вроде этого:

usb.blockDefaultOSDeviceHandler()
usb.on('device:plugged_in', function(data){
  if (data.type == 'keyboard') {
    if (data.modelNumber == '123') {
      // allow
      usb.applyKeyboardDriver('abc', data.modelNumber)
      usb.on('keyboard:event', logKeyboardEvent)
    } else {
      throw new Error('Unrecognized device')
    }
  } 
})

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

Я хотел бы получить доступ к любому недавно подключенному USB-устройству до того, как операционная система применяет правила обработки по умолчанию. А затем у вас есть возможность написать код для ручной обработки того, что делать с каждым подключенным устройством.

Если это возможно только в C, то лучше знать, как это сделать, вместо node.js.

1 Ответ

0 голосов
/ 10 января 2019

Ответ находится в документации Apple на USB-устройствах. По сути, вы хотите переопределить функцию probe в пользовательском драйвере, сделать так, чтобы он возвращал наивысшую оценку, чтобы переопределить все другие драйверы, и реализовать драйвер как обычно. Здесь - некоторая полезная документация по выбору и созданию экземпляра драйвера.

Прежде чем можно будет использовать устройство или любого поставщика услуг, драйвер для него должен быть найден и загружен в ядро. Набор ввода / вывода определяет гибкий трехфазный процесс согласования, который сужает пул драйверов-кандидатов до одного или нескольких драйверов. Окончательный кандидат (или, если несколько кандидатов, м Затем загружается и предоставляется первая возможность управлять устройством или поставщиком услуг.

...

Каждый драйвер устройства, рассматриваемый как загружаемое расширение ядра (KEXT), должен определять одну или несколько персон, которые указывают типы устройств, которые он может поддерживать.

...

Поскольку драйвер может содержать несколько соответствующих словарей, каждый из которых определяет свою индивидуальность для драйвера, один и тот же код драйвера может быть загружен для разных устройств. В целях конкуренции набор I / O рассматривает каждую личность так, как если бы она была водителем. Если в какой-либо отдельной личности все свойства, требуемые семейством, совпадают, код драйвера загружается и ему предоставляется возможность запуска для этого устройства.

...

Одним из общих свойств личностей является пробный счет. Пробная оценка - это целое число, которое отражает, насколько хорошо подходит драйвер для управления конкретным устройством. Драйвер может иметь начальное значение оценки пробника в своей индивидуальности, и он может реализовать функцию проверки, которая позволяет ему изменять это значение по умолчанию, основываясь на его пригодности для управления устройством. Как и в случае других совпадающих значений, оценки зондов характерны для каждой семьи. Это потому, что как только сопоставление проходит стадию сопоставления классов, конкурируют только лица из одной семьи. Для получения дополнительной информации о результатах проверки и действиях драйвера в функции проверки см. Раздел «Проверка устройства».

...

Во время загрузки и в любое время, когда устройства добавляются или удаляются, процесс сопоставления драйверов выполняется для каждого обнаруженного устройства (или другого поставщика услуг). Процесс динамически находит наиболее подходящий драйвер в / System / Library / Extensions для устройства или службы.

...

Как описано в разделе «Сопоставление драйверов» в главе «Обзор архитектуры», процесс сопоставления запускается, когда драйвер контроллера шины сканирует свою шину и обнаруживает новое подключенное к нему устройство. Для каждого обнаруженного устройства драйвер контроллера создает кусок. Затем I / O Kit инициирует процесс сопоставления и получает значения от устройства для использования при сопоставлении (например, проверка регистров PCI). Как только подходящий драйвер для куска найден, драйвер регистрируется и загружается. Этот драйвер, в свою очередь, может создать свой собственный кусочек (возможно, посредством поведения, унаследованного от его семейства), который инициирует процесс сопоставления, чтобы найти подходящий драйвер.

...

Процесс сопоставления происходит следующим образом:

  1. На шаге , соответствующем классу , комплект ввода / вывода сужает список потенциальных драйверов, удаляя все драйверы неправильного класса для службы провайдера (то есть, куска). Например, все объекты драйвера, которые происходят от класса SCSI, могут быть исключены при поиске драйвера USB.
  2. На шаге пассивного сопоставления личность водителя (указанная в списке свойств информации XML для водителя) проверяется на наличие свойств, характерных для семьи провайдера. Например, личность может указывать имя конкретного поставщика.
  3. В активный поиск шаг, функция зонда драйвера вызывается со ссылкой на узел, с которым он сопоставляется. Эта функция позволяет водителю связываться с устройством и проверять, действительно ли оно может управлять им. Водитель возвращает тестовый результат, который отражает его способность управлять устройством. См. Device Probing для получения дополнительной информации. Во время активного сопоставления набор ввода-вывода загружает и проверяет все драйверы-кандидаты, а затем сортирует их в порядке наивысшего или наименьшего значения.

...

Затем I / O Kit выбирает оставшийся драйвер с наивысшей оценкой и запускает его. Если драйвер успешно запускается, он добавляется в реестр ввода-вывода, а все оставшиеся кандидаты в драйвер отбрасываются. Если он не запускается успешно, запускается драйвер со следующим наивысшим значением пробы и т. Д. Если в пуле возможных кандидатов более одного драйвера, более общий драйвер обычно проигрывает более конкретному драйверу, если оба утверждают, что могут управлять устройством.

...

Оценка теста - это 32-разрядное целое число со знаком, инициализированное значением, указанным в личности водителя (или равным нулю, если не инициализировано явно).

...

Драйвер в своей функции исследования возвращает объект драйвера (IOService *), если проверка прошла успешно, в противном случае возвращает ноль. Возвращаемый объект обычно является самим драйвером, но драйвер может вернуть другой драйвер, который больше подходит поставщику. Оценка зондирования является параметром входа-выхода, который зонд может изменять в зависимости от того, что он обнаружил в устройстве.

...

После того, как все драйверы прощупывают устройство, подключается тот, у кого наивысшая оценка пробника, и вызывается его стартовая функция, которая должна быть реализована всеми драйверами. Функция запуска инициализирует аппаратное обеспечение устройства и подготавливает его к работе. Если драйвер успешно запускается, он возвращает true; остальные экземпляры драйверов-кандидатов отбрасываются, и успешно запущенный драйвер продолжает работать. Если драйвер не может инициализировать оборудование, он должен оставить оборудование в состоянии, в котором он находился при запуске, и вернуть false. Отказавший драйвер затем отсоединяется и сбрасывается, и кандидату-драйверу со следующим наивысшим значением пробного теста предоставляется возможность запуска.

Этого нельзя сделать с Node.js, если (потенциально) не используется расширение C / C ++ в узле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...