ユニバーサル ドライバーのシナリオUniversal Driver Scenarios

このトピックでは、DCHU ユニバーサル ドライバーのサンプルに DCHU design principles (Declarative: 宣言型、Componentized: コンポーネント化済み、Hardware Support Apps [HSA]: ハードウェア サポート アプリ、Universal API compliance) がどのように適用されているかについて説明します。This topic describes how the DCHU universal driver sample applies the DCHU design principles (Declarative, Componentized, Hardware Support Apps [HSA], and Universal API compliance). 実際のユニバーサル ドライバー パッケージのモデルとして使うことができます。You can use it as a model for your own universal driver package.

サンプル リポジトリのローカル コピーが必要な場合は、Windows-driver-samples から複製できます。If you would like a local copy of the sample repo, clone from Windows-driver-samples.

このサンプルは、Windows 10 バージョン 1703 以降で使うことを前提として作られています。This sample is intended to be used with Windows 10 Version 1703 and later.

前提条件Prerequisites

このセクションを読む前に、「ユニバーサル Windows ドライバーの概要」で説明されているユニバーサル ドライバー パッケージの要件とベスト プラクティスを確認してください。Before you read this section, check out the requirements and best practices for universal driver packages described in Getting Started with Universal Windows drivers.

概要Overview

DCHU サンプルで提供されているシナリオ例では、2 つのハードウェア パートナー Contoso (システム ビルダーまたは OEM) と Fabrikam (デバイスの製造元または IHV) が共同で、Contoso の次期システムのデバイス用のユニバーサル Windows ドライバーを作成しています。The DCHU sample provides example scenarios where two hardware partners, Contoso (a system builder, or OEM) and Fabrikam (a device manufacturer, or IHV) are working together to create a Universal Windows Driver for a device in Contoso's upcoming system. 対象のデバイスは OSR USB FX2 学習キットです。The device in question is an OSR USB FX2 learning kit. これまで、Fabrikam は、特定の Contoso 製品ライン用にカスタマイズされた非ユニバーサル ドライバー パッケージを作成し、サービスを処理するために OEM に渡していました。In the past, Fabrikam would write a non-universal driver package that was customized to a specific Contoso product line, and then hand it to the OEM to handle servicing. その結果、大きなメンテナンス オーバーヘッドが発生していたため、Fabrikam は、コードをリファクタリングして、代わりにユニバーサル ドライバー パッケージを作成することを決定しました。This resulted in significant maintenance overhead, so Fabrikam decides to refactor the code and create a universal driver package instead.

宣言型セクションとディレクティブのみを使用するUse only declarative sections and directives

最初に、Fabrikam はユニバーサル ドライバー パッケージ無効な INF のセクションとディレクティブの一覧を確認します。First, Fabrikam reviews the list of INF sections and directives that are invalid in universal driver packages. その間に、Fabrikam は無効なセクションとディレクティブの多くをドライバー パッケージで使っていることに気付きます。During this exercise, Fabrikam notices that they're using many of these sections and directives in their driver package.

Fabrikam の非ユニバーサル ドライバーの INF は、プラットフォームに依存する設定とファイルを適用する共同インストーラーを登録します。Their non-universal driver INF registers a co-installer that applies platform-dependent settings and files. そのため、ドライバー パッケージが本来のサイズより大きいだけでなく、ドライバーを搭載している OEM システムの一部のみがバグの影響を受ける場合のドライバーの保守作業が困難です。This means that the driver package is larger than it should be, and it is harder to service the driver when a bug affects only a subset of the OEM systems that ship the driver. また、OEM 固有の変更のほとんどはブランドに関連するため、OEM が追加されたり、軽微な問題が OEM システムのサブセットに影響を与えたりするたびに、Fabrikam はドライバー パッケージを更新する必要があります。Also, most of the OEM-specific modifications are related to branding, so Fabrikam needs to update the driver package every time an OEM is added or when a minor issue affects a subset of OEM systems.

Fabrikam は、非ユニバーサルのセクションとディレクティブを削除し、InfVerif ツールを使って新しいドライバー パッケージの INF ファイルがユニバーサルであることを確認します。Fabrikam removes the non-universal sections and directives and uses the InfVerif tool to verify that the new driver package's INF file is universal.

