Ответ находится в документации Apple на USB-устройствах. По сути, вы хотите переопределить функцию probe
в пользовательском драйвере, сделать так, чтобы он возвращал наивысшую оценку, чтобы переопределить все другие драйверы, и реализовать драйвер как обычно. Здесь - некоторая полезная документация по выбору и созданию экземпляра драйвера.
Прежде чем можно будет использовать устройство или любого поставщика услуг, драйвер для него должен быть найден и загружен в ядро. Набор ввода / вывода определяет гибкий трехфазный процесс согласования, который сужает пул драйверов-кандидатов до одного или нескольких драйверов. Окончательный кандидат (или, если несколько кандидатов, м
Затем загружается и предоставляется первая возможность управлять устройством или поставщиком услуг.
...
Каждый драйвер устройства, рассматриваемый как загружаемое расширение ядра (KEXT), должен определять одну или несколько персон, которые указывают типы устройств, которые он может поддерживать.
...
Поскольку драйвер может содержать несколько соответствующих словарей, каждый из которых определяет свою индивидуальность для драйвера, один и тот же код драйвера может быть загружен для разных устройств. В целях конкуренции набор I / O рассматривает каждую личность так, как если бы она была водителем. Если в какой-либо отдельной личности все свойства, требуемые семейством, совпадают, код драйвера загружается и ему предоставляется возможность запуска для этого устройства.
...
Одним из общих свойств личностей является пробный счет. Пробная оценка - это целое число, которое отражает, насколько хорошо подходит драйвер для управления конкретным устройством. Драйвер может иметь начальное значение оценки пробника в своей индивидуальности, и он может реализовать функцию проверки, которая позволяет ему изменять это значение по умолчанию, основываясь на его пригодности для управления устройством. Как и в случае других совпадающих значений, оценки зондов характерны для каждой семьи. Это потому, что как только сопоставление проходит стадию сопоставления классов, конкурируют только лица из одной семьи. Для получения дополнительной информации о результатах проверки и действиях драйвера в функции проверки см. Раздел «Проверка устройства».
...
Во время загрузки и в любое время, когда устройства добавляются или удаляются, процесс сопоставления драйверов выполняется для каждого обнаруженного устройства (или другого поставщика услуг). Процесс динамически находит наиболее подходящий драйвер в / System / Library / Extensions для устройства или службы.
...
Как описано в разделе «Сопоставление драйверов» в главе «Обзор архитектуры», процесс сопоставления запускается, когда драйвер контроллера шины сканирует свою шину и обнаруживает новое подключенное к нему устройство. Для каждого обнаруженного устройства драйвер контроллера создает кусок. Затем I / O Kit инициирует процесс сопоставления и получает значения от устройства для использования при сопоставлении (например, проверка регистров PCI). Как только подходящий драйвер для куска найден, драйвер регистрируется и загружается. Этот драйвер, в свою очередь, может создать свой собственный кусочек (возможно, посредством поведения, унаследованного от его семейства), который инициирует процесс сопоставления, чтобы найти подходящий драйвер.
...
Процесс сопоставления происходит следующим образом:
- На шаге , соответствующем классу , комплект ввода / вывода сужает список потенциальных драйверов, удаляя все драйверы неправильного класса для службы провайдера (то есть, куска). Например, все объекты драйвера, которые происходят от класса SCSI, могут быть исключены при поиске драйвера USB.
- На шаге пассивного сопоставления личность водителя (указанная в списке свойств информации XML для водителя) проверяется на наличие свойств, характерных для семьи провайдера. Например, личность может указывать имя конкретного поставщика.
- В активный поиск шаг, функция зонда драйвера вызывается со ссылкой на узел, с которым он сопоставляется. Эта функция позволяет водителю связываться с устройством и проверять, действительно ли оно может управлять им. Водитель возвращает тестовый результат, который отражает его способность управлять устройством. См. Device Probing для получения дополнительной информации. Во время активного сопоставления набор ввода-вывода загружает и проверяет все драйверы-кандидаты, а затем сортирует их в порядке наивысшего или наименьшего значения.
...
Затем I / O Kit выбирает оставшийся драйвер с наивысшей оценкой и запускает его. Если драйвер успешно запускается, он добавляется в реестр ввода-вывода, а все оставшиеся кандидаты в драйвер отбрасываются. Если он не запускается успешно, запускается драйвер со следующим наивысшим значением пробы и т. Д. Если в пуле возможных кандидатов более одного драйвера, более общий драйвер обычно проигрывает более конкретному драйверу, если оба утверждают, что могут управлять устройством.
...
Оценка теста - это 32-разрядное целое число со знаком, инициализированное значением, указанным в личности водителя (или равным нулю, если не инициализировано явно).
...
Драйвер в своей функции исследования возвращает объект драйвера (IOService *), если проверка прошла успешно, в противном случае возвращает ноль. Возвращаемый объект обычно является самим драйвером, но драйвер может вернуть другой драйвер, который больше подходит поставщику. Оценка зондирования является параметром входа-выхода, который зонд может изменять в зависимости от того, что он обнаружил в устройстве.
...
После того, как все драйверы прощупывают устройство, подключается тот, у кого наивысшая оценка пробника, и вызывается его стартовая функция, которая должна быть реализована всеми драйверами. Функция запуска инициализирует аппаратное обеспечение устройства и подготавливает его к работе. Если драйвер успешно запускается, он возвращает true; остальные экземпляры драйверов-кандидатов отбрасываются, и успешно запущенный драйвер продолжает работать. Если драйвер не может инициализировать оборудование, он должен оставить оборудование в состоянии, в котором он находился при запуске, и вернуть false. Отказавший драйвер затем отсоединяется и сбрасывается, и кандидату-драйверу со следующим наивысшим значением пробного теста предоставляется возможность запуска.
Этого нельзя сделать с Node.js, если (потенциально) не используется расширение C / C ++ в узле.