나에게 필요한 지식과 기술을 검색해 보세요.

API로 배우는 Windows 구조와 원리

지은이

야스무로 히로카즈

옮긴이

김용준

출간일

2004.10.11

레벨

중고급

평점

4.4(14명)

정가

16,000

판매가

14,400

총 결제 금액

10%

14,400

적립 예정

720P

눈에 보이지 않는 또 다른 시스템 알고리즘! OS를 이해하자

프로그램을 만들다 보면 수많은 문제에 부딪힌다. 시스템이 다운되기도 하고 보안 허점이 드러나 동분서주하다가 튜닝은 꿈도 꾸지 못하는 상황이 자주 발생한다. 이런 상황에 닥쳤다면 이는 프로그래머의 프로그래밍 스킬이 부족해서일까? 아니다. 해답의 실마리는 운영체제의 내부 구조를 이해하는 데서부터 시작된다.
이 책은 Windows 애플리케이션에게 제공하는 Windows API(Application Programming Interface)라고 하는 "창구"를 통해서 Windows의 작동 구조를 이해할 수 있도록 도와준다. C/C++는 물론이고, 비주얼 베이직, Java, .NET 같은 개발 환경을 사용해서 제작한 애플리케이션도 내부에서는 Windows API를 호출해서 동작한다. 이런 개발 환경을 무심하게 넘기지 않고, 개발 환경의 내부에서 어떻게 작동하는지, 즉 운영체제 내부는 어떻게 구성되어 있는지를 알게 되면 프로그래밍 기술을 크게 향상시킬 수 있다.
주요 내용
  • Windows 애플리케이션의 구조: 기본부터 심화 학습까지
  • 수준 높은 애플리케이션을 만들기 위한 콘솔 환경의 이해
  • 파일 접근의 원리와 제어: Windows의 파일 조작 기능 이해
  • 메모리 관리의 구조의 API의 사용 방법
  • 멀티태스킹: 프로세스와 스레드
  • 만들면서 이해하는 DLL의 작동 원리
  • 메모리 공간의 벽을 넘어선 프로세스 간 데이터 공유
  • 튜닝이나 디버그에 도움되는 실행 파일의 구조와 원리
  • Windows의 접근 제어 구조: 내 프로그램의 보안은 내 손으로
  • 서비스 프로그램 작성 원리: HTTP와 FTP 같은 시스템의 작성 원리
  • 디버거를 알아야 디버깅을 안다
  • 코드 체계의 세계화: 유니코드의 원리
  • 문자는 어떻게 모양이 달라질까: 폰트의 세계
  • 예외 처리를 Windows에만 맡기지 말자
  • 디바이스 드라이버의 구조 이해와 작성 방법
추천평(미디어서평)

"윈도우 프로그래머가 제대로 된 프로그램을 만들려면 Windows OS에 대한 이해는 필수적이다. 하지만 그 방대함에 금새 포기하고 마는 경우가 많다. 수년 동안 강의를 해오면서 이 책만큼 Windows OS의 핵심만을 추려서 이해하기 쉽게 구성한 책은 보지 못하였다. 윈도우 프로그래머라면 적어도 이 책에 씌어진 정도는 섭렵하고 있어야 한다고 본다." - 김선우(IT COOKBOOK 윈도우 프로그래밍 저자)

저자

목차

저자 서문
역자 서문
이 책의 주요 내용
목차

1부. 운영체제의 구조를 배우자
1장. 운영체제의 동작 철저 이해
    운영체제는 애플리케이션의 요청을 "조정(調停)"한다
    운영체제는 높은 특권레벨에서 작동한다
    각 세그먼트의 속성은 디스크립터 테이블에 설정한다
    I/O 특권레벨을 설정해서 I/O 접근을 제한한다
    콜게이트와 소프트웨어 인터럽트로 커널모드로 들어간다
    Windows에서의 API 호출 처리 순서
    Linux에서의 시스템 호출 처리 순서
    Windows 애플리케이션이 시작할 때까지

2장. 운영체제의 3대 기능
    01. 프로세스/스레드 관리
    짧은 간격으로 태스크를 전화하여 멀티태스크 구현
    CPU의 상태를 보존/복원해서 태스크를 전환
    스레드는 프로세스보다 빠르게 전환된다
    우선순위를 고려해서 태스크를 스케줄링한다
    02. 메모리 관리
    디스크와 조합하여 보이는 메모리량을 늘려라
    가상 주소와 실제 주소를 페이지 단위로 매핑한다
    프로세스마다 페이지 테이블을 준비해서 주소 공간을 분리한다
    예약과 수용의 2단계 조작으로 메모리를 할당한다
    03. 파일 관리
    구조가 간단한 FAT FS
    파일 속성을 유연하게 다룰 수 있는 NTFS
    i-node로 디스크를 관리하는 Linux의 Ext2 FS

3장. 사용자 입력 구조
    인터럽트를 사용해서 이벤트 발생을 알려준다
    우선순위가 낮은 인터럽트는 보류한다
    윈도우 메시지로 애플리케이션에 통지한다
    큐를 2단으로 구성해서 메시지를 놓치는 것을 막는다
    메시지 루프로 큐에서 메시지를 꺼낸다

