2015-10-21 32 views
1

我正在爲我的USB設備在OS X上的kext驅動程序工作。在此驅動程序中,我有一個指向對象IOUSBDevice *device(它可以在start()和probe( )函數),我有一個問題:有可能在probe()函數中打開設備(device->open(this, kIOServiceSeize)),但在其他函數open()中返回false,因爲它看起來像經典驅動程序在設備上進行控制。防止經典驅動程序在OS X上打開USB設備

我發現文章User-Mode USB Device Arbitration並試圖創建「骨架」kext設置「ClassicMustNotSeize」屬性爲true,但它似乎不工作,我仍然無法打開設備。

<?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> 

是否有可能以編程方式設置「ClassicMustNotSeize」屬性,例如在我的驅動程序的probe()函數中?

我想:

device->setProperty("ClassicMustNotSeize", true); 

而且好像也不起作用。

回答

1

其他kexts不會主張服務,如果你已經成功匹配和probe() d。如果你不成功start(),如果重新啓動匹配,它可能會在以後與另一個kext匹配。所以有些事情是不正確的,從單獨的問題中無法單獨告訴你是什麼原因,因爲你沒有提供相關的代碼,info.plist和ioreg摘錄,更不用說你的代碼的調試輸出...

所以我只能猜測:

  1. 爲什麼你認爲你需要使用kIOServiceSeize?如果您的kext與設備匹配,探測得分最高,並且從probe()返回非空值,則沒有其他驅動程序會抓取該設備(尚)。如果要確保獨佔訪問USB設備,請使用kUSBOptionBitOpenExclusivelyMask選項open()
  2. 如果你在open()期間probe(),請確保你在返回之前close(),不管你返回什麼值。 Re-open() in start()。 (重寫probe()通常不需要,默認情況下它將返回this。)
  3. 您是否在I/O套件的個性中設置了匹配類別?除非你有很好的理由,否則不要。
  4. 您是否在您的實際驅動程序個性中匹配IOUSBInterface而不是IOUSBDevice,然後遍歷服務圖?或者以某種方式嘗試聲稱該設備不是通過I/O套件匹配?
  5. 你的kext是/ Library/Extensions(或者/系統/庫/擴展,如果有很好的理由它不能在/ LE中)?如果不是,它不會參與匹配。
  6. 我非常懷疑這與「經典」有什麼關係,據我所知,它是在OS X的早期版本中運行Mac OS 8應用程序的一種方式。所以除非您的目標是10.1或所以,ClassicMustNotSeize什麼都不做。
相關問題