Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Driver harus menginisialisasi semua buffer output dengan nol sebelum mengembalikannya ke pemanggil. Gagal menginisialisasi buffer dapat mengakibatkan data sampah dalam byte yang tidak diinisialisasi.
Dalam contoh berikut, driver mengembalikan sampah dalam byte yang tidak digunakan.
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;
}
Mengatur IoStatus.Information ke ukuran buffer output menyebabkan seluruh buffer output dikembalikan ke pemanggil. Manajer I/O tidak menginisialisasi data lebih dari ukuran buffer input—buffer input dan output beririsan untuk permintaan yang dibuffer. Karena rutinitas sistem IoGetDeviceProperty tidak menulis seluruh buffer, IOCTL ini mengembalikan data yang belum terinisialisasi kepada pemanggil.
Beberapa driver menggunakan bidang Informasi untuk mengembalikan kode yang memberikan detail tambahan tentang permintaan I/O. Sebelum melakukannya, driver tersebut harus memeriksa penanda IRP untuk memastikan bahwa IRP_INPUT_OPERATION tidak diaktifkan. Ketika bendera ini tidak diatur, IOCTL atau FSCTL tidak memiliki buffer output, sehingga bidang Informasi tidak perlu menyediakan ukuran buffer. Dalam hal ini. driver dapat dengan aman menggunakan bidang Informasi untuk mengembalikan kodenya sendiri.