Windows OS2009. 2. 23. 23:51
반응형

유저모드와 커널모드의 공유메모리를 구현할 때 ZwOpenSection() + ZwMapViewOfSection() 조합으로 사용하는 경우가 많다. 이 때 ZwMapViewOfSection() 에서 얻은 공유메모리에 대한 가상주소는 이 함수를 호출한 현재 프로세스 컨텍스트의 유저모드 주소이다. (0x00160000 같은...)

만약 멀티 프로세스 컨텍스트를 지원하는 드라이버를 개발하고 있다면 ZwMapViewOfSection() 에서 얻은 가상주소는 사용할 수가 없게 된다. 왜냐하면 ZwMapViewOfSection() 을 호출한 프로세스에서  다른 프로세스 컨텍스트로 스위칭되어 버리면 이 가상주소는 유효하지 않은 메모리가 될테니 말이다.

이럴 때는 ZwOpenSection() +  ObReferenceObjectByHandle() + MmMapViewInSystemSpace() 조합을 사용하면 된다. MmMapViewInSystemSpace() 는 커널모드 가상주소를 얻어주기 때문에 아무때나 아무 프로세스 컨텍스트에서나 사용할 수 있다. (0xbb000000 같은...)

NTSTATUS MmMapViewInSystemSpace(PVOID Section , PVOID *
MappedBase , PSIZE_T ViewSize ) ;

param[IN] Section : Section 포인터
param[OUT] MappedBase : 맵핑된 가상주소
param[OUT] ViewSize : 맵핑된 메모리 크기

NTSTATUS MmUnmapViewInSystemSpace(PVOID MappedBase ) ;

param[IN] MappedBase : MmMapViewInSystemSpace() 에서 얻었던 가상주소

반응형
Posted by GreeMate