Post List

Windows Shared Memory (MMF)




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)

댓글 없음:

댓글 쓰기