2부. API로 배우는 Windows의 구조
4장. Windows 애플리케이션의 구조
    Windows 애플리케이션은 이벤트 반응형이다
    메시지를 사용해 이벤트를 통지한다
    윈도우 프로시저로 메시지를 처리한다
    WinMain 함수에서 실행을 시작한다
    윈도우 클래스를 등록해 윈도우를 생성한다
    메시지 루프로 메시지를 하나씩 꺼낸다
    메시지의 대부분은 DefWindowProc에 처리를 맡긴다

5장. 윈도우
    윈도우는 Windows가 관리하는 객체다
    윈도우 스타일로 윈도우의 구성요소를 지정한다
    윈도우 스타일로 윈도우의 종류를 지정한다
    부모 윈도우는 자식 윈도우의 디스플레이
    윈도우 간 소유 관계를 설정한다
    컨트롤 ID로 자식 윈도우를 식별한다
    SetWindowPos API로 Z 순서를 지정한다

6장. 윈도우 메시지
    메시지 하나는 단시간에 처리한다
    장시간을 필요로 하는 처리는 분할해서 실행한다
    PeekMessage API를 사용해 공전 시간에 처리한다
    독자적인 메시지를 정의한다
    PostMessage를 사용해 큐를 경유하는 메시지를 보낸다
    메시지 전달인자에 포인터를 넘긴다

7장. Windows 콘솔 사용
    Windows에도 콘솔 환경이 있다
    표준 입출력을 사용한다
    콘솔 프로그램과 GUI 프로그램의 차이는 작다
    GUI 프로그램에서도 콘솔을 이용할 수 있다
    콘솔 API를 사용해 본다
    저수준 API에서는 마우스 입력도 다룰 수 있다

8장. 파일 접근 제어
    파일을 손쉽게 다룰 수 있게 해주는 파일시스템
    라이브러리 함수에서는 텍스트 모드에 주의한다
    CreateFile API로 파일을 연다
    여러 프로그램으로부터의 동시 접근을 제어한다
    데이터의 읽고 쓰기는 버퍼링된다
    파일의 특정 위치에서 읽기/쓰기를 한다
    마무리는 잊기 쉽지만 중요하다

9장. Windows의 메모리 관리
    페이징으로 가상 기억장치를 구현한다
    페이징으로 실제 메모리 페이지를 자유롭게 배치한다
    다른 프로그램의 메모리에는 접근할 수 없다
    VirtualAlloc은 가상 주소의 페이지 상태를 변경한다
    힙으로부터 필요한 크기만 할당한다

10장. Windows의 프로세스와 스레드
    프로그램을 전환해서 멀티태스킹을 구현한다
    멀티스레드는 프로그램 내에서의 멀티태스크
    CreateProcess API로 프로세스를 시작한다
    WaitForSingleObject API로 프로세스의 종료를 기다린다
    CreateThread API로 스레드를 생성한다
    라이브러리 함수를 사용할 경우에는 _beginthreadex를 이용한다

11장. 스레드 간 동기화
    동기화란 무엇인가
    동기화에는 시스템 지원이 필요하다
    동일 프로세스 내의 스레드 간에 배타적 제어를 하는 크리티컬 섹션
    프로세스 간에도 동기화 객체를 사용한다
    프로세스 간의 배타적 제어에는 뮤텍스를 사용한다
    유한 개의 리소스 관리에는 세마포어를 사용한다
    이벤트를 사용해서 다른 스레드에 통지한다

12장. DLL의 작동 원리
    DLL이란 무엇인가
    DllMain 함수에서 초기화 처리를 한다
    함수를 익스포트한다
    DLL을 프로그램에서 이용한다
    DLL을 실행 시에 로드해 링크한다
    DLL에 리소스를 저장해서 다국어를 지원한다

13장. 프로세스 간 데이터 공유
    프로세스에는 각각의 가상 주소 공간이 있다
    파일 매핑이란 무엇인가
    뷰를 만들어 가상 주소 공간에 매핑한다
    페이지 파일을 매핑해서 공유 메모리를 만든다
    WM_COPYDATA 메시지로 간단하게 데이터를 주고받는다

14장. 실행 파일의 구조
    tdump로 실행 파일의 내용을 들여다본다
    더미 MS-DOS 프로그램 뒤쪽에 Windows 프로그램이 있다
    Windows에서는 옵션 헤더를 참조해서 실행 환경을 설정한다
    실행 파일은 섹션 단위로 로드된다
    TLS나 리소스는 코드나 데이터와는 다른 섹션에 저장된다
    이미지 베이스를 변경할 때는 재배치를 한다
    익스포트 정보를 저장하는 .edata 섹션
    임포트 정보를 저장하는 idata 섹션

