상세 컨텐츠

본문 제목

IE Protected Mode API

Internet Explorer

by 탑~! 2012. 3. 30. 10:44

본문

IE Protected Mode API

IE 7의 새로운 기능에 대해서는 microsoft 사이트를 통해서 쉽게 확인하실 수 있습니다.

이렇게 처음으로 IE7의 새로운 기능을 이야기하는 이유는 앞으로의 내용이 IE7의 새로운 기능에 대해서 이야기를 할 것이 아니기 때문입니다.

Windows 2003 혹은 Windows XP 사용자를 위한 ActiveX Component를 개발하는 측면에서는 크게 달라진 것이 없습니다. 물론 세세하게 들어가면 몇몇 warning 창이 새로 생기고, 수행여부를 사용자에게 물어보기도 하고, ActiveX Component을 사용하지 못하도록 할 수도 있고 등등 이것저것 많습니다만 이건 순전히 사용자 측면이고 개발자들은 기존의 규칙을 잘 따르기만 하면 큰 문제는 생기지 않습니다. 이러한 환경에서는 여전히 ActiveX Component의 관리자의 권한을 얻을 수 있습니다.

이제는 Vista로 가볼 차례입니다. 가장 먼저 변경된 사항은 Vista IE 7에만 존재하는 보호모드(protected mode) 입니다. UAC와 관련된 내용을 일부 확인하셨다면 Administrators 그룹에 포함된 사용자라 하더라도 권한상승창을 통하지 않고는 관리자 권한으로 프로세스를 수행할 수 없다는 것 즈음을 아시고 계시리라 생각합니다. 그런데 보호모드란 녀석은 UAC보다 더 지독합니다. 왠만하면 아무것도 못하게 합니다.

이전의 OS에서는 아무런 제약없이 했던 파일쓰기나 레지스트리 추가/수정, 다른 서버로 연결하기 등은 모두 제한됩니다. 그래서 만일 관리자 권한이 필요한 작업을 수행하려면, ActiveX Component를 2개 만들어서 하나는 보호모드로 수행중인 iexplore.exe 프로세스 안에서 수행되게 놔두고 나머지 한녀석은 dllhost.exe라는 surrogate process가 hosting하도록 구성해야 합니다. 물론 이 과정에서 dllhost.exe는 관리자 권한을 가지고 수행될 수 있도록 조치를 해 두어야 합니다. 이 내용은 다음에 알아보기로 합시다. 사실 이러한 내용들은 모두 기존의 ActiveX 가 Vista에서도 정상적으로 동작하려면 어떻게 해야하는가에 대한 호환성과 관련된 내용입니다.

오늘 확인할 내용은 IE7에서 새로이 제공하는 함수인데 다 접어두고 구체적인 내용을 가지고 접근해 봅시다. 먼저 ActiveX Component내에서 IE가 현재 보호모드에서 수행중인지의 여부를 어떻게 확인하면 좋을까요? msdn에 새로 추가된 Internet Explorer 7 관련 API 목록을 살펴보면 바로 그 내용을 확인할 수 있습니다.

HRESULT IEIsProtectedModeProcess(BOOL *pbResult);

위 함수를 이용하면 ActiveX를 hosting하고 있는 현재의 IE process가 보호모드에서 돌고 있는지의 여부를 확인할 수 있습니다. 이 함수가 만일 FALSE를 반환하면 우리는 매우 happy합니다. 왜냐하면 위에서 말씀드린바와 같이 별 제약없이 모든 기능을 수행할 수 있을테니까요.

두번째로 알아볼 내용은, 저장가능한 Folder위치나 레지스트리 위치를 찾아내는 함수들입니다. 앞서 보호모드에서는 파일쓰기, 레지스트리 추가/수정 등이 제한된다고 했습니다만 다행히도 완전히 이런 기능이 불가능한 것만은 아닙니다. 앞으로 알아볼 특별한 위치에 대해서는 IE7이 보호모드에서 수행되고 있고, IE 프로세스 내부로 로딩된 ActiveX라 하더라도 쓰기가 가능합니다. (사실 IE7이 보호모드에서 수행된다 하더라도 여전히 temporary internet files 폴더 등에 파일을 저장하고 있지 않습니까?)

먼저 레지스트리상에 쓰기 가능 영역은 어떻게 얻어올 수 있을까요?

HRESULT IEGetWriteableHKCU(HKEY *phKey );

위 함수가 도움이 됩니다. 레지스트리상에 쓰기 가능영역은 HKEY_CURRENT_USER 이하에 위치하게 되고, 이곳의 위치를 알기 위해서는 위 함수를 반드시 이용해야 합니다 HKEY를 가져오게 되면, 그 다음은 레지스트리 관련 함수를 그대로 이용하면 되겠지요. 물론 이 함수에 의해서 획득된 HKEY에 대해서도 반드시 RegCloseKey() 함수로 close해주어야 함은 물론입니다.

다음은 로컬파일시스템 상에 쓸 수 있는 영역을 획득하는 방법에 대해서 알아봅시다. 위의 레지스트리의 예와 그다지 틀리지 않습니다.

HRESULT IEGetWriteableFolderPath(GUID clsidFolderID, LPWSTR *lppwstrPath );

첫번째 인자로 줄 수 있는 내용은, KnownFolders.h 파일에 정의된 내용중 하나가 올 수 있습니다만, 반환값을 확인하여 실제 접근이 가능한지 확인하여야 합니다. FOLDERID_InternetCache, FOLDERID_Cookies, FOLDERID_History, FOLDERID_LocalAppDataLow 을 지정할 수 있습니다. 주의할 것은 두번째 인자로 반환된 LPWSTR * 값은 추후 CoTaksMemFree()로 해제되어야 한다는 것입니다.

그외에도 몇가지 추가적인 함수들이 있는데, 목록만을 써보면 다음과 같습니다.

IECancelSaveFile
IEGetWriteableFolderPath : 앞서 알아본 함수
IEGetWriteableHKCU : 앞서 알아본 함수
IEIsProtectedModeProcess : 앞서알아본함수
IEIsProtectedModeURL
IELaunchURL
IESaveFile
IEShowSaveFileDialog

이에 대한 사용 예제는 Introduction to the Protected Mode API 를 통해 sample도 확인해 보시기 바랍니다.

'Internet Explorer' 카테고리의 다른 글

IE10 랜더링 문제 해결 방안  (0) 2013.05.28
IE 신뢰사이트  (0) 2012.03.30
ProtectedModeHelper  (0) 2012.03.30
IE Protected Mode 해제  (0) 2012.03.30
IE 보호 모드에서 비보호 모드 프로세스 실행  (0) 2012.03.30

관련글 더보기