C·C++

[펌] Shell이란?(기본개념)

십억10 2009. 9. 11. 17:00

약 5년전에 Explorer에 Context Menu를 추가하는 프로그램 개발을 하기 위해서 찾은 자료를 올려놓습니다. 솔직히 출처는 기억이 잘나지 않습니다. 만약 아래 글원저자님께서 이 글 올려놓는것을 허락하지 않으면 덧글 남겨 주십시오 바로 삭제 하겠습니다.

 

------------------------------------------------------------------------------------

 

1) Shell이란 무엇인가?

-> 사용자와 OS간의 중간에 서서 사용자의 요구사항을 받아서 넘겨주는
   역활을 합니다. Windows 플랫폼하에서 Shell은 하나의 실행 파일인데..
   그것이 바로  Windows폴더 밑에 있는  explorer.exe를 의미합니다.
   요놈이 Shell이죠... 우리가 많이 쓰는 탐색기 있죠? 그것인데...
   흔히 우리는 이것을 파일 탐색을 해주는 응용 프로그램으로 알고 있는
   데 Shell의 역할도 합니다.
  
   그러면 언제 Shell의 역활하는 explorer.exe가 실행되는가하면...
   윈도우즈가 부팅을하고 로그인을 하고 바탕화면에 아이콘들과 아래
   태스크바도 로딩되죠? 그때 바로 explorer.exe가 처음 실행되고 Shell이
   로딩된답니다.
  
   너무 너져분하게 말을 했는데 한마디로 Shell은 explorer.exe가 담당을하고
   부팅될 시점에 이것이 로딩된다. 그 뒤로 수행되는 explorer.exe는 파일
   브라우징 역활을 하는 탐색기가 뜬답니다.
  
   그러면 위해서 확인한 내용을 직접 확인해볼까요?
   부팅되고 나서  Ctrl-Alt-Del을 눌러보세요.. 그럼 리스트 중에 explorer
   있을 겁니다. 고것이  Shell이죠...

  

2) Shell Extension Programming이란 무엇인가?

-> Shell Extension Programming을 그대로 번역하면 Shell 확장 프로그램밍...
   말 그대로 Shell의 기능을 확장하는 프로그램밍을 의미합니다.
   흠..너무하다.. 그러면 Shell을 기능은 모가 있가 그것에 확장하는것은
   뭘 의미할까요...
  
   그러면 Shell Extension Programming으로 어떤 일을 할수 있을 가요..
   윈도우즈에서 파일에 대로 오른쪽 버튼을 누르면.. Context Menu가
   뜨죠.. 고기에 메뉴를 추가하여 내가 원하는 내용을 수행하게 하거나...
   또는 파일에 오른쪽 버튼 클릭하고 메뉴중에 등록정보라는 메뉴가
   있잖아여..그 메뉴를 실행하면 Property Sheet Dialog가 뜨잖습니까?...
   고기에도 내가 원하는 파일에 특정 페이지를 삽입할수도 있습니다.
   그리고 사용자가 폴더를 더블 클릭하거나, 파일을 더블클릭하는것을
   감지하여 다른 일을 하도록 하는 작업도 가능합니다. 또한 아이콘을
   그리거나, 파일 드래그& 드롭할때도 가능합니다.

   즉 여러분이 만든 어플리케이션이 Shell의 한 부분인것 처럼 동작을 한다
   는 것이죠.. 기존의 Winzip안 알집 등을 이런 작을 통해 Shell의 한부분
   인것처럼 동작을 합니다.

  
  
3. Windows의 Shell Loading 과 Shell Unloading.
  
