デバイスのインストールおよびドライバーの更新中のシステム再起動の回避
デバイスのインストール中にシステムが再起動しないようにするには、次の規則を使用します。
INF DDInstall セクションの [Reboot] または [Restart] エントリを使用しないでください。 これらのディレクティブは、もともと Windows 9x/Me との互換性のために提供されたものであり、Windows 2000 以降のバージョンの Windows では使用しないでください。
絶対に必要な場合を除き、COPYFLG_FORCE_FILE_IN_USE または COPYFLG_REPLACE_BOOT_FILE フラグを INF CopyFiles ディレクティブで使用しないでください。
ドライバー パッケージ内のすべてのファイルは、ドライバー ストアから実行してください。
ドライバー パッケージ内のファイルがドライバー ストアから実行されない場合は、クラス インストーラーまたは共同インストーラー、またはサービス DLL の新しい各バージョンに新しいファイル名を割り当てます。 これにより、古いバージョンが使用されている場合にシステムを再起動する必要がなくなります。 (実際、更新されたクラス インストーラーまたはクラス共同インストーラーに新しいファイル名が使用されていない場合、これらの新しいファイルはインストールに使用されません)。
デバイスのドライバーを更新するには、「ドライバー ファイルの更新」に一覧表示されている規則に従います。
ファイルに格納されるドライバーを更新するときの再起動を最小限に抑える
Windows 10 より前では、すべてのカーネル モード ドライバーがシステムのページング ファイルによってサポートされていました。 その結果、ドライバーの実行中でも、ドライバー バイナリがディスク上で上書きされる可能性がありました。
パフォーマンスを向上させるために、Windows 10 以降では、ほとんどの非ブートスタート ドライバーは、代わりにディスク上のドライバー バイナリによってサポートされます。
ファイル使用になったドライバーの起動の種類は次のとおりです。
SERVICE_SYSTEM_START (0x00000001)
SERVICE_AUTO_START (0x00000002)
SERVICE_DEMAND_START (0x00000003)
ブート スタート ドライバーは、引き続きページング ファイルによってサポートされます。
ファイル使用のドライバーを更新するには、次のベスト プラクティスを使用します。 それ以外の場合、更新には 2 回の再起動が必要になる場合があります。1 回はファイルを置き換えるため、もう 1 回はドライバーの新しいバージョンを読み込むためです。
INF ファイルを使用している場合は、次の手順に従ってください。
ドライバー INF ファイルの CopyFiles セクションを次のように変更して、COPYFLG_IN_USE_RENAME を使用するようにします。
[MyDriver_Install.NT] CopyFiles=MyDriverCopy [MyDriverCopy] MyDriver.sys,,,0x00004000 ; COPYFLG_IN_USE_RENAME
このフラグを使用すると、Windows はディスク上のドライバー ファイルの置き換えを試みます。 詳細については、「INF CopyFiles ディレクティブ」を参照してください。
INF が PnP ドライバー用の場合、デバイスのインストール中に、Windows は実行中のドライバーをアンロードし、それを使用するデバイスを再起動して、ドライバーの新しいバージョンを選択しようとします。 それが失敗した場合、デバイスのインストールはシステムを再起動する必要があることを示します。
INF が PnP ドライバー用ではなく、InstallHInfSection などのメソッドを使用して INF を処理している場合は、ドライバーを手動で停止して再起動してください。
開いているすべてのドライバーのハンドルを閉じて、次のいずれかのメソッドを使用してドライバーを停止します。
sc.exe stop <mydriver>
ControlService(SERVICE_CONTROL_STOP)
詳細については、「ControlService 関数」 を参照してください。
INF ファイルを使用していない場合は、次の手順を使用します。
前述のように、ドライバーを停止します。 古いドライバー バイナリ ファイルを新しいファイルに置き換えます。
ドライバーを停止できない場合は、既存のファイルの名前を変更し、新しいファイルを所定の場所にコピーし、既存のファイルが将来削除されるように設定します (たとえば、MoveFileEx を MOVEFILE_DELAY_UNTIL_REBOOT フラグと共に使用して)。 新しいバージョンのドライバーの使用を開始するには、システムを再起動する必要があります。