권한이 낮은 어플리케이션에서 높은 어플리케이션으로 메시지를 전송 할 때 사용한다.

권한이 높은 어플리케이션에서 ChangeWindowMessageFilter API를 사용하여 메세지를 필터에 등록해 준다.

 

단, VISTA와 Windows7 에서는 service session과 user session이 확연히 분리되어 있다.

service process area가 isolation 이라는 것이다. 그러므로 service process와 user process 와 통신하기 위해서는 아래와 같이 필터 등록만으로 처리할 수 가 없다.

그렇게 하기 위해서 했던 방법으로 named pipe or 높은 권한을 가진 service process에서 user process 를 CreateProcessAsUser로 실행해 주는 방법이 있다. 그렇게 함으로써 named pipe도 가능하게 된다.

 // 함수 선언부

 

typed BOOL (WINAPI *CHANGEWINDOWMESSAGEFILTER)(

UINT message,

DWORD dwFlag

);

 

위 부분을 선언부에 선언한 후에 아래의 함수 부분을 어플리케이션 entry function에 넣어준다.

initdialog or initinstance

 

WM_COPYDATA의 경우

1. Admin 권한 프로세스 -> User 프로세스는 가능

2. User 프로세스 -> Admin 프로세스는 기본적으로 불가

 

HANDLE hDll;

CHANGEWINDOWMESSAGEFILTER ChangeWindowMessageFilter;

hDll = LoadLibrary("USER32.DLL");

ChangeWindowMessageFilter = (CHANGEWINDOWMESSAGEFILTER)GetProcAddress((HINSTANCE)hDll, "ChangeWindowMessageFilter");

 

if ( ChangeWindowMessagFilter == NULL )

return;

 

// WM_COPYDATA 메세지를 필터에 등록해 준다.

 

FreeLibrary(hDll);

참조 : ChangeWindowMessageFilter

         ChangeWindowMessageFilterEx


예제)

ChangeWindowMessageFilter(A, MSGFLT_ADD);
A파라미터에 해당메세지 값을 등록하면 
그 메세지에 한해 OnCopyData(WM_COPYDATA)에서 값을 받아 올 수 있을 것입니다.

아래 예제는 관라자 권한에서 Drag & Drop 메세지를 가능하게 하는 소스입니다.
 

typedef BOOL (WINAPI *CHANGEWINDOWMESSAGEFILTER)(

  UINT message,

  DWORD dwFlag

);

#define MSGFLT_ADD 1

void Test::FilterApply()
{

HMODULE hDll;

CHANGEWINDOWMESSAGEFILTER ChangeWindowMessageFilter;

hDll = LoadLibrary("USER32.DLL");

ChangeWindowMessageFilter = (CHANGEWINDOWMESSAGEFILTER)GetProcAddress((HINSTANCE)hDll, "ChangeWindowMessageFilter");

if ( ChangeWindowMessageFilter == NULL )

{

AfxMessageBox("^^;");

return TRUE;

}


if(ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD) == FALSE)

AfxMessageBox("1");

if(ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD) == FALSE)

AfxMessageBox("2");

ChangeWindowMessageFilter (0x0049, MSGFLT_ADD);

FreeLibrary(hDll);



void Test::OnDropFiles(HDROP hDropInfo)
{

UINT nCnt = DragQueryFile(hDropInfo, 0xffffffff, NULL, 0);

    for(UINT i = 0; i < nCnt; i++)

    {

        char wzItem[MAX_PATH] = {0};

        int nCount = DragQueryFile(hDropInfo, i, wzItem, MAX_PATH);

AfxMessageBox(wzItem);

        if( nCount == 0 )

            continue ;

#ifdef _DEBUG

        wcscat_s<MAX_PATH>(wzItem, L"\n");

        OutputDebugString(wzItem);

#endif

    }

    DragFinish(hDropInfo);

    CDialog::OnDropFiles(hDropInfo);

Posted by 띠깜
,