驅動程式應該先以零初始化所有輸出緩衝區,再將它們傳回給呼叫端。 未能初始化緩衝區可能導致未初始化位元組中出現垃圾資料。
在下列範例中,驅動程式會在未使用的位元組中傳回隨機數據。
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 設定為輸出緩衝區大小會導致整個輸出緩衝區傳回給呼叫端。 I/O 管理員不會初始化超出輸入緩衝區大小的數據,輸入和輸出緩衝區會針對緩衝要求重疊。 因為系統支援常式 IoGetDeviceProperty 不會寫入整個緩衝區,所以此 IOCTL 會將未初始化的數據傳回給呼叫端。
某些驅動程式會使用 [資訊 ] 欄位來傳回提供 I/O 要求額外詳細數據的代碼。 這麼做之前,這類驅動程式應該檢查 IRP 旗標,以確保未設定IRP_INPUT_OPERATION。 未設定此旗標時,IOCTL 或 FSCTL 沒有輸出緩衝區,因此 [資訊 ] 欄位不需要提供緩衝區大小。 在這種情況下。 驅動程式可以安全地使用 Information 欄位來傳回自己的程式代碼。