iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
今回は、IOKit driver templateで生成したプロジェクトを使って開発だ。
新規プロジェクトで、IOKit driver templateを選択する。
プロジェクト名は、前回の流れからSmartScrollDriverとした。
今回も、前回と同様にTARGETSのArchitecturesのBuild Active Architecture Onlyは、NOを選択する。
SmartScrollDriver-Info.plistのCFBundleIdentifierをcom.MyCompany.driver.${PRODUCT_NAME:rfc1034identifier}に変更する。著者は、MyCompanyに自分の会社のものにしている。
SmartScrollDriver-Info.plistのIOKitPersonalitiesにSmartScrollDriver辞書型を追加して、以下の内容に設定する。
Name | Value |
---|---|
CFBundleIdentifier | com.MyCompany.driver.${PRODUCT_NAME:rfc1034identifier} |
IOClass | com_MyCompany_driver_SmartScrollDriver |
IOKitDebug | 65535 |
IOProviderClass | IOResources |
IOMatchCategory | com_MyCompany_driver_SmartScrollDriver |
IOClassは、このドライバの起点となるクラス名の様だ。ようするに、この名前のクラスを実装する事になる。
IOProviderClassは、ドライバがぶら下がるnubクラス名。
テンプレートのSmartScrollDriver.hとSmartScrollDriver.cppは空なので中身を実装する。メソッドが呼ばれたらにデバッグ出力するだけだ。
#include <IOKit/IOService.h>
class jp_co_bitz_driver_SmartScrollDriver : public IOService {
OSDeclareDefaultStructors(jp_co_bitz_driver_SmartScrollDriver)
public:
virtual bool init(OSDictionary *dictionary = 0);
virtual void free(void);
virtual IOService *probe(IOService *provider, SInt32 *score);
virtual bool start(IOService *provider);
virtual void stop(IOService *provider);
};
#include <IOKit/IOLib.h>
#include "SmartScrollDriver.h"
OSDefineMetaClassAndStructors(jp_co_bitz_driver_SmartScrollDriver, IOService)
#define super IOService
bool jp_co_bitz_driver_SmartScrollDriver::init(OSDictionary *dict)
{
bool result = super::init(dict);
IOLog("Initializing\n");
return result;
}
void jp_co_bitz_driver_SmartScrollDriver::free(void)
{
IOLog("Freeing\n");
super::free();
}
IOService *jp_co_bitz_driver_SmartScrollDriver::probe(IOService *provider,
SInt32 *score)
{
IOService *result = super::probe(provider, score);
IOLog("Probing\n");
return result;
}
bool jp_co_bitz_driver_SmartScrollDriver::start(IOService *provider)
{
bool result = super::start(provider);
IOLog("Starting\n");
return result;
}
void jp_co_bitz_driver_SmartScrollDriver::stop(IOService *provider)
{
IOLog("Stopping\n");
super::stop(provider);
}
一度、プロジェクトをビルドする。Show the Log NavigatorからSmartScrollDriver.kextの出力先を調べて、ターミナル.appで、そのディレクトリに移動する。
cd Build/Products/Debug
そこで以下のコマンドを実行する。
$ kextlibs -xml SmartScrollDriver.kext
<key>OSBundleLibraries</key>
<dict>
<key>com.apple.kpi.iokit</key>
<string>11.4.2</string>
<key>com.apple.kpi.libkern</key>
<string>11.4.2</string>
</dict>
この内容をSmartScrollKext-Info.plistのOSBundleLibrariesに設定する。
再度、ビルドし、生成されたSmartScrollDriver.kextを/tmpにコピーする。
$ sudo cp -R SmartScrollDriver.kext /tmp
以下のコマンドで、問題がないか確認する。
$ kextutil -n -t /tmp/SmartScrollDriver.kext
No kernel file specified; using running kernel for linking.
Notice: /tmp/SmartScrollDriver.kext has debug properties set.
/tmp/SmartScrollDriver.kext appears to be loadable (including linkage for on-disk libraries).
ロードしてみる。
$ sudo kextutil -v /tmp/SmartScrollDriver.kext
Password:
Notice: /tmp/SmartScrollDriver.kext has debug properties set.
/tmp/SmartScrollDriver.kext appears to be loadable (not including linkage for on-disk libraries).
Loading /tmp/SmartScrollDriver.kext.
/tmp/SmartScrollDriver.kext successfully loaded (or already loaded).
確認する。
$ kextstat | grep jp.co.bitz
162 0 0xb97000 0x4000 0x3000 jp.co.bitz.driver.SmartScrollDriver (1) <4 3>
アンロード。
$ sudo kextunload -v /tmp/SmartScrollDriver.kext
jp.co.bitz.driver.SmartScrollDriver unloaded and personalities removed.