전체 글 139

함수 호출

1. __cdecl --> 프로시저에서 다른 프로시저를 호출시 파라미터는 오른쪽에서 왼쪽으로 스택에 쌓이고 호출하는 쪽에서 파라미터 스택 해제 2. __stdcall --> 프로시저에서 다른 프로스저 호출시 파라미터는 오른쪽에서 왼쪽으로 스택에 쌓이고 호출 받는 쪽에서 파라미터 스택 해제 3. __fastcall --> 파라미터 2개는 스택을 사용하지 않고 EDX , ECX 를 사용 , 2개이상부터는 파라미터 에 쌓인다. 스택 해제는 __stdcall과 같다. 4. Naked 함수 - 모든 스택 프레임에 대한 규정과 해제를 프로그래머가 직접 신경 써줘야 한다. 여기서 __LOCAL_SIZE는 이 Naked 형식의 함수에서 정의한 로컬 변수의 사이즈를 컴파일러에서 자동으로 계산하여 넣어주는 심벌 만약에 심..

Windows 구조와 원리

커널이란 ... 시스템 내의 물리적 장치 CPU , 메모리 , 입출력 장치 논리적 자원인 파일 (프로그램 또는 자료가 보조 기억 장치에 저장된 형태) 들이 효율적으로 고유의 기능을 수행하도록 관리하고 제어 하는 부분 CPU ---> 프로그램을 구성하는 명령어를 실행 메모리 ---> 프로그램과 자료를 저장하고 , 입출력이 원활하게 수행되도록 관리 마이크로프로세서 ---> 프로그램을 실제로 실행시키는 칩, 산술, 수치 비교, 데이터 전달 주변 장치 ---> I/O 입출력 장치 , 하드 디스크 MBR(Memory Buffer Register) : 메모리로부터 불러들인 데이터 저장 MAR(Memory Address Register): MBR쪽으로 읽어들인 메모리 주소를 저장 IR(Instruct Register..

윈도우 디바이스 드라이버 & 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로 부터..