Share via


출력 버퍼 초기화 실패

드라이버는 호출자에게 반환하기 전에 모든 출력 버퍼를 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에 출력 버퍼가 없으므로 정보 필드에 버퍼 크기를 제공할 필요가 없습니다. 이 경우. 드라이버는 정보 필드를 안전하게 사용하여 자체 코드를 반환할 수 있습니다.