매크로
IoGetCurrentIrpStackLocation
- 전달받은 IRP에서 스택 위치를 얻는다.
IoMarkIrpPending
- 현재 IRP가 앞으로 더 처리될 내용이 있음을 표시
IoGetNextIrpStackLocation
- 하위 드라이버의 스택 위치를 구한다.
IoSetNextIrpStackLocation
- 하위 드라이버에 스택 위치를 지정한다.
IoSetCompletionRoutine
- 하위 드라이버가 입출력 처리를 마쳤을 때 실행될 함수를 지정한다.
IoCreateDevice
NTSTATUS IoCreateDevice(
IN PDRIVER_OBJECT DriverObject, //드라이버객체
IN ULONG DeviceExtensionSize, //필요한 디바이스 확장 사이즈
IN PUNICODE_STRING DeviceName, //디바이스의 이름, 또는 NULL
IN DEVICE_TYPE DeviceType, //디바이스의 종류 : 표준 헤더의 WDM.H또는 NTDDK.H에 기재된 FILE_DEVICE_xxx 값의 하나
IN ULONG DeviceCharacteristics, //이동 매체, 읽기 전용 등을 나타내는 다양한 상수의 논리집합
IN BOOLEAN Exclusive, //한번에 하나의 스레드만이 디바이스에 액세스하는 경우 TRUE로 지정
OUT PDEVICE_OBJECT* DeviceObject //반환된 디바이스 객체
)
CTL_CODE
CTL_CODE(
DeviceType, //IoCreateDevice에 주어진 FILE_DEVICE_XXX 값
ControlCode, //IOCTL 함수 코드, 0x000 ~ 0x7FF Microsoft를 위해 예약, 0x800 ~ 0xFFF 개인 코드
TransferType, //METHOD_BUFFERED, METHOD_IN_DIRECT, METHOD_OUT_DIRECT, METHOD_NEITHER
RequiredAccess //FILE_ANY_ACCESS, FILE_READ_DATA, FILE_WRITE_DATA, FILE_READ_DATA | FILE_WRITE_DATA
)
PnP 부함수 코드
일반적인 PnP IRP
IRP_MN_START_DEVICE : 리소스를 할당하고 디바이스를 시작한다.
IRP_MN_QUERY_REMOVE_DEVICE : 디바이스를 제거해도 좋은지 묻는다.
IRP_MN_CANCEL_REMOVE_DEVICE : IRP_MN_QUERY_REMOVE_DEVICE의 확인을 취소한다.
IRP_MN_REMOVE_DEVICE : 디바이스가 언플러그(혹은 제거)됐기 때문에, 자원 할당을 해제해 디바이스를 삭제한다.
IRP_MN_SURPRISE_REMOVAL(win2k전용) : 예기치 않은 상황에서 사용자가 디바이스를 제거했다.
IRP_MN_QUERY_STOP_DEVICE : 디바이스를 정지해도 좋은지 확인한다.
IRP_MN_CANCEL_STOP_DEVICE : IRP_MN_QUERY_STOP_DEVICE의 확인을 취소한다.
IRP_MN_STOP_DEVICE : 자원을 재할당하기 위해 디바이스를 정지한다.
기타 PnP IRP
IRP_MN_QUERY_DEVICE_RELATIONS : 일정한 특성을 갖는 PDO에 관해 조회한다.
IRP_MN_QUERY_INTERFACE : 드라이버에 직접 호출 인터페이스를 엑스포트(export) 시킨다.
IRP_MN_QUERY_CAPABILITIES : 디바이스의 기능을 확인한다(잠금(lock) 혹은 배출(eject)이 가능한지 등).
IRP_MN_QUERY_RESOURCES : 디바이스 부트 구성 리소스를 얻는다.
IRP_MN_QUERY_RESOURCE_REQUIREMENTS : 디바이스가 필요로 하는 리소스를 조회한다.
IRP_MN_QUERY_DEVICE_TEXT : 디바이스의 설명 또는 위치를 나타내는 문자열을 취득한다.
IRP_MN_FILTER_RESOURCE_REQUIREMENTS : 필터 드라이버 및 기능 드라이버에 디바이스의 리소스 요구를 필터시킨다.
IRP_MN_READ_CONFIG : 구성 영역 정보를 읽는다.
IRP_MN_WRITE_CONFIG : 구성 영역 정보를 설정한다.
IRP_MN_EJECT : 디바이스를 슬롯에서 배출한다.
IRP_MN_SET_LOCK : 디바이스 잠금 상태를 설정한다.
IRP_MN_QUERY_ID : 디바이스의 하드웨어 ID, 호환 ID 및 인스턴스 ID를 얻는다.
IRP_MN_QUERY_PNP_DEVICE_STATE : 디바이스 상태 비트맵에 비트를 설정한다.
IRP_MN_DEVICE_USAGE_NOTIFICATION : 디바이스가 페이징 상태, 하이버네이션 상태, 혹은 크래시 덤프 파일의 작성 중에 있는지를 통지한다.
IRP_MN_QUERY_LEGACY_BUS_INFORMATION : 레서시(legacy) 버스 정보를 반환한다(win2k전용).
IoAttatchDeviceToDeviceStack
xxx 디바이스를 디바이스 스택에 첨부한다.
PASSIVE_LEVEL에서만 호출되어야 한다. 상위 레벨에서 호출하면 드라이버 파손 가능성
============================================================
dx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, pdo);
IoCreateDevice()후 생성된 정보를 DeviceStack에 장착시키고 위치값을 DeviceExtension의 변수에 저장시킨다.
DDK 환경설정
IoGetCurrentIrpStackLocation
- 전달받은 IRP에서 스택 위치를 얻는다.
IoMarkIrpPending
- 현재 IRP가 앞으로 더 처리될 내용이 있음을 표시
IoGetNextIrpStackLocation
- 하위 드라이버의 스택 위치를 구한다.
IoSetNextIrpStackLocation
- 하위 드라이버에 스택 위치를 지정한다.
IoSetCompletionRoutine
- 하위 드라이버가 입출력 처리를 마쳤을 때 실행될 함수를 지정한다.
IoCreateDevice
NTSTATUS IoCreateDevice(
IN PDRIVER_OBJECT DriverObject, //드라이버객체
IN ULONG DeviceExtensionSize, //필요한 디바이스 확장 사이즈
IN PUNICODE_STRING DeviceName, //디바이스의 이름, 또는 NULL
IN DEVICE_TYPE DeviceType, //디바이스의 종류 : 표준 헤더의 WDM.H또는 NTDDK.H에 기재된 FILE_DEVICE_xxx 값의 하나
IN ULONG DeviceCharacteristics, //이동 매체, 읽기 전용 등을 나타내는 다양한 상수의 논리집합
IN BOOLEAN Exclusive, //한번에 하나의 스레드만이 디바이스에 액세스하는 경우 TRUE로 지정
OUT PDEVICE_OBJECT* DeviceObject //반환된 디바이스 객체
)
CTL_CODE
CTL_CODE(
DeviceType, //IoCreateDevice에 주어진 FILE_DEVICE_XXX 값
ControlCode, //IOCTL 함수 코드, 0x000 ~ 0x7FF Microsoft를 위해 예약, 0x800 ~ 0xFFF 개인 코드
TransferType, //METHOD_BUFFERED, METHOD_IN_DIRECT, METHOD_OUT_DIRECT, METHOD_NEITHER
RequiredAccess //FILE_ANY_ACCESS, FILE_READ_DATA, FILE_WRITE_DATA, FILE_READ_DATA | FILE_WRITE_DATA
)
PnP 부함수 코드
일반적인 PnP IRP
IRP_MN_START_DEVICE : 리소스를 할당하고 디바이스를 시작한다.
IRP_MN_QUERY_REMOVE_DEVICE : 디바이스를 제거해도 좋은지 묻는다.
IRP_MN_CANCEL_REMOVE_DEVICE : IRP_MN_QUERY_REMOVE_DEVICE의 확인을 취소한다.
IRP_MN_REMOVE_DEVICE : 디바이스가 언플러그(혹은 제거)됐기 때문에, 자원 할당을 해제해 디바이스를 삭제한다.
IRP_MN_SURPRISE_REMOVAL(win2k전용) : 예기치 않은 상황에서 사용자가 디바이스를 제거했다.
IRP_MN_QUERY_STOP_DEVICE : 디바이스를 정지해도 좋은지 확인한다.
IRP_MN_CANCEL_STOP_DEVICE : IRP_MN_QUERY_STOP_DEVICE의 확인을 취소한다.
IRP_MN_STOP_DEVICE : 자원을 재할당하기 위해 디바이스를 정지한다.
기타 PnP IRP
IRP_MN_QUERY_DEVICE_RELATIONS : 일정한 특성을 갖는 PDO에 관해 조회한다.
IRP_MN_QUERY_INTERFACE : 드라이버에 직접 호출 인터페이스를 엑스포트(export) 시킨다.
IRP_MN_QUERY_CAPABILITIES : 디바이스의 기능을 확인한다(잠금(lock) 혹은 배출(eject)이 가능한지 등).
IRP_MN_QUERY_RESOURCES : 디바이스 부트 구성 리소스를 얻는다.
IRP_MN_QUERY_RESOURCE_REQUIREMENTS : 디바이스가 필요로 하는 리소스를 조회한다.
IRP_MN_QUERY_DEVICE_TEXT : 디바이스의 설명 또는 위치를 나타내는 문자열을 취득한다.
IRP_MN_FILTER_RESOURCE_REQUIREMENTS : 필터 드라이버 및 기능 드라이버에 디바이스의 리소스 요구를 필터시킨다.
IRP_MN_READ_CONFIG : 구성 영역 정보를 읽는다.
IRP_MN_WRITE_CONFIG : 구성 영역 정보를 설정한다.
IRP_MN_EJECT : 디바이스를 슬롯에서 배출한다.
IRP_MN_SET_LOCK : 디바이스 잠금 상태를 설정한다.
IRP_MN_QUERY_ID : 디바이스의 하드웨어 ID, 호환 ID 및 인스턴스 ID를 얻는다.
IRP_MN_QUERY_PNP_DEVICE_STATE : 디바이스 상태 비트맵에 비트를 설정한다.
IRP_MN_DEVICE_USAGE_NOTIFICATION : 디바이스가 페이징 상태, 하이버네이션 상태, 혹은 크래시 덤프 파일의 작성 중에 있는지를 통지한다.
IRP_MN_QUERY_LEGACY_BUS_INFORMATION : 레서시(legacy) 버스 정보를 반환한다(win2k전용).
IoAttatchDeviceToDeviceStack
xxx 디바이스를 디바이스 스택에 첨부한다.
PASSIVE_LEVEL에서만 호출되어야 한다. 상위 레벨에서 호출하면 드라이버 파손 가능성
============================================================
dx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, pdo);
IoCreateDevice()후 생성된 정보를 DeviceStack에 장착시키고 위치값을 DeviceExtension의 변수에 저장시킨다.
DDK 환경설정
댓글을 달아 주세요