data_seg pragma ??
DLL을 Application(EXE) 이나 다른 DLL과 연동하여 사용할때 쓴다. 후킹목적(message hook)의 DLL이 타겟 프로세스에 인젝션(dll injection) 되어 있다면 '공유섹션'을 이용하여 데이터를 전달할 수 있다. 결국 DLL 내부에서 생성한 데이터(메모리)를 외부 프로세스에서 공유해야 될 필요가 생길 수도 있는데, 그 상황에 맞쳐 쓰는 2가지 방법 (1. data_seg pragma를 사용하여 공유할 섹션 만들기. 2. 메모리 맵 파일(memory mapped files)을 사용하기) 중에 첫번째 방법이다.
사용법
1 2 3 4 5 | // 반드시 초기화 한 data 만 공유메모리에 들어 갈 수 있다. #pragma data_seg(".share") int g_nCount = 0; char g_szProcName[MAX_PATH] = "Test..."; #pragma data_seg() | cs |
#pragma data_seg(".share")
.share 세그먼트 시작을 선언합니다. 세그먼트 이름은 자유롭게 지을 수 있습니다. 고유섹션의 선언부이며 지정하지 않으면 기본적으로 .data 영역에 들어가게 된다.
자매품으로 .ioshare (dll 내의 어떤 데이터 영역으로 표시되는지를 결정합니다.) 와 SHAREDATA 가 있다.
int g_nCount = 0;
char g_szProcName[MAX_PATH] = "Test...";
공유섹션에 저장할 변수를 선언합니다. 여러개의 변수를 저장할 수 있습니다.
#pragma.data_seg()
.share 세그먼트 종료를 선언 합니다. 이후에 선언되는 것은 해당 세그먼트에 저장되지 않습니다. 공유섹션의 종료부
그런 다음 DLL공유 선언시 사용할 링커를 선언해줘야 하는데 2가지 방법이 있다.
- DLL 프로젝트 내부에서 ***.def 파일 생성 후 아래의 내용을 추가한다.12SECTIONSSHAREDATA READ WRITE SHARED
cs - ***.def에 위의 내용을 추가하는 대신에 처음 입력한 소스 밑에 아래의 소스를 써도 된다.1#pragma comment( linker, "/SECTION:.share,RWS") // R:Read, W:Write, S:Shared
cs
이젠 g_nCount 와 g_szProcName데이터를 외부 DLL에서 사용할 수 있게된다.
외부에서 변수를 접근하는 방법은 여러가지가 있지만, 하나를 예로 들면,
1 2 3 4 5 6 7 8 | extern "C" _declspec( dllexport ) int* GetNumberPointer( ) // 물론, 외부에서 호출할 때는 __declspec(dllimport) { return &g_nNumber; } extern "C" _declspec( dllexport ) char* GetCharPointer( ) // 물론, 외부에서 호출할 때는 __declspec(dllimport) { return g_szProcName; } | cs |
이렇게 변수의 포인터를 리턴하는 함수를 DLL에 만들어도 된다.
물론, new로 생성한 변수들도 공유가 가능한다.
메모리 해제(delete)는 DLL 내부에서 해도 되고, DLL 외부에서 해도 된다.
'잡다한 자료(번역) > C&C++' 카테고리의 다른 글
FILE MAPPING : Memory Mapped File (MMF) (0) | 2015.07.29 |
---|---|
extern "C" 를 쓰는 이유 (0) | 2015.07.15 |
최근댓글