몇 번 애기한 이슈인데, 메모장2 mod에는 이상한 오류가 있다.

32비트 어플에서 64비트 메모장2 mod로 드래그앤드롭을 하면 오류가 발생한다는 것.

게다가 이 문제는 윈도우 7에선 발생하지 않고, 윈도우 8 이상에서만 발생해서 더욱 아리송했다.


이봐… 내가 떨어뜨리던 파일은 그게 아니라고…


그런데, 블로그 구독자분께서 단비와도 같은 링크를 답글로 달아주셨다.

스택오버플로우에 이 문제에 대한 해답이 올라와 있었던 것이다!


대략의 내용은 아래와 같다.


1. 이 문제는 순전히 윈도우 8 이상의 버그에 의한 것임

2. 컴파일 시 윈도우 8 이상에서 제공되는 High Entropy ASLR을 비활성화하면 간단히 해결 가능

3. 잃어버린 HDROP의 상위 32비트 값을 찾아내려면 GlobalAlloc()를 사용하면 됨


즉, 링크 옵션에서 /HIGHENTROPYVA:NO를 지정하는 것만으로도 문제는 해결된다.

그런데, 보안성이 다소 저하되는 게 걱정되면 HDROP를 아래와 같이 찾아낼 수 있다.


    case WM_DROPFILES:
      {
        WCHAR szBuf[MAX_PATH+40];
        HDROP hDrop = (HDROP)wParam;
#if defined(_WIN64)
        DWORDLONG hDropTemp = (DWORDLONG)GlobalAlloc(GMEM_MOVEABLE, 0);
        long long int i;
        GlobalFree((HGLOBAL)hDropTemp);
       
        hDrop = (HDROP)(((hDropTemp - 16) & 0xffffffff00000000) | (wParam & 0xffffffff));
        for (i = -4 - 16; i < 5 - 16; ++i) {
            if (((hDropTemp + i) & 0xffffffff) == (wParam & 0xffffffff)) {
                hDrop = (HDROP)(hDropTemp + i);
                break;
            }
        }
#endif

덧1. 이 문제를 무려 3년 넘게만에 해결했음. 3년!


덧2. Notepad2-mod를 진행하는 XhmikosR에게 이 문제를 제기했지만, 말같잖은 답[각주:1]만 들어서 이 해결책은 얘기 안 해줌


덧3. Notepad2의 원작자 Florian Balmer에게 리포트 완료했음



  1. 왜 나한테 얘기하냐, 왜 32비트 프로그램 쓰냐 등등 [본문으로]
신고

+ Recent posts