반응형


예~~~전에 지극히 개인적인 편의를 위해 만든 인젝터가 하나 있습니다. ㅎㅎㅎ


이름도 거창한(?) "건담 인젝터" ;;;


2011/07/31 - [My Portfolio] - [APP] GInjector (Gundam Injector)


이 당시 가장 신경을 썼던 기능이 "Drag & Drop" 인데요~~


( 기존의 다른 인젝터들을 쓸 때 매번 버튼을 눌러서 인젝션 할 대상파일을 지정하는게 귀찮아져서~

Drag & Drop 을 지원하는 걸 그냥 만들자~~ 해서 뚝딱뚝딱 만든거랄까요.. ^^;;;; )



이때만해도 주로 인젝션 작업을 한 OS 가 XP 였기에~ 별다른 불편함없이 잘 썼습니다.


그러다가 이런저런 이유로 몇 달 전부터 주 작업 OS 를 Win7 으로 바꿨는데~


인젝터를 '관리자 권한으로 실행' 만 하면~~ 탐색기(낮은 권한 상태)로부터 Drag & Drop 이 안먹히더군요;;;


Drag & Drop 때문에 만든 인젝터인데 그게 안먹힐 때의 그... 허탈함이란..;;;


'수정해야지... 수정해야지...' 생각만 해오다가 불과 2 ~ 3일 전에서야 수정을 했습니다.



키포인트는 비스타부터 지원되는 "ChangeWindowMessageFilter" API 인데요~~

( MSDN - http://msdn.microsoft.com/en-us/library/windows/desktop/ms632675(v=vs.85).aspx )


일반적으로는 권한이 낮은 프로세스에서 권한이 높은 프로세스로 메시지 전달이 안되는데


메시지를 받는 프로세스쪽(저의 경우는 인젝터가 되겠죠~)에서


위의 API 를 이용해서 메시지 필터 설정을 해주면 메시지 전달이 가능하더군요~ :)


Drag & Drop 과 관련된 메시지를 허용하도록 설정하는 코드는 다음과 같습니다.


//
// 컴파일러 버전에 따라 "ChangeWindowMessageFilter" 를 바로 쓸 수 없는 경우도 있어서
// 동적으로 구해오는 방식으로 했습니다.
//
#ifndef WM_COPYGLOBALDATA
#define WM_COPYGLOBALDATA 0x0049

#ifndef MSGFLT_ADD
#define MSGFLT_ADD 1

typedef BOOL (WINAPI *pfnChangeWindowMessageFilter)(UINT, DWORD);

.
.
.

HMODULE hUser32Mod = LoadLibrary("USER32.DLL");
if (hUser32Mod != NULL) {
    pfnChangeWindowMessageFilter pChangeWindowMessageFilter =
        (pfnChangeWindowMessageFilter)GetProcAddress(hUser32Mod, "ChangeWindowMessageFilter");

    // XP 이하의 OS 는 해당 API 가 없음. API 가 있는 경우만 실행될 수 있도록 함...
    if (pChangeWindowMessageFilter != NULL) {
        pChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
        pChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
        pChangeWindowMessageFilter(WM_COPYGLOBALDATA, MSGFLT_ADD);
    }
}
// 이후 필요없는 경우 USER32.DLL 은 언로드~
// if (hUser32Mod) FreeLibrary(hUser32Mod);

덕분에 지금은 Win7 에서 인젝터를 "관리자 권한으로 실행" 해도 Drag & Drop 이 잘 동작해서~


인젝터가 존재의 이유를 다시 찾았습니다... =_=v...



반응형
AND