WinPE: アプリの作成

Windows PE (WinPE) は、カスタマイズされた展開ユーティリティと回復ユーティリティを作成するために、相手先ブランド供給業者 (OEM) にライセンスが付与されています。 このトピックでは、Windows PE で実行される展開アプリと回復アプリを OEM が開発するためのガイドラインを示します。

Windows PE は、汎用的なオペレーティング システムではありません。 展開と回復以外の目的には使用できません。 シン クライアントまたは組み込み型のオペレーティング システムとして使用しないでください。

拡張性

Windows PE のアプリの大多数は、独自の GUI が備わった固定関数のシェル アプリです。 例として、Windows セットアップ アプリと Windows 回復環境 (Windows RE) の 2 つが挙げられます。

  • コマンドプロンプトを表示できる場合は、Startnet.cmdを変更します。これは、アプリを自動的に起動する最も便利な方法です。 「WinPE: マウントとカスタマイズ」をご覧ください。

  • アプリでコマンド ラインをバイパスして GUI で開始するには、Winpeshl.exe、Wpeinit.exe、wpeutil.exe、wpeutil.dll を使用します。

Winpeshl.exe、Wpeinit.exe、wpeutil.exe、wpeutil.dll

既定では、Windows PE の起動時に最初に実行されるプロセスは、Winpeshl.exe です。 これは、型が REG_SZ の次のレジストリ値によって指定されます。

HKEY_LOCAL_MACHINE
   System
      Setup
         CmdLine

Winpeshl.exe では、Winpeshl.ini という名前のファイルを検索します。 そのファイルが存在しない場合、Winpeshl.exe で Cmd.exe のプロセスを開始し、そこで Startnet.cmd スクリプトが実行されます。 Winpeshl.ini が存在し、起動するアプリが含まれている場合は、Cmd.exe の代わりにそれらのアプリが実行されます。

Wpeinit.exe でプラグ アンド プレイ (PnP) デバイスがインストールされ、これによってネットワーク スタックを開始し、Windows PE の起動時に Unattend.xml の設定を処理します。 詳細については、Wpeinit および Startnet.cmd: WinPE スタートアップ スクリプトの使用に関するページを参照してください。

ネットワークは、Windows PE の起動時に Wpeinit.exe を許可するか、Wpeutil コマンドライン オプション コマンドを実行することで、いつでも開始できます。

カスタマイズされたシェル アプリは、LoadLibrary 関数と GetProcAddress 関数を使用して、Wpeutil.dll 内に直接呼び出すことができます。

Wpeutil.dll でエクスポートされた各関数には、次のコード サンプルに示すように、WinMain Function と同じ関数シグネチャがあります。

int InitializeNetworkingW(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
);

次のコード サンプルは、ネットワークを初期化する方法を示しています。

#include <windows.h>
#include <tchar.h>
#include <stdio.h>
typedef int (*WpeutilFunction)( 
HINSTANCE hInst, 
HINSTANCE hPrev, 
LPTSTR lpszCmdLine, 
int nCmdShow 
);
int __cdecl _tmain( int argc, TCHAR *argv[] )
{
    
HMODULE         hWpeutil          = NULL;
    
WpeutilFunction InitializeNetwork = NULL;
    
int             result            = 0;
    
TCHAR           szCmdLine[]       = _T("");
    
hWpeutil = LoadLibrary( _T("wpeutil") );
    
if( NULL == hWpeutil )
    
{
        _tprintf( _T("Unable to load wpeutil.dll \ n") );
        
return GetLastError();
}
    
InitializeNetwork = (WpeutilFunction)GetProcAddress( 
hWpeutil, 
"InitializeNetworkW" 
);
    
if( NULL == InitializeNetwork )
    
{
        
FreeLibrary( hWpeutil );
        
return GetLastError();
    
}
    
result = InitializeNetwork( NULL, NULL, szCmdLine, SW_SHOW );
    
if( ERROR_SUCCESS == result )
    
{
        _tprintf( _T("Network initialized. \ n") );
    
}
  
else
    
{
        _tprintf( _T("Initialize failed: 0x%08x"), result );
    
}
    
FreeLibrary( hWpeutil );

return result;}

Wpeutil.dll のエクスポートの完全なリストについては、「Wpeutil コマンドライン オプション」をご覧ください。

Visual Studio のプロジェクト設定

