윈도우 커널 모드 포팅의 정석 3편 - 호환 레이어 작성

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

포팅을 쉽게 하려면 원본 소스 코드를 최소한으로 수정해야 합니다. WDK에 없는 함수를 구현할 호환 레이어를 작성해야 합니다.

이제 부터 매크로와 인라인 함수를 이용하여 에러를 막았던 부분을 구현해줄 차례입니다. 호환 레이어는 호환 레이어 소스를 원본 소스 코드 빌드 설정에 추가하는 것도 좋지만, lib(라이브러리) 형태로 작성하는 것이 편리합니다.

TARGETNAME=libcompat
TARGETTYPE=LIBRARY

SOURCES= \
    io.c \
    sync.c \
    time.c \
    memory.c

커널 모드용 라이브러리를 만들기 위해 TARGETTYPE을 LIBRARY로 설정해줍니다.

TARGETLIBS=..\libcompat\objchk\i386\libcompat.lib

이후 포팅할 드라이버의 sources 파일에서 위와 같이 라이브러리를 지정해주면 됩니다.

SQLite for Windows Kernel의 경우 각 플랫폼 별로 호환 레이어가 제공되었기 때문에 윈도우 커널용 호환 레이어를 원본 소스 코드에 추가하는 방식으로 포팅하였습니다. 이 처럼 플랫폼 별로 호환 레이어를 제공해 주는 경우, 이 호환 레이어를 이용하는 것이 편리합니다.

io.c
#include "compat.h"

HANDLE
CreateFileW(
    LPCWSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile
    )
{
    // ... 생략 ...
    ZwCreateFile( );
    // ... 생략 ...
}

BOOL
ReadFile(
    HANDLE hFile,
    LPVOID lpBuffer,
    DWORD nNumberOfBytesToRead,
    LPDWORD lpNumberOfBytesRead,
    LPOVERLAPPED lpOverlapped
    )
{
    // ... 생략 ...
    ZwReadFile( );
    // ... 생략 ...
}

앞서 제작했던 compat.h를 include 해주는 것이 중요합니다. compat.h에 각종 자료형과 구조체를 정의해주었기 때문에 이 부분을 이용해야 합니다. (여기서 실제 구현은 생략하겠습니다.)

함수를 구현하였다면 에러를 막기 위해 compat.h에 추가하였던 매크로 및 인라인 함수를 삭제합니다. 즉, 함수를 구현하여 추가할 때마다 그 함수에 해당하는 매크로, 인라인 함수를 삭제해주는 방식으로 포팅을 진행합니다.

구현할 함수가 늘어날 때마다, io.c, sync.c, time.c, memory.c 등 함수 종류에 맞는 소스 파일을 추가하면 됩니다.

관련글


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

2009-07-17