拡張 INF を使ってドライバー パッケージをコンポーネント化するUse extension INFs to componentize a driver package

次に、Fabrikam は、OEM パートナー (Contoso など) に固有のカスタマイズを基本ドライバー パッケージから分離して、拡張 INF にまとめます。Next, Fabrikam separates customizations that are specific to OEM partners (such as Contoso) from the base driver package into an extension INF.

osrfx2_DCHU_extension.inx から更新された次のスニペットでは、Extension クラスが指定されており、拡張ドライバー パッケージを所有する Contoso がプロバイダーとしてを識別されます。The following snippet, updated from osrfx2_DCHU_extension.inx, specifies the Extension class and identifies Contoso as the provider since they will own the extension driver package:

[Version]
Class       = Extension
ClassGuid   = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider    = Contoso
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID

osrfx2_DCHU_base.inx では、次のエントリが指定されています。In osrfx2_DCHU_base.inx, Fabrikam specifies the following entries:

[OsrUsbFx2_AddReg]
HKR, OSR, "OperatingMode",, "Default" ; FLG_ADDREG_TYPE_SZ
HKR, OSR, "OperatingParams",, "None" ; FLG_ADDREG_TYPE_SZ

osrfx2_DCHU_extension.inx で、Contoso は基本パッケージによって設定された OperatingParams レジストリ値をオーバーライドして、OperatingExceptions を追加します。In osrfx2_DCHU_extension.inx, Contoso overrides the OperatingParams registry value set by the base and adds OperatingExceptions:

[OsrUsbFx2Extension_AddReg]
HKR, OSR, "OperatingParams",, "-Extended"
HKR, OSR, "OperatingExceptions",, "x86" 

拡張機能は常に基本 INF の後に順不同で処理されることに注意してください。Note that extensions are always processed after the base INF in no definite order. 基本 INF が新しいバージョンに更新された場合、拡張 INF は新しい基本 INF がインストールされた後で再適用されます。If a base INF is updated to a newer version, then the extensions will still be re-applied after the new base INF is installed.

INF ファイルからサービスをインストールするInstall a service from an INF file

Fabrikam では、OSR ボード上の LED 制御に Win32 サービスを使用しています。Fabrikam uses a Win32 service to control the LEDs on the OSR board. 同社にとってこのコンポーネントはデバイスのコア機能の一部であるため、基本 INF (osrfx2_DCHU_base.inx) の一部として組み込みます。They view this component as part of the core functionality of the device, so they include it as part of their base INF (osrfx2_DCHU_base.inx). このユーザーモード サービス (usersvc) は、INF ファイルに AddService ディレクティブを指定して宣言することで、追加および開始できます。This user-mode service (usersvc) can be added and started declaratively by specifying the AddService directive in the INF file:

[OsrFx2_Install.NT]
CopyFiles = OsrFx2_UserSvcCopyFiles

[OsrFx2_Install.NT.Services]
AddService = osrfx2_DCHU_usersvc, 0x00000800, UserSvc_ServiceInstall
    
[UserSvc_ServiceInstall]
DisplayName = %UserSvcDisplayName%
ServiceType = 0x00000010
StartType = 3
ErrorControl = 1
ServiceBinary = %13%\osrfx2_DCHU_usersvc.exe

[OsrFx2_UserSvcCopyFiles]
osrfx2_DCHU_usersvc.exe

このようなサービスは、状況に応じて、コンポーネント INF または拡張 INF にもインストールできることに注意してください。Note that such a service could also be installed in a component or extension INF, depending on the scenario.

コンポーネントを使ってドライバー パッケージからレガシ ソフトウェアをインストールするUse a component to install legacy software from a driver package

