모종의 음모/Notepad22009. 5. 8. 13:22


간만에 백신을 돌려보았더니
notepad2를 실행하는 부분의 레지스트리가 바이러스로 검출이 되도록 패턴이 수정되었다.


...
어떻게 피해가야 하나 -ㅁ-?
Posted by 구차니
파일방2009. 1. 16. 11:34
자세한 내용은 http://mr-ok.com/tc/entry/notepad2-ultimatum 을 참조 하세요


'파일방' 카테고리의 다른 글

TeamViewer  (0) 2009.08.03
UFO:AI 임시 번역본  (0) 2009.03.07
Dual time clock  (0) 2009.02.04
공개 시리얼 프로그램(터미널) - free terminal program(RS-232)  (6) 2009.01.21
POTO TV CSE 드라이버(회색)  (22) 2008.11.26
Posted by 구차니
모종의 음모/Notepad22009. 1. 4. 22:30
메뉴상에서 notepad.exe를 notepad2.exe로 대체 할 것인지에 대한 메뉴를 추가 하였다.
일단 사용한 함수는 RegSetValueEx 이다.

 
 LONG WINAPI RegSetValueEx(
   __in        HKEY hKey,
   __in_opt    LPCTSTR lpValueName,
   __reserved  DWORD Reserved,
   __in        DWORD dwType,
   __in_opt    const BYTE *lpData,
   __in        DWORD cbData
 );

기존에는 RegSetValue를 사용했었는데, 이 녀석은 Key , SubKey에 대해서 만 등록을 할 수 있지,
Value는 등록하지 못하므로 Value를 등록 할 수 있는 RegSetValueEx를 사용하게 되었다.

 RegSetValueExW(key1, L"Debugger", 0, REG_SZ, cmd, len * 2);
데이터는 위의 prototype를 보면 알겠지만,
"키,value name, 0, 변수 타입, value, 길이" 의 순서인데 reserved 값으로 0이 고정 되어 있다.

notepad2 프로젝트는 unicode로 되어 있으므로, 이에 대응하기 위해서 RegSetValueExW로 함수를 사용하였는데,
버그인지는 모르겠지만, len 부분에서 2배를 해주어야 만 제대로 value가 들어 가는 문제가 있었다.
2배라고 함은 unicode는 2byte 문자열이므로 이를 맞추어 주기 위해 2배가 된 것 같기는 하지만,
문자열이 unicode인데 길이만 따로 ascii 식으로 세어 준다는 것은 무언가의 문제가 있는 것으로 보인다.

그리고 prototype 상으로는 BYTE 타입의 문자열을 원하므로 Unicode 함수임에도 불구하고 warning을 출력한다.
--------------------Configuration: Notepad2 - Win32 Release--------------------
Compiling...
Notepad2.c
C:\cvsdown\np2src_VC6\src\Notepad2.c(2994) : warning C4133: 'function' : incompatible types - from 'unsigned short [264]' to 'const unsigned char *'
Linking...

Notepad2.exe - 0 error(s), 1 warning(s)