-> 일단 Shell Extension Programming하여 컴파일하고 링킹을 하여 만들어
   지는 파일은 DLL파일입니다. 이 DLL파일은 로딩 시점은 OS알아서 로딩을
   하고, 다시 OS가 알아서 Unloading을 한답니다. 완전 오토메틱입니다.
  
   DLL파일 꼭 CALLBACK함수와 비슷하게 동작합니다.이것에 더욱 설명하고
   싶지만 삼천포로 빠지니 다음에 다시 설명하죠..
   정확히 말하면 '인프로세서 Com 서버' 입니다. 더 정확히 말하면
   Com interface을 사용하여 구현되 인프로세서 COM서버를 의미합니다. ^^;
  
   만약에 우리가 Context Menu관련 Shell Extension Programming을 하여
   DLL파일을 만들고 이것을 Registry 등록(요것도 나중에 설명하죠)하죠.
   이렇게 하고 만약에 사용자가 Shell에서 마우스 오른쪽 버튼을 클릭해서
   Shell이 Context Menu를 불러들이는 순간 우리가 만든 DLL이 로딩 됩니다.
   (로딩을 걱정할 필요가 없는것이 Registry를 제대로만 등록해놓으면
    자동으로 Loading이 됩니다.)
   이렇게 로딩된  DLL은 당분가  Unloading이 되지 않는답니다. Unloading
   되는 시점은 보통 10분정도 더군요. 즉  Context Menu를 호출하지 않고
   10분정도 지나면 Shell을 알아서 우리의 DLL을 자동으로 Unloading을 합니
   다.

   여기서 강제로 우리의 Shell을 언로딩 하려면 어떻게 하면 될까요?
   이건 프로그래밍을 할때 많이 쓰입니다. 왜냐 테스트를 하려고 DLL을
   맹글어서 다시 태스트 할려고 컴파일하고 다시 DLL을 로딩하고 싶은데
   요놈이 10분동안 사용하지 않고 있어야 언로딩이 되니 참으로 열받더군
   여.. 그래서 첨엔 잘 몰라서..이렇게 했죠..
   1) Windows를 재부팅 했답니다. -> 그러면 Shell이 다시 로딩 될테고 그때 싹
   파일 바꾸었답니다. 그런데 이것은 너무 무식했죠..첨엔 너무 힘들었져..
   2) 두번째는 Log off를 하는방법니죠.. 이렇게해도 Shell이 Unloading 되고
   다시 로딩 됩답니다. 그때 바꾼 DLL을 싹 바꿔치죠.. 요것도 약간 무식..
   3) 세번째 방법은 위에 내용을 잘 읽어보신 분이면 아실 텐데요..
   강제로 Shell을 죽이고 다시 띄우는 방법입니다. 이것은 프로그래밍
   하시다 보면  이방법을 많이 쓰실겁니다. 가장 빠르고 구찮지도 않고...
   아래 설명하겠습니다.
  
   Shell Unloading 과 Shell Loading..
   시작 메뉴의 "Microsoft Visual Stdio-> Microsoft Visual 6.0 도구들->
   Process Viewer"를 사용하는 것이 가장 편합니다. 일단 실행~~쫘잔..
   하이튼 이것을 실행하면 Process 리스트가 쭈~욱 나온답니다. 거기서
   explorer.exe를 Kill하세요.. 그러면 Shell 뻑하고 죽죠..그러면
   바탕화면에 응용프로그램만 남고, 아이콘은 사라지고, 태스크바도 사라
   집니다. 아무것도 없죠... 그냥 응용프로그램만 남습니다.
   그러면 다시 로딩 해야하는데 어떻게하냐...면요....^^;
   일단 Shell을 죽이기 전에 꼭 도스창을 하나 띄워놓습니다.
   그리고 Process Viewer에서 explorer를 Kill한다음 도스창에서 explorer
   을 실행해주죠... 그러면 Shell이 다시 로딩된답니다. 휴~ 설명하기 힘들군요..

   요점은 Process Viewer를 사용해서 explorer을 Kill하면 Shell이 뻑 죽고,
   다시 로딩은 그냥 도스창에서 explorer을 실행시켜주면 된다.
   Shell은 Shell 익스텐션 DLL을 관련 모듈이 호출될때 로딩을 하고 일정시간
   동안 그 모듈이 쓰이지 않는다면 자동으로 언로딩한다. 아시겠죠?
  
   참고로 Process Viewer말고 Ctrl+Alt+Del을 해서 explorer을 죽여도 되
   지만...별루 추천해주고 싶지는 않습니다. 해보세요..어떤것이 편한지.


