Programming(175)
-
[WDF] IRQL에 따른 스레드 선점 주의사항
윈도우즈 커널이나 드라이버에 대한 설명을 나온 책을 보면 항상 IRQL 에 따른 스레드 선점에 대한 얘기가 나오는데 다음과 같은 내용은 오해를 불러일으킬 소지가 있다."낮은 수준의 IRQL에서 실행하는 코드(스레드)는 높은 수준의 IRQL의 작업이 발생하게 되면 항상 선점된다.""상승 된 IRQL에 코드는 상승 된 IRQL보다 낮은 레벨에 코드가 실행되는 것을 블록시킨다."그러나 위에 사항들은 예외적일 수 있다.예를 들어, 스레드 A가 APC_LEVEL로 실행중이고, 스레드 B는 이전에 PASSIVE_LEVEL에서 실행중이었다라고 가정하면 스레드 A가 APC_LEVEL로 실행중이기 때문에 스레드 B보다 IRQL이 높으므로 스레드A가 PASSIVE_LEVEL로 IRQL이 내려가지 않는 이상은 스레드 B에 ..
2013.01.04 -
[WDF] Object Context란?
오브젝트 context는 드라이버가 오브젝트를 할당하고 배정할 수 있는 extra, nonpageable, memory 공간이다.각각의 프레임워크 기반의 드라이버는 하나 또는 그 이상의 오브젝트 Context를 생성할 수 있다. 프레임워크 기반의 드라이버는 오브젝트 context 내에 오브젝트와 관련된 모든 데이터를 저장해야 한다. 예를 들어, USB 디바이스 드라이버는 자신의 프레임워크 디바이스 오브젝트를 위한 context를 생성한다. 드라이버는 디바이스의 USB_DEVICE_DESCRIPTOR, USB_CONFIGURATION_DESCRIPTOR 구조체 등과 같은 디바이스 정보들을 context 내에 저장한다.프레임워크는 하나의 드라이버에서 또 다른 드라이버로 프레임워크 오브젝트를 전달하지 않기 때..
2013.01.04 -
[WDF] Macro
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE - WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE 매크로는 드라이버의 Wdf Object attributes 구조체를 초기화 하고 구조체 속으로 드라이버의 context 정보를 기입한다. WDF_DECLARE_CONTEXT_TYPE_WITH_NAME - WDF_DECLARE_CONTEXT_TYPE_WITH_NAME 매크로는 드라이버의 오브젝트 context를 위한 특정 이름과 함께 접근자(accessor)를 생성한다. WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE - 드라이버의 WDF_IO_QUEUE_CONFIG 구조체를 초기화한다.- 드라이버는 디바이스의 디폴트 큐로써 po..
2013.01.04 -
[WDF] Function
WdfFdoInitSetFilter- 프레임워크에게 디바이스 오브젝트가 필터 드라이버임을 알리기 위한 함수.- 필터 드라이버는 전형적으로 몇몇의 I/O Request를 처리하며, 대부분의 Request는 다음 드라이버로 전송하는 역할을 한다.- 그런데 만약 프레임워크가 어떤 Request를 수신하였고 드라이버는 해당하는 Request type과 일치하는 I/O queue를 생성하지 않았을 경우, 프레임워크의 처리 방법은 WdfFdoInitSetFilter를 호출했느냐 아니냐에 따라 달라지게 된다. 만약 드라이버가 WdfFdoInitSetFilter를 호출했다면, 드라이버 프레임 워크는 Request를 다음 드라이버로 보낸다. 만약 드라이버가 WdfFdoInitSetFilte..
2013.01.04 -
[WDF] PAGED_CODE 매크로
PAGED_CODE는 다음과 같이 생긴 매크로이다.#define PAGED_CODE(){\if(KeGetCurrentIrql() > APC_LEVEL) { \kdPrint(""EX: Pageable code called at IRQL %d\n", KeGetCurrentIrql())); \PAGED_ASSERT(FALSE); \} \} 현재의 IRQL을 체크해보고 IRQL이 APC_LEVEL 보다 높다면 시스템을 종료시킨다. 디바이스 드라이버의 세계에서 중요한 규칙 중 하나는 IRQL이 Dispatch 레벨 이상일 때는 페이지 폴트가 일어나서는 안된다는 것이다.IRQL >= DISPATCH_LEVEL 일 때 페이지 폴트가 일어나게 되면 시스템은 크래쉬 된다. 위 규칙을 알고나면 #pragma alloc_t..
2013.01.04 -
[WDF] UNREFERENCED_PARAMETER 매크로
프로그램을 작성할 경우 변수나 인자만 선언해 놓고, 참조를 안할 경우 컴파일러는 C4100 오류를 발생시킨다. 만약 이 warning이 눈에 거슬릴 경우, UNREFERENCED_PARAMETER를 해주면 warning이 사라진다. 인자값이나 로컬 변수가 선언되지 않았을 때 컴파일러 경고를 발생시키지 않기 위해 사용하는 매크로이다. UNREFERENCED_PARAMETER는 아직 참조하지 않은 인자에,DBG_UNREFERENCED_LOCAL_VARIABLE은 아직 참조하지 않은 로컬 변수에 사용할 때 사용한다. #pragma warning (disable : 4100) 위 방식과 같은 결과를 나타낸다.
2013.01.03