소프트웨어 아래 글에 그거 일부 기능만 완성(수정)
2024.03.25 02:15
민망하게 아랫글도 저군요....
아뭏튼 그냥 기본 기능 한개라도 살리자싶어서 하나는 완성을 해놨습니다.
이름도 다른 거랑 헷갈리지 마시라공 RoBoot로 지어놨어요 ㅎㅎ
왼쪽에 우클릭 등록만 살려놨습니다.
오른쪽 1회부팅 생성은 OpenFileRequester 로 열어서 파일 선택하고 선택하면 알아서 등록하고 부팅하는걸로
만드려고 했는데 사실 연결만 하면 되는데 의욕상실중이라... ;;;
- 레지 자동 삭제 기능 없음
- MBR 부팅기능도 없음 (원래 소스에는 판별해서 바꿔서 넣는데... 역시 나중에^^)
- BCD 자동 삭제도 없음(마구 누적되니... Bootice로 지워주시거나 Msconfig 부팅 탭에서 지워주셔야 합니다.
(넣기는 할건데.... 지금은 없어요^^)
- 오른쪽 메뉴 안됨(1회 부팅 생성) 눌러서 생기는 결과는 책임 안짐...;
- 안내 메시지가 아예 없음 (뭐가 실행됐는지 만건지 안보임....)
- wim 파일만 등록해놓음... 로컬머신에 해놨는지, 클래스루트에 해놨는지 기억이...; 아마 HKCR쪽인듯
기본 설치하면 HKCU쪽에는 .wim이 없어서 키를 새로 만들어야해서 일단 HKCR에다 만들어 놓은 것 같네요.
저도 이게 맘에 안들지만 역시 나중에 수정을 ^^:
관리자권한도 추가 자동 생성이나 검사 기능도 안해놔서... 관리자 권한 없으면 실행이 안됨;;
그래도 그냥 가지고 노실 장난감으로 쓰실분은 써보시라는 의미롱... ^^;
저의 컨셉은 정갈하게 다져진 이쁜 것이랑은 절대 안친하고 대충 연습해보고 장난감으로 오픈하는...
------ 파일첨부에 실행파일과 원본 소스 첨부하겠습니다. 아래는 소스코드입니다.
------ 수정과 배포는 자유이지만... 이처럼 무성의한 것을 배포하시면 욕먹으실수도... 다른거 좋은 것도 많은데...;
EnableExplicit
Global Window_0
Global Button_0, Button_1
Global Event
Global Quit
Global BFile_A$ = ProgramParameter(0)
Procedure SetBCDValue()
OpenConsole()
Define B_GUID$
Define BFile_R.s{1}
Define BFile_Name$ = GetFilePart(BFile_A$)
Define BFile_Path$ = Mid( GetPathPart(BFile_A$) , 3, StringByteLength(GetPathPart(BFile_A$) ) )
Define BFile_R.s{1} = GetPathPart(BFile_A$)
Protected guid_run, Output$
guid_run = RunProgram("bcdedit", "/create /d "+#DQUOTE$+BFile_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
B_GUID$ = Mid(Output$, 1, 38)
RunProgram("xcopy", #DQUOTE$+"c:\windows\system32\boot.sdi"+ #DQUOTE$ +" " + #DQUOTE$+GetPathPart(BFile_A$)+#DQUOTE$+ " /y", "", #PB_Program_Wait)
RunProgram("bcdedit", "/create {ramdiskoptions} /d " + #DQUOTE$+BFile_Name$+#DQUOTE$, "", #PB_Program_Wait)
RunProgram("bcdedit", "/set {ramdiskoptions} description " + #DQUOTE$+BFile_Name$+#DQUOTE$, "", #PB_Program_Wait)
RunProgram("bcdedit", "/set {ramdiskoptions} ramdisksdidevice partition="+#DQUOTE$+BFile_R+#DQUOTE$+":", "", #PB_Program_Wait)
RunProgram("bcdedit", "/set {ramdiskoptions} ramdisksdipath "+ BFile_Path$ + "boot.sdi", "", #PB_Program_Wait)
RunProgram("bcdedit", "/set " + B_GUID$ + " device " + #DQUOTE$ + "ramdisk=["+ BFile_R +":]" +BFile_Path$ + BFile_Name$+",{ramdiskoptions}"+ #DQUOTE$, "", #PB_Program_Wait)
RunProgram("bcdedit"," /set " + B_GUID$ + " OSdevice "+ #DQUOTE$ + "ramdisk=["+ BFile_R +":]" +BFile_Path$ + BFile_Name$+",{ramdiskoptions}"+ #DQUOTE$, "", #PB_Program_Wait)
RunProgram("bcdedit"," /set " + B_GUID$ + " path \windows\system32\boot\winload.efi", "", #PB_Program_Wait)
RunProgram("bcdedit"," /set " + B_GUID$ + " systemroot \windows", "", #PB_Program_Wait)
RunProgram("bcdedit"," /set " + B_GUID$ + " winpe yes", "", #PB_Program_Wait)
RunProgram("bcdedit"," /set " + B_GUID$ + " detecthal yes", "", #PB_Program_Wait)
RunProgram("bcdedit"," /displayorder " + B_GUID$ + " /addlast", "", #PB_Program_Wait)
RunProgram("bcdedit","/bootsequence " + B_GUID$ + " /addlast", "", #PB_Program_Wait)
RunProgram("bcdedit"," /timeout 5", "", #PB_Program_Wait)
CloseConsole()
EndProcedure
Procedure WriteRegKey(RootKey.l, SubKey.s, KeyName.s, KeyValue.s)
Protected handle.l, result.l
If RegCreateKeyEx_(RootKey, @SubKey, 0, 0, #REG_SZ, #KEY_WRITE, 0, @RootKey, @result) = 0
If RegSetValueEx_(RootKey, KeyName, 0, #REG_SZ, KeyValue, StringByteLength(KeyValue)) = 0
Debug "Value set successfully"
RegCloseKey_(RootKey)
EndIf
EndIf
EndProcedure
Procedure Rclk_Registration()
Protected OpenKey, result, handle
If RegCreateKeyEx_(#HKEY_CLASSES_ROOT, "SystemFileAssociations\.wim\shell", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_WRITE, 0, @OpenKey, @result) = 0
If RegCreateKeyEx_(OpenKey, "RoBoot", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_WRITE, 0, @handle, @result) = 0
RegCloseKey_(handle)
EndIf
RegCloseKey_(OpenKey)
EndIf
Define RootKey.l = #HKEY_CLASSES_ROOT
Define SubKey.s = "SystemFileAssociations\.wim\shell\RoBoot"
WriteRegKey(RootKey, SubKey, "Icon", "C:\\Windows\\system32\\imageres.dll,147")
WriteRegKey(RootKey, SubKey, "Position", "Bottom")
WriteRegKey(RootKey, SubKey + "\Command", "", GetCurrentDirectory() + "RoBoot.exe " + #DQUOTE$+ "%1"+ #DQUOTE$)
EndProcedure
Procedure OpenWindow_0(x = 0, y = 0, width = 260, height = 80)
Window_0 = OpenWindow(0, 0, 100, 260, 80, "RoBoot 0.1", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Button_0 = ButtonGadget(#PB_Any, 20, 20, 100, 40, "우클릭 등록")
Button_1 = ButtonGadget(#PB_Any, 140, 20, 100, 40, "1회부팅 생성")
EndProcedure
Procedure Window_0_Events()
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
Quit = #True
Case #PB_Event_Gadget
If EventGadget() = Button_0
Rclk_Registration() ; Call the procedure to register right-click
ElseIf EventGadget() = Button_1
SetBCDValue()
EndIf
EndSelect
Until Quit = #True
EndProcedure
If BFile_A$ <> ""
SetBCDValue()
Rclk_Registration()
Else
OpenWindow_0()
Window_0_Events()
EndIf
------------------ 오전에 밖으로 좀 싸돌아다니다 왔더니 하나는 수정을 해야겠다는 생각이 들어서 손을 봤습니다. ------------
이렇게 2부분을 수정/추가해서 오른쪽 버튼도 기능을 연결은 해놨습니다.
너무 설명이 불친절해서 ^^: 근데 지금 보니까 Choose the Movie to Play네요 ㅎㅎ ...
기능만 바꾸고.... 꾸미는 멘트같은건 신기할 정도로 눈에 안들어오는군요.
글을 새로 작성한 게 아니라 첨부파일명을 바꿔서 올려야겠군요; 실행파일은 새로 컴파일한 것으로 바꿔놓겠습니다.
혹시라도 2개 비교해서 보실분은 비교해서 보시라고....;
댓글 [11]
-
상발이 2024.03.25 06:14
-
수리수리 2024.03.25 08:44
수고하셨습니다^^
-
왕초보 2024.03.25 09:00
이렇게 하나씩 채우시다보면..어느순간 원하시는 모습이 되어 있을것 같습니다..
1회부팅은 GUID가 고정값인것이 삭제도 편해서 저의 경우에는 고정값들을 활용하게 되네요
오늘도 화이팅입니다..
-
라랑 2024.03.25 15:14
그냥 만들어 본 코드 재활용 측면에서^^
고정 GUID는 부팅 스크립트가 종류가 워낙에 많아서 이미 만들어진 것과 충돌날 수도 있을 것 같기도 해서 자연생성으로 바꿨습니다.
-
왕초보 2024.03.25 15:22
GUID 값이 중복이 되는 경우를 생각을 하셨네요..
이 부분이 신경이 쓰이기는 합니다..
PE 1회 부팅 관련해서 프로그램을 소개하여 주신 몇분이 있으십니다..
GUID 값이 길어서인지 아직까지 겹치지는 않습니다..영문, 숫자에서 본인만의 특징을 넣으셔도 되십니다
저는 1회 부팅에는 끝숫자가 1,2를 PE 1회 부팅 프로그램과 BR 프로그램에서 복원시에 활용을 하고 있습니다
1회 부팅에 사용되는 GUID값을 BCD 고정 메뉴에 사용하시는 분은 없으실것입니다
다 같이 통일하는 방법도 있지만..어려운이야기죠..
-
REFS 2024.03.25 11:07
수고하셨습니다..
-
광풍제월 2024.03.25 11:52
수고하셨습니다.
-
왕초보 2024.03.25 12:00
관리자 권한 글이 있네요..저도 입니다님께서 알려주셔서 이렇게 활용하고 있습니다
1. 컴파일할때 옵션을 줄수 있습니다
2. 아래를 체크하고 사용을 하면 관리자권한으로 실행이 됩니다
3. 위에서 처럼 사용하는 경우 x86 x64 exe를 따라따로 만들어야 하는 불편이 있습니다
입니다님께서 이런 불편을 없애기 위해서 소스에 cmd 파일을 포함을 해주셨습니다
cmd에서 아래처럼 관리자 옵션을 추가하면 관리자 권한으로 x86 x64 2개가 만들어 집니
Set Para=/RESOURCE %ResFile% /XP /DPIAWARE /DYNAMICCPU /ADMINISTRATOR
-
왕초보 2024.03.25 14:14
왼쪽 버튼에 레지 등록이 있는것을 보면 wim 파일 우클릭 메뉴에서 PE 1회 부팅이 되는것으로 생각이 됩니다
개인적인 의견입니다
wim 파일 우클릭에서 1회 부팅하는것이 바로가기에서 프로그램 실행후 1회 부팅 버튼을 누르고 wim 파일을 찾는 과정보다 조금 더
편할것 같습니다..그래서 다른 분들도 우클릭 메뉴를 활용을 하고 계신것 같습니다
버튼에서 wim 파일을 찾아서 1회 부팅을 하도록 연결을 하여 보았습니다..1회 부팅 GUID 값은 고정값을 사용하였습니다
1회 부팅 등록전에 기존 GUID 값을 삭제하기가 편합니다
1. boot.sdi는 같은 폴더에 있는 방식으로 하여보았습니다..
버튼이 2개에서 레지 등록 삭제는 레지값을 읽고나서 추가 삭제 메세지를 보여주는것으로 해야 할것 같습니다.
레지 부분은 그대로 입니다
2. 1회 부팅 버튼 클릭시 boot.sdi가 없으면 메세지를 보여주도록 하여보았습니다
3. boot.sdi 파일이 있으면 wim 파일 선택 대화상자가 실행이 됩니다
4. wim 파일 확인 메세지입니다. purebasic은 특이하게 메세지 아이콘이 정보,에러,경고 3개만 있네요
5. pe로 부팅이 되었습니다
6. BCD에 등록된 GUID값입니다.. 다음 1회 부팅때 삭제후 1회 부팅을 등록을 하게 됩니다
7. 원하시는것을 정확히 몰라서..개인적인 생각들이 있습니다..
참고가 되었으면 합니다
-
라랑 2024.03.25 15:28
댓글까지 이리 정성을 ..^^ 감사합니다.
원래 계획은 질문과 답변에 올린 것도 같은 맥락인데 "%1을 안쓰고
타 프로그램들처럼 parameter를 여러 개를 받는 것을 구상했었습니다. 그래서 버튼도 차차 늘려갈 생각에 창크기도 2개뿐이라 이상했지만 크기 조절하지도 않고 놔뒀던 것이였는데,
말씀해주신 것처럼 레지 생성 / 삭제 / 바로 파일 선택 부팅의 메뉴를 같이 넣을 생각이였고 parameter을 경우에 따라 다양하게 입력받거나 때로는 콘솔창에 roboot /b test.wim 이런식을 바로 입력해도 굳이 openwindows 함수 호출없이 바로 실행되는 다양한 방법을 생각을 했었는데....
대충 기능만 만들어놓고 마지막으로 연결을 하려고 보니 선택한 파일을 변수로 가져오는 방법을 모르겠더라구요. 그래서 질문과 답변란에 올린 것이였습니다.
찾다가 지쳐서 한동안 손놓고 있다가 질답란에 올려보고 생각해보니 이게 우리가 익히 사용해왔던 프로그램들 이외에는 윈포에서 배포되는 프로그램들이나 소스들에는 해당 기능이 구현된 프로그램이 하나도 없더라구요.
레지등록때 "%1"을 안쓰고 선택한 파일의 이름을 바로 변수로 추출할 수 있으면 해당 이름을 넣으려고 했었던 것이였는데... 그게 안되서 삭제 기능도 넣지 않고 빼놓은 상태였습니다. 어차피 상위키를 삭제하면 되지만 원래 첨 구상했던 것이 거기까지가 아니여서
지금 해당 기능이 있는 프로그램중에 소스를 볼 수 있는 것은 7.zip인 것 같은데... 그것이 PureBasic에 구현이 가능할지는 모르겠습니다.
신경써주셔서 감사합니다.
-
왕초보 2024.03.25 15:43
자세한 설명에 감사드립니다...
어떤 모습으로 구상을 하고 게신지를 몰라서..여쭈어 보게 된것입니다
"콘솔창에 roboot /b test.wim" 처럼 입력하는 경우에는 wim파일이 다른 경로 있는 경우 전체 경로를 입력일 해야하고 wim 파일 이름도
각각이어서 그대로 입력하는것이 쉽지않다는 생각을 했었습니다..비슷한 생각에 GUI 대화 상자로 바꾸신것으로 짐작을 했었습니다.
"레지등록때 "%1"을 안쓰고 선택한 파일의 이름을 바로 변수로 추출할 수 있으면 해당 이름을 넣으려고 했었던 것이였는데"
이 부분은 어떤 뜻인지 알것 같습니다..test.wim 파일에서 우클릭하면 우클릭 메뉴에 "test 1회 부팅" 이렇게 메뉴가 나오는것을 원하시
는것 같습니다... 저도 비슷한 생각을 해본적은 있었습니다...저는 소스를 찾지 못했습니다..아마 윈도우 전문 프로로그램밍을 하시는 분
들은 가능하실것 같습니다
어려움이 있겠지만..포기하시지 않으시면..목표를 이루실수 있을것입니다
화이팅입니다
수고하셨습니다.