無法初始化輸出緩衝區
驅動程式應該先以零初始化所有輸出緩衝區,再將它們傳回給呼叫端。 無法初始化緩衝區可能會導致任何未初始化位元組的垃圾資料。
在下列範例中,驅動程式會以未使用的位元組傳回垃圾。
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 沒有輸出緩衝區,因此 資訊 欄位不需要提供緩衝區大小。 在此情況下。 驅動程式可以使用 [資訊 ] 欄位安全地傳回自己的程式碼。