Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Sterowniki powinny zainicjować wszystkie bufory wyjściowe zerami, zanim zwrócą je do obiektu wywołującego. Nieudana inicjalizacja bufora może prowadzić do śmieciowych danych w niezainicjowanych bajtach.
W poniższym przykładzie sterownik zwraca śmieci w nieużywanych bajtach.
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;
}
Ustawienie parametru IoStatus.Information na rozmiar buforu wyjściowego powoduje zwrócenie całego buforu wyjściowego do elementu wywołującego. Menedżer I/O nie inicjuje danych poza rozmiarem bufora wejściowego — bufory wejściowy i wyjściowy nakładają się na siebie w przypadku buforowanego żądania. Ponieważ rutynowa obsługa systemu IoGetDeviceProperty nie zapisuje całego buforu, ta funkcja IOCTL zwraca niezainicjowane dane do obiektu wywołującego.
Niektóre sterowniki używają pola Informacje do zwracania kodów, które zawierają dodatkowe szczegóły dotyczące żądań we/wy. Przed wykonaniem tej czynności takie sterowniki powinny sprawdzać flagi IRP, aby upewnić się, że IRP_INPUT_OPERATION nie jest ustawiona. Jeśli ta flaga nie jest ustawiona, IOCTL lub FSCTL nie ma buforu wyjściowego, więc pole Informacje nie musi dostarczać rozmiaru buforu. W tym przypadku. sterownik może bezpiecznie użyć pola Informacje, aby zwrócić własny kod.