[Windows PE] 윈도우 PE의 시작 프로그램 제어하기

Multibooting/Windows PE


이번 포스팅에서는 윈도우 PE의 시작 프로그램을 제어하는 방법을 알아보려 하는데요, 지난 포스팅에서 WINPESHL.INI에 대해서 간단하게 설명하기는 했지만 이 밖에 PE의 작업 순서와 쉘 프로그램, 시작 프로그램에 대한 개념 등 추가 설명이 더 필요할 것 같아서 이렇게 따로 포스팅하게 되었습니다.


Windows PE의 작업 순서


Windows PE의 부팅 프로세스는 다음과 같습니다.

1. 특정 미디어의 부팅 섹터가 로드됩니다. 컨트롤이 Bootmgr에 전달됩니다. Bootmgr은 BCD(부팅 구성 데이터)에서 기본 부팅 정보를 추출하고 컨트롤을 Boot.wim에 포함된 winload.exe에 전달합니다. 그러면 Winload.exe는 적절한 HAL(하드웨어 추상화 계층)을 로드하고 시스템 레지스트리 하이브 및 필요한 부팅 드라이버를 로드합니다. 로드가 완료되면 커널을 실행할 환경이 준비됩니다.

2. Ntoskrnl.exe가 실행되고 환경 설정이 완료됩니다. 세션 관리자(SMSS)로 제어가 전달됩니다.

3.SMSS는 레지스트리의 나머지를 로드하고 Win32 하위 시스템(Win32k.sys)과 해당 여러 프로세스를 실행하도록 환경을 구성합니다. SMSS는 Winlogon 프로세스를 로드하여 사용자 세션을 만든 다음 서비스 및 꼭 필요하지는 않은 나머지 장치 드라이버와 보안 하위 시스템(LSASS)을 시작합니다.

4. Winlogon.exe는 HKLM\SYSTEM\Setup\CmdLine 레지스트리 값에 따라 설치를 실행합니다. Winpeshl.exe%SYSTEMDRIVE%\sources\setup.exe(있는 경우)를 시작합니다. 그렇지 않으면 %SYSTEMROOT%\system32\winpeshl.ini에 지정된 응용 프로그램을 찾습니다. 응용 프로그램이 지정되지 않은 경우 Winpeshl.exe는 cmd /k %SYSTEMROOT%\system32\startnet.cmd를 실행합니다. 기본적으로 Windows PE에는 Wpeinit.exe를 시작할 Startnet.cmd 파일이 포함되어 있습니다. Wpeinit.exe는 네트워크 리소스를 로드하고 DHCP와 같은 네트워킹 구성 요소에 맞춰 조정됩니다.

5.Wpeinit.exe가 완료되면 명령 프롬프트 창이 표시됩니다. Windows PE의 부팅 프로세스가 완료됩니다.

출처 : http://technet.microsoft.com/ko-kr/library/cc721977(v=ws.10).aspx


마이크로소프트의 TechNet에는 여러 OEM 제조사들을 위해서 이렇게 자세한 PE 도움말을 제공하고 있습니다. 위의 내용은 이 중 대략적인 윈도우 PE의 작업 순서에 대한 내용인데요, 여기서 주목해야될 내용은 4번입니다. 대부분의 시작 프로그램이 레지스트리에 지정되어있는 일반 윈도우 환경과는 달리 윈도우 PE는 시작 프로그램들을 크게 3가지 방법으로 지정할 수 있는데요, 지난 포스팅에서 설명한 WINPESHL.INI를 통한 방법 외에도 Startnet.cmd, AutoUnattend.xml 을 통한 방법이 있습니다.

단순히 원도우 설치과정을 자동화 하기 위한 PE의 경우는 Startnet.cmd, AutoUnattend.xml 파일을 수정하는 방법을 사용해도 괜찮지만, WINPESHL.INI를 로드하는 WINPESHL.EXE 파일이 있어야 원활한 자원 분배가 가능하므로 마이크로소프트는 WINPESHL.INI를 통한 시작 프로그램 지정을 권장합니다. 저도 WINPESHL.INI를 수정하는 방법을 소개하도록 하겠습니다.


WINPESHL.INI 파일의 구조


[LaunchApp]
AppPath = %SYSTEMDRIVE%\myshell.exe
[LaunchApps]
%SYSTEMDRIVE%\mydir\application1.exe, -option1 -option2
application2.exe, -option1 -option2


마이크로소프트 TechNet에 공개된 WINPESHL.INI 도움말에서는 WINPESHL.INI 파일을 크게 두 섹션, 즉 [LaunchApp][LaunchApps] 섹션으로 분류합니다. 똑같아 보이지만 두번째 섹션은 LaunchApp's' 로 복수형이 사용된 것을 알 수 있는데요, 이를 통해 LaunchApp 섹션은 하나의 프로그램을, LaunchApps 섹션은 여러 프로그램들을 포함한다는 것을 알 수 있습니다.





[LaunchApp]
AppPath = %SYSTEMDRIVE%\myshell.exe


[LaunchApp] 섹션에는 쉘 프로그램을 지정합니다. '쉘 프로그램'은 윈도우의 시작 메뉴, 작업 표시줄 등 UI를 담당하는 Explorer.exe 같은 프로그램들을 지칭하는데요, 아무 프로그램이나 지정해주셔도 상관 없습니다. 단, 윈도우 PE에서는 쉘 프로그램이 종료될 경우 자동으로 시스템이 종료된다는 점을 염두하셔야 합니다.

'[Windows PE] 간단한 윈도우 PE 만들기' 에서는 Q-Dir을 쉘 프로그램으로 지정했었는데요, 이 밖에도 수많은 프로그램들을 쉘 프로그램으로 사용할 수 있습니다. 가볍게 BSExplorer을 사용할 수도 있고, 실제 윈도우와 비슷하게 만드려면 Explorer 쉘을 사용할 수도 있습니다.

쉘 프로그램을 지정할 때는 [LaunchApp] 섹션의 AppPath 항목에 실행될 프로그램을 지정해 주시면 되며, 명령줄 옵션은 사용할 수 없습니다. 그리고 되도록이면 절대 경로보다는 %SYSTEMDRIVE%, %SYSTEMROOT%, %WINDIR%, %TEMP% 같은 환경 변수들을 사용하시는 것이 좋습니다.





[LaunchApps]
%SYSTEMDRIVE%\mydir\application1.exe, -option1 -option2
application2.exe, -option1 -option2


[LaunchApps] 섹션에는 시작 프로그램들을 지정합니다. 시작 프로그램들은 맨 위부터 순서대로 실행되며, 파일의 경로만 적어주시면 됩니다. 명령줄 옵션을 사용할 수 있으므로 여러 플래그들을 덧붙이셔도 됩니다.

주로 PENetwork 같이 PE의 부팅과 함께 실행되어야 하는 프로그램들을 지정해서 사용합니다.





전 편에서 설명한 것처럼 이렇게 작성된 WINPESHL.INI 파일은 PE의 Windows\System32 폴더에 저장해주시면 됩니다. ^^