특정 프로그램 설치시 권한을 특정 어카운트에 종속적으로 등록한 경우, 서비스로 등록된 프로그램이 해당 프로그램 관련 명령을 내릴때 실패가 난다.


그래서 그 프로그램을 설치한 계정으로 서비스를 실행시키면 해결 할 수 있다.


sc create 프로그램 이름 binpath= "프로그램 경로" start= auto obj= "도메인\계정" password= "비번"


혹은, 문제가 되는 프로그램을 everyone으로 실행 가능하게 등록하는 방법도 있다.


특정 머신에서만 동작하지 원격 명령어가 있다면, 해당 문제를 의심해보도록.


PS : 나는 이런 문제 이외에도, 상대 경로 문제도 있었다.

서비스로 실행 될 경우 경로가 프로그램 설치 경로로 지정되지 않기 때문이다.


하지만 이번엔 그 문제가 아니어서 원인을 찾는 데에 시간이 좀 걸린편이었다.


참고 자료


Technet sc

http://technet.microsoft.com/en-us/library/bb490995.aspx


MSDN sc (Service Controll)

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682107(v=vs.85).aspx


SC 커맨드 주의 사항

http://ditongs.egloos.com/2302972


SC 명령어 정리

http://gipsi.tistory.com/entry/SC-%EB%AA%85%EB%A0%B9%EC%96%B4%EB%A1%9C-%EC%84%9C%EB%B9%84%EC%8A%A4Service-%EA%B4%80%EB%A6%AC%ED%95%98%EC%9E%90

'OS > Windows' 카테고리의 다른 글

서비스로 등록된 프로그램 권한 문제  (0) 2013.06.05
[WINDOWS] Perfmon (성능 모니터)  (0) 2011.02.09
findstr - 파일에서 문자열 찾기  (0) 2010.11.26
Non-Paged Pool  (2) 2010.08.12
MS-DOS 명령어  (0) 2008.07.16
ASCII 테이블  (0) 2008.01.12
Posted by 엘키 엘키

댓글을 달아 주세요

Windows Performance Monitor
http://technet.microsoft.com/en-us/library/cc749249.aspx

Windows Vista Performance and Reliability Monitoring Step-by-Step Guide
http://technet.microsoft.com/en-us/library/cc722173(WS.10).aspx

Performance Monitor Wizard
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=31fccd98-c3a1-4644-9622-faa046d69214

'OS > Windows' 카테고리의 다른 글

서비스로 등록된 프로그램 권한 문제  (0) 2013.06.05
[WINDOWS] Perfmon (성능 모니터)  (0) 2011.02.09
findstr - 파일에서 문자열 찾기  (0) 2010.11.26
Non-Paged Pool  (2) 2010.08.12
MS-DOS 명령어  (0) 2008.07.16
ASCII 테이블  (0) 2008.01.12
Posted by 엘키 엘키

댓글을 달아 주세요

C:\>findstr /?
파일에서 문자열을 찾습니다.

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P]
         [/F:파일][/C:문자열] [/G:파일] [/D:디렉터리 목록] [/A:색 속성] [/OFF[LINE]]
         문자열 [[드라이브:][경로]파일이름[ ...]]

  /B         패턴이 행의 첫부분에 있는지를 비교합니다.
  /E         패턴이 행의 끝부분에 있는지를 비교합니다.
  /L         찾는 문자열을 글자 그대로 사용합니다.
  /R         찾는 문자열을 정규식으로 사용합니다.
  /S         현재 디렉터리와 모든 하위 디렉터리에서 일치하는 파일을 찾습니다.
  /I         찾을 때 대/소문자를 구별하지 않습니다.
  /X         정확히 일치하는 줄만 보여줍니다.
  /V         일치하는 텍스트가 없는 줄만 보여줍니다.
  /N         일치하는 각 줄 앞에 줄 번호를 보여줍니다.
  /M         파일에 일치하는 텍스트가 있으면 파일 이름만 보여줍니다.
  /O         일치하는 각 줄 앞에 문자 오프셋을 보여줍니다.
  /P         인쇄할 수 없는 텍스트가 포함된 파일은 건너뜁니다.
  /OFF[LINE] 오프라인 속성 세트 파일을 건너뛰지 않습니다.
  /A:속성    색 속성을 두자리 16진수로 지정합니다. "color /?"를 참조하십시오.
  /F:파일    지정된 파일에서 파일 목록을 읽습니다('/'는 콘솔에 해당됩니다).
  /C:문자열  지정된 텍스트를 글자 그대로 찾는 문자열로 사용합니다.
  /G:파일    지정된 파일로부터 찾는 텍스트를 받습니다('/'는 콘솔에 해당됩니다).
  /D:디렉터리    디렉터리 목록을 구분하는 세미콜론(;)를 찾습니다.
  문자열     찾을 텍스트.
  [드라이브:][경로]파일이름
             찾을 파일을 지정합니다.

