Home | Info | Research | Blog | Repos | Messages | Contact Me

 


안녕하세요. 윈도우 프로젝트 필수 유틸리티의 이재홍입니다.

Subversion, Trac, CruiseControl.NET 구축과 운영에 관한 유료 컨설팅 및 기술지원을 해드립니다.

  • 서버 구성 및 구축, 운영 방법
  • 빌드 스크립트 작성 및 활용, 자동화 구축
  • 가상머신 연동
  • 고급 Subversion 활용 강의
  • 트러블 슈팅
  • 백업 및 복구
  • 저장소 마이그레이션 (볼랜드 스타팀 등)
  • 자동화 프로젝트 구성
  • 교육

 



VS2005의 버그 때문에 이 VS2005로 컴파일한 exe 파일만 실행해도 재부팅이 발생할 수 있습니다.

그 조합은 Windows XP SP2, IE6(기타 보안패치를 설치하지 않은 상태)에 Visual Studio 2005 상세 버전 8.0.50727.42로 빌드한 exe 파일을 실행할때 입니다.

문제는 exe 파일을 한번만 실행하면 괜찮은데, 2회에서 3회 반복 실행하면 재부팅이 발생합니다. (이것도 PC마다 다름)

*** An Access Violation occurred in C:\WINDOWS\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16:

The instruction at 7C9401B3 tried to write to an invalid address, 75DE193E

 *** enter .exr 018FECE8 for the exception record
 ***  enter .cxr 018FED04 for the context
 *** then kb to get the faulting stack

Break instruction exception - code 80000003 (first chance)
ntdll!DbgBreakPoint:
001b:7c93120e cc              int     3
1: kd> !analyze -v
FAULTING_IP:
ntdll!RtlAllocateHeap+1da
001b:7c9401b3 884706          mov     byte ptr [edi+6],al

EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 7c93120e (ntdll!DbgBreakPoint)
   ExceptionCode: 80000003 (Break instruction exception)
  ExceptionFlags: 00000000
NumberParameters: 3
   Parameter[0]: 00000000
   Parameter[1]: 7c997810
   Parameter[2]: 00000028

