비트 플래그 (Bit Flag)
비트 플래그란 한 비트를 플래그로 한 비트에 하나의 상태가 참이냐 거짓이냐를 따지는 것이다.
메모리는 바이트 단위이므로 최소 8비트를 가진다. 이 말은 8개의 조건이 참이냐 거짓이냐를 가질수 있다는 말이다.
0000 0000 에서 한 비트를 플래그로 생각했을때 1이면 on, 0이면off이 된다.
EX)
0000 0001 = 0x01 = 사과
0000 0010 = 0x02 = 딸기
0000 0100 = 0x04 = 참외
0000 1000 = 0x08 = 자두
0001 0000 = 0x10 = 수박
0010 0000 = 0x20 = 복숭아
0100 0000 = 0x40 = 바나나
1000 0000 = 0x80 = 배
 
옵션이 이렇게 있을때 사과와 자두 그리고 복숭아를 골랐다고 표현한다면 
(0000 0001) | (0000 1000) | (0100 0000) = (0100 1001) 
이런식으로 표현할 수 있다.
 
Windows API에서 제공하는 다양한 옵션들 또한 대부분 비트 플래그를 통해 지정된다.
 
NtCreateFile에서 DesiredAccess 파라미터를 예로 들어보겠다.
<winnt.h> 헤더의 정의를 보면 ACCESS_MASK는 DWORD 타입이고 DWORD는 4바이트 자료형이기 때문에 최대 32가지의 옵션을 지정할 수 있다.
위 목록은 MSDN에서 제공하는 ACCESS_MASK flag 목록의 일부이고
아래의 매크로는 <winnt.h> 헤더에서 실제로 옵션들을 정의하는 코드의 일부다.
NtCreateFile 호출시 보통 여러개의 옵션을 OR 연산으로 지정해주기 때문에 위 비트플래그 설명을 본다면 이해가 된다.
나는 NtCreateFile 후킹시 인자로 들어온 DesiredAccess의 값에 FILE_WRITE_ATTRIBUTES 옵션이 들어왔는지를 알아야 했다.
WinAPI에서 옵션이 어떠한 원리로 지정되는지 몰라서 처음에는 이 기능을 제공하는 WinAPI가 있나보다 하고 엄청 찾아봤다.
하지만 비트플래그 원리를 통해 옵션이 지정된다는 것을 알고 간단히 비트마스크 연산을 통해 해결했다.

'C&C++' 카테고리의 다른 글

WINAPI How To Hook ConnectEx  (0) 2019.11.06
WINAPI DLL_PROCESS_DETACH  (1) 2019.08.08
WINAPI CreateProcess Suspend State  (0) 2019.07.11
Incremental Linking  (0) 2019.07.10
WINAPI VirtualAlloc and VirtualAllocEx Difference  (0) 2019.07.09

+ Recent posts