I/O 제어 코드에 대한 버퍼 설명
I/O 제어 코드는 IRP_MJ_DEVICE_CONTROL 및 IRP_MJ_INTERNAL_DEVICE_CONTROL 요청에 포함됩니다. I/O 관리자는 DeviceIoControl 및 IoBuildDeviceIoControlRequest에 대한 호출의 결과로 이러한 요청을 만듭니다.
DeviceIoControl 및 IoBuildDeviceIoControlRequest는 입력 버퍼와 출력 버퍼를 모두 인수로 허용하므로 모든 IRP_MJ_DEVICE_CONTROL 및 IRP_MJ_INTERNAL_DEVICE_CONTROL 요청은 입력 버퍼와 출력 버퍼를 모두 제공합니다. 시스템에서 이러한 버퍼를 설명하는 방식은 데이터 전송 형식에 따라 달라집니다. 전송 형식은 IOCTL 코드 값을 만드는 CTL_CODE 매크로의 TransferType 값으로 지정됩니다.
시스템은 다음과 같이 각 TransferType 값에 대한 버퍼를 설명합니다.
METHOD_BUFFERED
이 전송 형식의 경우 IRP는 Irp-ASSOCIATedIrp.SystemBuffer>의 버퍼에 대한 포인터를 제공합니다. 이 버퍼는 DeviceIoControl 및 IoBuildDeviceIoControlRequest 호출에 지정된 입력 버퍼와 출력 버퍼 를 모두 나타냅니다. 드라이버는 이 버퍼에서 데이터를 전송한 다음 이 버퍼로 전송합니다.
입력 데이터의 경우 버퍼 크기는 드라이버의 IO_STACK_LOCATION 구조에서 Parameters.DeviceIoControl.InputBufferLength로 지정됩니다. 출력 데이터의 경우 버퍼 크기는 드라이버의 IO_STACK_LOCATION 구조에서 Parameters.DeviceIoControl.OutputBufferLength로 지정됩니다.
시스템에서 단일 입력/출력 버퍼에 할당하는 공간의 크기는 두 길이 값 중 더 큽니다.
METHOD_IN_DIRECT 또는 METHOD_OUT_DIRECT
이러한 전송 형식의 경우 IRP는 Irp-AssociatedIrp.SystemBuffer>에서 버퍼에 대한 포인터를 공급합니다. DeviceIoControl 및 IoBuildDeviceIoControlRequest 호출에 지정된 첫 번째 버퍼를 나타냅니다. 버퍼 크기는 드라이버의 IO_STACK_LOCATION 구조에서 Parameters.DeviceIoControl.InputBufferLength로 지정됩니다.
이러한 전송 형식의 경우 IRP는 Irp-MdlAddress>의 MDL에 대한 포인터도 입력합니다. DeviceIoControl 및 IoBuildDeviceIoControlRequest 호출에 지정된 두 번째 버퍼를 나타냅니다. 이 버퍼는 다음과 같이 입력 버퍼 또는 출력 버퍼로 사용할 수 있습니다.
IRP를 처리하는 드라이버가 호출될 때 버퍼의 데이터를 수신하는 경우 METHOD_IN_DIRECT 지정됩니다. MDL은 입력 버퍼를 설명하고 METHOD_IN_DIRECT 지정하면 실행 중인 스레드가 버퍼에 대한 읽기 액세스 권한을 갖도록 합니다.
IRP를 처리하는 드라이버가 IRP를 완료하기 전에 버퍼에 데이터를 쓸지 METHOD_OUT_DIRECT 지정됩니다. MDL은 출력 버퍼를 설명하고 METHOD_OUT_DIRECT 지정하면 실행 중인 스레드가 버퍼에 대한 쓰기 액세스 권한이 있는지 확인합니다.
이러한 두 전송 형식 모두에 대해 Parameters.DeviceIoControl.OutputBufferLength 는 MDL에서 설명하는 버퍼의 크기를 지정합니다.
METHOD_NEITHER
I/O 관리자는 시스템 버퍼 또는 MDL을 제공하지 않습니다. IRP는 유효성을 검사하거나 매핑하지 않고 DeviceIoControl 또는 IoBuildDeviceIoControlRequest에 지정된 입력 및 출력 버퍼의 사용자 모드 가상 주소를 제공합니다.
입력 버퍼의 주소는 드라이버의 IO_STACK_LOCATION 구조에서 Parameters.DeviceIoControl.Type3InputBuffer에서 제공되며 출력 버퍼의 주소는 Irp-UserBuffer>에 의해 지정됩니다.
버퍼 크기는 드라이버의 IO_STACK_LOCATION 구조에서 Parameters.DeviceIoControl.InputBufferLength 및 Parameters.DeviceIoControl.OutputBufferLength에서 제공됩니다.
CTL_CODE 매크로 및 위에 나열된 전송 형식에 대한 자세한 내용은 I/O 제어 코드 정의를 참조하세요.