WinPE: 앱 만들기

WinPE(Windows PE)는 OEM(Original Equipment Manufacturers)에 라이선스를 부여하여 사용자 지정된 배포 및 복구 유틸리티를 만들 수 있습니다. 이 항목에서는 OEM이 Windows PE에서 실행되는 배포 및 복구 앱을 개발하기 위한 지침을 제공합니다.

참고 Windows PE는 범용 운영 체제가 아닙니다. 배포 및 복구 이외의 용도로는 사용할 수 없습니다. 씬 클라이언트 또는 임베디드 운영 체제로 사용해서는 안 됩니다.

확장성

대부분의 Windows PE 앱은 자체 GUI를 제공하는 고정 함수 셸 앱입니다. 두 가지 예로는 Windows 설치 프로그램 앱과 Windows RE(Windows 복구 환경)가 있습니다.

  • 명령 프롬프트를 표시할 수 있는 경우 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는 PnP(플러그 앤 플레이) 디바이스를 설치하여 네트워킹 스택을 시작하고 Windows PE가 시작될 때 Unattend.xml 설정을 처리합니다. 자세한 내용은 Wpeinit 및 Startnet.cmd: WinPE 시작 스크립트 사용을 참조하세요.

네트워킹은 Windows PE가 시작될 때 Wpeinit.exe를 실행하거나 Wpeutil 명령줄 옵션 명령을 실행하여 언제든지 시작할 수 있습니다.

사용자 지정된 셸 앱은 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 명령줄 옵션을 참조하세요.

Visual Studio 프로젝트 설정

일부 기본 Visual Studio 프로젝트 설정은 Visual Studio 프로젝트 마법사에서 만든 기본 설정과 다를 수 있습니다. 다음과 같이 Windows PE와 호환되는 앱 및 DLL을 생성하도록 프로젝트의 빌드 설정을 지정했는지 확인합니다.

  1. MFC 또는 ATL을 사용하지 않는 네이티브 C 또는 C++ 코드를 사용하여 Windows PE 앱을 개발해야 합니다. 따라서 Visual Studio 프로젝트 마법사를 사용하는 경우 Win32 프로젝트를 선택하고 MFC와 ATL이 모두 선택되어 있지 않은지 확인합니다.

  2. Msvcrt.dll의 .dll 버전이 아닌 정적 C/C++ 런타임 라이브러리에 연결하도록 프로젝트 옵션을 설정합니다.

  3. 프로젝트 속성을 열고 구성 속성 \ C/C++ 런타임 라이브러리를 .dll 버전 중 하나가 아닌 다중 스레드 또는 다중 스레드 디버그로 설정합니다. 이 단계를 수행하지 않으면 앱이 Windows PE에서 실행되지 않을 수 있습니다.

  4. 64비트 버전의 Windows PE에서 앱을 호스팅하려는 경우 Visual Studio에서 x64 컴파일러를 사용하여 모든 이진 파일을 컴파일하도록 프로젝트 빌드 옵션을 설정합니다.

  5. 32비트 버전의 Windows PE에서 앱을 호스팅하려는 경우 x86 컴파일러를 사용하여 컴파일하도록 프로젝트 옵션을 설정합니다.

  6. 프로젝트에 /clr: 컴파일러 옵션이 설정되어 있지 않은지 확인합니다. 이 옵션은 Windows PE에서 실행되지 않는 관리되는 C++ 코드를 생성합니다.

경고 앱은 사용자가 작성하거나 타사로부터 라이선스를 받은 사용자 지정된 .dll 파일을 사용할 수 있습니다. Windows PE용 앱에 이러한 .dll 파일을 추가합니다. 그러나 Msvcrt.dll을 사용하지 말고 Windows PE의 일부가 아닌 추가 Windows .dll 파일을 포함하지 마세요.

API 호환성 참조

Windows PE는 Windows 운영 체제의 구성 요소 하위 집합을 기반으로 하는 경량 부트스트랩 운영 체제입니다. 이는 배포 및 복구 앱을 호스팅하도록 설계되었습니다. 따라서 이러한 앱 클래스에 가장 중요한 API를 호스팅하는 데 필요한 많은 Windows 이진 파일이 포함되어 있습니다. 크기 및 기타 디자인 제약 조건으로 인해 모든 Windows 이진 파일이 Windows PE에 있는 것은 아니므로 모든 Windows API가 존재하거나 사용할 수 있는 것은 아닙니다.

Windows PE에서 지원되는 API

다음 API는 Windows PE에서 지원됩니다.

  1. Windows API 세트(Mincore.lib).

  2. DISM(배포 이미지 서비스 및 관리) API(Dismapi.lib).

  3. Windows용 이미징 API(Wimgapi.lib).

API가 전체 Windows 운영 체제에서와 동일하게 작동하고 Windows 운영 체제용 Windows SDK에 설명된 대로 작동하는 경우 달리 명시되지 않는 한 지원되는 것으로 간주되어 앱에서 사용할 수 있습니다. Windows PE는 Windows의 구성 요소를 기반으로 하기 때문에 Windows 운영 체제용 Windows SDK에 게시된 Windows API의 중요한 하위 집합을 포함합니다. 이러한 지원되는 API의 매개 변수, 호출 규칙 및 동작은 고유한 Windows PE 환경의 영향을 받지 않는 한 전체 Windows 운영 체제에서와 동일하거나 거의 동일합니다. 이러한 API만 사용하는 앱은 전체 Windows 운영 체제와 Windows PE 간에 이식 가능해야 합니다.

경우에 따라 Windows PE에서 사용 가능한 매개 변수 값의 하위 집합을 사용할 수 있습니다. 이는 런타임 환경에 고유한 조건(예: 읽기 전용 매체에서 실행, 영구 상태에 대한 액세스 권한 없음 또는 기타 디자인 제한 사항) 때문일 수 있습니다. 이 경우 API가 지원되지 않을 수 있지만 다른 대안이 없는 경우 특정 작업을 수행하는 데 계속 사용될 수 있습니다.

일반적으로 API가 Windows PE에서 잘못 작동하거나 전혀 작동하지 않으면 Windows PE에 포함된 이진 파일에 있더라도 지원되지 않으며 사용해서는 안 됩니다. Windows PE가 Windows 운영 체제의 하위 집합이거나 Windows PE에 고유한 런타임 디자인 고려 사항으로 인해 API가 실패할 수 있습니다. 이러한 오류는 Windows PE에서 버그로 간주되지 않습니다.

많은 Windows 구성 요소가 Windows PE에 없기 때문에 많은 API를 사용할 수 없습니다. 이러한 API가 상주하는 Windows 이진 파일이 없기 때문에 완전히 누락될 수 있습니다. 또는 이러한 API가 상주하는 Windows 이진 파일이 있지만 종속되는 하나 이상의 이진 파일이 없기 때문에 부분적으로만 존재할 수 있습니다. 또한 Windows PE에 있는 일부 API는 제대로 작동하지 않으며 Windows에서와 다르게 작동합니다. 이러한 API는 지원되지 않으며 Windows PE에서의 동작이 정의되지 않았으므로 사용해서는 안 됩니다.

경우에 따라 특정 작업을 수행하기에 적합한 API가 없을 수 있습니다. 대체 솔루션을 찾으려면 다른 앱 논리, 다른 알고리즘 디자인 또는 기본 문제의 재정의가 필요합니다.

Windows 10용 WinPE

WinPE: 디버그 앱