2013년 12월 22일 일요일

linux-vim-misc

vim 

set autochdir
set autoindent
set smartindent



grep

search string in a file or files
command option searchstring path

grep -Iinr '^obref' .


find

search file list in directory

command path option regular expression

find . -name '*.[ch]'


find + grep

find . -name '*.[ch]' | xargs grep -in '^obref'


Windows Findstr

command searchstring path(windows style) - '.' not work opposite to linux shell
findstr printf *.c









2013년 12월 16일 월요일

windows driver build - sources


Sources 파일에 대하여 몇가지 중요한 부분만 정리해 본다.


Sources 

- TARGETNAME

빌드될 바이너리 이름 

- TARGETTYPE

DRIVER, EXPORT_DRIVER, DRIVER_LIBRARY, PROGRAM, DYNLINK

- TARGETPATH

빌드된 바이너리 위치

- SOURCES

소스 파일 ( 여러줄로 표현할 경우 '\' 를 사용 )

- INCLUDES

header 파일 참조 경로

- C_DEFINES

- USER_CFLAGS

- TARGETLIBS

라이브러리 참조 경로 ( 참고로 전체 경로로 써 주어야 함)

ex>

***************************************************************



TARGETTYPE=DRIVER_LIBRARY
TARGETNAME=klib
TARGETPATH=..\bin


C_DEFINES = $(C_DEFINES)
INCLUDES=$(DDK_INC_PATH);..\inc


SOURCES= klib.



***************************************************************
TARGETTYPE=DRIVER
TARGETNAME=kdrv
TARGETPATH=..\bin


C_DEFINES = $(C_DEFINES)
INCLUDES=$(DDK_INC_PATH);..\inc

TARGETLIBS = ..\bin\*\klib.lib

SOURCES= kdrv.



더 자세히 읽고 싶다면 아래 주소 참고

http://www.wd-3.com/archive/WinBuild.htm


2013년 12월 12일 목요일

KeEnterCriticalRegion

커널에서 APC 를 디스패치할 수 없도록 하기 위해서는 단순히 IRQL 을 APC_LEVEL로 올리면 가능하다. 하지만 윈도우에서는 스레드 커널 구조체에 값을 지정하여 특정 구간에서는 APC 를 불가능하도록 만드는 방법을 사용하고 있다.

다음 두 개의 함수를 사용해서 구간을 진입하게 된다.

KeEnterCriticalRegion 
{
   Thread->KernelApcDisable -= 1
}


KeLeaveCriticalRegion 
{
   Thread->KernelApcDisable += 1
}



KeEnterCriticalRegion, KeLeaveCriticalRegion

윈도우 커널에서는 스레드 커널 구조체의 ( KTHREAD ) 의 특정 필드를 통해서 위 매커니즘을 구현하게 된다.

KTHREAD.KernelApcDisable

이 값은 3가지 방향을 갖는다.  0, minus, plus




위와 같이 두개의 함수가 KernelApcDisable 값을 1씩 증감하면서 변화 시킨다.

+ 2    APC Dispatch Disable  ( KeEnterCriticalRegion 이 연속으로 호출됨 )
+ 1
   0    APC Dispatch Enable, If APC Dispatch Entry exist
- 1
- 2     APC Dispatch Disable ( KeLeaveCriticalRegion 이 연속으로 호출 됨 )  발생해서는 안되는 상황


KernelApcDisable 값이 '0' 이 될 때만 APC Dispatch 가 가능하다는 점을 기억하자.

만약 이 값을 boolean 으로 만들었다면 KeEnterCriticalRegion 와 KeLeaveCriticalRegion 함수 호출에 대한 pair를  추적하기 힘들었을 것이다.

signed value 로 지정함으로써 두개의 함수가 몇번 호출했는지 추적도 가능하고 APC Dispatch 가 가능한 구간도 지정할 수 있다.