Je travaille sur le pilote Kext pour mon périphérique USB sur OS X. Dans ce pilote, j'ai un pointeur vers l'objet IOUSBDevice *device
(il peut être reçu dans start() et sonde () fonctions et j'ai un problème: il est possible d'ouvrir le périphérique (device->open(this, kIOServiceSeize)
) dans la fonction probe(), mais dans d'autres fonctions open()
retourner false, car il semble que le pilote classique prend le contrôle sur l'appareil.Empêcher les pilotes classiques d'ouvrir périphérique USB sur OS X
J'ai trouvé l'article User-Mode USB Device Arbitration et j'ai essayé de créer "skeleton" kext pour définir la propriété "ClassicMustNotSeize" à vrai, mais il semble que cela ne fonctionne pas, je ne peux toujours pas ouvrir l'appareil. Fonction
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>com.sample.iokit.ClassicNotSeizeDriver</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0.0</string>
<key>IOKitPersonalities</key>
<dict>
<key>MyUSBDevice</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.apple.driver.AppleUSBMergeNub</string>
<key>IOClass</key>
<string>AppleUSBMergeNub</string>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>IOProviderMergeProperties</key>
<dict>
<key>ClassicMustNotSeize</key>
<true/>
</dict>
<key>idProduct</key>
<integer>1</integer>
<key>idVendor</key>
<integer>10978</integer>
</dict>
</dict>
<key>OSBundleLibraries</key>
<dict>
<key>com.apple.driver.AppleUSBMergeNub</key>
<string>1.8.3b1</string>
<key>com.apple.iokit.IOUSBFamily</key>
<string>1.8</string>
</dict>
</dict>
</plist>
Est-il possible de définir « ClassicMustNotSeize » propriété par programme, par exemple dans la sonde() de mon chauffeur?
J'ai essayé:
device->setProperty("ClassicMustNotSeize", true);
et il semble que cela ne fonctionne pas non plus.