WinPE: Crear aplicaciones

Windows PE (WinPE) tiene licencia para fabricantes de equipos originales (OEM) para crear utilidades de implementación y recuperación personalizadas. En este tema se proporcionan instrucciones para que los OEM desarrollen aplicaciones de implementación y recuperación que se ejecutan en Windows PE.

Nota Windows PE no es un sistema operativo de uso general. No se puede usar para ningún propósito que no sea la implementación y la recuperación. No debe usarse como cliente ligero ni como sistema operativo incrustado.

Extensibilidad

La mayoría de las aplicaciones de Windows PE son aplicaciones de shell de función fija que proporcionan su propia GUI. Dos ejemplos son la aplicación de instalación de Windows y el entorno de recuperación de Windows (Windows RE).

  • Si es aceptable mostrar un símbolo del sistema, modifique Startnet.cmd: esta es la manera más cómoda de iniciar automáticamente una aplicación. Consulta WinPE: Montaje y personalización.

  • Para que la aplicación omita la línea de comandos e inicie en la GUI, use Winpeshl.exe, Wpeinit.exe, wpeutil.exe y wpeutil.dll.

Winpeshl.exe, Wpeinit.exe, wpeutil.exe y wpeutil.dll

De forma predeterminada, Winpeshl.exe es el primer proceso que se ejecuta cuando se arranca Windows PE. Esto se especifica mediante el siguiente valor del Registro de tipo REG_SZ.

HKEY_LOCAL_MACHINE
   System
      Setup
         CmdLine

Winpeshl.exe busca un archivo denominado Winpeshl.ini. Si el archivo no existe, Winpeshl.exe inicia un proceso de Cmd.exe que ejecuta el script Startnet.cmd. Si Winpeshl.ini existe y contiene aplicaciones para iniciarse, estas aplicaciones se ejecutan en lugar de Cmd.exe.

Wpeinit.exe instala dispositivos Plug and Play (PnP), iniciando la pila de red y procesando la configuración de Unattend.xml cuando se inicia Windows PE. Para más información, consulte Wpeinit y Startnet.cmd: Uso de scripts de inicio de WinPE.

Las redes se pueden iniciar en cualquier momento ejecutando ya sea permitiendo que Wpeinit.exe se ejecuten cuando se inicia Windows PE o ejecutando el comando Wpeutil Command-Line Options .

Las aplicaciones de shell personalizadas pueden llamar directamente a Wpeutil.dll con las funciones LoadLibrary y GetProcAddress .

Cada una de las funciones exportadas por Wpeutil.dll tiene la misma firma de función que la función WinMain, como se muestra en el ejemplo de código siguiente.

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

En el ejemplo de código siguiente se muestra cómo inicializar las redes.

#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;}

Para obtener una lista completa de las exportaciones de Wpeutil.dll, consulte Opciones de Command-Line wpeutil.

Configuración del proyecto de Visual Studio

Algunos valores básicos del proyecto de Visual Studio pueden ser diferentes de los valores predeterminados creados por el Asistente para proyectos de Visual Studio. Asegúrese de configurar la configuración de compilación del proyecto para generar aplicaciones y archivos DLL compatibles con Windows PE, como se indica a continuación:

  1. Debe desarrollar aplicaciones de Windows PE con código nativo de C o C++ que no use MFC o ATL. Por lo tanto, si usa el Asistente para proyectos de Visual Studio, elija un proyecto de Win32 y asegúrese de que ni MFC ni ATL estén activados.

  2. Establezca las opciones del proyecto para vincular a las bibliotecas en tiempo de ejecución estáticas de C/C++, no a la versión .dll de Msvcrt.dll.

  3. Abra las propiedades del proyecto y establezca Propiedades de configuración \ C/C++ RunTime Library en Depuración multiproceso o multiproceso, no en una de las versiones de .dll. Si no realiza este paso, es posible que la aplicación no se ejecute en Windows PE.

  4. Si tiene previsto hospedar la aplicación en la versión de 64 bits de Windows PE, establezca las opciones de compilación del proyecto para compilar todos los archivos binarios con el compilador x64 en Visual Studio.

  5. Si tiene previsto hospedar la aplicación en la versión de 32 bits de Windows PE, establezca las opciones del proyecto para compilar con el compilador x86.

  6. Asegúrese de que el proyecto no tiene establecida la opción /clr: compilador. Esta opción genera código C++ administrado, que no se ejecutará en Windows PE.

