ChangeWindowMessageFilter
권한이 낮은 어플리케이션에서 높은 어플리케이션으로 메시지를 전송 할때 사용 한다.
권한이 높은 어플리케이션에서 ChangeWindowMessageFilter api 를 사용하여 메세지를 필터에 등록 해 준다.
단, VISTA 와 WINDOWS 7 에서는 service session 과 user session 이 확연히 분리 되어 있다.
service process area 가 isolation 이라는 것이다. 그러므로 service porcess 와 user process 와 통신 하기 위해서는 아래와 같이 필터 등록 만으로 처리 할 수가 없다.
그렇게 하기 위해서 했던 방법으로는 named pipe or 높은 권한을 가진 service process 에서 user process 를
CreateProcessAsUser 로 실행 해 주는 방법이 있다. 그렇게 하므로써 named pipe 도 가능하게 된다.
이 방법에 대해서는 다음에 자세히 설명 하도록 하겠다.
//함수 선언부
typedef BOOL (WINAPI *CHANGEWINDOWMESSAGEFILTER)(
UINT message,
DWORD dwFlag
);
위 부분을 선언부에 선언 한 후에 아래의 함수 부분을 어플리케이션 entry function 에 넣어준다.
initdialog or initinstance
WM_COPYDATA의 경우
- Admin 권한 프로세스 -> User 프로세스 는 가능
-
User 프로세스 -> Admin 프로세스는 기본적으로 불가
HANDLE hDll;
CHANGEWINDOWMESSAGEFILTER ChangeWindowMessageFilter;
hDll= LoadLibrary("USER32.DLL");
ChangeWindowMessageFilter=(CHANGEWINDOWMESSAGEFILTER)GetProcAddress((HINSTANCE)hDll,"ChangeWindowMessageFilter");
if(ChangeWindowMessageFilter == NULL)
return;
//WM_COPYDATA 메세지를 필터에 등록해준다.
ChangeWindowMessageFilter(WM_COPYDATA,1); //1 = add , 2 = remove
FreeLibrary(hDll);
참조 : http://blog.naver.com/remipa01?Redirect=Log&logNo=90015086046