Windows PE용 앱 만들기

WinPE(Windows PE)는 사용자 지정 배포 및 복구 유틸리티를 만들 수 있도록 ISV(독립 하드웨어 공급업체) 및 OEM(주문자 상표 부착 방식)에게 사용이 허가됩니다. 이 항목에서는 Windows PE에서 실행되는 배포 및 복구 앱을 개발할 수 있도록 ISV 및 OEM을 위한 지침을 제공합니다.

note참고
Windows PE는 일반적인 용도의 운영 체제가 아니며, 배포 및 복구 이외의 용도로는 사용할 수 없습니다. 또한 씬 클라이언트 또는 임베디드 운영 체제로도 사용할 수 없습니다. Windows Embedded CE와 같은 기타 Microsoft® 제품을 이러한 용도로 사용할 수 있습니다.

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

  • 명령 프롬프트를 표시하는 것이 적합한 경우, Startnet.cmd를 수정하세요. 이것이 앱을 자동으로 시작하기 위한 가장 편리한 방법입니다. WinPE: 탑재 및 사용자 지정을 참조하세요.

  • 앱이 명령줄을 무시하고 GUI에서 시작되도록 하려면 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에 직접 호출할 수 있습니다. 자세한 내용은 정보: GetProcAddress() 및 LoadLibrary() 사용에 대한 대안을 참조하세요.

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 프로젝트 마법사에서 만든 기본값과 다를 수 있습니다. 다음과 같이 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. Windows PE의 64비트 버전에 앱을 호스트하려면 Visual Studio의 x64 컴파일러로 모든 바이너리를 컴파일하도록 프로젝트 빌드 옵션을 설정하세요.

  5. Windows PE의 32비트 버전에 앱을 호스트하려면 x86 컴파일러로 컴파일하도록 프로젝트 옵션을 설정하세요.

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

Warning경고
앱에는 자신이 작성한 또는 타사 라이선스의 사용자 지정된 .dll 파일을 사용할 수 있습니다. 이러한 .dll 파일을 Windows PE용 앱에 추가하세요. 그러나 Msvcrt.dll을 사용하지 말고, Windows PE의 일부가 아닌 추가 Windows .dll 파일을 포함하지도 마세요.

Windows PE는 Windows 운영 체제 구성 요소의 하위 집합을 기반으로 하는 가벼운 부트스트랩 운영 체제로서, 개발 및 복구 앱을 호스트하도록 설계되었습니다. 따라서 Windows PE에는 이러한 앱 클래스에 가장 중요한 API를 호스트하기 위해 필요한 많은 Windows 바이너리가 포함되어 있습니다. 크기 및 기타 디자인 제약 조건 때문에 일부 Windows 바이너리는 Windows PE에 없으며, 일부 Windows API 역시 없거나 사용하지 못합니다.

Windows PE에서는 다음과 같은 API가 지원됩니다.

  1. Windows API 집합(Mincore.lib).

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

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

전체 Windows 운영 체제에서와 동일하게 작동하고 Windows 운영 체제용 Windows SDK의 문서에 설명된 것과 동일하게 작동하는 API가 있다면, 달리 설명이 없어도 지원되는 것으로 간주할 수 있으며 앱에서 사용할 수 있습니다. 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 바이너리가 없기 때문에 API가 완전히 누락될 수도 있습니다. 또는 상주해 있는 Windows 바이너리가 있다고 해도 종속된 하나 이상의 바이너리가 없기 때문에 API가 부분적으로만 존재할 수도 있습니다. 또한 Windows PE에 있는 일부 API는 정확하게 작동하지 않거나 작동 방식이 Windows에서와 다릅니다. 이러한 API는 Windows PE에서의 동작이 정의되어 있지 않으므로 지원되지 않으며 사용해서는 안 됩니다.

때로는 특정 작업을 수행하기 위한 적절한 API가 없을 수 있습니다. 대체 솔루션을 찾으려면 다른 앱 논리나 다른 알고리즘 디자인 또는 기반 문제의 재정의가 필요할 수 있습니다.

참고 항목

표시:
© 2015 Microsoft