2012-02-10 2 views

답변

6

사용자 모드면 : 두 가지 방법이 있습니다.

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) 또 다른 방법은 단순한 데이터 전송 만 필요하고 커널 드라이버가이를 받아 들일 수 있다면 ReadFileWriteFile을 사용하는 것입니다. DeviceIOControl (드라이버 데이터를 제공하고 오류 코드와 함께 당신에게 뭔가를 제공합니다)과 같은 양방향 통신을 할 수 없지만 간단합니다. 그리고 아마도 이미 그 API에 익숙 할 것입니다.

커널 모드 쪽 : 커널 드라이버도 쓰고 있습니까? 그렇다면 this article has information about implementing the kernel-mode side of IOCTL. 이 기사 시리즈에서는 사용자 모드가 ReadFileWriteFile을 사용하여 해당 방법을 선택하면 통신하도록 허용하는 방법에 대해서도 설명합니다.

+0

[Rootkits : Subversion the Windows Kernel] (http://www.amazon.com/Rootkits-Subverting-Windows-Greg-Hoglund/dp/0321294319)은 IRPs/DeviceIOControl은 처음 몇 장 (적어도 지금까지 내가 지금까지 그것에 대해 겪었던 것입니다.) –

관련 문제