WinPE: создание приложений

Windows PE (WinPE) лицензируется изготовителям оборудования (OEM) для создания настраиваемых служебных программ развертывания и восстановления. В этом разделе приводятся рекомендации для изготовителей оборудования по разработке приложений для развертывания и восстановления, которые выполняются в Среде предустановки Windows.

Примечание Windows PE не является операционной системой общего назначения. Его нельзя использовать для каких-либо целей, кроме развертывания и восстановления. Его не следует использовать в качестве тонкого клиента или встроенной операционной системы.

Расширяемости

Большинство приложений Windows PE — это приложения оболочки с фиксированными функциями, которые предоставляют собственный графический интерфейс. Два примера: приложение установки Windows и среда восстановления Windows (Windows RE).

  • Если можно отобразить командную строку, измените Startnet.cmd — это самый удобный способ автоматического запуска приложения. См . раздел WinPE: подключение и настройка.

  • Чтобы приложение обошло командную строку и начало работы с графическим интерфейсом, используйте Winpeshl.exe, Wpeinit.exe, wpeutil.exe и wpeutil.dll.

Winpeshl.exe, Wpeinit.exe, wpeutil.exe и wpeutil.dll

По умолчанию Winpeshl.exe является первым запуском процесса при загрузке Среды предустановки Windows. Это определяется следующим значением реестра типа REG_SZ.

HKEY_LOCAL_MACHINE
   System
      Setup
         CmdLine

Winpeshl.exe выполняет поиск файла с именем Winpeshl.ini. Если файл не существует, Winpeshl.exe запускает Cmd.exe процесс, который выполняет скрипт Startnet.cmd. Если Winpeshl.ini существует и содержит приложения для запуска, эти приложения выполняются вместо Cmd.exe.

Wpeinit.exe устанавливает устройства Plug and Play (PnP), запускает сетевой стек и обрабатывает параметры Unattend.xml при запуске Windows PE. Дополнительные сведения см. в разделах Wpeinit и Startnet.cmd: использование скриптов запуска WinPE.

Сеть можно запустить в любое время, запустив Wpeinit.exe при запуске Среды предустановки Windows или выполнив команду Wpeutil Command-Line Options .

Настраиваемые приложения оболочки могут вызывать непосредственно в Wpeutil.dll с помощью функций LoadLibrary и GetProcAddress .

Каждая из функций, экспортируемых 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 экспорта см. в разделе Параметры Command-Line Wpeutil.

Параметры проекта Visual Studio

Некоторые базовые параметры проекта Visual Studio могут отличаться от параметров по умолчанию, созданных мастером проектов Visual Studio. Убедитесь, что вы настроили параметры сборки проекта для создания приложений и библиотек DLL, совместимых с Windows PE, следующим образом:

  1. Необходимо разрабатывать приложения Windows PE с помощью собственного кода C или C++, который не использует MFC или ATL. Поэтому при использовании мастера проектов Visual Studio выберите проект Win32 и убедитесь, что не установлен флажок MFC и ATL.

  2. Задайте для параметров проекта связь со статическими библиотеками среды выполнения C/C++, а не с .dll версией Msvcrt.dll.

  3. Откройте свойства проекта и задайте для параметра Свойства конфигурации \ Библиотека времени выполнения C/C++ значение Многопотоковая или Многопоточная отладка, а не одна из .dll версий. Если вы не выполните этот шаг, приложение может не выполняться в Среде предустановки Windows.

  4. Если вы планируете разместить приложение в 64-разрядной версии Windows PE, задайте параметры сборки проекта, чтобы компилировать все двоичные файлы с помощью компилятора x64 в Visual Studio.

  5. Если вы планируете разместить приложение в 32-разрядной версии Среды предустановки Windows, задайте параметры проекта для компиляции с помощью компилятора x86.

  6. Убедитесь, что в проекте не задан параметр компилятора /clr: . Этот параметр создает управляемый код C++, который не будет выполняться в Среде предустановки Windows.

Предупреждение Ваше приложение может использовать настроенные .dll файлы, которые вы пишете или лицензироваете у стороннего производителя. Добавьте эти .dll файлы в приложение для Windows PE. Однако не используйте Msvcrt.dll и не включайте дополнительные файлы .dll Windows, которые не являются частью Windows PE.

Справочник по совместимости API

Windows PE — это упрощенная операционная система начальной загрузки, основанная на подмножестве компонентов операционной системы Windows. Он предназначен для размещения приложений развертывания и восстановления. Таким образом, он содержит много двоичных файлов Windows, необходимых для размещения ИНТЕРФЕЙСов API, наиболее важных для этих классов приложений. Из-за размера и других конструктивных ограничений не все двоичные файлы Windows присутствуют в Среде предустановки Windows, и, следовательно, не все API Windows присутствуют или доступны для использования.

Поддерживаемые API в Среде предустановки Windows

В среде предустановки Windows поддерживаются следующие API:

  1. Наборы API Windows (Mincore.lib).

  2. API обслуживания образов развертывания и управления ими (DISM) (Dismapi.lib).

  3. API-интерфейсы обработки изображений для Windows (Wimgapi.lib).

Если API ведет себя так же, как и в полной операционной системе Windows и как описано в windows SDK для операционной системы Windows, он будет считаться поддерживаемым и может использоваться приложениями, если не указано иное. Так как среда предустановки Windows основана на компонентах Windows, она содержит значительное подмножество API-интерфейсов Windows, опубликованных в пакете WINDOWS SDK для операционной системы Windows. Параметры, соглашения о вызовах и поведение этих поддерживаемых API-интерфейсов будут такими же или почти такими же, как в полной операционной системе Windows, если на них не влияет уникальная среда Windows PE. Приложения, использующие только эти API, должны быть переносимы между полной операционной системой Windows и Windows PE.

В некоторых случаях подмножество возможных значений параметров можно использовать в Windows PE. Это может быть вызвано условиями, уникальными для среды выполнения, например выполнением на носителе только для чтения, отсутствием доступа к постоянному состоянию или другими ограничениями разработки. В этом случае API может не поддерживаться, но по-прежнему может использоваться для выполнения определенной задачи, если другой альтернативы нет.

Как правило, если API работает неправильно или вообще не работает в Среде предустановки Windows, он не поддерживается и не должен использоваться, даже если он находится в двоичном файле, включенном в Среду предустановки Windows. Api может завершиться сбоем, так как среда предустановки Windows является подмножеством операционной системы Windows или из-за соображений проектирования среды выполнения, уникальных для Среды предустановки Windows. Такие сбои не считаются ошибками в Среде предустановки Windows.

Поскольку многие компоненты Windows отсутствуют в Среде предустановки Windows, многие API недоступны. Они могут полностью отсутствовать, так как отсутствует двоичный файл Windows, в котором они находятся. Кроме того, они могут присутствовать только частично, так как хотя двоичный файл Windows, в котором они находятся, присутствует, один или несколько двоичных файлов, от которых они зависят, не являются. Кроме того, некоторые API, присутствующие в Среде предустановки Windows, работают неправильно и ведут себя иначе, чем в Windows. Эти API не поддерживаются и не должны использоваться, так как их поведение в Среде предустановки Windows не определено.

Иногда может не быть подходящего API для выполнения определенной задачи. Чтобы найти альтернативное решение, потребуется другая логика приложения, другая архитектура алгоритма или переопределение базовой задачи.

WinPE для Windows 10

WinPE: отладка приложений