일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- sudo
- ubuntu
- docker
- 도커
- 드라이버
- Linux
- DevOps
- VMware
- docker container
- golang
- Openswan
- Chef
- 방화벽체크
- VIM
- 리눅스
- 우분투
- driver
- AWS
- RUBY
- ssh
- ssh command
- opsworks
- port
- VPN
- 패키지
- docker-compose
- docker registry
- QT
- 루비
- window size
- Today
- Total
구리의 창고
driver와 application 데이터 주고받기 본문
1. application이 driver 에게 버전 요청
winioctl.h 에 정의된 함수인 DeviceIoControl()를 사용한다.
사용 예시는 아래와 같다.
DWORD dwRet;
ULONG Version;
DeviceIoControl( hDevice, IOCTL_CMD_VERSION, &Version, sizeof(ULONG), &Version, sizeof(ULONG), &dwRet, NULL );
ULONG Version;
DeviceIoControl( hDevice, IOCTL_CMD_VERSION, &Version, sizeof(ULONG), &Version, sizeof(ULONG), &dwRet, NULL );
2. driver는 ioctl 이벤트가 일어나면 이를 감지하고 적절한 case 문으로 이벤트를 처리한다
그럼 드라이버에서는 irp stack에 뭐가 왔나 체크를한다.
PIO_STACK_LOCATION irpStack ;
ULONG outputBufferLength;
irpStack = IoGetCurrentIrpStackLocation(Irp) ;
outputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
ULONG Version;
if (outputBufferLength > 0)
{
if (outputBufferLength > 0)
{
Version = pdx->Version;
DbgPrint("Version : %d\n", Version); //for debugging
irpStack->Parameters.DeviceIoControl.OutputBufferLength = sizeof(ULONG) ;
*((ULONG*)Irp->AssociatedIrp.SystemBuffer ) = Version;
Irp->IoStatus.Information = sizeof(ULONG) ;
}
3. 이렇게 SystemBuffer 에 구해온 Version 값을 넣어주면 1번에서 참조한 Version에 데이터가 넘어간다.
'Window Driver' 카테고리의 다른 글
디바이스 드라이버 이벤트발생순서 (0) | 2010.02.16 |
---|---|
Window Driver IOCTL / PnP 소스 (0) | 2010.02.16 |
헤더에서 컴파일러 구분하기 (0) | 2010.02.12 |
#include <winioctl.h> 에러날때 (0) | 2010.02.12 |
헤더파일 한 번만 include 하기 (0) | 2010.02.12 |
Comments