자유 게시판

(수정)PB 연습 중인 BCD - RoBoot0.1

2024.03.31 01:01

라랑 조회:368 추천:5

새로 글 쓰기도 뭐해서 있던 글을 수정합니다.

어제 잠들기 전에 올려놨던 소스가 DEL_BCD를 테스트하면서 요래 저래 옮기다가

마지막에 BCD 왕창 만들어놓고 테스트할때 맨 아래쪽에 배치해놓고 제자리로 안돌리고 올려서

검색 결과가 없어도 무조건 한번은 실행이 되게 되버려서.... {default}를 삭제를 해버리는

 

조회수 2분일때 언능 삭제를 하긴 했지만 혹시? 피해보신분 없으시죠?

 

현재 BCD 날아가신분은 현재 상태에서  bcdboot c:\windows /l ko-kr ... 이라도...;

 

현재 만들어 놓은 상태가 어디까지인지 잘 기억이 안나고;

삭제부분을 추가를 어떤 방식으로 할 지 고민중인데... 구현하는 것보다 제약(?)이 걸리는 부분이 많아지는 느낌이네요.

 

runonce에 넣을지, 프로그램이 startup에 배치하나 작성해서 밀어넣고 재부팅하면 스크립트 돌고 자삭하도록 만들지, 아예 레지 command에 배치파일을 깡그리 밀어넣어 버릴지.... 

 

GUID도 고정을 쓸지 그때 그때 생성할지... 11112111111 이런식으로 쓰면 BCD 종류가 아무리 많아져도 겹칠일은 없겠지만 

어차피 자동생성도 d e f 이런식으로 한글자만 바꾸는 경우가 많아서 

그냥 자동생성하고 wim 뒤에 _Roboot 란 이름을 붙여주는 방식으로 했습니다.

 

MyPE.wim_RoBoot < 결국 이렇게 이름이 붙어 버리는데... 이거 갠적으로 영 보기 싫은데.... 

BCD 리스트가 엄청나게 많아졌을 때 삭제할 대상 빠르게 판단하기 쉬운 장점도 있고

더이상 선택못하고 시간만 보내느니 암거나 하나 정해서 만들자 싶어서... 젤 귀찮은 방법으로....

(빤히 알 것 같은 것들은 만들긴 귀찮은데.... 막상 선택은 또 그쪽으로 하고 )

 

------------------------ 현재 소스를 실행중일지 어쩔지 모르지만 그 상태에서 B_GUID 변수에 값이 있으면 찾는 부분

EnableExplicit

 

Global B_GUID$

 

