64-비트 포팅 체크 리스트 포인터 연산 -1

Download Report

Transcript 64-비트 포팅 체크 리스트 포인터 연산 -1

Windows 디바이스 드라이버
Update
정 우식
개발부장
㈜열린기술
내용






드라이버 개발자 입장에서 본 XP
XP DDK Update
64-비트 이슈
디바이스 설치
USB 드라이버 스택
디버깅 및 기타 도구들
드라이버 개발자가 보는 XP

NT 버전: Win2K  WinXP




OS: 5.0.  5.1
WDM: 1.1  1.2
커널의 안정성 및 신뢰성 향상
대폭적으로 개선된 드라이버 개발 환경



새로운 DDK
Verifier 의 기능 향상
디버깅 및 기타 도구들
커널 개선 사항

새로운 Cancel Queue



취소 작업과 관련된 기능을 커널에서 처리
예제: \src\general\cancel
저 메모리 상황에서의 성능 개선


“must succeed” 형태의 메모리 할당 금지
ExAllocatePoolxxx,
MmGetSystemAddressForMdlSafe
커널 개선 사항

시스템 복구



Sr.sys: 파일 시스템 필터 드라이버
IFS Kit에 새로운 지원 루틴 포함
새로운 DMA 기능


DEVICE_DESCRIPTION_VERSION2
CalculateScatterGatherList,
BuildScatterGatherList,
BuildMdlFromScatterGatherList
커널 개선 사항

추가된 DDIs




IoSetCompletionRoutineEx
IoFreeErrorLogEntry
IoIs32bitProcess, …
기타 커널 개선 사항




Logical Prefetcher – 신속한 부트
시스템 PTE 수의 증가
레지스트리 – 사용 공간 확대, 신속한 Query
Headless Support
XP DDK Update


내용 및 구성면에서 개선된 도큐먼트
Stand-alone 개발 툴




VC++ 필요 없음
VC7 컴파일러 포함
64-비트 개발 환경 지원
새롭게 추가되고 기능이 개선된 도구들



Driver Verifier
ChkINF, GenINF
PnP 테스트 유틸리티, Sleeper, …
XP DDK Update

힌트


대상 플랫폼에 맞는 DDK 선택
 WinNT4 – NT4 DDK
 WinXP DDK – WinXP, Win2K, WinMe,
Win98 WDM
Win2K SP2의 신뢰성 있는 드라이버 개발을
위해서는 WinXP DDK 사용 또는 참조
XP DDK Update

힌트



Set DEPRECATE_DDK_FUNCTIONS=1
 폐기된 DDI를 사용하는 경우 컴파일시
경고 메시지
 \test\xxx.c(111): error C4996:
‘RtlExtendecIntegerMultiply’ was
declared deprecated
“Not Supported” – 향후에 정상적으로
작동하지 않을 것임
Supported/unsupported 여부가 특별히
명시되지 않은 내용 – 아직 충분이
테스트되지 않은 기능들
XP DDK Update

XP DDK 얻는 방법




MSDN
XP DDK Suite 구입
웹을 통한 다운로드 지원계획 없음 (‘현재’)
Toaster 샘플



%winddk%\src\general\toaster
가상의 버스, function, 필터 드라이버
Power.c – bug fixed!
XP DDK 구조
64 –비트 이슈

WOW64 thunking layer



Win64 시스템에서 32-비트 응용 프로그램
구동
Win32 함수 호출시, pointer-precision
파라미터를 fixed-precision으로 변경하여
Win64 커널에 전달 – ‘thunking’
32-비트 드라이버는 Win64 시스템에서
지원되지 않는다.
Thunking의 필요성
32-비트: sizeof(DRIVER_DATA) = 12
HANDLE Event
32 bit
(4 bytes)
UNICODE_STRING ObjectName
USHORT
Length
USHORT
PWSTR
Maximum_Length Buffer
16 bit
(2 bytes)
16 bit
(2 bytes)
32 bit
(4 bytes)
64-비트: sizeof(DRIVER_DATA) = 24
HANDLE Event
64 bit
(8 bytes)
UNICODE_STRING ObjectName
USHORT
Length
Structure
USHORT
Maximum_Length Padding
PWSTR
Buffer
16 bit
(2 bytes)
16 bit
(2 bytes)
64 bit
(8 bytes)
32 bit
(4 bytes)
Thunking의 필요성
typedef struct _DRIVER_DATA32
{
VOID *POINTER_32 Event;
UNICODE_STRING32 ObjectName;
} DRIVER_DATA32;
64-비트, 32-비트: sizeof(DRIVER_DATA32) = 12
POINTER_32
Event
32 bit
(4 bytes)
UNICODE_STRING32 ObjectName
USHORT
Length
ULONG
USHORT
Maximum_Length Buffer
16 bit
(2 bytes)
16 bit
(2 bytes)
32 bit
(4 bytes)
64-비트 포팅 체크 리스트

Win32 응용 프로그램의 I/O 요청