ERROR_CODE: (NTSTATUS) 0x80000003 - {

EXCEPTION_CODE: (HRESULT) 0x80000003 (2147483651) -

EXCEPTION_PARAMETER1:  00000000

EXCEPTION_PARAMETER2:  7c997810

EXCEPTION_PARAMETER3:  00000028

NTGLOBALFLAG:  0

FAULTING_THREAD:  ffffffff

ADDITIONAL_DEBUG_TEXT:  Enable Pageheap/AutoVerifer

DEFAULT_BUCKET_ID:  HEAP_CORRUPTION

PRIMARY_PROBLEM_CLASS:  HEAP_CORRUPTION

BUGCHECK_STR:  APPLICATION_FAULT_HEAP_CORRUPTION_STATUS_BREAKPOINT

LAST_CONTROL_TRANSFER:  from 75df2137 to 7c9401b3

STACK_TEXT: 
7c9401b3 ntdll!RtlAllocateHeap+0x1da
75df2137 sxs!CSxsPointerBase<CXMLNamespaceManager::CNamespacePrefix,CSxsPointer<CXMLNamespaceManager::CNamespacePrefix,CXMLNamespaceManager::CNamespacePrefix::ms_szTypeName> >::HrAllocateBase+0x59
75de2f21 sxs!CXMLNamespaceManager::OnCreateNode+0x12e
75de38d2 sxs!CNodeFactory::CreateNode+0xa3
75de435f sxs!XMLParser::Run+0x2fc
75de8baa sxs!SxspIncorporateAssembly+0x8b8
75de9a0f sxs!SxspCloseManifestGraph+0x98
75de98cd sxs!SxsGenerateActivationContext+0x54c
75a9a5ed basesrv!BaseSrvSxsCreateActivationContextFromStruct+0x194
75a9a760 basesrv!BaseSrvSxsCreateActivationContextFromMessage+0x79
75a84a47 CSRSRV!CsrApiRequestThread+0x431


STACK_COMMAND:  .cxr 018FED04 ; kb ; dds 18fefd0 ; kb

SYMBOL_NAME:  heap_corruption!heap_corruption

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: heap_corruption

IMAGE_NAME:  heap_corruption

DEBUG_FLR_IMAGE_TIMESTAMP:  0

FAILURE_BUCKET_ID:  HEAP_CORRUPTION_80000003_heap_corruption!heap_corruption

BUCKET_ID:  APPLICATION_FAULT_HEAP_CORRUPTION_STATUS_BREAKPOINT_heap_corruption!heap_corruption

Followup: MachineOwner
---------


이 상태에서 F5(Go)를 하면 다시 아래와 같은 BugCheck이 발생하면서 완전히 재부팅됩니다.

1: kd> g

*** Fatal System Error: 0xc000021a
                       (0xE10C62F8,0xC0000005,0x7C9401B3,0x018FED04)

STOP: c000021a Unknown Hard Error
Unknown Hard ErrorBreak instruction exception - code 80000003 (first chance)

A fatal system error has occurred.
Debugger entered on first try; Bugcheck callbacks have not been invoked.

A fatal system error has occurred.

*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

Use !analyze -v to get detailed debugging information.

BugCheck C000021A, {e10c62f8, c0000005, 7c9401b3, 18fed04}

unable to get nt!KiCurrentEtwBufferOffset
unable to get nt!KiCurrentEtwBufferBase

*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

WINLOGON_FATAL_ERROR (c000021a)
The Winlogon process terminated unexpectedly.
Arguments:
Arg1: e10c62f8, String that identifies the problem.
Arg2: c0000005, Error Code.
Arg3: 7c9401b3
Arg4: 018fed04

Debugging Details:
------------------

unable to get nt!KiCurrentEtwBufferOffset
unable to get nt!KiCurrentEtwBufferBase

... 생략 ...

ERROR_CODE: (NTSTATUS) 0xc000021a - {

EXCEPTION_CODE: (NTSTATUS) 0xc000021a - {

EXCEPTION_PARAMETER1:  e10c62f8

EXCEPTION_PARAMETER2:  c0000005

EXCEPTION_PARAMETER3:  7c9401b3

EXCEPTION_PARAMETER4: 18fed04

ADDITIONAL_DEBUG_TEXT:  Windows SubSystem

BUGCHECK_STR:  0xc000021a_csrss.exe_c0000005

DEFAULT_BUCKET_ID:  DRIVER_FAULT

PROCESS_NAME:  System

LAST_CONTROL_TRANSFER:  from 8085f2bf to 8080ba52

SYMBOL_ON_RAW_STACK:  1

STACK_ADDR_RAW_STACK_SYMBOL: fffffffff78d2b8c

STACK_COMMAND:  dds F78D2B8C-0x20 ; kb

STACK_TEXT: 
f78d2b6c  8a2e8240
f78d2b70  00000000
f78d2b74  e165e4f8
f78d2b78  e15ae350
f78d2b7c  e165e488
f78d2b80  00000000
f78d2b84  00000000
f78d2b88  b78268a4 mrxdav!_NULL_IMPORT_DESCRIPTOR+0x3c
f78d2b8c  b77fe000 mrxdav!MrxDAVEfsControlCompletion <PERF> (mrxdav+0x0)
f78d2b90  808cf973 nt!MiSnapThunk+0x6f
f78d2b94  8a32c008
f78d2b98  b782735e mrxdav!_NULL_IMPORT_DESCRIPTOR+0xaf6
f78d2b9c  000000ff
f78d2ba0  b78268a4 mrxdav!_NULL_IMPORT_DESCRIPTOR+0x3c
f78d2ba4  b7804aa8 mrxdav!_imp__GetSecurityUserInfo
f78d2ba8  808cfae6 nt!MiSnapThunk+0x382
f78d2bac  00000001
f78d2bb0  00000000
f78d2bb4  b77fe000 mrxdav!MrxDAVEfsControlCompletion <PERF> (mrxdav+0x0)
f78d2bb8  f78ee924
f78d2bbc  b7804aa8 mrxdav!_imp__GetSecurityUserInfo
f78d2bc0  b78274ba mrxdav!_NULL_IMPORT_DESCRIPTOR+0xc52
f78d2bc4  00000000
f78d2bc8  e165e301
f78d2bcc  f7477958 KSecDD!DESParityTable <PERF> (KSecDD+0x14958)
f78d2bd0  00000000
f78d2bd4  0000000e
f78d2bd8  b7827372 mrxdav!_NULL_IMPORT_DESCRIPTOR+0xb0a
f78d2bdc  8a2e8240
f78d2be0  f78ee9b4
f78d2be4  f7b774ba Ntfs!NtfsFsdClose+0x3b0
f78d2be8  8a0c1978


FOLLOWUP_IP:
mrxdav!_NULL_IMPORT_DESCRIPTOR+3c
b78268a4 5c              pop     esp

SYMBOL_NAME:  mrxdav!_NULL_IMPORT_DESCRIPTOR+3c

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: mrxdav

IMAGE_NAME:  mrxdav.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  41107b91

FAILURE_BUCKET_ID:  0xc000021a_csrss.exe_c0000005_mrxdav!_NULL_IMPORT_DESCRIPTOR+3c

BUCKET_ID:  0xc000021a_csrss.exe_c0000005_mrxdav!_NULL_IMPORT_DESCRIPTOR+3c

Followup: MachineOwner
---------

자세한 원인 분석은 생략하겠습니다. 귀찮기도 하고 분석을 해봐도 뭐가 잘못된건지도 잘 모르겠고...

해결책은 이렇습니다.

VS2005 서비스팩1(KB926605)과 패치(KB932237)를 설치한다.

결론은 서비스팩1과 패치가 설치되지 않은 VS2005는 잘못된 exe를 생성해낸다는 것입니다.

지금까지 설명한 것과 비슷한 문제가 발생한다면, Visual Studio 2005 서비스팩과 패치를 설치해보는 것을 권장합니다.

- 원인을 발견하기까지
빌드 서버에서 빌드한 exe를 실행하면 계속 재부팅 현상이 발생하는데, 개발자 PC에서 빌드한 바이너리는 정상적으로 동작하는 것이었습니다. 약 이틀동안의 삽질을 하면서 소스코드의 별별 장소를 다 바꿔보고, 컴파일 옵션도 바꿔봤지만 소용이 없었습니다.

더 웃긴것은 문제가 발생하는 사람도 있고 그렇지 않은 사람도 있었던 것입니다.

그때 문득 팀원 중 한명이... 개발자 PC와 빌드 서버의 환경이 다른것이 아닐까? 하는 의견과 함께 VS2005의 버전을 확인하기 시작했습니다.

문제가 생기지 않는 개발자의 VS2005 버전은 8.0.50727.867(서비스팩1과 패치 설치)이었고 문제가 생기는 개발자와 빌드 서버의 VS2005 버전은 8.0.50727.42 였던 것입니다.

- 끝으로
빌드 서버를 이용한 개발환경에서 개발 도구(VS2005)의 버전 때문에 예상치 못한 문제가 발생할 수 있다는 점을 경험하게 되었습니다.

개발자 PC의 개발 도구(VS2005)와 빌드 서버의 개발 도구(VS2005)의 버전은 항상 일치시키켜야 합니다. 그렇지 않으면 버전 차이로 인해 원인 추적이 까다로운 문제가 발생할 수 있습니다.





SQLite는 아주 가벼운 데이터베이스 라이브러리입니다. SQL 문법을 사용할 수 있고 트랜잭션을 지원합니다.

이번에 윈도우 커널 모드(드라이버)에서 사용할 수 있는 SQLite를 만들어봤습니다. 윈도우 드라이버에서도 데이터를 데이터베이스 형식으로 관리하고자 할 때 사용할 수 있습니다. 혹은 유저모드에서 만든 SQLite 데이터베이스 파일을 윈도우 드라이버에서 읽거나 쓸 때에도 사용할 수 있습니다.

SQLite 버전은 3.6.12이며 WDK 6000 이상에서 빌드 할 수 있도록 작업하였습니다.

다운로드는 SQLiteForWindowsKernel 페이지에서 할 수 있습니다.



WDM 필터드라이버를 로드할 때 SetupDiCallClassInstaller 함수를 많이 사용합니다.

이 함수는 장치 트리를 재구성 할 때 사용하는데, 필터 드라이버는 특정 디바이스에 필터값을 설정하고 장치 트리를 재구성하면서 드라이버를 로드하는 것입니다.

여기서 SetupDiCallClassInstaller 함수가 동작하지 않을 때가 있습니다. 함수가 리턴하는 값이 TRUE 이면서 별다른 이상이 없는데도, 드라이버는 로드가 되지 않는 현상이 발생합니다.

문제는 WM_DEVICECHANGE 메시지입니다.

SetupDiCallClassInstaller 함수를 호출하면 WM_DEVICECHANGE (wParam : DBT_DEVNODES_CHANGED 0x0007) 메시지가 발생하는데 특정 프로그램이 중간에서 이 메시지를 없애버리면 드라이버가 로드 되지 않습니다.

예를 들자면 CBT 훅과 같이 전역 훅을 설치해두고 WM_DEVICECHANGE 메시지를 받은 뒤 정상적으로 전달해주지 않고 없애버리는 프로그램들입니다.

SetupDiCallClassInstaller 함수로 필터 드라이버가 로드 되지 않을 때에는 Spy++로 WM_DEVICECHANGE 메시지가 전달되는지 확인해보는 것이 좋습니다.




  • 2008년 5월 윈도우 프로젝트 필수 유틸리티 출간 이후 이렇다 할 활동을 하지 않고 있습니다. 책이 출간된 직후 부터 회사 생활에 있어 많은 변화가 있었고, 기술력에 더불어 조직문화의 차이가 성과에 큰 영향을 미친다는 것을 직접적으로 경험할 수 있었던 시기였습니다.

  • 오래전 부터 조직문화, 기업문화에 대한 관심은 지속적으로 있어 왔지만 최근의 경험들을 통해 이러한 분야의 중요성을 느끼게 되었고, 좀더 전문적으로 다가갈 수 있는 계기가 되었습니다.

  • 윈도우 프로젝트 필수 유틸리티 출간 이후 많은 질문 메일이 오고 있습니다. 거의 모든 질문 메일에 답변을 드리고 있지만, 간혹 답장을 못드리는 메일이 있을 수 있습니다. 저도 해결책을 찾지 못한 부분이거나, 질문 내용이 애매하여 마땅한 답을 드리지 못한 것들이 있습니다. 이점 양해의 말씀을 드립니다.
    • 뭔가 안되는 것이 있으시면 자주하는 질문(FAQ)오탈자 페이지를 참고해 주세요. 독자분들이 보낸 질문들과 잘못된 점을 지적해주신 부분들을 지속적으로 업데이트 하고 있습니다.
TAG 근황





처음에 우연히 이 책의 이름을 듣게 되었을 때 전산이라는 단어 때문에 일본 IT 업계 이야기인줄 알았습니다. 하지만 책을 사들고 한자로 된 회사명을 보고 난 뒤 전산이 전자계산이 아닌 전기산업이라는 것을 알게 되었습니다. 그렇습니다. 일본전산은 모터 제조회사입니다.

이 책의 초반부를 읽으면서 상당한 거부감을 느낀것이 사실입니다. 읽으면서 짜증이 날 정도였으니깐 말이죠.

초반부는 그다지 공감가지 않을 수 있는, 그저 사장의 오기로만 비춰질 수 있는 사장의 똥고집 같은 내용입니다.

"자네, 지금부터 자리에서 일어나서 '할 수 있다'는 구호를 100번 외쳐보게."

사이비 종교 같이 똑같은 구호를 백번 천번 외치게 한다거나, 입사 시험에서 큰 소리로 말하기, 밥 빨리 먹기를 채용 기준으로 정하고, 오래 달리기, 화장실 청소 시험을 보는 등 그야말로 빈축을 살만한 일들이었습니다.

"두배 더 오래 일 하라"
"납기일은 무조건 다른 회사의 절반으로 한다"

토요일 일요일은 물론이고 하루 16시간씩 즉 보통사람의 2배를 일해야 한다고 말하기도 합니다. 게다가 납기일은 절반으로 해야된다는것 까지...

"이 모터의 크기를 반으로 줄여달라. 석 달 안에 반으로 줄일 수 있다면, 당신 회사와 거래하겠다."
나가모리 사장은 우선 '가능하다'는 말부터 튀어나왔다.

이렇게 초반부만 보다 보면 이런 막무가내가 다 있나 하는 생각에 짜증이 밀려옵니다.

저는 앞서 "야마다 사장 샐러리맨의 천국을 만들다 - 미라이공업"을 읽었기 때문인지 이런 일본전산 사장의 행동에 더더욱 화가 낫는지도 모르겠습니다.

하지만 책의 중반을 지나 후반부에 이르러 일본전산 사장 나가모리 시게노부가 전하고자 하는 진정한 뜻을 느낄 수 있었습니다.

"진심으로 관심이 있어 들여다보고 살펴보며 깊이 관찰한 결과로 나무라거나 혼내는 것은, 그 직원에 대한 깊은 관심 덕분이다. ...(중략)... 물질적인 보상 혹은 립 서비스식의 칭찬 이외에는 달리 관심을 표할 만한 열정이 없는 사람일수록 칭찬을 남발하게 돼 있다." 139P

"적당한 칭찬으로 상대가 의기충전해질 것이라고 오해한다. 그런식의 속보이는 칭찬으로 '그럭저럭 잘해줄' 인재는 드물다. '회사에 엄청난 공헌을 했다며' 창립 기념일에 표창과 상장을 주면서 격려하면 직원이 의욕이 배가되어 죽을 둥 살 둥 열심히 일 할까? 물론 그런 장치도 반드시 필요하다. 하지만 인재는 저절로 크거나 알아서 자라는 것이 아니다. 경영자의 노력 없이 '백마타고 온 왕자처럼' 하늘에서 갑자기 나타나 부진에 빠진 회사를 구해줄 리 만무하다는 말이다." 148P

"회사를 키우고 활력 있는 조직으로 유지하기 위해서는 가점주의가 필요하다. 특히 중견 기업이나 중소기업들은 감점주의를 도입하면 머지않아 인재가 아무도 남지 않는다. 제대로 하려고 하는 사람의 발목까지 잡는 게 감점주의다. 도약하는 기업을 만들려면 가점주의로 운영해야 한다." 165P

감점주의 문화에서는 "적극적으로 새로운 도전을 시도하다가 실패한 직원보다, 새로운 것을 전혀 시도하지 않아 실패할 턱이 없는 직원이 훨씬 높은 평가를 받게 되는 어처구니 없는 결과를 낳기도 한다." 166P

"기업이 직원에게 해줄 수 있는 최고의 복지는 '교육'" 189P

"누구나 인재가 중요하다는 사실 정도는 익히 잘 알고 있다. 어느 나라를 막론하고 기업이 침체에 빠지거나 성장하지 못할 때 마다 대부분 '인재 부족'을 그 원인으로 꼽는다. 그렇다면 직원들 입장에선 어떨까? 그들에게 물어보면 하나같이 '경영진의 무능력'을 꼬집는다. 이렇게 패배자들은 남을 탓하는데 익숙해져 있다." 230P

"사장이 정신을 놓으면 '아무리 유능한 인재가 모여 있다 해도', 삼류 오합지졸로 바뀌는 것은 시간 문제다. 직원이 정신을 놓으면 경영자가 아무리 훌륭한 회사를 만들겠다고 결심해도 그 발걸음 마다 덜미를 잡힐 수 밖에 없다." 231P

"회사가 침체에 빠지는 것은 직원이 무능력해서가 아니라, 직원들의 의욕을 상실하게 하는 비효율적인 업무와 상호 소통 없는 나태함 때문이다. 그 원인을 제거하면 곧바로 회복 될 수 있다. 왜냐하면 본래 대다수의 직원들은 의욕을 가지고 회사에 입사했고, 일을 하려고 직업을 선택했기 때문이다." 267P

고학력이지만 취업난에 허덕이고 있는 구직자들을 질책하는 내용이기도 하지만 동시에 실패한 경영자들의 행동에 대해 일침을 가하는 내용이기도 합니다.

이책을 읽는 사람이 사원에 해당한다면 질책당하는 느낌이 들더라도 꼭 끝까지 읽기 바랍니다. 또한 책을 읽는 사람이 경영자에 해당한다면 앞부분만 읽고 사원들을 질책하는 일이 없길 바랍니다.



 

그렇습니다. 책광고입니다. 이 책은 저 위 표지에 나오는 할아버지가 쓴 책이고. 저자, 역자와 저는 아무런 상관도 없습니다. 하지만 제발 사서 읽어보라고 말하고 싶습니다.

이 책에 나오는 미라이 공업에 대해 이렇게 설명합니다.

 - 전 직원 정규직 종신고용
 - 70세 정년, 정리해고, 잔업 없음
 - 일일 근로시간 7시간 15분
 - 연간 140일 휴가+개인휴가, 육아 휴직 3년 보장
 - 5년마다 해외여행, 월급은 대기업 수준

정말 천국같은 환경입니다.

하지만 이렇게 표면적으로 드러나는 모습이 전부가 아닙니다.

"사원의 의욕을 불러 일으키고 사기를 진작시키는 방안을 강구하는 일은 사장이 해야 하는 일 중에서 가장 중요한 것이라 할 수 있다."

"사람들이 일할 의욕을 상실했다면 그 배경에는 분명히 '불만'이 있다. 나는 그 불만을 하나하나 없애 가는 것이 사장의 일이라고 생각한다. 이것이야 말로 의욕을 키우는 토양을 만드는 일이다."

"인간은 물건이 아니야. 회사는 사원을 위해 있는거야."

의욕.. 정말 중요한 단어입니다. 의욕을 잃으면 그냥 월급만 축내고 피해만 주는 존재가 될 뿐입니다. 주변에 잦아 보면 이렇게 의욕을 잃고 나는 월급만 받아가련다. 하는 사람이 의외로 많습니다.

평소에 일 잘하고 의욕적인 사람도, 회사측에 두세번 실망하게 되면 대부분 저런 식으로 바뀌어갑니다.

야마다 사장은 직원들의 의욕을 불러 일으키는 것이 사장이 해야 할 일이라고 말하고 있습니다.

이외에도 성과주의 금지, 업무 할당량 없음, 사원을 믿고 권한을 위임하는 것, 아이디어를 제안할 때마다 500엔 지급 등을 미라이 공업에서 실시하고 있습니다.

이 짧은 글로 모든 것을 설명할 수는 없습니다. 직접 읽어보고 느껴보길 바랍니다.





하제소프트 이봉석 사장님의 IT EXPERT 윈도우 디바이스 드라이버가 출간되었습니다.

이번에 저는 이 책의 감수를 맡게 되었습니다. 국내 윈도우 디바이스 드라이버계의 독보적인 존재이신 이봉석 사장님의 저서를 감수하게 되어 매우 영광으로 생각하고 있습니다.

이 책의 특징을 조금 살펴보자면, 윈도우 디바이스 드라이버를 개발하다 보면 많이 어려워하는 부분인 컨텍스트에 대해 자세하게 설명이 되어있습니다. 또한 기존 디바이스 드라이버 책에서는 크게 다루지 안았던 inf 파일의 형식과 사용법에 대해서도 잘 나와있습니다.

또한 실제 윈도우상의 여러가지 장치 스택을 쉽게 설명하고 있고, WDM 방식 드라이버에서 PNP 및 전원 처리에 관해 중점적으로 설명하고 있습니다.

그 이외에도 일반적인 동기화 문제와 취소 처리 루틴과 I/O 과정에서의 동기화 문제와 기존 디바이스 드라이버 책에서는 잘 다루지 않았던 멀티 프로세서 처리, 인터럽트, DMA, 각종 후킹 방법을 담고 있습니다.

이 책 전에 출간되었던 "고급 개발자들만이 알고 있던 디바이스 드라이버 구조와 원리 그리고 제작 노하우"가 급 절판 되면서 많은 사람들이 안타까워 하고 있었는데, 이번에 한빛미디어에서 새롭게 출간되어 저또한 독자로서 매우 기쁠 따름입니다.

이번 책은 "고급 개발자들만이 알고 있던 디바이스 드라이버 구조와 원리 그리고 제작 노하우"와는 별개로 새롭게 집필되었기 때문에 윈도우 디바이스 드라이버 개발자는 꼭 한번은 살펴보아야 할 책입니다.





Kernel Memory Editor 1.0.0이 릴리스 되었습니다.

Kernel Memory Editor는 Windows의 커널 메모리를 편집하는 프로그램입니다. 커널인 ntoskrnl.exe를 비롯한 커널 메모리상에 로드된 드라이버의 내용을 편집할 수 있습니다.

즉 런타임 패치가 가능하다는 것입니다. 그리고 커널 메모리는 커널 및 해당 드라이버에 대한 충분한 이해를 한 뒤 편집을 할 것을 권장합니다.

다운로드 및 버그 보고, 기능 추가 요청등은 KernelMemoryEditor 페이지에서 할 수 있습니다.



윈도우에서 드라이버를 로드하려면 일단 CreateService 함수로 서비스를 생성해야 합니다. 드라이버를 잘 사용하고 난 뒤 드라이버를 언로드하고 드라이버의 서비스를 삭제할 때 DeleteService 함수를 사용합니다.

이때 응용프로그램과 통신을 위해 생성한 디바이스 오브젝트 등을 CreateFile 등의 함수로 열었을 때 꼭 핸들을 닫아줘야 합니다.

핸들을 닫지 않은채로 DeleteService 함수로 드라이버 서비스를 삭제하게 되면 완전히 삭제되지 않고 흔적이 남아있게 됩니다.

즉 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<드라이버 이름> 키 아래에 DeleteFlag라는 DWORD 값이 생기게 됩니다. 데이터는 1이 들어가있습니다.



서비스가 완전히 삭제되지 않고 삭제 대기중인 상태에서 다시 OpenService로 해당 서비스의 핸들을 얻고 DeleteService 함수를 호출하게 되면 ERROR_SERVICE_MARKED_FOR_DELETE(0x00000430, 1072, 지정된 서비스가 지워진 것으로 표시되었습니다.) 에러가 발생하게 됩니다.

DeleteFlag가 설정된 서비스는 일정 시간이 지나면 자동적으로 삭제됩니다. 하지만 디바이스의 핸들을 닫지 않은 상태에서 CreateService(OpenService)와 DeleteService를 연속적으로 호출하게 되면, DeleteFlag가 남아있는 채로 서비스를 삭제하려고 하는 상황이 생길 수 있으니 주의해야 합니다.