Fabrikam は、これまで共同インストーラーを使ってインストールしていた実行可能ファイル osrfx2_DCHU_componentsoftware.exe を持っています。Fabrikam has an executable file osrfx2_DCHU_componentsoftware.exe that they previously installed using a co-installer. このレガシ ソフトウェアはボードによって設定されるレジストリ キーを表示し、OEM が必要とします。This legacy software displays the registry keys set by the board and is required by the OEM. これは、デスクトップ エディションの Windows でのみ実行される GUI ベースの実行可能ファイルです。This is a GUI-based executable that only runs on Windows for desktop editions. これをインストールするため、Fabrikam は別のコンポーネント ドライバー パッケージを作成し、それを拡張 INF に追加します。To install it, Fabrikam creates a separate component driver package and adds it in their extension INF.

osrfx2_DCHU_extension.inx の次のスニペットは、AddComponent ディレクティブを使って仮想子デバイスを作成します。The following snippet from osrfx2_DCHU_extension.inx uses the AddComponent directive to create a virtual child device:

[OsrFx2Extension_Install.NT.Components]
AddComponent = osrfx2_DCHU_component,,OsrFx2Extension_ComponentInstall


[OsrFx2Extension_ComponentInstall]
ComponentIds=VID_045e&PID_94ab

その後、コンポーネントの INF osrfx2_DCHU_component.inx で指定されている AddSoftware ディレクティブによって、オプションの実行可能ファイルがインストールされます。Then, in the component INF osrfx2_DCHU_component.inx, Fabrikam specifies the AddSoftware directive to install the optional executable:

[OsrFx2Component_Install.NT.Software]
AddSoftware = osrfx2_DCHU_componentsoftware,, OsrFx2Component_SoftwareInstall
    
[OsrFx2Component_SoftwareInstall]
SoftwareType = 1
SoftwareBinary = osrfx2_DCHU_componentsoftware.exe
SoftwareArguments = <<DeviceInstanceId>>
SoftwareVersion = 1.0.0.0 

[OsrFx2Component_CopyFiles]
osrfx2_DCHU_componentsoftware.exe

Win32 アプリのソース コードは、DCHU サンプルに含まれます。The source code for the Win32 app is included in the DCHU sample.

Windows ハードウェア デベロッパー センター ダッシュボードでターゲット指定が設定されているため、このコンポーネント ドライバー パッケージは デスクトップ SKU のみに配布されることに注意してください。Note that the component driver package is only distributed on Desktop SKUs due to targeting set in the Windows Hardware Dev Center dashboard. 詳しくは、「Windows Update にドライバーを公開する」をご覧ください。For more info, see Publish a driver to Windows Update.

ハードウェア サポート アプリとの通信を許可するAllow communication with a hardware support app

Fabrikam は、ユニバーサル ドライバー パッケージの一部として GUI ベースのコンパニオン アプリを提供したいと考えています。Fabrikam would like to provide a GUI-based companion app as part of the universal driver package. Win32 ベースのコンパニオン アプリケーションをユニバーサル ドライバー パッケージの一部にすることはできないため、Win32 アプリをユニバーサル Windows プラットフォーム (UWP) に移植し、アプリをデバイスとペアリングします。Because Win32-based companion applications cannot be part of a universal driver package, they port their Win32 app to the Universal Windows Platform (UWP) and pair the app with the device.

osrfx2_DCHU_base/device.c の次のスニペットでは、ベース ドライバー パッケージがデバイス インターフェイスのインスタンスにカスタム機能を追加する方法が示されています。The following snippet from osrfx2_DCHU_base/device.c shows how the base driver package adds a custom capability to the device interface instance:

    WDF_DEVICE_INTERFACE_PROPERTY_DATA PropertyData = { 0 };
    static const wchar_t customCapabilities[] = L"CompanyName.yourCustomCapabilityNameTBD_YourStorePubId\0";

    WDF_DEVICE_INTERFACE_PROPERTY_DATA_INIT(&PropertyData,
                                            &GUID_DEVINTERFACE_OSRUSBFX2,
                                            &DEVPKEY_DeviceInterface_UnrestrictedAppCapabilities);

    Status = WdfDeviceAssignInterfaceProperty(Device,
                                              &PropertyData,
                                              DEVPROP_TYPE_STRING_LIST,
                                              sizeof(customCapabilities),
                                              (PVOID)customCapabilities);

