Fehler beim Initialisieren von Ausgabepuffern
Treiber sollten alle Ausgabepuffer mit Nullen initialisieren, bevor sie an den Aufrufer zurückgegeben werden. Wenn ein Puffer nicht initialisiert wird, kann dies zu Garbage Data in nicht initialisierten Bytes führen.
Im folgenden Beispiel gibt ein Treiber Garbage in nicht verwendeten Bytes zurück.
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;
}
Wenn Sie IoStatus.Information auf die Ausgabepuffergröße festlegen, wird der gesamte Ausgabepuffer an den Aufrufer zurückgegeben. Der E/A-Manager initialisiert die Daten nicht über die Größe des Eingabepuffers hinaus– die Eingabe- und Ausgabepuffer überlappen sich für eine gepufferte Anforderung. Da die Systemunterstützungsroutine IoGetDeviceProperty nicht den gesamten Puffer schreibt, gibt diese IOCTL nicht initialisierte Daten an den Aufrufer zurück.
Einige Treiber verwenden das Feld Informationen , um Codes zurückzugeben, die zusätzliche Details zu E/A-Anforderungen bereitstellen. Zuvor sollten diese Treiber die IRP-Flags überprüfen, um sicherzustellen, dass IRP_INPUT_OPERATION nicht festgelegt ist. Wenn dieses Flag nicht festgelegt ist, verfügt die IOCTL oder FSCTL nicht über einen Ausgabepuffer, sodass das Feld Information keine Puffergröße angeben muss. In diesem Fall. der Treiber kann das Feld Information sicher verwenden, um seinen eigenen Code zurückzugeben.