DeviceIoControl 에서 pointer-precision
변수가 포함된 구조체의 주소를 InputBuffer
또는 OutputBuffer의 인수로 사용하는 경우
IoIs32bitProcess DDI 사용 thunking 구현
#if defined(_WIN64)
if (IoIs32bitProcess(Irp) {
DRIVER_DATA32 Buffer32;
...
}
else {
#endif
64-비트 포팅 체크 리스트

Structure Alignment



struct xxx {
DWORD NoOfPointers;
PVOID Pointers[1]; }
Malloc(sizeof(DWORD)+100*sizeof(PVOID));
 DWORD 뒤에 alignment를 위해 4 byte를
추가로 padding
Malloc(FIELD_OFFSET(struct xx, Pointers)
+100*sizeof(PVOID));
64-비트 포팅 체크 리스트

포인터 연산



-1 != 0xFFFFFFFF
ULONG len;
Len = ptr2 – ptr1;
포인터를 ULONG, DWORD 등의 형태로
캐스팅하지 않는다.
디바이스 설치
64-비트



새로운 64-비트 플랫폼 확장자 사용 .ntia64
기존의 다른 확장자와 동일한 사용 방법 .ntia64, .nt
IA64 시스템의 INF 파일 탐색 순서



.ntia64
.nt
undecorated
디바이스 설치
Include 와 Need


설치하려는 드라이버가 Windows “inbox” INF 파일에 의해 생성되는
드라이버/레지스트리 설정 등의 내용에
영향을 받는 경우…
include= 와 needs= 지시자 사용

[ToasterFilter.NT]
Include=toaster.inf
Needs=Toaster_Device.NT
디바이스 설치
OS 버전


OS 버전에 따른 INF 파일의 구분
기존 버전의 OS에 INF 파일이 설치되는
것을 방지
디바이스 설치
OS 버전 – XP solution

Decorated [Model] 섹션


%mfg name%=models-section-name
[,TargetOsVersion] [,TargetOsVersion]…
NT[Architecture][.[OSMajorVersion]
[.OSMinorVersion][.[ProductType]
[.SuiteMask]]]]
디바이스 설치
OS 버전 – XP solution 예1
[Manufacturer]
“Foo Corp” = FooMfg, NT….0x80, NT
“ABC Inc.” = ABCMfg, NTia64, NTx86
[FooMfg.NT….0x80]
[FooMfg.NT]
[FooMfg]
[ABCMfg.NTia64]
[ABCMfg.NTx86]
[ABCMfg]
;XP & later Data Center
;All other XP & later
;Windows 2000
;XP & later ia64
;XP & later x86
;Windows 2000
디바이스 설치
OS 버전 – XP solution 예2
[Manufacturer]
“Foo Corp” = FooMfg, NT.6.0, NTx86.5.1
[FooMfg.NT.6.0]
; Empty model section
[FooMfg.NTx86.5.1]
[FooMfg]
; Empty model section
; NT 6.0 과 그 이후 버전을 지원
하지 않음
;NT 5.1 및 이후 버전 (단, NT 6.0
이후는 지원하지 않음)
;Win9x/NT4/2K 는 지원하지 않음
디바이스 설치
멀티펑션 디바이스

멀티펑션 디바이스는 펑션별로 하나씩,
여러 개의 서로 다른 Devnode를 설치


서로 다른 디바이스 셋업 클래스에 속하므로
복수의 INF 파일 필요
CopyINF

[DDInstall]
CopyINF=filename1.inf [,filename2.inf]…
USB 드라이버 스택
Win2K
USB Client
Device Driver
USB Hub (Bus) Driver
usbhub.sys
Host Controller Driver
usbd.sys
Miniport
Driver
uhcd.sys
Miniport
Driver
openhci.sys
USB 드라이버 스택
WinXP
USB Client
Device Driver
USB Generic Parent Driver
usbccgp.sys
USB Client
Device Driver
USB Hub (Bus) Driver
usbhub.sys
Host Controller Driver
usbport.sys
Miniport
Driver
usbuhci.sys
USB Client
Device Driver
Miniport
Driver
usbohci.sys
Miniport
Driver
usbehci.sys
디버깅 및 기타 도구들
Driver Verifier




Enhanced I/O Verification
DMA Verification
Deadlock Detection
SCSI Verification
디버깅 및 기타 도구들
PnP 드라이버 테스트



%WinDDK%\tools\pnpdtest
PnP IRP를 전송하여 드라이버의 작동
상태를 검사
검사 항목





Removal
Surprise Remove
Rebalance
Stress
Demo
디버깅 및 기타 도구들
DeviceTree




%WinDDK%\tools\devicetree
시스템에 설치 되어 있는 모든 드라이버와
PnP 디바이스 스택의 관계를 보여 주는
도구
드라이버 뷰 / PnP 뷰
Demo
디버깅 및 기타 도구들
전원 관리



%WinDDK%\tools\acpi\pmte
%WinDDK%\tools\acpi\speeper
전원 상태 변경 검사
Demo
디버깅 및 기타 도구들
DevCon


%WinDDK%\tools\devcon
%WinDDK%\src\setup\devcon
텍스트 모드 디바이스 콘솔



장치관리자의 역할을 수행
Setup API, CfgMgr32 API 사용
Demo
디버깅 및 기타 도구들
디버깅


IEEE 1394 포트를 사용한 Host/Target
시스템 연결
드라이버 파일의 맵핑


커널 모드 드라이버 파일을 Host에서 제공
많은 확장 명령어의 추가 및 버그 fix
디버깅 및 기타 도구들
디버깅 힌트

Host/Target 시스템 연결




Host – free build, 디버거 (WinDbg, Kd)
Target – checked build
Driver Verifier 가동 상태에서 테스트
모든 코드/실행 패쓰에 대해서 테스트


pnpdtest, sleeper
emulator
Windows 디바이스 드라이버
Update
Wrap up
“마이크로소프트는 당신이 드라이버 개발 작업을
성공적으로 수행할 수 있기를 *진심으로* 원하고
있습니다.”
© 2001 Microsoft Corporation. All rights reserved.