(DCHU サンプルに含まれない) 新しいアプリは、セキュリティで保護され、Microsoft Store で簡単に更新することができます。The new app (not included in the DCHU sample) is secure and can be updated easily in the Microsoft Store. UWP アプリケーション対応になったことで、Contoso は DISM (展開イメージのサービスと管理) を使ってアプリケーションを Windows デスクトップ エディションのイメージに事前に読み込みます。With the UWP application ready, Contoso uses DISM - Deployment Image Servicing and Management to pre-load the application on Windows desktop edition images.

INF ファイルに COM コンポーネントを登録するRegistering a COM component in an INF file

Fabrikam は、共同インストーラーを使用せずに COM コンポーネントを登録する必要があります。Fabrikam needs to register a COM component without using a co-installer. そこでユニバーサル INF ファイルでこれを実現するために、WDK で配布された Reg2inf ツール を使用します。In order to accomplish this in a universal INF file, they use the Reg2inf tool distributed in the WDK. 同社は COM サーバー プロジェクト (In-process ATL COM server のサンプル から取得) をビルドした後、COM .dll を Reg2inf ツールへの入力として指定します。After building their COM server project (taken from the In-process ATL COM server sample), they provide the COM .dll as an input to the Reg2inf tool. このツールによって次の INF ディレクティブが生成され、Fabrikam はこれを基本 INF (osrfx2_DCHU_base.inx) に追加します。The tool then generates the following INF directives that Fabrikam includes in their base INF (osrfx2_DCHU_base.inx):

; Add all registry keys to successfully register the
; In-Process ATL COM Server MSFT Sample.
[OsrFx2_AddReg_COM]
HKCR,AppID\ATLDllCOMServer.DLL,AppID,,"{9DD18FED-55F6-4741-AF25-798B90C4AED5}"
HKCR,AppID\{9DD18FED-55F6-4741-AF25-798B90C4AED5},,,"ATLDllCOMServer"
HKCR,ATLDllCOMServer.SimpleObject,,,"SimpleObject Class"
HKCR,ATLDllCOMServer.SimpleObject\CLSID,,,"{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}"
HKCR,ATLDllCOMServer.SimpleObject\CurVer,,,"ATLDllCOMServer.SimpleObject.1"
HKCR,ATLDllCOMServer.SimpleObject.1,,,"SimpleObject Class"
HKCR,ATLDllCOMServer.SimpleObject.1\CLSID,,,"{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084},,,"SimpleObject Class"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\InprocServer32,,%REG_EXPAND_SZ%,"%%SystemRoot%%\System32\ATLDllCOMServer.dll"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\InprocServer32,ThreadingModel,,"Apartment"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\ProgID,,,"ATLDllCOMServer.SimpleObject.1"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\Programmable,,%FLG_ADDREG_KEYONLY%
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\TypeLib,,,"{9B23EFED-A0C1-46B6-A903-218206447F3E}"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\VersionIndependentProgID,,,"ATLDllCOMServer.SimpleObject"

複数の INF ファイルを密結合するTightly coupling multiple INF files

基本パッケージ、拡張パッケージ、コンポーネント パッケージの間には、優れたバージョン管理コントラクトが存在するのが理想です。Ideally, there should be strong versioning contracts between base, extensions and components. これら 3 つのパッケージが個別にサービスを受けることには ("疎結合" のシナリオ) サービス上のメリットがありますが、シナリオによっては、バージョン管理コントラクトが不十分なために、単一のドライバー パッケージへのバンドル ("密結合") が必要な場合があります。There are servicing advantages in having these three packages serviced independently (the "loosely coupled" scenario), but there are scenarios where they need to be bundled in a single driver package ("tightly coupled") due to poor versioning contracts. 次のサンプルでは、両方のシナリオの例が示されています。The sample includes examples of both scenarios:

[OsrFx2Extension_Install.NT]
CopyInf=osrfx2_DCHU_component.inf

このディレクティブは、多機能デバイス内での INF ファイルのインストールを調整することもできます。This directive can also be used to coordinate installation of INF files in multifunction devices. 詳しくは、「Copying INF files」 (INF ファイルのコピー) をご覧ください。For more details, see Copying INF files.

