Soft Ware 130

윈도우 디바이스 드라이버 & Simple

- SIMPLE_DriverUnload() - - SIMPLE_Unload() 가 호출된다는것을 SIMPLE 드라이버가 생성한 Device_Object가 메모리에 없다는 뜻이다. 이시기에는 Driver_Object만을 드라이버에 전달 가능 - 드라이버는 이 구조체 안(Driver_Object)에 츨정 필드를 적당한 값으로 채워줘야한다 - RegistryPath는 SIMPLE 드라이버가 등록되어 있는 시스템 레지스트리 상에 키값을 담고 있다. - 디바이스 드라이버는 자신을 메모리에 로딩하면서 여러가지 선택적인 작업을 할수있다, 이것은 이와 같은 레지스트리 키가 제공 되며, 이 키 아래에 하위키로 여러가지 파라미터를 개발자가 보관해 두며 드라이버는 로딩되는 과정중에서 레지스트리 키에 접근해 파라미터를 읽어서..

윈도우 디바이스 드라이버 & Simple

- SIMPLE_PnpDispatch() - - 이 함수는 윈도상의 pnp 관리자 모듈이 SIMPLE 드라이버에게 pnp 사건이 발생 될때마다 이를 통지하는 역할로 사용 - pnp 관리자 : 사용자 모드 컴포넌트의 도움을 받아 디바이스 의 드라이버를 식별 - 여기서 인자값 DeviceObject는 이전에 SIMPLE_AddDevice함수에서 SIMPLE 드라이버가 만들어서 디바이스 스택에 올렸던 바로 그 Device_Object가 여기에 해당 - IRP는 내부적으로 자료구조 스택과 같은 형태의 메모리를 가진다. - pStack 은 현재 스택의 Top 포인터가 가르키는 메모리 주소를 가져와서 보관 - IoGetCurrenIrpStackLocation() 함수는 IRP 내의 스택 메모리를 찾아서 현재 TOP..

윈도우 디바이스 드라이버 & Simple 예제

- SIMPLEAddDevice 함수 - - 디바이스 드라이버 모듈 하나는 반드시 하나의 Driver_Object만 가질수 있다. - SIMPLE_AddDevice()는 Device_Object를 physicalDeviceObject가 가르키고 있는 상위 드라이버가 만들어 놓은 물리층인 디바이스 스택에 포함 - Device_Object는 FDO, PDO 또는 FiDO같은 스택층을 묘사하는 구도체 - IoCreateDevice() 는 Device_Object를 만들고 이는 메모리 상에 위치함 - DeviceObject안에 Device_Extension이라는 포인터 변수가 있고 이 Device_Extension이 가리키는 다른 메모리 공간을 Device_Extension이라고 부른다. - DeviceExte..

ctime 함수

ctime 함수의 원형은 char * ctime(const time_t * timer); 로서 이 함수의 기능은 time함수로부터 얻어진 값을 문자열로 바꾸는 기능이 있다. timer 가 가리키는 time_t 형 변수를 읽어들여서, 그 값을 해석 하여 지역 시간에 맞추어 아래와 같은 형식으로 문자열로 바꾼다. Www Mmm dd hh:mm:ss yyyy Www는 요일, Mmm 은 월 이름, dd 는 몇일인지, hh:mm:ss 는 현재 시간, yyyy 는 현재 년도를 말한다. 이때 문자열 끝에는 자동으로 \n과 NULL 문자가 들어가게 된다. time_t 값을 해석해서 만든 문자열이 리턴된다. 이때 조심해야 될것이 asctime(localtime(timer)) 라는 함수와 ctime 함수가 참조하는 메..

Time 함수와 time_t라는 변수에 대해서

#include 에 정의된 time 함수는 1970년도 1월 1일 0시부터 현재 지금시간까지의 시간을 알수 있는 함수로 time_t time( time_t * timer); 여기서 time_t는 typedef 되어 있다. 정의를 따라가보면 time_t는 typedef __time64_t time_t; /* time value */ 다시 __time64_t를 따라가 보면 typedef __int64 __time64_t; /* 64-bit time value */ 로 정의 되어져있다. 이는 64비트 int형이라는것이다 !!! 이 함수는 구한 time_t형 값을 리턴하기도 하고, 인자로 받은 timer 포인터가 가르키는 변수의 값에 구한 time_t형 값으로 설정한다. 결국 리턴 값과 인자값이 둘다 같은값이기..

strdup 함수 헤더파일은 string.h

