Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
I driver devono inizializzare tutti i buffer di output con zeri prima di restituirli al chiamante. Se non si inizializza un buffer, i dati spazzatura possono apparire nei byte non inizializzati.
Nell'esempio seguente un driver restituisce il garbage in byte inutilizzati.
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;
}
L'impostazione di IoStatus.Information sulle dimensioni del buffer di output determina la restituzione dell'intero buffer di output al chiamante. Il gestore I/O non inizializza i dati oltre le dimensioni del buffer di input, poiché i buffer di input e output si sovrappongono per una richiesta con buffer. Poiché la routine di supporto del sistema IoGetDeviceProperty non scrive l'intero buffer, questo IOCTL restituisce dati non inizializzati al chiamante.
Alcuni driver usano il campo Informazioni per restituire codici che forniscono dettagli aggiuntivi sulle richieste di I/O. Prima di farlo, tali driver devono controllare i flag IRP per assicurarsi che IRP_INPUT_OPERATION non sia impostato. Quando questo flag non è impostato, IOCTL o MDFTL non dispone di un buffer di output, quindi il campo Informazioni non deve fornire una dimensione del buffer. In questo caso. il driver può usare in modo sicuro il campo Informazioni per restituire il proprio codice.