注意

ベース ドライバーのペイロードに拡張機能を格納する (そして、配送先住所ラベルでベース ドライバーをターゲットにする) ことはできますが、別のドライバーとバンドルされている拡張機能を、拡張機能のハードウェア ID に公開することはできません。While a base driver can payload an extension (and target the base driver in the shipping label), an extension bundled with another driver cannot be published to the extension hardware ID.

ドライバー ストアから実行するRun from the driver store

ドライバーを容易に更新できるように、Fabrikam は、可能であれば dirid 13 を使って、ドライバー ストア をドライバー ファイルのコピー先として指定します。To make it easier to update the driver, Fabrikam specifies the Driver Store as the destination to copy the driver files by using dirid 13 where possible. コピー先ディレクトリの値として 13 を使うと、ドライバー更新プロセスの間の安定性が向上します。Using a destination directory value of 13 can result in improved stability during the driver update process. osrfx2_DCHU_base.inx の例を次に示します。Here is an example from osrfx2_DCHU_base.inx:

[DestinationDirs]
OsrFx2_UserSvcCopyFiles = 13 ; copy to Driver Store

ドライバー ストアから実行されているカーネル モード ドライバーは、IoQueryFullDriverPath を呼び出してそのパスを使用し、パスを基準として構成ファイルを見つけます。A kernel mode driver that is running from the Driver Store can call IoQueryFullDriverPath and use that path to find configuration files relative to it. カーネル モード ドライバーが KMDF ドライバーの場合、WdfDriverWdmGetDriverObject を使用して、IoQueryFullDriverPath に渡す WDM ドライバー オブジェクトを取得できます。If the kernel mode driver is a KMDF driver, it can use WdfDriverWdmGetDriverObject to retrieve the WDM driver object to pass to IoQueryFullDriverPath. UMDF ドライバーは、GetModuleHandleExW および GetModuleFileNameW を使用してドライバーがどこから読み込まれたかを特定できます。UMDF drivers can use GetModuleHandleExW and GetModuleFileNameW to determine where the driver was loaded from. たとえば、次のように入力します。For example:

bRet = GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
                         (PCWSTR)&DriverEntry,
                         &handleModule);
