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가지 방법이 있다.

  1. DLL 프로젝트 내부에서 ***.def 파일 생성 후 아래의 내용을 추가한다.
    1
    2
    SECTIONS    
        SHAREDATA  READ WRITE SHARED
    cs
  2. ***.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
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기