Visual Studio の基本的なプロジェクト設定の一部が、Visual Studio プロジェクト ウィザードで作成された既定値とは異なる場合があります。 次のように、Windows PEと互換性のあるアプリとDLLを生成するようにプロジェクトのビルド設定を設定してください。

  1. Windows PE のアプリは、MFC と ATL のいずれも使用されないネイティブ C または C++ コードを使用して開発する必要があります。 そのため、Visual Studio プロジェクト ウィザードを使用する場合は、Win32 プロジェクトを選択し、MFC と ATL のいずれもオンになっていないことを確認する必要があります。

  2. .dll バージョンの Msvcrt.dll ではなく、C または C++ の静的ランタイム ライブラリにリンクされるように、プロジェクトのオプションを設定します。

  3. プロジェクトのプロパティを開き、.dll バージョンのいずれかではなく、[構成プロパティ] \ [C/C++ RunTime Library]\(C/C++ ランタイム ライブラリ\)[マルチスレッド] または [マルチスレッド デバッグ] に設定します。 この手順を実行しないと、アプリを Windows PE で実行できなくなるおそれがあります。

  4. Windows PE の 64 ビット バージョンにアプリをホストする予定の場合は、Visual Studio の x64 コンパイラを使用してすべてのバイナリをコンパイルするように、プロジェクトのビルド オプションを設定します。

  5. Windows PE の 32 ビット バージョンにアプリをホストする予定の場合は、x86 コンパイラを使用してコンパイルするように、プロジェクトのオプションを設定します。

  6. プロジェクトに /clr: コンパイラ オプションが設定されていないことを確認します。 このオプションに設定すると、Windows PE で実行されないマネージド C++ コードが生成されます。

警告 アプリでユーザーがカスタマイズした .dll ファイルや、サード パーティのライセンスを使用できます。 それらの .dll ファイルを Windows PE 用のアプリに追加します。 ただし、Msvcrt.dll を使用することや、Windows PE の一部でない追加の Windows .dll ファイルを含めることはしないでください。

API 互換性リファレンス

Windows PE は、Windows オペレーティング システムのコンポーネントのサブセットをベースとする、軽量のブートストラップ オペレーティング システムです。 展開アプリと回復アプリをホストするように設計されています。 そのため、そのようなクラスのアプリで最も重要な API をホストするために必要な数多くの Windows バイナリが含まれています。 サイズやその他の設計上の制約により、すべての Windows バイナリが Windows PE に存在するとは限らず、そのため、すべての Windows API が存在していて使用できるとは限りません。

Windows PE でサポートされている API

Windows PE では、次の API がサポートされています。

  1. Windows API セット (Mincore.lib)

  2. 展開イメージのサービスと管理 (DISM) API (Dismapi.lib)

  3. Windows 用イメージング API (Wimgapi.lib)

Windows フル オペレーティング システムでの動作と同じように、かつ Windows オペレーティング システム向け Windows SDK に記載されているとおりに動作する API については、サポート対象であり、別途記載されていない限りはアプリで使用できると見なされます。 Windows PE は Windows のコンポーネントをベースとするため、Windows オペレーティング システム向け Windows SDK で公開されている Windows API の大多数のサブセットが含まれています。 それらのサポート対象の API のパラメーター、呼び出し規則、動作は、Windows PE 固有の環境の影響を受けない場合に限り、Windows フル オペレーティング システムと同じまたはほぼ同じです。 それらの API のみが使用されるアプリは、Windows フル オペレーティング システムと Windows PE 間で移植できます。

場合によっては、考えられるパラメーター値のサブセットを Windows PE で使用できます。 これは、読み取り専用メディアでの実行、永続的な状態へのアクセス権を持たない、その他の設計上の制限など、ランタイム環境に固有の条件が原因である可能性があります。 この場合、サポートされていない可能性があるものの、他の代替手段がない場合は、引き続き特定のタスクを実行するためにその API を使用できます。

一般に、Windows PE 上で正しく動作しない、または一切動作しない API は、Windows PE に含まれているバイナリに属している場合でもサポートされていないため、使用してはなりません。 その API が失敗するのは、Windows PE が Windows オペレーティング システムのサブセットであるため、または Windows PE 固有のランタイム設計上の考慮事項が原因である可能性があります。 そのようなエラーは、Windows PE のバグとは見なされません。

Windows のコンポーネントの多くは Windows PE に存在しないため、多くの API は使用できません。 それらが属している Windows バイナリが存在しないため、完全に欠落している可能性があります。 またはそれらが属している Windows バイナリは存在するものの、それらが依存する 1 つ以上のバイナリが存在しないため、一部のみが存在している可能性があります。 さらに、Windows PE に存在する一部の API は正しく機能せず、Windows での動作とは異なります。 そのような Windows PE での動作が定義されていない API はサポートされていないため、使用しないでください。

場合によっては、特定のタスクを実行するための適切な API がないことがあります。 代替策を見つけるには、異なるアプリ ロジック、異なるアルゴリズム設計、またはその根底にある問題の再定義が必要です。

WinPE for Windows 10

WinPE: アプリのデバッグ