출력 버퍼 초기화 실패
드라이버는 호출자에게 반환하기 전에 모든 출력 버퍼를 0으로 초기화해야 합니다. 버퍼를 초기화하지 못하면 초기화되지 않은 바이트에서 가비지 데이터가 발생할 수 있습니다.
다음 예제에서 드라이버는 사용되지 않는 바이트로 가비지 를 반환합니다.
case IOCTL_GET_NAME: {
...
...
outputBufferLength =
ioStack->Parameters.DeviceIoControl.OutputBufferLength;
outputBuffer = (PGET_NAME) Irp->AssociatedIrp.SystemBuffer;
if (outputBufferLength >= sizeof(GET_NAME)) {
length = outputBufferLength - sizeof(GET_NAME);
ntStatus = IoGetDeviceProperty(
DeviceExtension->PhysicalDeviceObject,
DevicePropertyDriverKeyName,
length,
outputBuffer->DriverKeyName,
&length);
outputBuffer->ActualLength =
length + sizeof(GET_NAME);
Irp->IoStatus.Information = outputBufferLength;
} else {
ntStatus = STATUS_BUFFER_TOO_SMALL;
}
IoStatus.Information를 출력 버퍼 크기로 설정하면 전체 출력 버퍼가 호출자에게 반환됩니다. I/O 관리자는 입력 버퍼의 크기를 초과하여 데이터를 초기화하지 않습니다. 입력 및 출력 버퍼는 버퍼링된 요청에 대해 겹칩니다. 시스템에서 루틴 IoGetDeviceProperty 가 전체 버퍼를 작성하지 않으므로 이 IOCTL은 초기화되지 않은 데이터를 호출자에게 반환합니다.
일부 드라이버는 정보 필드를 사용하여 I/O 요청에 대한 추가 세부 정보를 제공하는 코드를 반환합니다. 이렇게 하기 전에 이러한 드라이버는 IRP 플래그를 검사 IRP_INPUT_OPERATION 설정되지 않도록 해야 합니다. 이 플래그를 설정하지 않으면 IOCTL 또는 FSCTL에 출력 버퍼가 없으므로 정보 필드에 버퍼 크기를 제공할 필요가 없습니다. 이 경우. 드라이버는 정보 필드를 안전하게 사용하여 자체 코드를 반환할 수 있습니다.