4) Context Menu의 기본.

   Shell 익스텐션의 종류에는

   Context Menu - Context Menu 항목 추가.     
   오른쪽 드래그&드롭 - Context Menu 항목 추가.
   Shell 아이콘 - 아이콘을 동적으로 변경. 
   등록정보 시트 - 페이지 추가.
   파일 훅 - 파일이 실행되는것을 훅하는데.....^^
   왼쪽 드래그&드롭 - 이때 할일 정의.
 
   가 있습니다. 그런데 여기서 우리가 첫번째로 다룰 Contex Menu에 대해서
   먼저 이야기 하겠습니다.

   Context Menu와 관련된 Com Interface는 IContextMenu가 있습니다.
   위에서 설명했던 Shell Extension은 인프로세서 컴 서버라고 했었는데
   여기서 COM에 대해서 설명하는 것은 너무나 길고도 험한 길이고..
  
   그냥 이렇게 이해하시면 좋을듯 싶네요..
   Context Menu 항목을 추가하기 위해 어떤 인터페이스가 있는데 그것이
   IContextMenu이다. 이것을 이용하여 Context Menu 항목을 추가하면 OS
   에서 알아서 추가된 모듈이 있나 조사하고 있다면 이것에 해당하는 것을
   실행한다. COM에 대한 내용은 다른 책을 참고하시면 좋을듯 합니다.
   COM에 대해서 자세히 나온책을요.. 이론적으로 자세히 설명된..것으로..
   그리고 ATL에 대해서도 잘 알아두면 캡짱인데..흐흐..

   요점은 IContextMenu의 COM 인터페이스를 사용하여 메뉴 항목을 추가하고
   그것에 해당하는 일을 하도록 한다라고 이해해주시고....
   앞으로는 COM의 내용은 배제하고 설명할렵니다. COM의 내용이 궁금하시면
   따로 공부하심이 좋을듯 싶네요.
   (참고로 Com Interface는 미리 정의되고 정해진 함수 프로토타입의 모음이라고
    생각할 수 있습니다. - 빨간책 인용(31 Page) )


   하이튼 IContextMenu의 Com interface에는 3개의 프로토타입만이 있습니다.
   GetCommandString()
   InvokeCommand()
   QueryContextMenu()
   요것들은 IContextMenu의 메소들인데 이 메소드의 내용을 만들어주므로써
   메뉴의 항목을 추가하고 ...메뉴의 항목이 선택이 되면 어떤 작업을 할지
   를 정합니다.

   1) QueryContextMenu()
   -> 이 함수 내용에는 우가 추가하고 싶은 메뉴 항목을 넣어주는 역활을
      합니다.

   2) InvokeCommand()
   -> 이 함수의 내용에는 우리가 추가한 내용을 클릭했을때 해줄 작업을
      작성합니다.

   3) GetCommandString()
   -> 이 함수는 내가 만들어 넣은 메뉴중 어느 메뉴가 선택되고 있나
      또는 핼프 텍스트를 탐색기 탕에 나타내 줄때 사용되는데...
      보통의 구현에서 이 함수의 내용을 해두 그만 안해두 그만이죠..
     

   중요한것은 (1),(2)입니다. 메뉴를 추가하고, 그 메뉴를 클릭했을때
   작업할 내용을 코딩하는것이니까요..

 

참고로 Shell과 연관된 자료를 첨부파일로 올려놓았습니다. 필요하신 분들 참고하세용

 

출처 : 5년전 프로그램 개발(삽질) 작업으로 부터...

  

shell_extension_explain-process3.7z
1.43MB
exregedit-process3.reg
0.0MB
exregedit2-process3.reg
0.01MB
shell에_침투하기1-process3.pdf
0.03MB