몇 번 애기한 이슈인데, 메모장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에게 이 문제를 제기했지만, 말같잖은 답만 들어서 이 해결책은 얘기 안 해줌
덧3. Notepad2의 원작자 Florian Balmer에게 리포트 완료했음