2015-10-21 1 views
1

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.

Répondre

1

D'autres kexts ne revendiqueront pas un service si le vôtre a correspondu avec succès et probe() d. Si vous ne réussissez pas start(), il se peut qu'il soit assorti d'un autre kext plus tard si quelque chose ré-initialise la correspondance. Donc quelque chose ne va pas, et il n'est pas possible de dire à partir de votre question ce que c'est parce que vous n'avez pas fourni le code, info.plist et extrait ioreg, et encore moins la sortie de débogage de votre code ...

ne peut que deviner:

  1. Pourquoi pensez-vous que vous devez utiliser kIOServiceSeize? Si votre kext correspond à l'appareil, a le score de sonde le plus élevé et retourne non-nul de probe(), aucun autre pilote n'aura attrapé le périphérique (encore). Si vous souhaitez garantir un accès exclusif aux périphériques USB, utilisez l'option kUSBOptionBitOpenExclusivelyMask pour open().
  2. Si vous open() pendant probe(), assurez-vous close() avant de retourner, peu importe quelle valeur vous revenez. Re-open() en start(). (La substitution probe() n'est généralement pas nécessaire de toute façon, elle renvoie this par défaut.)
  3. Définissez-vous une catégorie de correspondance dans la personnalité de votre kit d'E/S? Sauf si vous avez une très bonne raison, ne le faites pas.
  4. Etes-vous en train de faire correspondre une IOUSBInterface à la place de l'IOUSBDevice dans votre personnalité de pilote actuelle, puis de parcourir le graphique de service? Ou d'une manière ou d'une autre essayant de réclamer l'appareil autrement que par un kit d'E/S correspondant?
  5. Votre bibliothèque est-elle dans/Library/Extensions (ou/System/Library/Extensions s'il y a une bonne raison pour qu'elle ne puisse pas être dans/LE)? Sinon, il ne participera pas à l'appariement. Je doute beaucoup que cela ait quelque chose à voir avec "Classic" qui, autant que je sache, était une façon d'exécuter Mac OS 8 & 9 applications dans les premières versions de OS X. Donc, sauf si vous ciblez 10.1 ou donc, ClassicMustNotSeize ne fait rien.