Windows 공간에서 사용자 공간과 커널 공간간에 메모리를 공유하려고합니다. 사용자 수준의 메모리에 쓰고 커널 드라이버 프로그램에서 읽고 싶습니다. 빌드 기능?사용자 공간과 커널 공간간에 메모리 공유
답변
사용자 모드면 : 두 가지 방법이 있습니다.
1) 가장 일반적인/유연한 방법은 DeviceIOControl
을 사용하여 메모리 전달을 포함하여 사용자 모드와 커널 모드간에 통신하는 것입니다.
마지막 커널 드라이버를 작성한 지 오래되었으므로 (6 년? XP 시간대) 정확한 코드가 아닌 프로세스의 개요입니다. 그러나 사용자 모드 프로그램은 CreateFile
을 사용하고 예를 들어 \\.\YourNameHere
과 같이 이름을 지정하여 사용자의 '장치'또는 드라이버의 열린 인스턴스에 대한 핸들을 얻을 수 있어야합니다. 와 통신하기 위해 그 핸들을 사용
네 개의 매개 변수를 당신이에 관심이있을 것 (DeviceIOControl
첫 번째 매개 변수.)이 사용
__in_opt LPVOID lpInBuffer,
__in DWORD nInBufferSize,
__out_opt LPVOID lpOutBuffer,
__in DWORD nOutBufferSize,
__out_opt LPDWORD lpBytesReturned,
, 당신은 lpInBuffer
을 통해 드라이버 (데이터를 제공 할 수 있습니다 포인터 및 nInBufferSize
매개 변수가 얼마나 큰지 지정합니다.이 데이터의 의미 또는 해석 방법은 드라이버에 달려 있습니다.) 커널 모드 계층은 lpOutBuffer
을 통해 데이터를 다시 제공 할 수 있습니다 (사용자 모드의 메모리 포인터는 이미 있습니다. 할당 됨 - 이것은 드라이버가 설정하는 포인터가 아닙니다!), 바이트 단위의 크기는 nOutBufferSize
입니다 (다시 알다시피, 사용자 모드 이 버퍼를 찾으십시오.) 그러면 드라이버는 실제적으로 그 버퍼의 얼마만큼을 lpBytesReturned
으로 채웠는지 알려줍니다.
이 위키 백과 문서는 general concept of ioctl functions을 설명하며, 그 중 DeviceIOControl이 예입니다.
참고 : 당신은 "나는 창에서 사용자 공간과 커널 공간 사이에 메모리를 공유하는 것을 시도하고있다"고 말했다. 이것은 정확히 공유 메모리가 아닙니다. 예를 들어, 사용자 모드와 커널 모드가 동시에 읽거나 쓰는 메모리가 아닙니다. DeviceIOControl
함수 호출 동안 커널 모드는 포인터를 전달하는 사용자 모드 할당 메모리에 액세스 할 수있는 메모리입니다 (하지만 메모리에서 약간 복잡하지만 효과가 있습니다). 그 방법을 호출하는 동안에 만 '공유'할 수 있습니다.
2) 또 다른 방법은 단순한 데이터 전송 만 필요하고 커널 드라이버가이를 받아 들일 수 있다면 ReadFile
과 WriteFile
을 사용하는 것입니다. DeviceIOControl
(드라이버 데이터를 제공하고 오류 코드와 함께 당신에게 뭔가를 제공합니다)과 같은 양방향 통신을 할 수 없지만 간단합니다. 그리고 아마도 이미 그 API에 익숙 할 것입니다.
커널 모드 쪽 : 커널 드라이버도 쓰고 있습니까? 그렇다면 this article has information about implementing the kernel-mode side of IOCTL. 이 기사 시리즈에서는 사용자 모드가 ReadFile
과 WriteFile
을 사용하여 해당 방법을 선택하면 통신하도록 허용하는 방법에 대해서도 설명합니다.
[Rootkits : Subversion the Windows Kernel] (http://www.amazon.com/Rootkits-Subverting-Windows-Greg-Hoglund/dp/0321294319)은 IRPs/DeviceIOControl은 처음 몇 장 (적어도 지금까지 내가 지금까지 그것에 대해 겪었던 것입니다.) –
- 1. 사용자 공간과 커널 스레드 간의 공유 메모리
- 2. 리눅스 ioctl 명령이 사용자 공간과 커널 공간간에 변경됩니다.
- 3. 프로세스 주소 공간과 가상 메모리
- 4. Eclipse에서 작업 공간간에 사용자 라이브러리를 복사하는 방법
- 5. C 메모리 공간과 #defines
- 6. 프로세스 주소 공간과 가상 메모리
- 7. 리눅스 커널 메모리 관리
- 8. 커널 하이 메모리
- 9. 리눅스에서 커널과 사용자 공간간에 의사 소통하고 동기화하는 가장 좋은 방법
- 10. 커널 설정, 공유 메모리 구성을 변경하는 방법은 무엇입니까?
- 11. 커널 모드 및 메모리 보호
- 12. a.out의 커널 공간
- 13. postgresql 공유 메모리 설정
- 14. 리눅스 커널 코드 세그먼트 메모리 수정
- 15. 메모리 매핑 파일이없는 공유 메모리
- 16. 리눅스 커널이 사용자 공간과 통신 할 수있는 방법은 무엇입니까?
- 17. 사용자 프로세스와 커널 프로세스에서 공유 리소스를 동시에 보호하는 방법은 무엇입니까?
- 18. CUDA 커널 내부 메모리 할당
- 19. 공유 가능한 메모리 잠그기
- 20. CUDA의 공유 메모리 크기가 무엇입니까?
- 21. 커널 모듈에서 사용자 공간 메모리 보호 플래그를 변경하십시오.
- 22. 메모리 바운드 커널 및 GPU에서 바운드 커널 계산
- 23. C++ 공유 메모리 누수, 공유 메모리 지우는 방법?
- 24. 공유 응용 프로그램간에 공유 메모리 (또는 다른 메모리)가 있습니까?
- 25. 사용자 프로그램이나 커널 모듈?
- 26. 사용자 커널 주소 부분
- 27. 포크를위한 공유 메모리
- 28. PHP의 공유 메모리 파일
- 29. 보호 된 공유 메모리?
- 30. Unix의 공유 메모리
전화 DeviceIoControl –