Advertencia La aplicación puede usar archivos .dll personalizados que escriba o con licencia de un tercero. Agregue estos archivos .dll a la aplicación para Windows PE. Sin embargo, no use Msvcrt.dll y no incluya archivos adicionales de Windows .dll que no formen parte de Windows PE.

Referencia de compatibilidad de API

Windows PE es un sistema operativo ligero y de arranque basado en un subconjunto de componentes del sistema operativo Windows. Está diseñado para hospedar aplicaciones de implementación y recuperación. Por lo tanto, contiene muchos archivos binarios de Windows necesarios para hospedar las API que son más importantes para estas clases de aplicación. Debido al tamaño y a otras restricciones de diseño, no todos los archivos binarios de Windows están presentes en Windows PE y, por lo tanto, no todas las API de Windows están presentes o se pueden usar.

API admitidas en Windows PE

En Windows PE se admiten las siguientes API:

  1. Conjuntos de API de Windows (Mincore.lib).

  2. DEPLOYMENT Image Servicing and Management (DISM) API (Dismapi.lib).

  3. API de creación de imágenes para Windows (Wimgapi.lib).

Si una API se comporta igual que en el sistema operativo Windows completo y como se documenta en el sistema operativo Windows SDK para Windows, se considerará compatible y se puede usar en las aplicaciones a menos que se indique lo contrario. Dado que Windows PE se basa en componentes de Windows, contiene un subconjunto significativo de las API de Windows publicadas en windows SDK para el sistema operativo Windows. Los parámetros, las convenciones de llamada y los comportamientos de estas API admitidas serán los mismos o casi iguales que en el sistema operativo Windows completo, a menos que se vean afectados por el entorno único de Windows PE. Las aplicaciones que usan solo estas API deben ser portátiles entre el sistema operativo Windows completo y Windows PE.

En algunos casos, se puede usar un subconjunto de los valores de parámetro posibles en Windows PE. Esto puede deberse a condiciones exclusivas del entorno de ejecución, como ejecutarse en un medio de solo lectura, no tener acceso al estado persistente u otras limitaciones de diseño. En este caso, es posible que no se admita la API, pero se puede seguir usando para realizar una tarea específica si no hay ninguna otra alternativa.

En general, si una API funciona incorrectamente o no en Windows PE, no se admite y no se debe usar, incluso si reside en un binario incluido en Windows PE. Es posible que se produzca un error en la API porque Windows PE es un subconjunto del sistema operativo Windows o debido a las consideraciones de diseño en tiempo de ejecución exclusivas de Windows PE. Estos errores no se consideran errores en Windows PE.

Dado que muchos componentes de Windows no están presentes en Windows PE, muchas API no están disponibles. Pueden faltar por completo porque el binario de Windows en el que residen no está presente. Como alternativa, solo pueden estar parcialmente presentes porque aunque el binario de Windows en el que residen esté presente, uno o varios archivos binarios de los que dependen no lo sean. Además, algunas API que están presentes en Windows PE no funcionan correctamente y se comportan de forma diferente de lo que hacen en Windows. Estas API no son compatibles y no se deben usar, ya que su comportamiento en Windows PE no está definido.

A veces, puede que no haya ninguna API adecuada para realizar una tarea específica. Para encontrar una solución alternativa, necesitaría una lógica de aplicación diferente, un diseño de algoritmo diferente o una redefinición del problema subyacente.

WinPE para Windows 10

WinPE: Depuración de aplicaciones