Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйверы должны инициализировать все выходные буферы нулевыми значениями, прежде чем возвращать их вызывающей стороне. Сбой инициализации буфера может привести к появлению мусорных данных в любых неинициализированных байтах.
В следующем примере драйвер возвращает мусор в неиспользуемых байтах.
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 в размер выходного буфера означает возврат всего выходного буфера вызывающей стороне. Диспетчер ввода-вывода не инициализирует данные за пределами размера входного буфера— входные и выходные буферы перекрываются для буферизованного запроса. Поскольку подпрограмма поддержки системы IoGetDeviceProperty не записывает всё содержимое буфера, этот IOCTL возвращает неинициализированные данные вызывающему объекту.
Некоторые драйверы используют поле сведений для возврата кодов, которые предоставляют дополнительные сведения о запросах ввода-вывода. Перед этим такие драйверы должны проверить флаги IRP, чтобы убедиться, что IRP_INPUT_OPERATION не задан. Если этот флаг не задан, IOCTL или FSCTL не имеет выходного буфера, поэтому поле сведений не требуется предоставлять размер буфера. В этом случае. Драйвер может безопасно использовать поле сведений для возврата собственного кода.