PE의 BCD에 '테스트 모드'를 체크하면 워터마크가 표시됩니다.

    PE에 그래픽 드라이버등 서명되지 않은 드라이버를 설치하려면 테스트 모드를 켜야하는데,

    은근히 보기 싫어서 차라리 어떻게 써먹을 방법이 없을까 생각하다가 만들어봤습니다.

     

     

     

    *WMIC 명령어들을 사용합니다. 다이어트가 많이 된 PE에선 작동하지 않을 수 있습니다.

     

    수정 방법

    mui 파일 수정은 resource hacker가 필요합니다. http://www.angusj.com/resourcehacker/

     

     

    첫번째 줄 (테스트 모드)

    X:\Windows\system32\ko-KR\shell32.dll.mui


    약 70자 정도를 넘어가면 짤려서 표시되지 않는듯 합니다. 긴 내용을 적고 싶은 경우 부팅해서 테스트해보셔야합니다.

    shell32.dll.mui는 '다른 프로그램에서 열려 있으므로 작업을 완료할 수 없습니다" 라고 뜨며 부팅된 이후에 수정할 수 없습니다.

    기본적인 PE의 정보나 주의사항등을 적기에 적합합니다.

     

     

    2번째 줄 (제품 이름)

    X:\Windows\branding\basebrd\ko-kr\basebrd.dll.mui


    Basebrd.dll.mui는 부팅된 이후에도 수정이 가능합니다. 수정된 이후에 탐색기(explorer.exe)또는 DWM.exe을 재시작하면 됩니다.

     

    배치파일로 rc 파일을 작성한 다음, resource hacker를 통해 res로 컴파일한 후 mui 파일을 수정하여 적용할 수 있습니다.

    아래에서 빨간색 글씨 부분만 수정하시면 됩니다.

     

    ::리소스 해커 경로 지정

    set rh="X:\Program Files\ResourceHacker\ResourceHacker.exe"

     

    ::입력할 문구 입력

    set TEXT=Sample text

     

    ::리소스 해커에서 사용할 RC파일 생성

    echo STRINGTABLE>"%temp%\StringTable20.rc"

    echo LANGUAGE LANG_KOREAN, SUBLANG_KOREAN>>"%temp%\StringTable20.rc"

    echo {>>"%temp%\StringTable20.rc"

    echo   314, "%text%%%1%%2">>"%temp%\StringTable20.rc"

    echo   315, "%text%%%1%%2">>"%temp%\StringTable20.rc"

    echo   316, "Windows 10 Enterprise Evaluation%%1%%2">>"%temp%\StringTable20.rc"

    echo   317, "Windows 10 Enterprise Evaluation%%1%%2">>"%temp%\StringTable20.rc"

    echo   318, "Windows 10 Enterprise N%%1%%2">>"%temp%\StringTable20.rc"

    echo   319, "Windows 10 Enterprise N%%1%%2">>"%temp%\StringTable20.rc"

    echo }>>"%temp%\StringTable20.rc"

     

    ::리소스 해커로 rc파일 res로 컴파일

    %rh% -open "%temp%\StringTable20.rc" -save "%temp%\StringTable20.res" -action compile

     

    ::리소스 해커로 mui파일 수정

    %rh% -open "X:\Windows\Branding\Basebrd\ko-KR\basebrd.dll.mui" -save "X:\Windows\Branding\Basebrd\ko-KR\basebrd.dll.mui" -action addoverwrite -res "%temp%\StringTable20.res" -mask 

     

    taskkill.exe /f /im dwm.exe

     

    세번째 줄 (빌드 번호)


    레지스트리 값을 수정해주시면 됩니다. 가장 쉽게 reg.add 명령만으로 수정이 가능합니다.

    reg.exe add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v "BuildLab" /d "표시할 내용" /f

     

    맨 앞에 Build가 붙는게 거슬린다면 


    1번째줄을 수정할때 편집했던 shell32.dll.mui의 STRINGTABLE,2070 부분에서 %ws Build %ws를 %ws %ws 로 바꿔주시면 됩니다.

     

      

     


    위 내용들을 활용한 예시입니다.

     

    수집중 메시지는 미리 Wim파일 내부의 파일들을 수정해놓았고,
    배치파일로 정보를 수집한 후 수정, 탐색기 재시작을 통해 적용하였습니다.

     

     

    설치된 운영체제 표시

    OS : Windows 7 Enterprise (0:1 C:40GB) / 

    OS : 설치된 운영체제 (디스크번호:파티션번호 드라이브문자:용량) / 

    C~W 드라이브 중에서 Windows\system32\config 폴더가 있는 드라이브 문자를 알아낸 다음

    해당 드라이브의 레지스트리 하이브를 불러와서 운영체제 정보를 읽습니다.

    드라이브 문자를 diskpart 명령어에 대입하여 몇번째 디스크, 몇번째 파티션인지, 용량이 몇인지 알아냅니다.


    운영체제가 여러 드라이브에 설치되어있는 경우 뒤에 이어붙여서 표시합니다.

     

    ::변수 초기화, 각종 오류를 막기 위해 사용하려는 변수를 미리 비워놓는 습관을 들이면 좋습니다.

    SET "WinDrvS="

    ::윈도우 설치된 드라이브 찾기, WinDrvS 변수에 Windows가 들어있는 드라이브의 문자를 쌓습니다.

    ::SET 변수=변수 %%a 와 같이 입력하였기에 기존값+새로운 값이 중복되어 등록되므로 결과값들이 쌓이게 됩니다.

    for %%a in (C D E F G H I J K L M N O P Q R S T U V W Y ) do (

    if exist "%%a:\windows\system32\config" set WinDrvS=!WinDrvS! %%a

    )

     

    :: 윈도우 찾을 수 없으면 (WinDrvS 변수에 저장된 값이 없으면) NA표시

    IF "%WinDrvS%" EQU "" (

    set "WinName= N/A"

    GOTO SKIP_WinName

    )

     

    ::설치된 윈도우 정보 수집, 위 명령과 비슷한 명령인데 C D E F G...대신에 WinDrvS(윈도가 들어있는 드라이브 문자)를 넣은것입니다.

    For %%B in (%WinDrvS%) do (

    ::Diskpart 명령을 통해 용량, 디스크, 파티션 번호를 알아냅니다.

    ::%Tcapa%=용량, %WINDISK%=디스크번호, %WINPAR% 파티션 번호 입니다.

    (echo sel vol %%B

    echo det vol

    echo lis par

    echo exit

    ) | diskpart>"%temp%\vol%%B.txt"

    for /f "tokens=3 usebackq delims= " %%a in (`"find "* 디스크" "%temp%\vol%%B.txt""`) do set WINDISK=%%a

    for /f "tokens=3 usebackq delims= " %%b in (`"find "* 파티션" "%temp%\vol%%B.txt""`) do set WINPAR=%%b

    for /f "tokens=1-2 delims=: usebackq" %%a in ("%temp%\vol%%B.txt") do (if "%%a" EQU "볼륨 용량        " set Tcapa=%%b)

    SET Tcapa=!Tcapa: =!

    ::설치된 운영체제 제품명을 알아내기 위해 윈도우 드라이브 (%%B:\)의 레지스트리 하이브를 탑재합니다.

    REG LOAD HKLM\Tmp_SFT "%%B:\windows\system32\config\SOFTWARE"

    ::레지스트리 쿼리 명령을 통해 제품명을 변수에 저장합니다. 

     

     

    ::괄호 사이에 주석을 넣으면 오히려 더 햇갈릴까봐 여기에 몰아서 적습니다. 

    ::결과값이 여러줄로 나오므로, 필요없는 값이 저장되는것을 막기 위해
    ::
    %%I EQU "    productname    " 명령을 썻습니다.

    ::이 경우 첫번째 토큰이 productname인 경우에만 %%J의 값을 %WinName2% 변수에 저장합니다.
    ::밑줄 친 부분은 %
    WinName2% 변수의 공백을 지우는 명령입니다.

    ::WinDrvS에 썻던것과 같은 요령으로 여러 드라이브에 운영체제가 있는 경우에 결과값을 %WinName% 변수에 이어붙입니다.

     

    FOR /F "TOKENS=1* DELIMS=REG_SZ USEBACKQ SKIP=1 " %%I IN (`Reg query "HKLM\Tmp_SFT\Microsoft\windows NT\CurrentVersion" /v "productname"`) DO (

    IF "%%I" EQU "    productname    " (

    SET WinName2=%%J

    FOR /F "TOKENS=* DELIMS= " %%Z IN ("!WinName2!") DO SET WinName2=%%Z

    SET "WinName=!WinName! !WinName2! (!WINDISK!:!WINPAR! %%B:!Tcapa!)"

    )

    )

    REG UNLOAD HKLM\Tmp_SFT

    )

     

    ::윈도우 없으면 여기로 건너뜀

    :SKIP_WinName

     

     

    IP주소 표시

    단순한 ipconfig 명령어에 첫번째 IP주소만 표시하기 위한 약간의 명령어가 추가되어 있습니다.

     

    ::현재 IP주소, 인터넷 연결 안된 경우엔 -.-.-.-로 표시되도록 기본값 설정

    SET "IP_Ad=-.-.-.-"

    FOR /F "TOKENS=2 DELIMS=: USEBACKQ" %%F IN (`IPCONFIG ^| FINDSTR /C:"IPv4 주소"`) do set IP_Ad=%%F

     

    ::앞에 공백 제거

    FOR /F "TOKENS=* DELIMS= " %%A IN ("%IP_Ad%") DO SET IP_Ad=%%A

     

    BIOS 타입 표시

    ::PE 빌더에 들어있는 코드를 약간 수정한것입니다.

    wpeutil.exe UpdateBootInfo

    For /f "tokens=2* delims= " %%A in ('Reg Query HKLM\System\CurrentControlSet\Control /v PEFirmwareType') Do Set Firmware=%%B

     

    ::나중에 불러올 수 있도록 BTYPE 변수에 저장해놓기

    If %Firmware%==0x1 set BTYPE=LEGACY

    If %Firmware%==0x2 set BTYPE=UEFI

     

    CPU 모델명, 물리코어와 논리코어의 갯수

    ::CPU 모델명

    for /F "tokens=* skip=1" %%n in ('wmic cpu get name ^| findstr "."') do set "CNAME=%%n"

     

    ::모델명 뒤 공백 지우기

    set CNAME=%CNAME%##

    set CNAME=%CNAME:        ##=##%

    set CNAME=%CNAME:    ##=##%

    set CNAME=%CNAME:  ##=##%

    set CNAME=%CNAME: ##=##%

    set CNAME=%CNAME:##=%

     

    ::CPU 물리 코어 수

    for /F "tokens=* skip=1" %%n in ('wmic cpu get NumberOfCores ^| findstr "."') do set "PCORE=%%n"

    set PCORE=%PCORE: =%

     

    ::CPU 논리 코어 수 / echo %CNAME% (%PCORE%C%LCORE%T)의 결과값 예시는 I7-5775C (4C8T) 입니다.

    for /F "tokens=* skip=1" %%n in ('wmic cpu get NumberOfLogicalProcessors ^| findstr "."') do set "LCORE=%%n"

    set LCORE=%LCORE: =%

     

    RAM 용량

    :: 총 메모리 용량

    for /F "tokens=* skip=1" %%n in ('wmic ComputerSystem get TotalPhysicalMemory ^| findstr "."') do set "TM=%%n"

    set TM=%TM: =%

     

    ::32비트 계산 한계 초과로 끝자리 날리고 계산

    set TM3=0

    set TM2=%TM:~,-2%

    set /a TM3=%TM2%/10737418

    IF %TM3% EQU 0 (

    set TM2=%TM:~,-3%

    set /a TM3=%TM2%/1073742

    )

     

    ::총 메모리 용량은 %TM% 변수에 저장되며 단위는 GB입니다. 예시 : echo %TM%GB

    set /a TM=%TM3%+1

     

     

    그래픽카드 정보

    그래픽카드 정보는 그래픽카드 드라이버가 설치돼야 읽어올 수 있습니다.

    따라서 부팅 직후에 실행되게 하면 안되고 드라이버팩 등으로 설치된 이후에 실행되도록 조절해주셔야합니다.

    아래 예시에선 설치된 경우에만 레지스트리 값을 한번 더 덮어씌웁니다.

     

    ::변수 초기화

    set "GNAME=0"

    :: 그래픽카드 모델명 조회, 얻은 값이 없으면 SKIP_GPU로 이동 (생략)

    for /F "tokens=* skip=1" %%n in ('WMIC path Win32_VideoController get Name ^| findstr "."') do set GNAME=%%n

    IF "%GNAME%" EQU "0" goto SKIP_GPU

    ::뒤에 공백 제거

    set GNAME=%GNAME%##

    set GNAME=%GNAME:                ##=##%

    set GNAME=%GNAME:        ##=##%

    set GNAME=%GNAME:    ##=##%

    set GNAME=%GNAME:  ##=##%

    set GNAME=%GNAME: ##=##%

    set GNAME=%GNAME:##=%

    ::Microsoft 기본 어댑터 등 의미없는 정보일 경우 SKIP_GPU로 이동 (생략)

    echo %GNAME%|findstr Microsoft&&SET GNAME=0&&goto SKIP_GPU

    IF "%GNAME%" EQU "Microsoft Basic Display Adapter" SET GNAME=0&&goto SKIP_GPU

    IF "%GNAME%" EQU "Microsoft 기본 디스플레이 어댑터" SET GNAME=0&&goto SKIP_GPU

    ::PE용 드라이버팩으로 드라이버를 설치했을때 장치 이름 앞에 붙는 (PE64) 등의 불필요한 문구 제거

    echo %GNAME%|findstr (PE64)&&set GNAME=%GNAME:(PE64) =%

    echo %GNAME%|findstr (PE64)&&set GNAME=%GNAME:(PE64)=%

    echo %GNAME%|findstr Vulkan&&set GNAME=%GNAME:Vulkan=%

    :: GNAME 변수에 0이 아닌 뭔가 저장되어있을때만 레지스트리에 등록, %GNAME% 변수에 모델명이 저장됩니다.

    IF "%GNAME%" NEQ "0" (

    reg.exe add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v "BuildLab" /d "CPU : %CNAME% (%PCORE%C%LCORE%T) / RAM : %TM%GB / GPU : %GNAME%" /f

    )


    PE의 빌드 번호 (1909, 1903, 2004 등등)

    ::ReleaseID 찾기 / %RID% 변수에 1909등의 숫자가 저장됩니다.

    for /f "tokens=1-4 usebackq delims= " %%i IN  (`reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /V "ReleaseID"`) do set "RID=%%k"

     

     

    등록 예시



    1번째 줄

    shell32.dll.mui

    부팅 이후에 수정할 수 없습니다. 3번째줄의 'Build'제거 포함 수정된 파일입니다.

    (1909, 19H2 x64 파일로 만들었습니다. 다른 PE에 적용되는지 확인 안해봤습니다.)

    2번째 줄

    set "TEXT=OS :%WinName% / IP : %IP_Ad% / BIOS : %BTYPE%"

    3번째 줄

    reg.exe add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v "BuildLab" /d "CPU : %CNAME% (%PCORE%C%LCORE%T) / RAM : %TM%GB / GPU : %GNAME%" /f


    참고한 사이트

    https://www.askvg.com/show-your-desired-text-on-desktop-by-customizing-windows-vista-build-number/?__cf_chl_captcha_tk__=2ebac396d786a0b1eec17fb5c9e64c6c583b7117-1592230839-0-AfbHf053iwbn0dWowMKMZK4u-qN86xsIXnOllMQDTvhKsTijPSFDjTSPWDfQ5mcj4_nfarxRmk3ywxBeELX5u7UWQwf_Pkl9cDf28rsyX0ERSKb8ERwaBUCD36-zCtrlKW9sYldAtqkOiDR06e6n0MzxXgq4ypRh0csnn33yvtbt3RVxncYomiSfV0oY54Vj7FSs-HlihhTNTFT8tiSp2akBiPmoGHoDDFteAvvfYIVp9ZjDtFAP23ZjBluNpHFxCC8axYMvo-8-Rl7siZ9uRstg2IiR9vkhIumtL2efiXPVs0Qk6YnNKhymsA0nkst2b7R89WBBVtDSb9VENN63zEXJHX236GQI2q_Fn70BheBHOj0JuH5woAYdxEUbf6OteVBMrvpxwtXdVkF9PXg4ESWzRotGb0jbA3blYQmK2p5HTruZ4g6yAPAAglGM5i-q5F3EtmlAQ_OsCLP6O0_nZUIKps99vEh87U4j0FrHIuX6PUTcKMhBvDEU8KYlEGi9nvlvavCc-5pZrW9AeOZjfaevRc9OSty4NwEMfrca7XqkjHse4sNqjbc0sd-8EGzzDVkMOKUIS0armFvegaAjaqE

     

    https://www.sevenforums.com/tutorials/212819-test-mode-windows-7-build-7601-watermark-remove-desktop-4.html

     

    https://stackoverflow.com/questions/16985518/batch-file-for-running-diskpart

     

    https://stackoverflow.com/questions/5898763/how-do-i-get-the-ip-address-into-a-batch-file-variable

     

    https://www.dostips.com/DtTipsStringManipulation.php#

    'Windows PE' 카테고리의 다른 글

    PE 설치 스크립트 V7  (0) 2020.10.30
    PE 수정 스크립트  (0) 2020.10.13
    PE용 드라이버팩  (0) 2020.06.16
    Windows PE DPI 조절 스크립트  (1) 2020.06.01
    Windwos PE에 드라이버 통합하기 (DISM)  (0) 2020.02.09
    Posted by 히이이잌