WinPE: 앱 만들기

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

pe가 시작될 때 Wpeinit.exe 실행하도록 허용하거나 Wpeutil Windows 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 옵션을 참조하세요.

프로젝트 설정 Visual Studio

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

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

  2. .dll 버전의 Msvcrt.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 PE에 모든 Windows 이진이 있는 것은 아니므로 모든 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 운영 체제용 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를 사용할 수 없습니다. 상주하는 Windows 이진이 없기 때문에 완전히 누락될 수 있습니다. 또는 해당 항목이 있는 Windows 이진이 있더라도 의존하는 하나 이상의 이진 파일은 없으므로 부분적으로만 존재할 수 있습니다. 또한 Windows PE에 있는 일부 API는 제대로 작동하지 않으며 Windows 작동과 다르게 작동합니다. 이러한 API는 지원되지 않으며 Windows PE에서의 동작이 정의되지 않았으므로 사용하지 않아야 합니다.

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

winPE for Windows 10

WinPE: 앱 디버그