이 strdup 함수는 strcpy의 문제점을 해결할수 있다. 그럼 strcpy의 문제점은 무엇인지 부터 알아보겠다. strcpy는 복사할 문자열이 복사될 문자열 공간보다 크면 복사하는도중에 문자열이 짤린다. 하지만 이러한 문제점을 strdup 함수는 해결할수 있다. strdup 함수는 함수내부적으로 malloc함수를 이용하여 메모리를 할당해주고 리턴값을 char*를 리턴함으로서 동적할당의 첫번째 주소를 넘겨준다. strdup()의 원형으로는 char *strdup(const char *string) { char *Data=0; int len = 0; len = strlen()+1; Data = malloc(char*len); return Data; } 이렇게 정의 되어 있을거 같다는 생각이 든다. ma..

뮤텍스와 세마포어

뮤텍스란 MUTual EXclusion 으로 우리말로 해석하면 '상호 배제'라고 한다. Critical Section을 가진 Thread들의 running time이 서로 겹치지 않게, 각각 단독으로 실행되게 하는 기술이다. * Critical Section : 프로그램 상에서 동시에 실행될 경우 문제을 일으킬 수 있는 부분. 만약 어느 Thread에서 Critical Section을 실행하고 있으면 다른 Thread들은 그 Critical Section에 접근할 수 없고 앞의 Thread 가 Critical Section을 벗어나기를 기다려야 한다. 그리고 세마포어란 역시 데드락을 피하기 위한 기술 중에 하나이다. Thread 가 Critical Section에 접근할때 (또는 processer로 부터..

레지스터

31 16 15 8 8 7 7 0 EAX AH AX AL EBX BH BX BL ECX CH CX CL EDX DH DX DL EBP BP ESP SP ESI SI EDI DI AX : 어큐뮬레이터. 산술, 논리 연산의 중심이 되는 레지스터이며, Input/Output 포트의 입출력 명령 BX : 간접 번지 지정 시 번지 레지스터. 베이스 레지스터로 주로 사용 CX : 루프와 같이 어떤 명령을 반복적으로 수행하고자 할때 반복 횟수를 지정하는데 주로 사용 DX : 간접 번지 지정에 의한 입출력 명령을 실행할때 번지 지정에 사용된다. 곱셉 , 나눗셈을 할때에는 보조 어큐뮬레이터로 사용 SI , DI : 다른 범용 레지스터의 마찬가지로 연산과 간접 번지 지정에 사용된다. 그밖에 문자열의 전송이나 비교 등을 하..

세그먼트

세그먼트오프셋목적 코드 세그먼트( CS )IP수행되어질 명령어의 위치 스택 세그먼트( SS )SP 또는 BP스택 주소 참조 보조 세그먼트( ES )스트링 명령어를 위한 DI 스트링의 목적지 주소 데이터 세그먼트( DS )AX, BX , CX, DX와 같은 데이터 주소 참조 범용 레지스터와 BX, DI, SI 세그먼트 레지스터 종류와 구조 15 0 CS DS SS ES FS GS 길이는 16bit이며 세그먼트 영역의 메모리에 주소를 지정 16bit 세그먼트 시스템에서는 좌측으로 4bit 시프트를 하고 오프셋 레지스터를 시프트한 세그먼트 레지스터와 합하여 위치를 정한다. 32bit에 들어서는 세그먼트 레지스터가 32bit로 커지는 대신 FS 와 GS가 추가 되었다. 16bit를 유지한 큰 이유는 16bit에..

파일 시스템 드라이버

1. 파일 시스템 드라이버는 I/O를 요청한 스레드 컨텍스트에서 호출 되어야 한다. 2. 파일 시스템 드라이버는 메모리 관리자와 캐시 관리자와 자주 통신한다. 그래서 일반 디바이스 드라이버와 구분하는 가장 큰 특징은 캐시 관리자와 통신한다는 사실이다. 3. 파일 시스템 드라이버가 Fast I/O를 사용하여 I/O 요청을 처리할때 데이터는 항상 캐쉬된 상태에 있어야 한다. 4. I/O 처리에 필요한 데이터가 시스템 캐시에 없으면 캐시 관리자는 페이지 오류를 발생시키고 제어를 메모리 관리자에 넘긴다. 5. 파일 시스템 드라이버는 I/O 관리자 및 오브젝트 관리자와 민접한 관계에 있다. 6. 오직 파일 시스템 드라이버만이 데이터를 읽거나 저장하기 위한 Fast I/O함수를 제공한다. --------------..