본문 바로가기

Programming177

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_.. 2013. 1. 4.
UNREFERENCED_PARAMETER 매크로 프로그램을 작성할 경우 변수나 인자만 선언해 놓고, 참조를 안할 경우 컴파일러는 C4100 오류를 발생시킨다. 만약 이 warning이 눈에 거슬릴 경우, UNREFERENCED_PARAMETER를 해주면 warning이 사라진다. 인자값이나 로컬 변수가 선언되지 않았을 때 컴파일러 경고를 발생시키지 않기 위해 사용하는 매크로이다. UNREFERENCED_PARAMETER는 아직 참조하지 않은 인자에,DBG_UNREFERENCED_LOCAL_VARIABLE은 아직 참조하지 않은 로컬 변수에 사용할 때 사용한다. #pragma warning (disable : 4100) 위 방식과 같은 결과를 나타낸다. 2013. 1. 3.
#pragma alloc_text(PAGE, XXX) 컴파일러에게 코드를 특정한 섹션에 두라고 지시하는 전통적인 방법은 alloc_text라는 pragma를 이용하는 것이다. 모든 컴파일러가 pragma를 다 지원하는 것은 아니기 때문에, DDK 헤더에서는 이 pragma의 지원여부를 알려주기 위해 ALLOC_PRAGMA 상수를 정의할 수도 있고 정의하지 않을 수도 있다.드라이버의 개별 서브루틴에서 아래와 같이 pragma를 호출해서 섹션의 위치를 지정한다[역주 주: pragma 이후에 오는 문장들은 C/C++ 표준 문법이 아니며 각 개별 컴파일러가 하드웨어나 O/S에 의존적인 부분의 차이를 위해 자체적으로 지원하는 기능이다.] #ifdef ALLOC_PRAGMA#pragma alloc_text(INIT, DeviceEntry)#endif 위처럼 INIT .. 2013. 1. 3.
IRQL Dispatching - 실행 중인 한 스레드에서 다른 스레드로 실행을 전환하는 절차 Scheduling - 프로세서에서 실행될 다음 스레드를 결정하는 절차 Quantum - 특정 스레드가 CPU에서 실행하도록 정해진 시간 Pre-emption(선점) - 현재 실행 중인 스레드의 우선 순위보다 더 높은 우선 순위를 가진 스레드가 실행할 준비가 되었을 때 IRQL - 운영체제는 스레드가 실행하고 있는 도중에 인터럽트가 발생하면 이를 처리한다. 우리는 이를 당연하다고 여기지만 사실은 스레드에 의한 코드 실행과 인터럽트 발생으로 인한 코드 실행에는 각각 해당 중요도가 있으며 운영체제는 이들 중요도에 근거하여 우선적인 작업을 먼저 처리한다. - 시스템에 존재하는 각 프로세서(CPU)는 자신만의 IRQL을 가진다.. 2013. 1. 3.
WIX로 설치 프로그램 만들기 WIX란?? XML 소스 코드를 이용하여 윈도우 인스톨러 패키징을 만들 수 있는 일종의 오픈 소스 플랫폼 입니다. Visual Studio 2010에서 Wix 기본 프로젝트 만들기 1) Wix 홈페이지에 가서 Wix Toolset을 다운 로드 받는다. 현재 3.7 버전까지 진행 중... (http://wix.sourceforge.net/index.html) 2) Visual Studio 2010을 실행시킨 후 파일 메뉴의 NEW를 선택하고 프로젝트를 생성합니다. 3) 아마 WIX Toolset을 설치하였다면 아래 그림과 같이 Windows Installer XML이란 Template가 뜰 것입니다. 선택한 후 Setup Project를 만들면 됩니다. 그 밖의 프로젝트에 대해선 아직 Custom Acti.. 2013. 1. 3.
WPF 전체 화면 설정하기 Window를 고정된 전체 화면으로 만들고 싶을 때 쓰는 설정. Window Property 중 WindowStyle="None" ResizeMode="NoResize" WindowState="Maximized"로 설정. 2013. 1. 3.
Collection 정리 Vector- 동기화 처리가 내부적으로 이루어진다.- 예를 들어 한 쓰레드에서 어떤 작업을 하고 있으면 다른 쓰레드에서는 접근할 수 없도록 한번에 하나의 쓰레드만 사용할 수 있도록 내부적으로 처리되고 있다.- 단일 쓰레드에서는 불필요한 처리 코드만 가지게 되기 때문에 ArrayList나 LinkedList에 비해 성능 저하를 가져오게 된다.- 동기화를 고려한다면 Vector의 사용 보다는 Collection.synchronizedCollection(Collection C)나 synchronizedList, Map 등을 사용하는 것이 낫다. ArrayList- 내부적으로 따로 동기화 처리를 하지 않는다.- 동기화 처리를 위해선 Collection.synchronizedCollection을 사용해야 한다.-.. 2013. 1. 3.
동적 라이브러리 호출 JAVA에서도 C++과 같이 동적으로 Lib(자바에서는 Jar)를 호출할 수 있다. 2013. 1. 3.
volatile 얼핏보면 C volatile과 다른 문맥으로 쓰인 것 처럼 보였지만 알고 보면 같은 의미이다.첫번째로 C에서 volatile 선언은 optimize를 포기하겠다는 의미로 표현될 수 있다.가령 어떤 변수에 i = 0;i = 10;i = 20;i = 50;이라는 값을 대입했을 경우 volatile로 선언하지 않았을 경우, C 컴파일러에서는 optimize를 위해서 최종 50에 해당하는 값만 의미가 있다고 판단을 하고 나머지 0,10,20에 대한 값은 누락시킬 것이다.하지만 이를 방지하고 단계적 순차과정을 알아야 한다면 volatile로 선언을 해주어야 한다. 두 번째는 멀티쓰레드 환경에서의 무결성 보장을 위한 측면으로 사용될 수 있다.프로그램은 메모리에 대입한 변수에 대해 매번 메모리로부터 값을 가지고 오는.. 2012. 12. 27.