1. はじめに
デバイスドライバ開発・検証業務でよく使うツールを3つご紹介します。
2. pnputil.exe
2.1 概要
Windowsにおけるデバイスドライバの操作を管理するためのコマンドラインツールです。
このツールを使用すると、デバイスドライバのインストール、削除、パッケージの一覧取得などが可能です。
pnputil /e
でドライバーパッケージの一覧表示、pnputil /add-driver <infファイルのパス> /install
でドライバのインストールを行うときに使用しています。
2.2 コマンド一覧
pnputil
でコマンド説明を確認することができます。
C:\Windows\System32>pnputil
PNPUTIL [/add-driver <...> | /delete-driver <...> |
/export-driver <...> | /enum-drivers [<...>] |
/enum-devices [<...>] | /enum-devicetree [<...>] |
/disable-device <...> |/enable-device <...> |
/restart-device <...> | /remove-device <...> |
/scan-devices [<...>] | /enum-classes [<...>] |
/enum-interfaces [<...>] | /enum-containers [<...>] | /?]
コマンド:
/add-driver <filename.inf | *.inf> [/subdirs] [/install] [/reboot]
ドライバー パッケージをドライバー ストアに追加します。
/subdirs - サブディレクトリをスキャンしてドライバー パッケージを探します。
/install - 一致するすべてのデバイスでドライバーをインストール/更新します。
/再起動 - 操作を完了するために必要な場合は、システムを再起動します。
例:
ドライバー パッケージの追加:
pnputil /add-driver x:\driver.inf
複数のドライバー パッケージを追加:
pnputil /add-driver c:\oem\*.inf
ドライバー パッケージの追加とインストール:
pnputil /add-driver device.inf /install
/delete-driver <oem#.inf> [/uninstall] [/force] [/reboot]
ドライバー ストアからドライバー パッケージを削除します。
/uninstall - ドライバー パッケージを使用しているデバイスからドライバー パッケージをアンインストールしま
/force - デバイスで使用中であってもドライバー パッケージを削除します。
/再起動 - 操作を完了するために必要な場合は、システムを再起動します。
例:
ドライバー パッケージの削除:
pnputil /delete-driver oem0.inf
ドライバー パッケージの強制削除:
pnputil /delete-driver oem1.inf /force
/export-driver <oem#.inf | *> <target directory>
ドライバー パッケージをドライバー ストアからターゲット ディレクトリにエクスポートします。
例:
ドライバー パッケージのエクスポート :
pnputil /export-driver oem6.inf .
すべてのドライバー パッケージをエクスポート:
pnputil /export-driver * c:\backup
/enum-drivers [/class <name | GUID>] [/files] [/ids] [/devices]
[/format <txt | xml | csv>] [/output-file [<filename>]]
ドライバー ストアにあるサード パーティのドライバー パッケージをすべて列挙します。
/class <name | GUID> - デバイス クラス名または GUID でフィルターします。
/files - すべてのドライバー パッケージ ファイルを列挙します。
/ids - ドライバー パッケージとファミリ ID を表示します。
/devices - ドライバー パッケージがインストールされているデバイスを表示します。
/format - 出力をテキスト、XML、または CSV として書式設定します。
/output-file [<filename>] - オプションの名前のファイルに対し出力を書き込みます。
例:
すべての OEM ドライバー パッケージを列挙します:
pnputil /enum-drivers
特定のクラスのすべての OEM ドライバー パッケージを列挙します:
pnputil /enum-drivers /class "System"
すべての OEM ドライバー パッケージを列挙し、ドライバー ファイルを表示します:
pnputil /enum-drivers /files
/disable-device [<instance ID> | /deviceid <device ID>] [/class <name | GUID>]
[/bus <name | GUID>] [/reboot] [/force]
システム上のデバイスを無効にします。
/deviceid <device ID> - デバイス ID が一致するすべてのデバイスを無効にします。
/class <name | GUID> - デバイス クラス名または GUID でフィルターします。
/bus <name | GUID> - バス列挙子名またはバスの種類の GUID でフィルターします。
/再起動 - 操作を完了するために必要な場合は、システムを再起動します。
/force - デバイスが重要なシステム機能を提供している場合でも無効にします。
例:
デバイスを無効にします:
pnputil /disable-device "USB\VID_045E&PID_00DB\6&870CE29&0&1"
特定のハードウェア/互換性 ID ですべてのデバイスを無効にします:
pnputil /disable-device /deviceid "USB\Class_03"
特定のバスで特定のクラスのすべてのデバイスを無効にする:
pnputil /disable-device /class "USB" /bus "PCI"
/enable-device [<instance ID> | /deviceid <device ID>] [/class <name | GUID>]
[/bus <name | GUID>] [/reboot]
システム上のデバイスを有効にします。
/deviceid <device ID> - デバイス ID が一致するすべてのデバイスを有効にします。
/class <name | GUID> - デバイス クラス名または GUID でフィルターします。
/bus <name | GUID> - バス列挙子名またはバスの種類の GUID でフィルターします。
/再起動 - 操作を完了するために必要な場合は、システムを再起動します。
例:
デバイスを有効にします:
pnputil /enable-device "USB\VID_045E&PID_00DB\6&870CE29&0&1"
特定のハードウェア/互換性 ID ですべてのデバイスを有効にします:
pnputil /enable-device /deviceid "USB\Class_03"
特定のバス上の特定のクラスのすべてのデバイスを有効にする:
pnputil /enable-device /class "USB" /bus "PCI"
/restart-device [<instance ID> | /deviceid <device ID>] [/class <name | GUID>]
[/bus <name | GUID>] [/reboot]
システム上のデバイスを再起動します。
/deviceid <device ID> - デバイス ID が一致するすべてのデバイスを再起動します。
/class <name | GUID> - デバイス クラス名または GUID でフィルターします。
/bus <name | GUID> - バス列挙子名またはバスの種類の GUID でフィルターします。
/再起動 - 操作を完了するために必要な場合は、システムを再起動します。
例:
デバイスを再起動します:
pnputil /restart-device "USB\VID_045E&PID_00DB\6&870CE29&0&1"
特定のハードウェア/互換性 ID ですべてのデバイスを再起動します:
pnputil /restart-device /deviceid "USB\Class_03"
特定のバスで特定のクラスのすべてのデバイスを再起動します:
pnputil /restart-device /class "USB" /bus "PCI"
/remove-device [<instance ID> | /deviceid <device ID>] [/class <name | GUID>]
[/bus <name | GUID>] [/subtree] [/reboot] [/force]
システムからデバイスを削除しようとしました。
/deviceid <device ID> - デバイス ID が一致するすべてのデバイスを削除します。
/class <name | GUID> - デバイス クラス名または GUID でフィルターします。
/bus <name | GUID> - バス列挙子名またはバスの種類の GUID でフィルターします。
/subtree - 子デバイスも含めて、デバイス サブツリー全体を削除します。
/再起動 - 操作を完了するために必要な場合は、システムを再起動します。
/force - デバイスが重要なシステム機能を提供している場合でも削除します。
例:
デバイスの削除:
pnputil /remove-device "USB\VID_045E&PID_00DB\6&870CE29&0&1"
特定のハードウェア/互換性 ID ですべてのデバイスを削除します:
pnputil /remove-device /deviceid "USB\Class_03"
特定のバス上の特定のクラスのすべてのデバイスを削除します:
pnputil /remove-device /class "USB" /bus "PCI"
/scan-devices [/instanceid <instance ID>] [/async]
システムでデバイス ハードウェアの変更をスキャンします。
/instanceid <instance ID> - デバイス サブツリーで変更をスキャンします。
/async - 変更を非同期にスキャンします。
例:
デバイスのスキャン:
pnputil /scan-devices
/enum-devices [/connected | /disconnected] [/class <name | GUID>]
[/instanceid <instance ID> | /deviceid <device ID>]
[/problem [<code>]] [/bus [<name | GUID>]] [/deviceids]
[/relations] [/services] [/stack] [/location] [/drivers]
[/interfaces] [/properties] [/resources]
[/format <txt | xml | csv>] [/output-file [<filename>]]
システム上のすべてのデバイスを列挙します。
/connected | /disconnected - 接続されているデバイスでフィルターするか、
接続解除されているデバイスでフィルターします。
/class <name | GUID> - デバイス クラス名または GUID でフィルターします。
/instanceid <インスタンス ID> - デバイス インスタンス ID でフィルターします。
/deviceid <device ID> - デバイス ハードウェア/互換性 ID でフィルターします。
/problem [<コード>] - 問題があるデバイスでフィルターするか、
特定の問題コードでフィルターします。
/bus [<name | GUID>] バス列挙子名またはバスの種類の GUID を表示します。
バス列挙子名またはバスの種類の GUID でフィルターします。
/deviceids - ハードウェア/互換性 ID を表示します。
/relations - 親と子のデバイスの関係を表示します。
/services - デバイス サービスを表示します。
/stack - 有効なデバイス スタック情報を表示します。
/location - 場所の情報とパスを表示します。
/drivers - 一致するインストール済みドライバーを表示します。
/interfaces - デバイスのインターフェースを表示します。
/プロパティ - すべてのデバイスのプロパティを表示します。
/resources - デバイスのリソースを表示します。
/format - 出力をテキスト、XML、または CSV として書式設定します。
/output-file [<filename>] - オプションの名前のファイルに対し出力を書き込みます。
例:
システム上の接続されているデバイスのみを列挙します:
pnputil /enum-devices /connected
特定のインスタンス ID を持つデバイスを列挙します:
pnputil /enum-devices /instanceid "ACPI\PNP0A08\1"
特定のハードウェア/互換性 ID ですべてのデバイスを列挙します:
pnputil /enum-devices /deviceid "USB\Class_03"
特定のクラスを持つすべてのデバイスを列挙します:
pnputil /enum-devices /class Display
pnputil /enum-devices /class {4d36e97d-e325-11ce-bfc1-08002be10318}
特定の問題コードを持つすべてのデバイスを列挙します:
pnputil /enum-devices /problem 28
pnputil /enum-devices /problem 0xA
特定のバスを持つすべてのデバイスを列挙します:
pnputil /enum-devices/bus PCI
pnputil /enum-devices /bus{c8ebdfb0-b510-11d0-80e5-00a0c92542e3}
問題のあるすべてのデバイスを列挙し、ハードウェア/互換性 ID を表示します:
pnputil /enum-devices /problem /deviceids
/enum-interfaces [/enabled | /disabled] [/class <GUID>] [/instanceid <instance ID>]
[/properties] [/format <txt | xml | csv>] [/output-file [<filename>]]
システム上のすべてのデバイス インターフェイスを列挙します。
/enabled | /disabled - 有効になっているインターフェイスでフィルターするか、
無効になっているインターフェイスでフィルターします。
/class <GUID> - インターフェイス クラス GUID でフィルターします。
/instanceid <インスタンス ID> - デバイス インスタンス ID でフィルターします。
/プロパティ - すべてのインターフェイスのプロパティを表示します。
/format - 出力をテキスト、XML、または CSV として書式設定します。
/output-file [<filename>] - オプションのファイル名に出力を書き込みます。
例:
システム上で有効になっているインターフェイスのみを列挙します:
pnputil /enum-interfaces /enabled
特定のインターフェイス クラス GUID を持つすべてのインターフェイスを列挙します:
pnputil /enum-interfaces /class {884b96c3-56ef-11d1-bc8c-00a0c91405dd}
/enum-classes [/class <name | GUID>] [/services] [/format <txt | xml | csv>]
[/output-file [<filename>]]
システム上のすべてのデバイス セットアップ クラスを列挙します。
/class <name | GUID> - デバイス クラス名または GUID でフィルターします。
/services - デバイス クラス サービスを表示します。
/format - 出力をテキスト、XML、または CSV として書式設定します。
/output-file [<filename>] - オプションのファイル名に出力を書き込みます。
例:
システム上のすべてのデバイス セットアップ クラスを列挙します:
pnputil /enum-classes
特定のデバイス セットアップ クラスの情報を列挙します:
pnputil /enum-classes /class Display
pnputil /enum-classes /class {4d36e968-e325-11ce-bfc1-08002be10318}
/enum-devicetree [ルート デバイス インスタンス ID] [/connected] [/services]
[/stack] [/drivers] [/interfaces]
デバイス ツリーを列挙します。
/connected - 接続されたデバイスでフィルター処理します。
/services - デバイス サービスを表示します。
/stack - 有効なデバイス スタック情報を表示します。
/drivers - 一致するインストール済みドライバーを表示します。
/interfaces - デバイスのインターフェースを表示します。
例:
デバイス ツリーの列挙:
pnputil /enum-devicetree
"ACPI\PNP0A03\0" をルート:
として持つデバイス ツリーを列挙します pnputil /enum-devicetree "ACPI\PNP0A03\0"
接続されているデバイスのツリーを列挙し、デバイス インターフェイスを表示します:
pnputil /enum-devicetree /connected /interfaces
/enum-containers [/containerid <container id>] [/connected | /disconnected]
[/problem] [/devices] [/format <txt | xml | csv>]
[/output-file [<filename>]]
システム上のすべてのデバイス コンテナを列挙します。
/containerid <container id> - コンテナー ID でフィルター処理します。
/connected | /disconnected -接続されたデバイス コンテナまたは
でフィルタリングする 切断されたデバイス コンテナでフィルタリングします。
/problem - 問題のあるデバイス コンテナでフィルタリングします。
/devices - コンテナー デバイスを表示します。
/format - 出力をテキスト、XML、または CSV として書式設定します。
/output-file [<filename>] - オプションのファイル名に出力を書き込みます。
例:
システム上のすべてのデバイス コンテナを列挙します:
pnputil /enum-containers
特定のデバイス コンテナを列挙する:
pnputil /enum-containers /containerid "{00000000-0000-0000-ffff-ffffffffffff}"
接続されているすべてのデバイス コンテナーと関連付けられたデバイスを列挙します:
pnputil /enum-containers /connected /devices
/?
使用法画面を表示します。
3. sc.exe
3.1 概要
Windowsオペレーティングシステムで提供されるコマンドラインツールで、サービス(Windowsサービス)に関連する操作を管理するためのツールです。
このツールは、サービスのインストール、削除、開始、停止、クエリ(状態確認)などを行うために使用されます。システム管理やスクリプトを作成する際に役立つツールです。
サービスとして登録されたデバイスドライバの開始・停止操作にsc start <デバイスドライバ名>
、sc stop <デバイスドライバ名>
を実行したり、sc query <デバイスドライバ名>
でデバイスドライバの実行状態を確認したりすることが可能です。
3.2 コマンド一覧
sc
でコマンド説明を確認することができます。
C:\Windows\System32>sc
説明:
SC はサービス コントロール マネージャーやサービスと通信するために使用
するコマンド ライン プログラムです。
使用法:
sc <サーバー> [コマンド] [サービス名] <オプション 1> <オプション 2>...
オプションの <サーバー> は "\\サーバー名" の形式です。
「sc [コマンド]」と入力するとコマンドの詳細なヘルプが表示されます。
コマンド一覧:
query-----------サービスの状態を照会したりサービスの種類ごと
に状態を列挙したりします。
queryex---------拡張されたサービスの状態を照会したりサービス
の種類ごとに状態を列挙したりします。
start-----------サービスを開始します。
pause-----------サービスに PAUSE 制御要求を送信します。
interrogate-----サービスに INTERROGATE 制御要求を送信します。
continue--------サービスに CONTINUE 制御要求を送信します。
stop------------サービスに STOP 要求を送信します。
config----------サービスの構成を変更します (恒久的)。
description-----サービスの説明を変更します。
failure---------エラー発生時のサービスの動作を変更します。
failureflag-----サービスの障害動作フラグを変更します。
sidtype---------サービスのサービス SID の種類を変更します。
privs-----------サービスの必要な特権を変更します。
managedaccount--サービス アカウントのパスワードを LSA で管理された
パスワードとマークするようにサービスを変更します。
qc--------------サービスの構成情報を照会します。
qdescription----サービスの説明を照会します。
qfailure--------エラー発生時のサービスの動作を照会します。
qfailureflag----サービスの障害動作フラグを照会します。
qsidtype--------サービスのサービス SID の種類を照会します。
qprivs----------サービスの必要な特権を照会します。
qtriggerinfo----サービスのトリガー パラメーターを照会します。
qpreferrednode--サービスの優先 NUMA ノードを照会します。
qmanagedaccount-パスワードが LSA で管理されたアカウントを
サービスで使用するかどうかを照会します。
qprotection-----サービスのプロセス保護レベルを照会します。
quserservice----ユーザー サービス テンプレートのローカル インスタンスを照会します。
delete----------レジストリからサービスを削除します。
create----------サービスを作成します (レジストリに追加します)。
control---------サービスに CONTROL コードを送信します。
sdshow----------サービスのセキュリティ記述子を表示します。
sdset-----------サービスのセキュリティ記述子を設定します。
showsid---------任意の名前に対応するサービス SID 文字列を表示します。
triggerinfo-----サービスのトリガー パラメーターを構成します。
preferrednode---サービスの優先 NUMA ノードを設定します。
GetDisplayName--サービスの DisplayName を取得します。
GetKeyName------サービスの ServiceKeyName を取得します。
EnumDepend------サービスの依存関係を列挙します。
次のコマンドはサービス名を指定しません:
sc <サーバー> <コマンド> <オプション>
boot------------(ok | bad) 最後に行われたブートを前回正常起動時
の構成として保存するかどうかを示します。
Lock------------サービス データベースをロックします。
QueryLock-------SCManager データベースの LockStatus を照会します。
例:
sc start MyService
QUERY と QUERYEX のオプション:
クエリ コマンドにサービス名が続く場合、サービスの状態が戻されます。
この場合、それ以上のオプションは適用されません。クエリ コマンドに
オプションがない場合やまたは以下に一覧に表示されているオプションが
続く場合は、サービスが列挙されます。
type= 列挙するサービスの種類 (driver、service、user service、all)
(既定 = service)
state= 列挙するサービスの状態 (inactive、all)
(既定 = active)
bufsize= 列挙バッファーのサイズ (バイト)
(既定 = 4096)
ri= 列挙の開始を指定するための再開インデックス番号
(既定 = 0)
group= 列挙するサービス グループ
(既定 = all groups)
構文の例
sc query - アクティブなサービス ドライバーの状態を列挙します
sc query eventlog - イベントログ サービスの状態を表示します
sc queryex eventlog - イベントログ サービスの拡張状態を表示します
sc query type= driver - アクティブなドライバーのみ列挙します
sc query type= service - Win32 サービスのみ列挙します
sc query state= all - サービスとドライバーをすべて列挙します
sc query bufsize= 50 - 50 バイトのバッファーで列挙します
sc query ri= 14 - 再開インデックスを = 14 にして列挙します
sc queryex group= "" - グループにないアクティブなサービスを列挙します
sc query type= interact - 対話型サービスをすべて列挙します
sc query type= driver group= NDIS - NDIS ドライバーをすべて列挙します
4. fltmc.exe
4.1 概要
Windowsオペレーティングシステムにおけるコマンドラインツールで、フィルターマネージャー(Filter Manager)を管理するためのツールです。
フィルターマネージャーは、ファイルシステムのフィルタードライバを管理するための Windowsコンポーネントで、セキュリティソフトウェアやファイル暗号化ソフトウェアなどがこの仕組みを利用してファイルシステムの操作を監視・制御します。
業務ではfltmc instances
、fltmc volumes
などを用いて、フィルタードライバが期待するボリュームに適用できているかを確認しています。
4.2 コマンド一覧
fltmc help
で使用できるコマンド一覧を確認可能です。
C:\Windows\System32>fltmc help
有効なコマンド:
load フィルター ドライバーを読み込みます
unload フィルター ドライバーをアンロードします
filters 現在システムに登録されているフィルターを一覧表示します
instances 現在システムに登録されているフィルターまたは
ボリュームのインスタンスを一覧表示します
volumes システム内のすべてのボリューム/RDR を一覧表示します
attach ボリュームにフィルター インスタンスを作成します
detach ボリュームからフィルター インスタンスを削除します
特定コマンドのヘルプを表示するには fltmc help [コマンド] を実行してください
5. おわりに
デバイスドライバ開発・検証業務でよく使用するツールを3つご紹介しました。
デバイスドライバ開発をするときやデバイスドライバの実行状態に違和感を感じたときは、ぜひご紹介したツールを使ってみてください。
6. 参考