소프트웨어 헉시 저처럼 PureBasic 시작해보신 분 계실라나요?
2024.03.21 22:50
차곡 차곡 개념부터 학습해야 하는데 설렁설렁 AI 믿고 대충 덤볐다가 허탕만 치고 결국 개념부터 차근차근
다시 절대 안하고(개버릇...) 또 다시 날림 삽질하다 제가 헤맨 몇 가지... 올려볼게요.
------------ 드라이브 문자 입력 받기 --------------
Input$ = InputRequester("드라이브 문자", "부팅할 드라이브 문자를 입력하세요 (문자만) : ", "D")
MessageRequester("Information", Input$)
Input1.s = InputRequester("드라이브 문자", "부팅할 드라이브 문자를 입력하세요 (문자만) : ", "D")
MessageRequester("Information", Input1.s)
Input2.s{1} = InputRequester("드라이브 문자", "부팅할 드라이브 문자를 입력하세요 (문자만) : ", "D")
MessageRequester("Information", Input2.s{1})
-----------------------------------------------------------------------
------ 콘솔 출력 가져오는 샘플 -------
; 참고로 저는 bootice 전문가모드에서 aaa라는 항목을 70개 정도 삭제함
; bcdedit /enum으론 안보이니 연습하시고나면 bootice로 꼭 확인하시길 ^^
------------------------------------------------------------------------------
guid_run = RunProgram("bcdedit", "/create /d aaa /application osloader", "", #PB_Program_Open | #PB_Program_Read)
Output$ = ""
If guid_run
While ProgramRunning(guid_run)
If AvailableProgramOutput(guid_run)
Output$ + ReadProgramString(guid_run, #PB_Ascii) + Chr(13)
EndIf
Wend
Output$ + "Exitcode: " + Str(ProgramExitCode(guid_run))
CloseProgram(guid_run) ; Close the connection to the program
EndIf
guid_os$ = Mid(Output$, 1, 38)
MessageRequester("Output", guid_os$)
MessageRequester("Output", Output$)
-- 다른 것도 좀 애먹었지만 배치 만들던 습성을 못버리니까
-- 콘솔 창에 출력을 어떻게 가져와서 변수화 하는지 이거 찾는 동안 AI가 구라를 너무 많이 날려서 그거 때문에 엄청나게 허탕을 쳤네요.
-- 결국 꽁수 포기하고 함수 한가지 한가지 다 테스트해가면서 겨우 찾은 방법입니다. 더 나은 방법이 있을 것 같은데 실력이 나아지면
-- 그땐 떠오를지도...
--------------- 아래는 제가 예전에 쓰던 원작자 snoopy님의 PE 부팅 배치파일 샘플 / 그 아래에 그것을 PureBasic으로
일부만 구현한 것
그나마 제일 간단한거 찾아서 덤비려다보니 그냥 생각나는게... 가장 많이 사용했던 것이기도 하고...
----------------------------------------------------------------------------------------------
@echo off
bcdedit /enum bootmgr > nul || goto _admin
set drv_L =
set /p drv_L= "드라이브 문자를 입력하세요. (ex : D), 콜론 생략 : "
bcdedit /create {ramdiskoptions} /d "TmpBoot_PE" || bcdedit /set {ramdiskoptions} description "TmpBoot_PE"
bcdedit /set {ramdiskoptions} ramdisksdidevice partition=%drv_L%: || goto _dynamic
bcdedit /set {ramdiskoptions} ramdisksdipath \TmpBoot_PE\boot\boot.sdi
setlocal enabledelayedexpansion
for /f "tokens=1-5 usebackq delims=-" %%a in (`bcdedit /create /d "TmpBoot_PE" /application osloader`) do (
set first=%%a
set last=%%e
set guid=!first:~-9!-%%b-%%c-%%d-!last:~0,13!
)
bcdedit /set !guid! device ramdisk=[%drv_L%:]\TmpBoot_PE\sources\boot.wim,{ramdiskoptions}
bcdedit /set !guid! osdevice ramdisk=[%drv_L%:]\TmpBoot_PE\sources\boot.wim,{ramdiskoptions}
set bios=exe
reg query "HKLM\SYSTEM\CurrentControlSet\Control\SecureBoot\State" > nul 2>&1
if not errorlevel 1 set bios=efi
bcdedit /set !guid! path \windows\system32\boot\winload.!bios!
bcdedit /set !guid! systemroot \windows
bcdedit /set !guid! winpe yes
bcdedit /set !guid! detecthal yes
bcdedit /displayorder !guid! /addlast
bcdedit /bootsequence !guid! /addlast
bcdedit /timeout 5
endlocal
goto _success
:_admin
cls
echo.
echo 우클릭 해서 관리자 권한으로 실행해주세요.
pause
exit
:_dynamic
cls
echo.
echo 오류가 발생했습니다. 동적 디스크에서는 작동하지 않습니다.
echo.
echo 기본 디스크에서 실행해주세요.
echo.
pause
exit
:_success
cls
echo.
echo 작업이 성공적으로 완료되었습니다.
echo.
echo 재부팅하시면 Tmp Boot_PE 메뉴가 나타납니다.
echo.
pause
exit
-------------------------------------- 이상이 배치파일 --------- 아래는 이것을 PureBasic으로 연습해 본 것
OpenConsole()
drv_l.s{1} = InputRequester("Drive Letter Input", "Please enter a drive letter:", "D")
PE_Name$ = "Tmp PE"
guid_run = RunProgram("bcdedit", "/create /d "+#DQUOTE$+PE_Name$+#DQUOTE$+" /application osloader", "", #PB_Program_Open | #PB_Program_Read)
Output$ = ""
If guid_run
While ProgramRunning(guid_run)
If AvailableProgramOutput(guid_run)
Output$ + ReadProgramString(guid_run, #PB_Ascii) + Chr(13)
EndIf
Wend
Output$ + "Exitcode: " + Str(ProgramExitCode(guid_run))
CloseProgram(guid_run) ; Close the connection to the program
EndIf
guid_os$ = Mid(Output$, 1, 38)
MessageRequester("Guid_Number", guid_os$)
RunProgram("bcdedit", "/create {ramdiskoptions} /d " + #DQUOTE$+PE_Name$+#DQUOTE$, "", #PB_Program_Open)
RunProgram("bcdedit", "/set {ramdiskoptions} description " + #DQUOTE$+PE_Name$+#DQUOTE$, "", #PB_Program_Open)
RunProgram("bcdedit", "/set {ramdiskoptions} ramdisksdidevice partition="+#DQUOTE$+drv_l+#DQUOTE$+":", "", #PB_Program_Open)
RunProgram("bcdedit", "/set {ramdiskoptions} ramdisksdipath "+ #DQUOTE$+ "\" +PE_Name$+ "\boot\boot.sdi" + #DQUOTE$, "", #PB_Program_Open)
RunProgram("bcdedit", "/set " + guid_os$ + " device ramdisk=" + #DQUOTE$ + "[" + drv_l +":]\" +PE_Name$+ "\sources\boot.wim,{ramdiskoptions}"+ #DQUOTE$, "", #PB_Program_Open)
RunProgram("bcdedit"," /set " + guid_os$ + " OSdevice ramdisk=" + #DQUOTE$ + "[" + drv_l +":]\" +PE_Name$+ "\sources\boot.wim,{ramdiskoptions}"+ #DQUOTE$, "", #PB_Program_Open)
RunProgram("bcdedit"," /set " + guid_os$ + " path \windows\system32\boot\winload.efi", "", #PB_Program_Open)
RunProgram("bcdedit"," /set " + guid_os$ + " systemroot \windows", "", #PB_Program_Open)
RunProgram("bcdedit"," /set " + guid_os$ + " winpe yes", "", #PB_Program_Open)
RunProgram("bcdedit"," /set " + guid_os$ + " detecthal yes", "", #PB_Program_Open)
RunProgram("bcdedit"," /displayorder " + guid_os$ + " /addlast", "", #PB_Program_Open)
RunProgram("bcdedit","/bootsequence " + guid_os$ + " /addlast", "", #PB_Program_Open)
RunProgram("bcdedit"," /timeout 5", "", #PB_Program_Open)
Delay(14000)
CloseConsole()
------------------------------------ OpenConsole() / CloseConsole() / Delay(14000) 은 없어도 됩니다.
--- 콘솔창 습성을 못버려서 debug 활용을 못하고 저걸로 자꾸 보게 되더라구요
원본 보시면 아시겠지만 최근 아주 지능화(?)된 1회성부팅보다 너무 너무 불편한 부팅스크립트이니
그냥 코딩 연습용 장난감으로만 보세요.
여러 자료나 정보를 제공해주신 입니다님과 왕초보님이 올려주신 보여주신 정보들이 시작이라도 해볼 맘이 생겼었네요.
감사드립니다.
창띄우고(가젯이라고 불리는...) 연동하는 것은 의외루 너무 쉬워서 굳이 올리진 않았습니다. 기본 설치하면 예제가 엄청나게 많기도 하고 다른 베이직처럼 시작부터 폼모드(pbf)로 작성하시다가 switch code 모드로 코딩모드에서 작성하셔도 됩니다.
마지막 샘플 실행파일 만든거 첨부하려고 했는데 고새 삭제하고 없군요. 백신 검사에서는 암것도 안나왔는데...;
왕초보님의 https://windowsforum.kr/index.php?mid=review&page=2&document_srl=20514407 이 글을 보고 시작하였습니다.
혹시 시작해보실 분들 홧팅!입니다.
댓글 [6]
-
왕초보 2024.03.21 23:10
-
왕초보 2024.03.21 23:38
소스를 공개를 하여 주신 덕분에 실행을 해볼수 있었습니다. 감사합니다
작년에 suk님께서 Guid에 고정값을 사용할수 있다고 알려주셔서 고정값을 사용하고 있습니다
BR cmd 버전에서 1회 부팅에 사용한 고정값입니다
Set Guid={11111111-1111-1111-1111-111111111111}
Set GuidDevice={11111111-1111-1111-1111-111111111112}
등록전에 기존것들을 삭제를 하고 있습니다
For %%a in (%GuidWim% %GuidDeviceWim%) do bcdedit /delete %%a /f>nul
1. 이렇게 입력창이 나오고 있습니다
2. 새로 설정한 GUID 값을 보여주고 있습니다.그리고 여러개 cmd창들이 쭉 실행이됩니다
3. 등록할때 마다 새로운 GUID 값이 생겨서 아래처럼 2개가 되었습니다..
-
라랑 2024.03.22 00:03
앗~! 이 부끄러운 것을 굳이 테스트까지 해주셨군요... 하나씩 업글을 해가야하나 ? 굳이 더 좋은 부팅파일이 많은데 해야하나 고민중인....
시작도 그냥 만들어만 볼까였는데 시작도 제대로 못하고 ...
뭐든 에러처리쪽으로 가면 할 일이 눈덩이처럼 불어나서 정해진대로 안하면 난장판 되버리는 걸 그래도 혹시나 저처럼 삽질하시는 분 있을까해서 올려놓은 ...
공유해주신 소스 덕분에 또 꿀정보를 얻게 됩니다. 감사드립니다.
PE도 한참동안 관심이 없었어서 저런 소스가 있는지도 몰랐었는데 거듭 감사드립니다.
-
왕초보 2024.03.22 08:36
새로운것을 시작한다는것을 시간적 여유도 있어야 하지만 용기도 필요한 일입니다
저도..입니다님께서 처음 소스를 공개해주셨을때부터 많은 고민을 했었습니다
망설이다 이제서야 시작을 하게되었습니다..시작한것이 너무 잘한 일인것 같습니다
열정에 진심을 담아 박수를 보내드립니다
저도 사용기를 많이 활용을 합니다...고수님들이 보았을때 저의 사용기는 아무것도 아닐것입니다
부족한 부분들에 대해서 조언을 해주시는 고수님들 덕분에 저도 여기까지 올수가 있었습니다
처음부터 잘할수 있는 사람을 없을것입니다..저도 엄청 헤메이고 있습니다
이렇게 조금씩 지식이 쌓이면서 시간이 흐르면...다른분들께 도움이 되는 작품이 완성이 될수 있습니다...
그때에는 멋진 작품을 배포를 하여 주십시요
화이팅입니다
-
광풍제월 2024.03.22 01:59
수고하셨습니다.
-
대조선언니 2024.03.22 03:13
위 화면들이 뭐하는건지. ^^ 프로그램 일단 구입해야 하는건가요 ???
고생이 많으셨습니다..
그리고 열정에 진심을 담아 박수를 보내드립니다..
질문란 글에 댓글을 다신것들을 보았었습니다..cmd 관련해서는 고수님이셔서 PureBasic으로 원하시는것을 얻을실수 있으실것입니다
완성하는 기쁨을 누릴수 있으시길 기원드립니다