if (bRet) {
   winErr = GetModuleFileNameW(handleModule, 
                               path, 
                               pathLength);
     …

ドライバー ストアから動的にファイルを見つけて読み込むDynamically finding and loading files from the Driver Store

ドライバー パッケージには、別のドライバー パッケージのバイナリまたはユーザー モード コンポーネントによって読み込まれるファイルが含まれている場合があります。In some scenarios, a driver package may contain a file that is intended to be loaded by a binary in another driver package or by a user mode component.

次にいくつかの例を示します。Here are a couple examples:

  • ユーザー モード DLL は、ドライバー パッケージ内のドライバーと通信するためのインターフェイスを提供します。A user mode DLL provides an interface for communicating with a driver in the driver package.
  • 拡張ドライバー パッケージには、ベース ドライバー パッケージ内のドライバーによって読み込まれる構成ファイルが含まれています。An extension driver package contains a configuration file that is loaded by the driver in the base driver package.

このような場合、ドライバー パッケージでは、デバイスによって開示される、ファイルのパスまたはデバイス インターフェイスを示す状態を設定する必要があります。In these situations, the driver package should set some state indicating the path of the file or a device interface exposed by the device.

たとえば、ドライバー パッケージで HKR AddReg を使用してこの状態を設定できます。For example, the driver package could use an HKR AddReg to set this state. この例では、ExampleFile.dll について、ドライバー パッケージは subdir のない SourceDisksFiles エントリを持つとします。For this example, it should be assumed that for ExampleFile.dll, the driver package has a SourceDisksFiles entry with no subdir. この結果、このファイルはドライバー パッケージの root に存在し、CopyFiles ディレクティブの DestinationDirs には dirid 13 が指定されます。This results in the file being at the root of the driver package directory, and the DestinationDirs for a CopyFiles directive specifies dirid 13.

デバイスの状態としてこれを設定する INF の例を次に示します。Here is an INF example for setting this as device state:

[ExampleDDInstall.HW]
AddReg = Example_DDInstall.AddReg

[Example_DDInstall.AddReg]
HKR,,ExampleValue,,%13%\ExampleFile.dll

デバイス インターフェイスの状態としてこれを設定する INF の例は次のようになります。An INF example for setting this as device interface state would be:

[ExampleDDInstall.Interfaces]
AddInterface = {<fill in an interface class GUID for an interface exposed by the device>},,Example_Add_Interface_Section

[Example_Add_Interface_Section]
AddReg = Example_Add_Interface_Section.AddReg

[Example_Add_Interface_Section.AddReg]
HKR,,ExampleValue,,%13%\ExampleFile.dll

上記の例では、空フラグの値が使用されているため、REG_SZ レジストリ値になります。The above examples use an empty flags value, which results in a REG_SZ registry value. これにより、 %13% が完全修飾ユーザー モード ファイル パスに変換されます。This results in the %13% being turned into a fully qualified user mode file path. 多くの場合、このパスは環境変数の相対パスであることが望ましいです。In many cases, it is preferable to have the path be relative to an environment variable. フラグ値 0x20000 を使用すると、レジストリ値はタイプ REG_EXPAND_SZ となり、 %13% は適切な環境変数で変換され、パスの場所が抽象化されます。If a flags value of 0x20000 is used, the registry value is of type REG_EXPAND_SZ and the %13% converts to a path with appropriate environment variables to abstract the location of the path. このレジストリ値を取得する場合、ExpandEnvironmentStrings を呼び出して、パスの環境変数を解決します。When retrieving this registry value, call ExpandEnvironmentStrings to resolve the environment variables in the path.

カーネル モード コンポーネントによってこの値を読み取る必要がある場合、値は REG_SZ 値でなければなりません。If the value needs to be read by a kernel mode component, the value should be a REG_SZ value. カーネル モード コンポーネントはこの値を読み取るときに、先頭に \??\ を付けてから、ZwOpenFile などの API に渡す必要があります。When the kernel mode component reads that value, it should prepend \??\ before passing it to APIs such as ZwOpenFile.

この設定がデバイスの状態の一部である場合にアクセスするには、まずアプリケーションはデバイスの ID を検索する必要があります。To access this setting when it is part of the device's state, first the application must find the identity of the device. ユーザー モード コードでは、CM_Get_Device_ID_List_Size および CM_Get_Device_ID_List を使用してデバイスの一覧 (必要に応じて、フィルタ適用) を取得できます。User mode code can use CM_Get_Device_ID_List_Size and CM_Get_Device_ID_List to get a list of devices, filtered as necessary. このデバイスの一覧には複数のデバイスが含まれている場合があるため、デバイスから状態を読み取る前に、適切なデバイスを検索します。That list of devices might contain multiple devices, so search for the appropriate device before reading state from the device. たとえば、特定の条件に一致するデバイスを検索するときに、CM_Get_DevNode_Property を呼び出して、そのデバイスのプロパティを取得します。For example, call CM_Get_DevNode_Property to retrieve properties on the device when looking for a device matching specific criteria.

適切なデバイスが見つかったら、CM_Open_DevNode_Key を呼び出して、デバイスの状態が格納されたレジストリの場所へのハンドルを取得します。Once the correct device is found, call CM_Open_DevNode_Key to get a handle to the registry location where the device state was stored.

カーネル モード コードでは、PDO (物理デバイス オブジェクト) を取得し、IoOpenDeviceRegistryKey を呼び出す必要があります。Kernel mode code should retrieve a PDO (physical device object) and call IoOpenDeviceRegistryKey.

デバイス インターフェイスの状態の場合にこの設定にアクセスするために、ユーザー モード コードで CM_Get_Device_Interface_List_Size および CM_Get_Device_Interface_List を呼び出すことができます。To access this setting when it is device interface state, User mode code can call CM_Get_Device_Interface_List_Size and CM_Get_Device_Interface_List.

また、デバイス インターフェイスの接続や削除の通知を受けるために、CM_Register_Notification を使用できます。これにより、コードではインターフェイスが有効化されたときに通知を受け、状態を取得できます。Additionally CM_Register_Notification can be used to be notified of arrivals and removals of device interfaces so the code gets notified when the interface is enabled and then can retrieve the state. 上記の API で使用されるデバイス インターフェイス クラスには、複数のデバイス インターフェイスがある可能性があります。There may be multiple device interfaces in the device interface class used in the above APIs. これらのインターフェイスを確認し、設定を読み込むために適切なインターフェイスを特定します。Examine those interfaces to determine which is the correct interface for the setting to read.

適切なインターフェイスが見つかったら、CM_Open_Device_Interface_Key を呼び出します。Once the correct device interface is found, call CM_Open_Device_Interface_Key.

カーネル モード コードでは、状態を取得するデバイス インターフェイスのシンボリック リンク名を取得できます。Kernel mode code can retrieve a symbolic link name for the device interface from which to get state. そのためには、IoRegisterPlugPlayNotification を呼び出して、適切なデバイス インターフェイス クラスでデバイス インターフェイス通知に登録します。To do so, call IoRegisterPlugPlayNotification to register for device interface notifications on the appropriate device interface class. 別の方法として、システム上の現在のデバイス インターフェイスの一覧を取得するために IoGetDeviceInterfaces を呼び出すこともできます。Alternatively, call IoGetDeviceInterfaces to get a list of current device interfaces on the system. 上記の API で使用されるデバイス インターフェイス クラスには、複数のデバイス インターフェイスがある可能性があります。There may be multiple device interfaces in the device interface class used in the above APIs. これらのインターフェイスを確認し、読み込まれる設定を持つ適切なインターフェイスを特定します。Examine those interfaces to determine which is the correct interface that should have the setting to be read.

適切なシンボリック リンク名が見つかったら、IoOpenDeviceInterfaceRegistryKey を呼び出して、デバイス インターフェイスの状態が格納されたレジストリの場所へのハンドルを取得します。Once the appropriate symbolic link name is found, call IoOpenDeviceInterfaceRegistryKey to retrieve a handle to the registry location where the device interface state was stored.

注意

CM_GETIDLIST_FILTER_PRESENT フラグと CM_Get_Device_ID_List_Size および CM_Get_Device_ID_List を使用するか、CM_GET_DEVICE_INTERFACE_LIST_PRESENT フラグと CM_Get_Device_Interface_List_Size および CM_Get_Device_Interface_List を使用します。Use the CM_GETIDLIST_FILTER_PRESENT flag with CM_Get_Device_ID_List_Size and CM_Get_Device_ID_List or the CM_GET_DEVICE_INTERFACE_LIST_PRESENT flag with CM_Get_Device_Interface_List_Size and CM_Get_Device_Interface_List. これにより、ハードウェアが存在し、通信の準備ができていることを確認します。This ensures that hardware is present and ready for communication.

要約Summary

次の図は、Fabrikam と Contoso がユニバーサル Windows ドライバー用に作成したドライバー パッケージを示したものです。The following diagram shows the driver packages that Fabrikam and Contoso created for their Universal Windows Driver. 疎結合の例では、Windows ハードウェア デベロッパー センター ダッシュボードで、基本パッケージ、拡張パッケージ、コンポーネントパッケージの 3 回にわたってパッケージが別個に提出されます。In the loosely coupled example, they will make three separate submissions on the Windows Hardware Dev Center dashboard: one for the base, one for the extension, and one for the component. 密結合の例では、基本パッケージと拡張/コンポーネント パッケージの 2 つが提出されます。In the tightly coupled example, they will make two submissions: base and extension/component.

拡張、基本、コンポーネントの各ドライバー パッケージ

コンポーネント INF はコンポーネント ハードウェア ID に一致し、基本 INF と拡張 INF はボードのハードウェア ID に一致することに注意してください。Note that the component INF will match on the component hardware ID, whereas the base and extensions will match on the board's hardware ID.

See also

ユニバーサル Windows ドライバーの概要Getting Started with Universal Windows drivers

拡張 INF ファイルの使用Using an Extension INF File