WinPE:建立應用程式

Windows PE (WinPE) 授權給原始設備製造商, (OEM) 建立自訂的部署和復原公用程式。 本主題提供 OEM 的指導方針,以開發在 Windows PE 中執行的部署和復原應用程式。

注意 Windows PE 不是一般用途的作業系統。 除了部署和復原以外,不可能將它用於任何其他用途。 不得當作精簡型用戶端或內嵌作業系統使用。

擴展

大部分的 Windows PE 應用程式都是提供自己 GUI 的固定函式殼層應用程式。 兩個範例包括 Windows 安裝程式應用程式和 Windows 復原環境 (Windows RE) 。

  • 如果可以接受顯示命令提示字元,請修改 Startnet.cmd – 這是自動啟動應用程式的最方便方式。 請參閱 WinPE:掛接和自訂

  • 若要讓應用程式略過命令列並在 GUI 中啟動,請使用 Winpeshl.exe、Wpeinit.exe、wpeutil.exe 和 wpeutil.dll。

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

根據預設,Winpeshl.exe是在 Windows PE 開機時的第一個進程執行。 這是由類型為 REG_SZ 的下列登錄值所指定。

HKEY_LOCAL_MACHINE
   System
      Setup
         CmdLine

Winpeshl.exe搜尋名為 Winpeshl.ini 的檔案。 如果檔案不存在,Winpeshl.exe會啟動執行 Startnet.cmd 腳本的Cmd.exe進程。 如果Winpeshl.ini存在且其中包含要啟動的應用程式,則會執行這些應用程式,而不是Cmd.exe。

Wpeinit.exe會在 Windows PE 啟動時安裝 隨插即用 (PnP) 裝置、啟動網路堆疊,以及處理Unattend.xml設定。 如需詳細資訊,請參閱 Wpeinit 和 Startnet.cmd:使用 WinPE 啟動指令碼

網路功能可以隨時執行,方法是允許 windows PE 啟動時執行Wpeinit.exe,或執行 Wpeutil Command-Line Options 命令。

自訂殼層應用程式可以使用 LoadLibraryGetProcAddress 函式直接呼叫 Wpeutil.dll。

Wpeutil.dll所匯出的每個函式都有與 WinMain 函式相同的函式簽章,如下列程式碼範例所示。

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 Command-Line Options

Visual Studio 專案設定

某些基本 Visual Studio 專案設定可能與 Visual Studio 專案精靈所建立的預設值不同。 請確定您已設定專案的組建設定,以產生與 Windows PE 相容的應用程式和 DLL,如下所示:

  1. 您必須使用不使用 MFC 或 ATL 的原生 C 或 C++ 程式碼來開發 Windows PE 應用程式。 因此,如果您使用 Visual Studio 專案精靈,請選擇 Win32 專案,並確定不會核取 MFC 或 ATL。

  2. 設定專案選項以連結至靜態 C/C++ 執行時間程式庫,而不是.dll版本的 Msvcrt.dll。

  3. 開啟專案屬性,並將 組態屬性 \ C/C++ RunTime 程式庫 設定為 多執行緒多執行緒偵錯,而不是其中一個.dll版本。 如果您未執行此步驟,您的應用程式可能無法在 Windows PE 上執行。

  4. 如果您打算在 64 位版本的 Windows PE 上裝載應用程式,請設定專案建置選項,以在 Visual Studio 中使用 x64 編譯器編譯所有二進位檔。

  5. 如果您打算在 32 位版本的 Windows PE 上裝載應用程式,請將專案選項設定為使用 x86 編譯器進行編譯。

  6. 請確定您的專案未設定 /clr:編譯器選項。 此選項會產生 Managed C++ 程式碼,而不會在 Windows PE 上執行。

警告 您的應用程式可以使用您從協力廠商撰寫或授權的自訂.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 (Wimgapi.lib) 映射 API

如果 API 的行為與在完整 Windows 作業系統上的行為相同,且如 Windows SDK for Windows 作業系統中所述,除非另有說明,否則會被視為支援,且可供應用程式使用。 因為 Windows PE 是以 Windows 中的元件為基礎,所以它包含 Windows SDK for Windows 作業系統中發佈的大量 Windows API 子集。 除非這些支援的 API 受到唯一 Windows PE 環境影響,否則這些支援 API 的參數、呼叫慣例和行為會相同或幾乎與完整 Windows 作業系統相同。 僅使用這些 API 的應用程式應該可在完整的 Windows 作業系統和 Windows PE 之間移植。

在某些情況下,可能的參數值的子集可在 Windows PE 上使用。 這可能是因為執行時間環境特有的條件,例如在唯讀媒體上執行、無法存取永續性狀態或其他設計限制。 在此情況下,可能不支援 API,但如果沒有其他替代專案,可能仍可用來完成特定工作。

一般而言,如果 API 在 Windows PE 上運作不正確或完全不正常,則不支援它,而且不得使用,即使它位於 Windows PE 中包含的二進位檔中也一樣。 API 可能會因為 Windows PE 是 Windows 作業系統的子集,或因為 Windows PE 特有的執行時間設計考慮而失敗。 這類失敗不會被視為 Windows PE 中的 Bug。

因為 Windows PE 中沒有許多 Windows 元件,所以無法使用許多 API。 它們可能完全遺失,因為它們所在的 Windows 二進位檔不存在。 或者,它們可能只是部分存在,因為雖然它們所在的 Windows 二進位檔存在,但它們相依的一或多個二進位檔不是。 此外,某些存在於 Windows PE 中的 API 無法正常運作,而且行為與 Windows 中的運作方式不同。 這些 API 不受支援,且不得使用,因為 Windows PE 上的行為未定義。

有時候,可能沒有任何適當的 API 可以完成特定工作。 若要尋找替代解決方案,您需要不同的應用程式邏輯、不同的演算法設計,或重新定義基礎問題。

WinPE for Windows 10

WinPE:偵錯應用程式