/C 옵션을 사용한 경우가 아니면, 찾는 문자열을 여러 개 지정할 때
공백으로 분리하십시오. 예를 들면, 'FINDSTR "hello there" x.y' 명령을
입력하면 파일 x.y에서 "hello"나 "there"을 찾습니다.
반면에 'FINDSTR /C:"hello there" x.y' 명령을 입력하면 파일 x.y에서
"hello there"을 찾습니다.

정규식에 대한 참고 사항:
  .         와일드카드: 모든 문자
  *         반복: 문자나 클래스에 대하여 0번 이상 반복
  ^         행 위치: 행의 앞부분
  $         행 위치: 행의 끝부분
  [클래스]  문자 클래스: 세트에 있는 문자
  [^클래스] 역 클래스: 세트에 없는 문자
  [x-y]     범위: 특정 범위에 있는 문자
  \x        익스케이프: 메타 문자 x를 문자 그대로 사용
  \<xyz     단어 위치: 단어의 앞부분
  xyz\>     단어 위치: 단어의 끝부분

Findstr에서 사용 가능한 정규식은 온라인 명령을 참조하십시오.

'OS > Windows' 카테고리의 다른 글

서비스로 등록된 프로그램 권한 문제  (0) 2013.06.05
[WINDOWS] Perfmon (성능 모니터)  (0) 2011.02.09
findstr - 파일에서 문자열 찾기  (0) 2010.11.26
Non-Paged Pool  (2) 2010.08.12
MS-DOS 명령어  (0) 2008.07.16
ASCII 테이블  (0) 2008.01.12
Posted by 엘키 엘키
 TAG findstr

댓글을 달아 주세요

2010. 8. 12. 14:43 OS/Windows

Non-Paged Pool

윈도우즈에서 내부적으로, 시스템이 사용하려는 메모리 공간을 제한되게 확보하는 것들이 있는데, 그 중에서 하나가 Non-Paged Pool이다.

Memory Limits for Windows Releases

Non-Paged Pool 메모리는 물리 메모리에만 할당 되는 것으로, 페이지 폴트가 없이 접근하기 위한 메모리 영역이다. 
페이지 폴트가 없다보니, 접근 속도도 물론 빠르다.
이러한 장점으로 인해 고레벨 IRQL 접근이 오류가 없이 가능해진다.

하지만, 이런 장점에도 불구하고, 몇몇 잘못된 드라이버나 프로그램들이 Non-Paged Pool에 할당되는 데이터를 남용해서 문제가 생기곤 한다.

실제로 커널 오브젝트의 일부 (WSASend, WSARecv, bind, connect 등등)과, 커널 드라이버 들이 주로 이 메모리에 할당 된다.
하지만 말했다시피, 메모리 공간을 제한해서 확보해둔 것이기 때문에, 이 공간을 다 사용한다면 할당에 실패하게 된다.