[출처 : http://msdn.microsoft.com/en-us/library/ms724923(VS.85).aspx]
Posted by 구차니
메모장을 대체 하기 위한 프로그램으로 notepad2 와 notepad++가 있다.

1. notepad2

2. notepad++


notepad++을 실행 만 시켜 봤는데, 상당히 화려하고, 먼가 기능이 매우 많아 보인다.
단순하게 용량을 비교 하자면 sourceforge notepad++ 프로젝트 에서 받은
최신 버전의 용량은 3.23MB (3,397,310 바이트)
그리고 압축이 해제된(ANSI/UNICODE 버전 두가지 포함)
디렉토리의 용량은 10.7MB (11,295,036 바이트) 이다.
그리고 실행하는데 시간이 약간 걸린다. 내 시스템에서 화면 나오는데 대략 1초 미만 정도로 추정된다.
[notepad++ 공식 : http://notepad-plus.sourceforge.net/uk/site.htm]

하지만 notepad2는
누르자 마자 실행이 되고, 용량은 한글판 최신 버전 기준 300KB 미만이다.
용량/속도 대비로는 notepad2가 상당히 우세하나, 눈에 보이는 기능이라던가 글꼴은 notepad++가 낫다.

메모장 대체라는 가벼운 용도라면 notepad2를
ultraedit 등의 에디터를 대체하는 용도라면 notepad++를 하는 것이 나을 듯 하다.
[notepad2 공식 : http://www.flos-freeware.ch/notepad2.html]
Posted by 구차니
모종의 음모/Notepad22008. 12. 29. 23:54
메모장2 한글화를 위해서 context-menu 역시 한글로 하자는 의견이 나와서 수정을 하게 되었다.
물론.. 이번에는 검색도 없이 조언을 받아 약간의 시행오차를 거쳐 수정하게 되었다.

frhed를 이용한 테스트

step 1. 레지스트리는 HKEY_CLASSES_ROOT\*\shell 에 추가되는데 "Open in frhed" 라는 key가 보인다.


step 2. 하위 항목인 "command" 키에는 실행될 프로그램의 경로 및 인자를 넘겨 주기 위한 %1이 존재한다.


step 3. "Open in frhed" 키에 존재하는 (기본값) 의 내용을 수정해 준다.


step 4. context-menu에서 출력되는 모습을 구경한다. 기본값을 설정해준 대로 변경되었다.
   


이것을 이용하면, 출력 포맷은 바뀌어도 key는 변하지 않으므로 수정이 용이하다고 한다. (BLUE'nLIVE 님의 조언)


레지스트리 편집기를 이용하는 것 말고 프로그램으로 이것을 적용하려면 아래와 같이 하면된다.
            HKEY key1;
            LONG res = RegCreateKey(HKEY_CLASSES_ROOT,L"*\\shell\\Open with notepad2",&key1);
            if (res == ERROR_SUCCESS)
            {
                WCHAR cmd[] = L"메모장2로 열기(&E)";
                RegSetValue(key1, NULL, REG_SZ, cmd, wcslen(cmd)); // wcslen - strlen for unicode
            }

            res = RegCreateKey(HKEY_CLASSES_ROOT,L"*\\shell\\Open with notepad2\\command",&key1);
            if (res == ERROR_SUCCESS)
            {
                WCHAR cmd[MAX_PATH + 4];
                WCHAR path[MAX_PATH];
                int len;
                GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
                len = wsprintf(cmd, L"%s %%1", path);
                RegSetValue(key1, NULL, REG_SZ, cmd, len);
            }

[wcslen  : http://msdn.microsoft.com/en-us/library/78zh94ax(VS.71).aspx]
Posted by 구차니
모종의 음모/Notepad22008. 12. 28. 00:37
컴파일을 이상없이 되는 관계로!
이제 기능추가를 위해 몸부림을 쳤다 ^^;

추가 될 내용은 레지스트리 관련기능들 인데..
문제는 /D "_UNICODE" 로 인해서 함수들이 모두 유니코드 대응으로 변환되었다는 점이다.



이로 인해서 약간의 삽질이 추가 되었다.

            HKEY key1;
            LONG res = RegCreateKey(HKEY_CLASSES_ROOT,
                L"Unknown\\shell\\Open with notepad2\\command",
                &key1);
            if (res == ERROR_SUCCESS)
            {
                WCHAR cmd[MAX_PATH + 4];
                WCHAR path[MAX_PATH];
                int len;
                GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
                len = wsprintf(cmd, L"%s %%1", path);
                RegSetValue(key1, NULL, REG_SZ, cmd, len);

유니코드로 함수들이 변경되면서 char 형의 변수에서 WCHAR 형으로 바뀌고
각종 스트링들도 T 접두를 붙여서 unicode 형으로 바꾸어 주었다.
물론 sprintf 역시 유니코드를 지원하는 wsprintf로 변경!

이로서 간편하게 context-menu에서 실행이 가능하도록 설정을 할 수 있게 되었다.
Posted by 구차니
모종의 음모/Notepad22008. 12. 24. 00:31
MS Platform SDK를 설치 한다고 해서 바로 되는게 아니라
우선순위가 상당히 낮아져 있기 때문에 Visual Studio에서 설정을 바꾸어 주어야 한다는 말에
설정을 바꾸고 선언문을 삭제 하니 이상없이 컴파일이 되었다.




물론 소스상의 문제(?)로 프로토타입과 실제 함수의 리턴 타입이 맞지 않아 에러가 발생을 하긴 했지만 말이다.
일단 DWORD *func와 DWORD_PTR func가 같아 보이는데, 다르게 인식을 해서 생긴 문제였다.


아무튼 요즘에 Win32API 스타일로 프로그래밍을 하다 보니, 조금은 눈에 익은 녀석들이 보여서
상대적으로 그다지 어렵지는 않게 수정을 하고는 있지만, 생각보다 상당히 방대한 녀석이라..
Source Insight 없이 Visual Studio만으로 하기에는 상당히 귀찮은 느낌이 든다. ㅠ.ㅠ

오늘은 메뉴에 추가해서 체크 on/off까지만~


Posted by 구차니