Procedure GUID_Search()

  Protected guid_run, Output$

  B_GUID$ = "{3d6285ee-ecd8-11ee-bff3-d45aed64acee}"

  If B_GUID$ <> ""

    Debug "GUID Exist"

    If ((FindString(B_GUID$,"{")=1) And ( StringByteLength(B_GUID$, #PB_Ascii) = 38))

      Debug B_GUID$

      ;guid_run = RunProgram("bcdedit", "/deletevalue "+B_GUID$+" sdfa:", "", #PB_Program_Open | #PB_Program_Read)

    EndIf

  EndIf

EndProcedure

 

GUID_Search()

------------------------------- 있다고 가정하고 DEL_BCD 테스트 해본 부분

EnableExplicit

Declare Del_BCD()

 

Global B_GUID$

 

Procedure GUID_Search()

  Protected guid_run, Output$

  B_GUID$ = "{3d6285ee-ecd8-11ee-bff3-d45aed64acee}"

  If B_GUID$ <> ""

    If ((FindString(B_GUID$,"{")=1) And ( StringByteLength(B_GUID$, #PB_Ascii) = 38))

      Del_BCD()

    EndIf

  EndIf

EndProcedure

 

Procedure Del_BCD()

  RunProgram("bcdedit", "/deletevalue "+B_GUID$+" description","", #PB_Program_Wait)

  RunProgram("bcdedit", "/deletevalue "+B_GUID$+" path","", #PB_Program_Wait)

  RunProgram("bcdedit", "/deletevalue "+B_GUID$+" device","", #PB_Program_Wait)

  RunProgram("bcdedit", "/deletevalue "+B_GUID$+" OSdevice","", #PB_Program_Wait)

  RunProgram("bcdedit", "/delete "+B_GUID$+" /f","", #PB_Program_Wait)

EndProcedure

 

GUID_Search()

 

------------------------ bcdedit /enum 으로 검색해서 색출하고 삭제하는건 샘플이 4개있는데 어떤걸 썼는지도 기억이 안나네요;

Procedure Enum_Search(B_GUID$)

  Protected enum_run, output.s, GUID_Exist, i,j

  Protected Dim Enum_array.s(1000)

    

  enum_run = RunProgram("bcdedit", "/enum", "", #PB_Program_Open | #PB_Program_Read)

  output.s = ""

  GUID_Exist = 0  ; Initialize the variable to indicate whether the GUID exists

  

  If enum_run

    i = 0

    While ProgramRunning(enum_run)

      If AvailableProgramOutput(enum_run)

        i + 1

        Enum_array.s(i) = ReadProgramString(enum_run, #PB_Ascii)

        If FindString(Enum_array.s(i), "_RoBoot") > 0

          GUID_Exist = 1

          output.s = Left(Enum_array.s(i), 38)

          Break

        EndIf

      EndIf

    Wend

    CloseProgram(enum_run) ; Close the connection to the program

  EndIf

  

  Repeat

    i-1

    If FindString(Enum_array(i), "identif") > 0

      Quit = #True

    EndIf  

  Until Quit = #True

  j = 12

  output.s = Mid(Enum_array(i),j,38)

  

  If Mid(output,1,1) <> "{"

    While Mid(output,1,1) <> "{"

      j+1

      output.s = Mid(Enum_array(i),j,38) 

    Wend

  EndIf 

  B_GUID$ = output.s

  Debug B_GUID$

EndProcedure

 

Enum_Search(B_GUID$)

---------------------------------------------  enum으로 색출된 것 삭제하는 부분 여기서 DEL_BCD 암데나 놔서 

EnableExplicit

 

Declare Del_BCD()

Global B_GUID$

Global Quit

 

Procedure GUID_Search()

  Protected guid_run, Output$

  B_GUID$ = "{3d6285ee-ecd8-11ee-bff3-d45aed64acee}"

  If B_GUID$ <> ""

    If ((FindString(B_GUID$,"{")=1) And ( StringByteLength(B_GUID$, #PB_Ascii) = 38))

      Del_BCD()

      EndIf

  EndIf

EndProcedure

 

Procedure Enum_Search()

  Protected enum_run, output.s, GUID_Exist, i,j

  Protected Dim Enum_array.s(1000)

    

  enum_run = RunProgram("bcdedit", "/enum", "", #PB_Program_Open | #PB_Program_Read)

  output.s = ""

  GUID_Exist = 0  ; Initialize the variable to indicate whether the GUID exists

  

  If enum_run

    i = 0

    While ProgramRunning(enum_run)

      If AvailableProgramOutput(enum_run)

        i + 1

        Enum_array.s(i) = ReadProgramString(enum_run, #PB_Ascii)

        If FindString(Enum_array.s(i), "_RoBoot") > 0

          GUID_Exist = 1

          output.s = Left(Enum_array.s(i), 38)

          Break

        EndIf

      EndIf

    Wend

    CloseProgram(enum_run) ; Close the connection to the program

  EndIf

  

  Repeat

    i-1

    If FindString(Enum_array(i), "identif") > 0

      Quit = #True

    EndIf  

  Until Quit = #True

  j = 12

  output.s = Mid(Enum_array(i),j,38)

  

  If Mid(output,1,1) <> "{"

    While Mid(output,1,1) <> "{"

      j+1

      output.s = Mid(Enum_array(i),j,38) 

    Wend

  EndIf 

  B_GUID$ = output.s

  ;Del_BCD()  <<<<<<<<<<< 요녀석이 문제라 일단 주석처리 해놓음

EndProcedure

 

Procedure Del_BCD()

  RunProgram("bcdedit", "/deletevalue "+B_GUID$+" description","", #PB_Program_Wait)

  RunProgram("bcdedit", "/deletevalue "+B_GUID$+" path","", #PB_Program_Wait)

  RunProgram("bcdedit", "/deletevalue "+B_GUID$+" device","", #PB_Program_Wait)

  RunProgram("bcdedit", "/deletevalue "+B_GUID$+" OSdevice","", #PB_Program_Wait)

  RunProgram("bcdedit", "/delete "+B_GUID$+" /f","", #PB_Program_Wait)

EndProcedure

 

GUID_Search()

Enum_Search()

--------------- ramdisk option 부분으로 찾아서 삭제

EnableExplicit

 

Procedure Ramdisk_Search()

  Protected Ramdisk_run, Output.s

  

  Ramdisk_run = RunProgram("bcdedit", "/enum {ramdiskoptions}", "", #PB_Program_Open | #PB_Program_Read)

  Output.s = ""

  If Ramdisk_run

    While ProgramRunning(Ramdisk_run)

      If AvailableProgramOutput(Ramdisk_run)

        Output.s + ReadProgramString(Ramdisk_run, #PB_Ascii) + Chr(13)

      EndIf

    Wend

    CloseProgram(Ramdisk_run)

  EndIf

  

  If FindString(Output.s, "_RoBoot") > 0

    RunProgram("bcdedit", "/delete {ramdiskoptions} /f","", #PB_Program_Wait)

  EndIf

EndProcedure

 

Ramdisk_Search()

--------------------------------------- 우클릭 레지스트리 삭제 부분
Procedure DeleteRegKey(RootKey.l, SubKey.s)
  Protected result1, result2
  result1 = RegDeleteKey_(RootKey, SubKey+"\command")
  result2 = RegDeleteKey_(RootKey, SubKey)
  
  If (result1 And result2) = 0
    MessageRequester("RoBoot Registry Delete", "우클릭 레지스트리 정보가 삭제되었습니다.")
  Else
    MessageRequester("RoBoot Registry Delete", "레지스트리 삭제에 실패했습니다.")
  EndIf
EndProcedure
 
DeleteRegKey(#HKEY_CURRENT_USER, "SOFTWARE\Classes\SystemFileAssociations\.wim\shell\RoBoot")
 
-------------------------------------------------------- 이 모든 것을 합친 것은 첨부에 올려 놓겠습니다.
 
2024-03-31_171248.png

 

주목적은 배치파일에 활용하는 것이라 옵션을 많이 가상으로 일단 설정을 해놓긴 했는데....

지금 제대로 돌아가는게 뭔지는 몰겠네용 

MessageRequester도 확인 눌러주는게 은근 귀찮아서 User32.dll 활용해서 다른 걸로 바꿀까 싶기도 했다가 openLibrary 써버리면 dll 없으면 바보 되버리는것이고 그렇다고 윈도 환경에서 저게 없을리도 없고 또.. 선택 장애...;

 

여전히... 친절한 메시지 아직 업뎃 전이고

관리자권한 .... 어떤 방식으로 넣을지.... 방법이야 수두룩하지만... 이것도 첨에 고민했던 내용처럼 은근 스트레스네요.

 

이제 코드도 이쁘게 슬슬 정리하면서 해야될 것 같기도 하고... 아이고 모르겠습니다. 

 

즐건 주말들 보내십시용~

 

#PB_Program_Hide를 쓰고 싶은데 한줄씩 디버깅을 해보면 Wait랑 차이가 있더군요.

그냥 줄 보는대로 순서 안기다리고 다다다다다다 처리를 해버리니까 거의 동시에 값이 들어가서 오류가 나버리는

그래서 wait를 습관을 길러보려고 쓰고 있는데, 이건 또 단점이 화면에 콘솔창이 껌벅껌벅 후루룩 지나가서 사용자 입장에선

나 몰래 뭔짓(?)을 하는거야? 하고 의심할 수도 있겠어서...

 

Ctrl + H 로 

#PB_Program_Wait 은 죄다 #PB_Program_Wait | #PB_Program_Hide로 바꿔놨습니다.

 

이게 제대로 작동하는 조합인지는 몰겠네용 ^^; 다시 하나씩 디버깅 해보긴 싫어요;

 

번호 제목 글쓴이 조회 등록일
[공지] 자유 게시판 이용간 유의사항 (정치, 종교, 시사 게시물 자제) [1] gooddew - -
47266 운동하다가 기절 [6] 긍지버림 1576 04-04
47265 [메시지전송의 분] 구글번역 저장 도우미 앱 v 3.0.3 [1] 빨강모자 768 04-03
47264 【배포】 Win11 Wifi 253mb AutoWall sunshine PE [12] 딸랑쇠 1624 04-03
47263 【배포】 Win10 Wifi 223mb Launch PEUtils PE [13] 딸랑쇠 1128 04-03
47262 재업 요청 자료 (누끼 이미지) [8] 솔제 830 04-03
47261 Windows10 드라이브 인식 오류 [2] 라랑 418 04-03
47260 이런 테스트 한번 해보신분? [6] 도뽱 1065 04-02
47259 한글 패치 요청 하려면.... [12] 최본 1065 04-02
47258 누끼 이미지 몇 장.. [10] 솔제 1121 04-02
47257 10년전 1억 투자시 현재 가치 [4] FINAL 1021 04-01
47256 마이크론 1300 SSD 는 관리프로그램이 없네요 ㅠㅠ [4] 소소생 488 04-01
47255 비어있는 집에.. [2] 솔라 831 04-01
47254 윈10 지원 종료 [13] Andor 1667 04-01
47253 [수정] Ventoy 의 강점 과 UEFI [1] [벗님] 1182 04-01
47252 성능 CrystalMark Retro 1.0.0 RC3 테스트 보[BORAM]람 544 03-31
47251 어제부터 유투브가 버퍼링이 심하네요. [5] 복두꺼비 853 03-31
47250 미국에 굶어 죽는 노숙자가 없는 이유 [5] FINAL 1464 03-31
47249 【배포】 Win11 Wifi 253mb DVD PE [20] 딸랑쇠 1601 03-31
47248 결국은 결정 [12] 긍지버림 1190 03-31
» (수정)PB 연습 중인 BCD - RoBoot0.1 [1] 라랑 368 03-31
XE1.11.6 Layout1.4.8