Устройство USB HID захватывается OS X Mojave при запуске. Как этого избежать? - PullRequest
2 голосов
/ 16 мая 2019

У меня есть USB HID-устройство (без мыши, без клавиатуры), которое захватывает OS X Mojave при запуске, когда оно подключается при запуске.Когда я пытаюсь связаться с ним (через libusb), я получаю сообщение об ошибке, что устройство занято, пока я не отключу USB-устройство и не подключу его снова.После этого он работает нормально.

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

Существует подписанный кекст без кода для него, установленный в /Library/Extentions.

Все это поведение было разработано в Mojave.На всех предыдущих версиях (El Capitan и т. Д.) Проблема не возникала.В предыдущих версиях кекст был в / System / Library / Extentions.Но это совсем не работает в Mojave, поэтому я переместил его в / Library / Extentions с результатом, как описано выше.

Добавление ключа «OSBundleRequired» со значением «Root» в info.plist сделалне изменил его, и у меня заканчиваются идеи.

Это используемый Info.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!-- This is a dummy driver which binds to SG-LOCK.   It -->
<!-- contains no actual code; its only purpose is to     -->
<!-- prevent Apple's USBHID driver from exclusively      -->   
<!-- opening the device.                                 -->
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>English</string>
    <key>CFBundleIconFile</key>
    <string></string>
    <key>CFBundleIdentifier</key>
    <string>com.domain.driver.dummy</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundlePackageType</key>
    <string>KEXT</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>1.0.0d1</string>
    <key>IOKitPersonalities</key>
    <dict>
        <key>USB Device</key>
        <dict>
            <key>CFBundleIdentifier</key>
            <string>com.apple.kpi.iokit</string>
            <key>IOClass</key>
            <string>IOService</string>
            <key>IOProviderClass</key>
            <string>IOUSBInterface</string>
            <key>bConfigurationValue</key>
            <integer>1</integer>
            <key>bInterfaceNumber</key>
            <integer>0</integer>
            <key>idProduct</key>
            <integer>1000</integer>
            <key>idVendor</key>
            <integer>1000</integer>
        </dict>
    </dict>
</dict>
</plist>

Проверка с помощью ioreg в обоих случаях дает следующий вывод:

ioreg -lirc IOUSBHostDevice выводит сразу после загрузки без доступа:




+-o MyLock USB Key@14400000  <class IORegistryEntry:IOService:IOUSBNub:IOUSBDevice, id 0x10000033b, registered, matched, active, busy 0 (64 ms), retain 24>
  | {
  |   "sessionID" = 2407103480
  |   "USBSpeed" = 1
  |   "IOServiceLegacyMatchingRegistryID" = 4294968128
  |   "idProduct" = 4096
  |   "bDeviceClass" = 0
  |   "IOPowerManagement" = {"PowerOverrideOn"=Yes,"CapabilityFlags"=32768,"MaxPowerState"=2,"DevicePowerState"=2,"ChildrenPowerState"=1,"DriverPowerState"=0,"CurrentPowerState"=2}
  |   "bcdDevice" = 1
  |   "USB Product Name" = „MyLock USB Key"
  |   "AppleUSBAlternateServiceRegistryID" = 4294968128
  |   "locationID" = 339738624
  |   "bDeviceSubClass" = 0
  |   "kUSBCurrentConfiguration" = 1
  |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
  |   "bDeviceProtocol" = 0
  |   "USBPortType" = 0
  |   "USB Vendor Name" = „MyLock"
  |   "idVendor" = 1447
  |   "IOGeneralInterest" = "IOCommand is not serializable"
  |   "kUSBVendorString" = „MyLock"
  |   "IOClassNameOverride" = "IOUSBDevice"
  | }
  | 
  +-o AppleUSBHostLegacyClient  <class IORegistryEntry:IOService:AppleUSBHostLegacyClient, id 0x100000341, !registered, !matched, active, busy 0, retain 9>
  |   {
  |     "kUSBHostDeviceForceSuspend" = No
  |     "IOPowerManagement" = {"DevicePowerState"=0,"CurrentPowerState"=1,"CapabilityFlags"=65536,"MaxPowerState"=2,"DriverPowerState"=1}
  |   }
  |   
  +-o AppleUSBHostCompositeDevice  <class IORegistryEntry:IOService:AppleUSBHostCompositeDevice, id 0x100000346, !registered, !matched, active, busy 0, retain 4>
  |   {
  |     "IOProbeScore" = 50000
  |     "CFBundleIdentifier" = "com.apple.driver.usb.AppleUSBHostCompositeDevice"
  |     "IOProviderClass" = "IOUSBHostDevice"
  |     "IOClass" = "AppleUSBHostCompositeDevice"
  |     "bDeviceSubClass" = 0
  |     "IOMatchCategory" = "IODefaultMatchCategory"
  |     "kUSBPreferredConfiguration" = 1
  |     "bDeviceClass" = 0
  |   }
  |   
  +-o IOUSBHostInterface@0  <class IORegistryEntry:IOService:IOUSBNub:IOUSBInterface, id 0x100000348, registered, matched, active, busy 0 (58 ms), retain 11>
    | {
    |   "USBPortType" = 0
    |   "IOCFPlugInTypes" = {"2d9786c6-9ef3-11d4-ad51-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
    |   "bcdDevice" = 1
    |   "USBSpeed" = 1
    |   "idProduct" = 4096
    |   "bConfigurationValue" = 1
    |   "bInterfaceSubClass" = 0
    |   "locationID" = 339738624
    |   "IOGeneralInterest" = "IOCommand is not serializable"
    |   "IOServiceLegacyMatchingRegistryID" = 4294968137
    |   "IOClassNameOverride" = "IOUSBInterface"
    |   "AppleUSBAlternateServiceRegistryID" = 4294968137
    |   "idVendor" = 1447
    |   "bInterfaceProtocol" = 0
    |   "bAlternateSetting" = 0
    |   "bInterfaceNumber" = 0
    |   "bInterfaceClass" = 3
    | }
    | 
    +-o IOUSBHostHIDDevice@14400000,0  <class IORegistryEntry:IOService:IOHIDDevice:IOUSBHostHIDDevice, id 0x100000425, registered, matched, active, busy 0 (21 ms), retain 8>
      | {
      |   "IOClass" = "IOUSBHostHIDDevice"
      |   "Transport" = "USB"
      |   "BootProtocol" = 0
      |   "IOPersonalityPublisher" = "com.apple.driver.usb.IOUSBHostHIDDeviceSafeBoot"
      |   "HIDDefaultBehavior" = ""
      |   "MaxInputReportSize" = 23
      |   "IOProviderClass" = "IOUSBHostInterface"
      |   "Manufacturer" = „MyLock"
      |   "Product" = „MyLock USB Key"
      |   "DeviceUsagePairs" = ({"DeviceUsagePage"=65440,"DeviceUsage"=1})
      |   "IOProbeScore" = 50000
      |   "MaxOutputReportSize" = 23
      |   "ReportDescriptor" = <06a0ff0901a10109021580257f75089517810209031580257f750895179102c0>
      |   "IOUserClientClass" = "IOHIDLibUserClient"
      |   "bInterfaceSubClass" = 0
      |   "bInterfaceClass" = 3
      |   "IOCFPlugInTypes" = {"7DDEECA8-A7B4-11DA-8A0E-0014519758EF"="IOHIDFamily.kext/Contents/PlugIns/IOHIDLib.plugin","FA12FA38-6F1A-11D4-BA0C-0005028F18D5"="IOHIDFamily.kext/Contents/PlugIns/IOHIDLib.plugin"}
      |   "CountryCode" = 0
      |   "VendorID" = 1447
      |   "VersionNumber" = 1
      |   "IOMatchCategory" = "IODefaultMatchCategory"
      |   "CFBundleIdentifier" = "com.apple.driver.usb.IOUSBHostHIDDevice"
      |   "PrimaryUsage" = 1
      |   "LocationID" = 339738624
      |   "ProductID" = 4096
      |   "Elements" = ({"ReportID"=0,"ElementCookie"=1,"CollectionType"=1,"Type"=513,"VariableSize"=0,"Elements"=({"VariableSize"=0,"UnitExponent"=0,"IsRelative"=No,"UsagePage"=65440,"Max"=127,"IsArray"=No,"Min"=18446744073709551488,"$
      |   "IOGeneralInterest" = "IOCommand is not serializable"
      |   "ReportInterval" = 8000
      |   "PrimaryUsagePage" = 65440
      |   "MaxFeatureReportSize" = 0
      |   "InputReportElements" = ({"ReportID"=0,"ElementCookie"=50,"Size"=184,"ReportCount"=1,"Type"=1,"VariableSize"=0,"UsagePage"=0,"ReportSize"=184,"Usage"=0})
      | }
      | 
      +-o IOHIDInterface  <class IORegistryEntry:IOService:IOHIDInterface, id 0x10000043e, registered, matched, active, busy 0 (6 ms), retain 6>
      |   {
      |     "MaxOutputReportSize" = 23
      |     "VendorID" = 1447
      |     "CountryCode" = 0
      |     "Product" = „MyLock USB Key"
      |     "VersionNumber" = 1
      |     "PrimaryUsage" = 1
      |     "LocationID" = 339738624
      |     "BootProtocol" = 0
      |     "ProductID" = 4096
      |     "DeviceUsagePairs" = ({"DeviceUsagePage"=65440,"DeviceUsage"=1})
      |     "Transport" = "USB"
      |     "ReportInterval" = 8000
      |     "ReportDescriptor" = <06a0ff0901a10109021580257f75089517810209031580257f750895179102c0>
      |     "HIDDefaultBehavior" = ""
      |     "PrimaryUsagePage" = 65440
      |     "Manufacturer" = „MyLock"
      |     "MaxFeatureReportSize" = 0
      |     "MaxInputReportSize" = 23
      |   }
      |   
      +-o IOHIDLibUserClient  <class IORegistryEntry:IOService:IOUserClient:IOHIDLibUserClient, id 0x1000004fb, !registered, !matched, active, busy 0, retain 6>
          {
            "DebugState" = {"EventQueueMap"=(),"Privileged"=Yes}
            "IOUserClientCreator" = "pid 86, loginwindow"
          }

ioreg -lirc IOUSBHostDevice выводит после повторного подключения с доступом:

+-o MyLock USB Key@14400000  <class IORegistryEntry:IOService:IOUSBNub:IOUSBDevice, id 0x1000006e5, registered, matched, active, busy 0 (3280 ms), retain 22>
  | {
  |   "sessionID" = 962218587513
  |   "USBSpeed" = 1
  |   "IOServiceLegacyMatchingRegistryID" = 4294969063
  |   "idProduct" = 4096
  |   "bDeviceClass" = 0
  |   "IOPowerManagement" = {"PowerOverrideOn"=Yes,"CapabilityFlags"=32768,"MaxPowerState"=2,"DevicePowerState"=2,"ChildrenPowerState"=2,"DriverPowerState"=0,"CurrentPowerState"=2}
  |   "bcdDevice" = 1
  |   "USB Product Name" = „MyLock USB Key"
  |   "AppleUSBAlternateServiceRegistryID" = 4294969063
  |   "locationID" = 339738624
  |   "bDeviceSubClass" = 0
  |   "kUSBCurrentConfiguration" = 1
  |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
  |   "bDeviceProtocol" = 0
  |   "USBPortType" = 0
  |   "USB Vendor Name" = „MyLock"
  |   "idVendor" = 1447
  |   "IOGeneralInterest" = "IOCommand is not serializable"
  |   "kUSBVendorString" = „MyLock"
  |   "IOClassNameOverride" = "IOUSBDevice"
  | }
  | 
  +-o AppleUSBHostLegacyClient  <class IORegistryEntry:IOService:AppleUSBHostLegacyClient, id 0x1000006e8, !registered, !matched, active, busy 0, retain 9>
  |   {
  |     "kUSBHostDeviceForceSuspend" = No
  |     "IOPowerManagement" = {"DevicePowerState"=0,"CurrentPowerState"=1,"CapabilityFlags"=65536,"MaxPowerState"=2,"DriverPowerState"=1}
  |   }
  |   
  +-o AppleUSBHostCompositeDevice  <class IORegistryEntry:IOService:AppleUSBHostCompositeDevice, id 0x1000006f4, !registered, !matched, active, busy 0, retain 4>
  |   {
  |     "IOProbeScore" = 50000
  |     "CFBundleIdentifier" = "com.apple.driver.usb.AppleUSBHostCompositeDevice"
  |     "IOProviderClass" = "IOUSBHostDevice"
  |     "IOClass" = "AppleUSBHostCompositeDevice"
  |     "bDeviceSubClass" = 0
  |     "IOMatchCategory" = "IODefaultMatchCategory"
  |     "kUSBPreferredConfiguration" = 1
  |     "bDeviceClass" = 0
  |   }
  |   
  +-o IOUSBHostInterface@0  <class IORegistryEntry:IOService:IOUSBNub:IOUSBInterface, id 0x1000006f6, !registered, !matched, active, busy 0, retain 6>
      {
        "USBPortType" = 0
        "IOCFPlugInTypes" = {"2d9786c6-9ef3-11d4-ad51-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
        "bcdDevice" = 1
        "USBSpeed" = 1
        "idProduct" = 4096
        "bConfigurationValue" = 1
        "bInterfaceSubClass" = 0
        "locationID" = 339738624
        "IOGeneralInterest" = "IOCommand is not serializable"
        "IOServiceLegacyMatchingRegistryID" = 4294969079
        "IOClassNameOverride" = "IOUSBInterface"
        "AppleUSBAlternateServiceRegistryID" = 4294969079
        "idVendor" = 1447
        "bInterfaceProtocol" = 0
        "bAlternateSetting" = 0
        "bInterfaceNumber" = 0
        "bInterfaceClass" = 3
      }


...