만약 잘못된 비공식 드라이버 내지는, 공식이지만 버그가 있는 경우에는 이 공간이 충분치 않아, 커널 단 동작에 오류가 생겨 알 수 없는 증상이 발생하고, 심지어는 레지스트리나, 파일이 깨지는 증상이 발생하기도 한다 (http://support.microsoft.com/default.aspx?scid=kb;en-us;156316)
 
Non-Paged Pool 에 대한 모니터는 작업 관리자나, perfmon을 통해서 보면 된다. (커널 메모리 부분 참고)

Detail하게 pooltag까지 보고 싶다면 poolmon이나 pooltag을 사용하면 된다. pooltag를 본다면, 어떤 프로그램이 커널 메모리를 과하게 사용하고 있는지 등의 추이를 볼 수 있기 때문에, 여러가지로 유용할 것이다.

Non-Paged Pool 크기 조정시 유의 사항은, 물리 메모리 크기를 염두에 두고 조정해야 한다는 것이다. 너무 크게 설정한다면, 어플리케이션이 사용할 메모리 크기가 영향을 받기 때문이다.

Nonpaged Pool is over the warning threshold


NonPagedPoolSize

IOCP의 커널 레벨 동작 원리

원한다면 어플리케이션 단에서 페이지 아웃이 안되게 설정하는 것도 가능하다.

VirtualLock(), VirtualUnlock() 함수를 이용하면 된다.

여기서 주의할 점은, 물리적인 메모리 자원은 한정되어 있기 때문에 페이지 아웃이 안되는 메모리 영역이 커지면 가상 메모리 (물리 메모리 <-> 하드 디스크간의 이동) 처리를 위한 페이지 인/아웃을 수행하는 메모리 공간이 줄어들기 때문에, 빈번한 페이징이 일어나게 되고, 시스템 퍼포먼스 저하를 일으키게 되기 때문에 매우 신중히 결정해야 할 것이다.


PoolMon.exe 를 이용한 커널 메모리 누수 모니터
http://support.microsoft.com/kb/177415/ko

'OS > Windows' 카테고리의 다른 글

[WINDOWS] Perfmon (성능 모니터)  (0) 2011.02.09
findstr - 파일에서 문자열 찾기  (0) 2010.11.26
Non-Paged Pool  (2) 2010.08.12
MS-DOS 명령어  (0) 2008.07.16
ASCII 테이블  (0) 2008.01.12
어떻게 윈도우 프로시저는 재진입되는가  (0) 2008.01.12
Posted by 엘키 엘키
 TAG NonPagedPool

댓글을 달아 주세요

  1. Favicon of http://blog.sooli.com BlogIcon 술이 2011.11.30 02:45  댓글주소  수정/삭제  댓글쓰기

    커널메모리를 어떤 드라이버가 차지하는지 궁금해서 검색해봤더니 이글이 보이네요. 덤프가 떨어지지 않으면 뭐가 문제인지 모르는 시점에서는 이게 필요하다 싶었습니다. 갑자기 사라진 메모리 어디로 갔나? 하면서 찾는다고 하길레 하드웨어 드라이버들 최신걸로 올리라는 말밖에...

    • Favicon of https://elky.tistory.com BlogIcon 엘키 엘키 2011.11.30 15:10 신고  댓글주소  수정/삭제

      ^^ 네. 어떤 프로그램이 쓰는지 보실땐...poolmon을 활용하시면 정말 좋아요 ㅎ 저도 종종 쓰게 되더라고요

      http://support.microsoft.com/kb/177415/ko

      위 링크를 참고해서 테스트 해보시면 될거 같습니다 ^^

2008. 7. 16. 09:56 OS/Windows

MS-DOS 명령어

㉠ DIR 명령 : 디렉토리 안에 들은 내용을 알고자 할 때 사용하는 명령어 

dir c:\util /p util 디렉토리에 들은 내용을 한 화면씩 출력해줄래.? 

옵 션 기 능 
/P 한 화면씩 보여준다. 
/W 가로로 파일 목록을 만든다. 
/A 지정한 속성을 갖는 파일만 보여준다. 
속성 → R : 읽기전용 파일, H : 숨김 파일, A : 기록 파일, S : 시스템 파일, - : 지정한 속성제외 
/O 내용을 출력할 순서를 지정한다. 
순서 → N : 이름순(알파벳순), S : 크기순(작은 파일부터), E : 확장명순(알파벳순), 
D : 날짜와 시각순(빠른순서), - : 역순 
/S 지정한 디렉토리 파일과 하위 디렉토리를 모두 보여준다. 
/B 제목 정보나 요약 정보를 생략하고 기본 포멧대로 보여준다. 
/L 소문자를 사용한다. 
/V 모든 정보를 자세하게 보여준다. 
====================================================================================== 
㉡ CD 명령 : 디렉토리 사이를 이동할 때 사용하는 명령어 

cd c:\yes → c 드라이브에 있는 yes 폴더로 가주겠니.? 

cd.. → 한 단계 바로 위 폴더로 가. 
cd... → 두 단계 위 폴더로 가라거.. 
cd\ → 무조건 루트폴더로 이동해라잉. 
====================================================================================== 
㉢ MD 명령 : 디렉토리를 만들때 사용하는 명령어 

md test → test 라는 폴더를 만들어라.
====================================================================================== 
㉣ DEL 명령 : 디렉토리안에 있는 파일을 삭제하는 명령어 

del why.com → why.com 파일을 삭제해버려. 

del *.* → 디렉토리에 들은 모든파일을 깡그리 삭제하라. 
del . → 현재 디렉토리에 들은 모든파일을 싸그리 삭제하라 
====================================================================================== 
㉤ RD 명령 : 디렉토리를 삭제하는 명령어 

rd test → test 폴더를 삭제하라 
rd test /s → 하위 폴더까지 삭제하라
rd test /q → 묻지 말고 삭제하라

====================================================================================== 
㉥ COPY 명령 : 파일을 특정 폴더로 복사할 때 사용하는 명령어 

copy 00.exe c:\windows → 00.exe 파일을 windows 폴더에 복사해줄래.? 

copy config.sys config.bak → config.sys 파일을 config.bak란 이름으로 복사하라 
====================================================================================== 
㉦ EXIT 명령 : 작업을 하다가 원래의 윈도우로 복귀하는 명령어 
====================================================================================== 
㉧ CLS 명령 : 도스에서 작업중 화면을 깨끗하게 지우는 명령어 
====================================================================================== 
㉨ TYPE 명령 : 도스에서 확장자가 TXT, DOC 등 일반 아스키 텍스트로 된 문서파일의 내용보자느 명령어. 

type c:\work.txt → work.txt 파일을 화면에 보여라 
====================================================================================== 
㉩ATTRIB 명령 : 파일의 속성을 보여주거나 변경하는 명령어 

attrib -h work.txt → work.txt 파일의 숨김 속성을 해제하라 
옵 션 기 능 
+A, -A 변경 속성을 설정, 해제 한다 
+H, -H 숨김 속성을 설정, 해제 한다 
+R, -R 읽기 전용속성을 설정, 해제 한다 
+S, -S 시스템 속성을 설정, 해제 한다 
/S 하위 폴더까지 포함하여 속성을 표시, 변경한다 
====================================================================================== 
㉪ SYS 명령 : 부팅디스크를 만들거나 부팅가능한 상태로 만들어 주는 명령어 

sys a: → A 드라이브에 넣은 디스켓을 부팅 가능한 상태로 만들어줄래.? 
===================================================================================== 
㉫ DELTREE 명령 : 파일과 폴더를 모두 삭제하는 명령어 

deltree c:\work → work 폴더와 안에 있는 모든파일을 싸그리삭제하라. 
====================================================================================== 
㉬ MEM 명령 : 시스템 메모리의 사용현황을 보여주는 명령어 

mem /c/p → 옵션 설명 참조 
옵 션 기 능 
/C 기본 메모리와 UMB 의 사용내역을 자세하게 보여준다. 현재 메모리에 어떤 램 상주 프로그 램 이나 디바이스가 설치되어 있는지를, 
사용된 메모리의 용량과 남은 용량을 확인할수 있다. 출력되는 내용이 많기 때문에 밑의 /P 옵션 과 같이 사용한다. 
/D 메모리 상에 램 상주 프로그램이나 디바이스 드라이버들이 어떤 이름으로 그리고 어떠한 형태로 설치가 되어 었는지 자세한 
정보를 제공하는 옵션이다. 
/F 기본 메모리 영역과 UMB 영역의 비어 있는 메모리 영역, 즉 사용자가 사용 가능한 영역이 얼마인지 그 위치와 크기를 표시한다. 
/M 램 상주 프로그램이나 디바이스 드라이버들의 이름을 입력하면 그 디바이스와 프로그램이 어 느 위치에 있는지, 크기는 어느정도 
되는지 자세한 내용을 보여준다. 
/P 출력되는 내용이 페이지 단위로 출력되도록 하는 옵션이다. 
====================================================================================== 
㉭ XCOPY 명령 : 파일, 디렉토리 등을 복사하기 위한 명령어 

xcopy c:\work d: /s/e → c 드라이브의 work 폴더와 하위 폴더, 비어있는 폴더까지 모 두 d 드라이브로 복사하라 
옵 션 기 능 
/A 원본 파일중, 변경속성이 부여된 파일만 복사한다. 
/D 지정한 날짜 이후에 변경, 설정 된 날짜를 가진 파일만 복사한다. 사용법은 [ /d:년-월-일 ] 이다 
/E 하위 디렉토리와 비어 있는 디렉토리까지 모두 복사한다. 
/M 원본 파일에 변경 속성이 부여된 파일만 복사한다. 그리고 복사 후 원본 파일의 변경 속성을 제거한다. 

/P 각각의 파일을 복사하기 전에 사용자에게 진짜로 복사할 것인지 일일이 확이한다. 
/S 하위 폴더까지 복사한다. 
/V 복사 후 정확히 복사되었는지 검사한다. 
/W Press any key to begin copying file(s) 라는 메세지를 출력해 준다. 작업을 확인해 실수를 예방하기 위한 기능이다 
/Y 같은 이름의 파일이 존재해도 무조건 파일을 덮어쓰게 한다. 
/-Y 같은 파일이 있으면 덮어쓸 것인지 사용자에게 물어보도록 하는 옵션이다 
====================================================================================== 
㉮ XCOPY 
윈도95/98/NT 4.0의 XCOPY 명령에 새롭게 포함된 스위치가 있다. 아래 리스트 중 일부는 이전부터 이어져온 스위치다. 

[스위치의 용도] 

/C 에러가 발생해도 복사를 계속함 
/I 대상이 존재하지 않고 하나 이상의 파일을 복사할 경우 대상을 디렉터리로 가정함 
/Q 복사하는 동안 파일 이름을 화면에 표시하지 않음 
/F 복사하는 동안 원본 파일의 위치와 정보를 보여줌 
/L 복사될 파일을 보여줌 
/H 숨겨진 파일과 시스템 파일도 복사함 
/R 읽기 전용 파일들도 덮어씀 
/T 디렉토리 구조는 만들고 파일은 복사하지 않음. 빈 디렉토리나 하위 디렉토리는 포함하지 않음. 
/T /E 스위치를 사용하면 빈 디렉토리와 하위 디렉토리도 포함하여 복사 
/U 대상에 이미 존재하는 파일을 업데이트함 
/K 속성을 복사함. 보통 XCOPY 명령을 사용하면 읽기 전용 속성을 재설정함. 
/Y 확인 메시지를 표시하지 않고 기존 파일을 덮어씀 
/-Y 기존 파일을 덮어쓰기 전에 확인 메시지를 표시함 
/N 작성된 짧은 이름을 사용하여 복사함 
====================================================================================== 
㉯ undelete 
왜 "undelete" 도구가 필요한 것인가? 한번 휴지통을 비우고 나면 더 이상 지운 파일을 살릴 수 없다. 그러나 여전히 과거 DOS로부터 나온 undelete 프로그램이 희망(?)을 준다. 

지워진 파일은 하드 디스크를 포맷하기 전에는 여전히 그곳에 남아 있다. 파일을 지우면 컴퓨터는 그 파일의 첫 문자만 삭제하고 그곳에 "deleted" 표시를 한다. 이렇게 하므로써 어떤 파일이든 그 위에 덮어 쓰거나 교체될 수 있게 된다. 결국 다른 파일이 지워진 파일을 덮어 쓰지만 않는다면 언제까지든 그 파일은 그 자리에 있다는 말이다. 이로써 여러분이 파일을 지운 후 새로운 파일을 복사하거나 디스크 전체를 변경하거나 스캔 디스크를 하거나 뭐 이런 일만 하지 않는다면 그 파일을 복구할 가능성은 존재한게 된다. 

이 유틸리티는 윈도우 CD의 /olddos 폴더에 있을 것이다. 
이 폴더에서 undelete를 찾았으면 "C:\windows\command" 폴더에 복사한다. 만약 gone.wav라는 지워진 파일을 살리려면 다음과 같이 입력한다. 

C:\>undelete gone.wav 

지워진 파일이 있는 전체 경로를 입력해야 한다. undelete로 파일을 복구할 경우 파일의 첫문자가 ?으로 표시된 것을 확인할 수 있을 것이다. 따라서 여러분은 첫 문자를 직접 입력해줘야 한다. 

C:\>undelete 

이렇게 입력하면 해당 폴더에서 복구할 수 있는 파일의 목록이 나타날 것이다. 복구를 원하는 파일을 선택하여 첫 문자를 입력하면 지워진 파일을 살릴 수 있다. 

undelete 유틸리티가 상당히 유용해 보이긴 하지만 몇몇 윈도우 시스템에서는 제대로 작동하지 않는다. 자신의 시스템에서 제대로 작동하는지는 직접 확인하는게 좋을 것이다. 
====================================================================================== 
㉰ diskcopy 

윈도95/98/NT의 diskcopy 유틸리티는 디스크 하나를 복사할 때는 매우 빠르고 좋다. 그러나, 하나 이상의 디스크를 복사할 경우에는 매번 원본 디스크를 복사해야하는 단점이 있다. 이에 반해 DOS의 diskcopy는 똑같은 디스크에 대해 여러 번 복사할 수 있는 장점이 있다. 

diskcopy를 실행하려면 다음과 같이 입력한다. 

C:\>diskcopy a: a: 

이렇게 입력하면 디스크를 삽입하라는 메시지가 뜰 것이다. 복사할 원본 디스크를 삽입한 후 엔터 키를 누른다. 윈도95는 원본 디스크의 내용을 트랙 단위로 메모리로 읽어 들인다. 모두 읽고 나면, 타겟 디스크를 넣으라는 메시지가 나타날 것이다. 빈 디스크를 드라이브에 삽입하고 엔터 키를 누르면 원본 디스크의 내용이 고스란히 새로운 디스크에 복사된다. 

diskcopy가 원본 디스크의 복사본을 만들고 난 후, 또 다른 복사 디스크를 만들 것인지 물어볼 것이다. 그렇다면 `Y` 키를 누르면 된다. 타겟 디스크를 드라이브에서 제거한 후, 다른 디스크를 삽입한다. 그리고 다시 엔터 키를 누르면 복사 디스크를 만들기 시작할 것이다. 여러분이 원하는 만큼의 복사 디스크를 만들 수 있다. 

diskcopy 명령에 /v 스위치를 함께 사용하면 타겟 디스크의 트랙이 복사할만한지 신뢰성을 조사하게 된다. 만약 타겟 디스크에 문제가 있다면 diskcopy를 거부하고 작업을 멈추게 된다. 이 옵션은 diskcopy를 안전하게 수행하는 이점이 있는 반면, 그만큼 시간이 더 걸리게 된다. 

diskcopy 명령에는 약간의 제한 사항이 있다. 먼저, 하드 디스크를 복사할 수는 없고 반드시 플로피 디스크에서 복사를 시작해야 한다. 두번째로 비슷한 크기의 디스크들 간에만 사용할 수 있다. 예컨데, 1.44MB 디스크에서 720KB 디스크로 diskcopy를 실행할 수는 없다. 그 반대는 가능한데, 이렇게 할 경우 1.44MB 디스크가 720KB 형식으로 다시 포맷이 된다는 것을 잊지 말자. 
====================================================================================== 

시스템 부팅시 F8 키를 눌러 도스 모드로 부팅했다면 win.com을 입력하여 다시 윈도우 모드로 부팅할 수 있다. 여기에 win.com에 많은 스위치가 존재한다. 이 스위치들은 올바르게 윈도가 시작되지 않을 때 문제를 해결하기 위하여 사용할 수 있다. 


C:\>WIN /D:[F][M][S][V][X] 

:F 32비트 디스크 액세스 기능을 해제 - 32BitDiskAccess=FALSE로 설정된 SYSTEM.INI 파일 설정과 같음 
:M 안전 모드를 사용 - 안전 모드를 시작하는 동안 자동으로 설정(키 사용) 
:N 네트워킹에서 안전 모드를 사용 : 안전 모드를 시작하는 동안 자동으로 설정(키 사용) 
:S Windows에서 중단점에 대해 F000:0000과 1 MB 사이의 ROM 주소 공간을 사용하지 않도록 지정 
SystemROMBreakPoint=FALSE로 설정된 SYSTEM.INI 파일 설정과 같음 
:V ROM 루틴에서 하드 디스크 컨트롤러의 인터럽트를 처리하도록 지정 
VirtualHDIRQ=FALSE로 설정된 SYSTEM.INI 파일 설정과 같음 
:X Windows에서 사용하지 않은 공간을 찾기 위해 스캔하는 메모리 영역에서 모든 어댑터 영역을 제외시킴 
EMMExclude=A000-FFFF로 설정된 SYSTEM.INI 파일 설정과 같음 
======================================================================================

'OS > Windows' 카테고리의 다른 글

[WINDOWS] Perfmon (성능 모니터)  (0) 2011.02.09
findstr - 파일에서 문자열 찾기  (0) 2010.11.26
Non-Paged Pool  (2) 2010.08.12
MS-DOS 명령어  (0) 2008.07.16
ASCII 테이블  (0) 2008.01.12
어떻게 윈도우 프로시저는 재진입되는가  (0) 2008.01.12
Posted by 엘키 엘키

댓글을 달아 주세요

2008. 1. 12. 10:59 OS/Windows

ASCII 테이블



'OS > Windows' 카테고리의 다른 글

[WINDOWS] Perfmon (성능 모니터)  (0) 2011.02.09
findstr - 파일에서 문자열 찾기  (0) 2010.11.26
Non-Paged Pool  (2) 2010.08.12
MS-DOS 명령어  (0) 2008.07.16
ASCII 테이블  (0) 2008.01.12
어떻게 윈도우 프로시저는 재진입되는가  (0) 2008.01.12
Posted by 엘키 엘키

댓글을 달아 주세요

준비물 : Visual Studio 6.0 , WinSpy++ v1.6

일단 아래와 같은 단순한 API 프로그램을 살펴보자.

그림 1

Visual C++ 6.0에서 New -> Project -> Win32 Application에서 프로젝트 이름은 BULK라고 하고 첫 번째 스텝에서 A typical "Hello World!" application을 선택하여 자동으로 생성된 프로그램을 그대로 빌드하여 실행시킨 것이다. 실제로 해보면 알겠지만 대부분의 Win32 App의 기본 골격인 메인 클래스 등록, 메인 윈도우 생성, 메시지 루프, 윈도우 프로시저까지 생성해 준다.


그림 2

위와 같이 메뉴에서 Help -> About 을 선택하여 모달 다이얼로그를 띄운다. 아래 코드가 실행되는 것이다.


그림 3

DialogBox()함수가 실행되면서 About 대화상자가 뜨는 것이다. 이 함수는 대화상자가 닫힐 때까지 리턴되지 않는다. [OK]버튼이나 [X]버튼을 눌러서 닫지 않는 이상 DialogBox()함수 아래 있는 break; 문은 실행되지 않는다는 것이다.

About 대화상자를 메인 윈도우의 클라이언트 영역에서 이리저리 움직여보자. “Hello World!"라는 글자를 가렸다가 보였다가 해보자. 어떤가? ...... 잘된다. -_-; 그렇다고 하면 DialogBox()함수에서 블록(?)이 걸려있는 WndProc()이 WM_PAINT 메시지를 훌륭하게 처리했다는 말이다. 여기서 의문점이 생긴다. 어떻게 블록되어 있는 상태에서 WndProc()에 재진입했단 말인가? 쓰레드가 여러개라도 되나?? 확인해보자.


그림 4

쓰레드는 하나다! 어떻게 된 것인가... 곰곰이 생각을 해보자. 생각할 수 있는 방법은 이것 뿐이다.


그림 5

DialogBox()함수는 API 함수이다. 이 함수에 의해 생성된 대화상자는 버튼이나 에디트 박스와 같이 Windows에서 제공하는 공통 클래스로 생성되고 따라서 프로시저도 Windows에서 제공한다. 프로시저 코드는 바로 USER32.DLL에 들어있다. 그 프로시저에서 어떤 메시지(그 메시지는 나중에 찾을 것이다)가 들어왔을 때 자신의 소유(Owner) 윈도우(이 대화상자는 CHILD 속성이 아니므로 부모(Parent) 윈도우가 아니다. Owner와 Parent는 다른 것이다) 핸들을 얻고 그 곳으로 WM_PAINT 메시지를 보내는 것이라고 생각할 수 있다.

그러나 위 방법을 짐작일 뿐이다. 그것을 확인해 보자.


그림 6

이 곳에 BP를 걸고 About 대화상자를 움직여 보자. 그러면 BP가 딱 걸린다. 콜 스택을 확인해보자.


그림 7

위와 같다. 살펴보자............... 모르겠다. -_-;;;;;;;; 좀 더 살펴보자..... ... ... 그래도 모르겠다. 가장 위에 우리의 WinProc() 호출되었다는 것은 알겠지만 아래 함수는 주소로만 표기된다. 운영체제 코드이므로 당연한 것이다. 심볼이 없기 때문에 함수이름으로 볼 수가 없는 것이다. 그러면 About 대화상자의 윈도우 프로시저 주소를 알아내자. 간단한 툴을 사용하면 쉽게 알아낼 수 있다.


그림 8

윈도우 프로시저의 주소는 77D1E54F이다. 이제 콜 스택에서 77D1E54F보다 큰 가장 가까운 주소를 찾아보자.


그림 9

77d1e571이 있다. 어셈블리 코드를 살펴보자.


그림 10

바로 이것이 Windows가 제공하는 표준 대화상자의 윈도우 프로시저 본체이다. 보다시피 상당히 짧다. 결과적으로
77D1E56C call 77D03F5A
에 의해 우리(?) 윈도우의 WinProc으로 재진입이 일어난 것이다. 더 깊이는 들어가지 않고(사실 잘 몰라서 ^^;;) 77D1E571에 BP를 찍고 RUN(F5)을 하여 어떤 메시지가 들어왔는지 살펴보자.


그림 11

위와 같이 BP가 걸린다. 이 상태에서 스택을 살펴보면 윈도우 프로시저에 넘어온 인자값을 확인할 수 있다. 다른 유용한(?) 디버거와는 달리 VC++ 내장 디버거는 스택창이 따로 없다. 따라서 메모리창을 띄워 직접 확인해야 한다.


그림 12
주소란에 ebp+8을 치면 첫 번째 인자부터 차례로 나온다. 함수 호출 후 스택 프레임 구성에 대해서는 다음을 참고하세요.
   .
   .
   .
ebp - 3n  =  지역 변수 3
ebp - 2n  =  지역 변수 2
ebp - 1n  =  지역 변수 1
ebp         =  이전 ebp
ebp + 1n  =  리턴 주소
ebp + 2n  =  인자 1
ebp + 3n  =  인자 2
ebp + 4n  =  인자 3
   .
   .
   .

윈도우 프로시저 정의는
LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
위와 같으므로 첫 번째 값부터 차례대로
hWnd => B090C
message => 112
wParam => F012
lParam => 11E01CE
메시지가 16진수로 112이다. 112는 WM_SYSCOMMAND를 의미하는데, 이 메시지에서 wParam은 다음 갚을 가진다.


그림 13

F012가 없다! ㅜㅜ SC_MOVE 인것 같은데 왜 2가 있지. 이럴 때 MSDN을 본다.


그림 14

해석하면, “WM_SYSCOMMAND 메시지에서 wParam 파라미터의 하위 4비트는 시스템에 의해 내부적으로 사용된다. 따라서 wParam의 올바른 값을 얻기 위해서 어플리케이션에서는 wParam을 0xFFF0와 AND 연산하여 사용해야 한다.”라고 되어 있다.
여기서 하위 4비트는 시스템에 의해 내부적으로 사용된다는 말이 중요하다. 여기서 알아본 경우가 내부적으로 사용되는 경우인 것 같다. “창이 이동이 되긴 했는데 뒤에 창에 그림이 그려져야 하니까 그쪽으로 WM_PAINT를 보내라” 뭐 이런 말을 시스템이 하는 것이 아닐까 한다. 참고로 lParam은 커서의 위치이다.

'OS > Windows' 카테고리의 다른 글

[WINDOWS] Perfmon (성능 모니터)  (0) 2011.02.09
findstr - 파일에서 문자열 찾기  (0) 2010.11.26
Non-Paged Pool  (2) 2010.08.12
MS-DOS 명령어  (0) 2008.07.16
ASCII 테이블  (0) 2008.01.12
어떻게 윈도우 프로시저는 재진입되는가  (0) 2008.01.12
Posted by 엘키 엘키

댓글을 달아 주세요

이전버튼 1 이전버튼

블로그 이미지
Software Engineer
엘키

공지사항

Yesterday31
Today29
Total1,605,483

달력

 « |  » 2020.8
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

글 보관함