15장. Windows의 접근 제어 구조
    왜 보안이 중요한가
    파일이나 레지스트리도 객체로 접근 제어를 한다
    사용자/그룹 단위로 접근 권한을 설정한다
    보안 디스크립터를 객체 생성 시에 지정한다
    프로세스의 접근 토큰을 체크한다
    명시적으로 보안 디스크립터를 지정한다

16장. 서비스 생성
    서비스란 특정 규칙에 따라 만들어진 콘솔 프로그램이다
    SCM이 서비스 실행을 제어한다
    서비스는 전용 사용자 계정에서 실행된다
    main 함수에서 서비스 진입점 등록
    실질적인 처리는 ServiceMain 함수에서 한다
    제어 핸들러로 SCM에서 송신하는 제어 코드에 응답한다
    서비스를 설치/제거한다
    프로그램에서 서비스를 제어한다

17장. 프로세스 간 통신을 통한 데이터 교환
    파이프는 프로세스 간 데이터 통로다
    이름있는 파이프는 같은 이름으로 얼마든지 만들 수 있다
    파이프는 파일과 똑같이 읽고 쓸 수 있다
    클라이언트에서 파이프에 접속한다
    이름없는 파이프의 핸들은 상속해서 사용한다
    클립보드는 데이터의 일시적인 보관 장소다
    소유권을 획득하고 나서 데이터를 설정한다
    설정된 객체의 소유권은 시스템으로 이전된다
    지연 렌더링으로 필요에 따라 데이터를 설정한다

18장. 디버거의 구조
    디버거의 기본은 중단점이다
    디버거의 커널모드 부분을 Windows와 결합한다
    디버그 이벤트를 보내서 디버거에 통지한다
    디버거의 자식 프로세스로 디버그 대상 프로세스를 시작한다
    WaitForDebugEvent로 이벤트를 받는다
    디버그 대상 프로세스의 메모리에 접근한다
    예외 발생 시에 디버거를 시작한다

19장. 유니코드와 다국어 지원
    컴퓨터로 처리하기 위해 문자에 코드를 할당한다
    온 세상의 문자를 문자 집합 하나로 정리한다
    기존 시스템과 호환성이 높은 UTF-8
    CJK 문자를 동시에 표현할 수 없는 경우가 있다
    Win32 API에는 ANSI판과 유니코드판이 있다
    일반형을 사용해 프로그램을 작성한다
    메시지로 주고받는 문자열은 자동으로 변환된다

20장. 폰트
    폰트는 자형(字形) 데이터베이스다
    논리 폰트를 물리 폰트에 매핑한다
    페널티를 계산해서 최적 폰트를 선택한다
    문자열 그리기 전용 API를 사용한다
    문자 코드에 맞추어 폰트의 문자 집합을 설정한다
    유니코드의 문자 코드 범위에서 출력할 수 있는 폰트를 검색한다

21장. 구조화 예외 처리 매커니즘
    VC++의 독자적인 키워드를 사용해서 SEH를 이용한다
    콜백 함수의 주소를 TIB로 설정한다
    어셈블리 언어를 사용해 예외 핸들러를 등록한다
    레지스터 세 개를 수정해서 예외 발생 시의 실행 재시작 위치를 변경한다
    언와인드를 위해 한 번 더 콜백 함수를 호출한다
    미처리 예외를 처리하는 순서는 디버거의 유무에 따라 다르다

22장. 비동기 I/O 처리를 이용한 파일 접근
    디스크 접근 대기 시간을 유효하게 사용한다
    이벤트 객체를 사용해서 처리 완료를 통지한다
    PeekOverlappedResult API로 처리 결과를 얻어온다
    동기 I/O와 비동기 I/O는 섞어서 사용할 수 없다
    비동기 I/O 전용 API를 이용한다
    경계 가능 상태를 위해서는 "Ex"가 붙은 대기용 API를 이용한다

23장. 디바이스 드라이버와 플러그 앤 플레이의 구조
    디바이스 드라이버가 하드웨어의 차이를 흡수한다
    WDM 드라이버는 Windows 2000/98 모두에서 사용할 수 있다
    기능 드라이버가 버스 드라이버를 통하여 장치를 제어한다
    필터 드라이버를 생성해서 운영체제의 기능을 확장한다
    버스에 접속된 장치를 열거한다
    INF 파일을 참조해서 드라이버를 설치한다
    전원 관리에는 WDM 드라이버 지원이 필요하다

24장. 디바이스 드라이버 제작 도전
    키 배치를 바꾸는 필터 드라이버를 제작한다
    키 배치를 바꾸려면 함수가 7개 필요하다
    DriverEntry 함수에서 각종 핸들러를 등록한다
    AddDeviceHandler 함수로 장치 객체를 생성/추가한다
    DefaultHandler 함수로 드라이버 간 통신을 한다
    전원 관리와 PnP에는 전용 함수를 사용한다
    키 배치 교체의 핵심 처리는 ReadHandler 함수에서 구현한다
    ReadComplete 함수로 데이터 읽기 완료를 통지한다
    Build 유틸리티를 이용해 빌드한다
    필터 드라이버 설치는 전용 설치기를 준비한다

찾아보기

리뷰

16,000

10%

14,400