HANDLE CreateFileMappingA(
HANDLE hFile,
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCSTR lpName
);
- 첫번째 파라미터에 INVALID_HANDLE_VALUE를 넣어서 단순한 file mapping이 아닌 shared memory를 생성한다.
- 5번째 파라미터에 shared memory의 size를 넣어서 생성할 수 있다.
- 6번째 파라미터(마지막)에 shared memory 이름을 지정해서 생성할 수 있다.
- 만약에 동일한 Name의 shared memory가 생성되어있는 경우 새로 만드는게 아닌 기존의 shared memory의 handle을 가져온다.
- size가 달라도 기존 shared memory의 handle을 가져오는데 성공하며, data도 잘 써진다. (0x1000으로 생성 후 0x10으로 create하여도 기존꺼로 유지되는것으로 보인다.)다만, 이런 경우 어떤 문제가 생길지는 모르니 size는 맞추는게 best로 판단된다.
- 실패하면 NULL을 반환한다.
HANDLE OpenFileMappingA(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCSTR lpName
);
- 마지막인자에 CreateFileMapping() 함수로 생성한 shared memory의 이름을 넣어서 접근할 수 있다.
- 실패하면 NULL을 반환한다.
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
SIZE_T dwNumberOfBytesToMap
);
- CreateFileMapping() 또는 OpenFileMapping() 함수 호출을 통해 얻은 HANDLE을 첫번째 파라미터에 넣는다.
- 실패하면 NULL을 반환한다.
BOOL UnmapViewOfFile(
LPCVOID lpBaseAddress
);
- 얘는 사실상 호출 안해도 process가 종료되면 자동 호출되는걸로 보인다.
중요
- Windows에서는 shared memory를 삭제하는 로직이 없는것으로 보인다. (커널이 알아서 attach된 process가 없는 경우 제거시키는것으로 보인다.)
- OpenFileMapping() 함수를 통해 shared memory가 존재하는지 확인할 수 있다. (없으면 NULL return)
댓글 없음:
댓글 쓰기