共用方式為


IRP_MN_DEVICE_USAGE_NOTIFICATION

系統元件會傳送此 IRP 來要求驅動程式,讓裝置是否可以支援 特殊檔案。 特殊檔案包括分頁檔案、傾印檔案和休眠檔案。 如果裝置的所有驅動程式都成功 IRP,則系統會建立特殊檔案。 系統也會傳送此 IRP,通知驅動程式已從裝置中移除特殊檔案。

如果函式驅動程式的裝置可以包含分頁檔案、傾印檔案或休眠檔案,則必須處理此 IRP。 如果函式驅動程式正在篩選的函式驅動程式會處理 IRP,篩選驅動程式就必須處理此 IRP。 匯流排驅動程式必須針對其介面卡或控制器 (匯流排 FDO) ,以及其子裝置 (子 PDO) 來處理此 IRP。

0x16

主要程式碼

IRP_MJ_PNP

傳送時

系統會在建立或刪除分頁檔案、傾印檔案或休眠檔案時傳送此 IRP。 如果裝置的電源管理關聯性落在傳統父子式關聯性之外,驅動程式可以將此 IRP 傳送至另一個裝置堆疊來傳播裝置使用量資訊。 如需詳細資訊,請參閱IRP_MN_QUERY_DEVICE_RELATIONS中的PowerRelations要求描述。

系統元件和驅動程式會在任意執行緒內容中,在 IRQL PASSIVE_LEVEL傳送此 IRP。

輸入參數

IO_STACK_LOCATION結構的Parameters.UsageNotification.InPath成員是 BOOLEAN。 當此參數為 TRUE時,系統會在裝置上建立分頁、損毀傾印或休眠檔案。 當 InPathFALSE時,這類檔案已從裝置中移除。

Parameters.UsageNotification.Type 是指出檔案類型的列舉。 此參數具有下列其中一個值: DeviceUsageTypePagingDeviceUsageTypeDumpFileDeviceUsageTypeHibernation

輸出參數

I/O 狀態欄塊

驅動程式將 Irp-IoStatus.Status > 設定為STATUS_SUCCESS或適當的錯誤狀態。

驅動程式不會修改 Irp-IoStatus.Information > 欄位;它會維持零,如傳送 IRP 的元件所設定。

作業

驅動程式會在 IRP 的下移裝置堆疊和 IRP 的方式備份堆疊上處理此 IRP。

驅動程式會以如下的程式回應此 IRP:

  • 如果 Parameters.UsageNotification.InPathTRUE,請判斷裝置是否支援特殊檔案。

    驅動程式應該測試驅動程式可支援的特定 Parameters.UsageNotification.Type (s) 。 未來可能會新增其他通知類型。

    請參閱下列進一步資訊,說明支援每個通知類型所需的動作。

    如果 Parameters.UsageNotification.InPathTRUE ,且驅動程式無法支援裝置上的特殊檔案,驅動程式必須完成 IRP 且失敗狀態。

  • 如果裝置支援特殊檔案:

    1. 採取適當的動作,以反映裝置現在包含或不再包含特殊檔案。

      驅動程式通常會遞增或遞減計數器。 例如,如果 Parameters.UsageNotification.TypeDeviceUsageTypePagingParameters.UsageNotification.InPathTRUE,請遞增裝置上分頁檔案的數目。 某些驅動程式分派常式必須檢查計數器 () 。

      不應停用包含特殊檔案的裝置。 驅動程式可以呼叫 IoInvalidateDeviceState,要求 PnP 管理員重新查詢裝置的 PnP 裝置狀態資訊。 為了回應產生的 IRP_MN_QUERY_PNP_DEVICE_STATE IRP,驅動程式應該設定PNP_DEVICE_NOT_DISABLEABLE旗標。

      如果 InPathFALSE,驅動程式會在裝置的裝置物件中設定DO_POWER_PAGABLE位。

    2. 將裝置使用方式資訊傳播至任何需要資訊的相關裝置。

      在處理 IRP_MN_DEVICE_USAGE_NOTIFICATION IRP 時,可能需要驅動程式將資訊傳遞至一或多個其他裝置堆疊。 這類驅動程式會建立新的 IRP_MN_DEVICE_USAGE_NOTIFICATION IRP (或 IRP) ,並將其傳送至適當的裝置堆疊 (或堆疊) 。 驅動程式必須等候任何裝置使用方式通知 IRP 完成, () 驅動程式完成處理收到的裝置使用量 IRP。

      如何識別相關裝置是裝置和驅動程式特定的裝置。 一般而言,驅動程式會將 IRP 傳送至其他驅動程式,以便傳送檔案的 I/O 要求。 當匯流排驅動程式處理子裝置的此要求時,它必須將使用量通知 IRP 傳送至裝置父系的裝置堆疊。

      例如,當 ftdisk 執行五個磁片等量集時,它會將分頁通知傳播至這五個磁片中的每個磁片,因為每個裝置都可以處理分頁檔案作業。

    3. 在函式或篩選驅動程式中,設定 IoCompletion 常式。

    4. 在函式或篩選驅動程式中,將 Irp-IoStatus.Status > 設定為 STATUS_SUCCESS、設定下一個堆疊位置,並使用 IoCallDriver將 IRP 傳遞至下一個較低的驅動程式。 請勿完成 IRP。

      在處理子 PDO IRP 的匯流排驅動程式中:設定 Irp-IoStatus.Status > 並完成 IRP (IoCompleteRequest) 。

    5. 在 IRP 完成處理期間:

      如果 IoCompletion 常式偵測到較低驅動程式的 IRP 失敗,函式或篩選驅動程式必須復原它執行的任何作業,以回應 IRP 並傳播錯誤。 如果函式或篩選驅動程式將使用量資訊傳播至任何其他裝置堆疊,驅動程式必須將另一個使用量 IRP 傳送給這些堆疊,以通知這些失敗。

      如果狀態STATUS_SUCCESS且 InPathTRUE,請清除DO_POWER_PAGABLE位。

如需處理隨插即用次要 IRP的一般規則,請參閱隨插即用

在裝置上支援分頁、損毀傾印和休眠檔案

當驅動程式的任何特殊檔案計數為非零時,驅動程式必須支援其裝置上 (或子系裝置上是否有特殊檔案 () ) 。

針對在其裝置上建立的 DeviceUsageTypePaging 檔案,驅動程式必須執行下列動作:

針對裝置上的 DeviceUsageTypeDumpFile 檔案,驅動程式必須執行下列動作:

  • 鎖定其 DispatchReadDispatchWriteDispatchDeviceControlDispatchPower 常式的記憶體中的程式碼。

  • 請勿讓裝置離開 D0 狀態。

    請勿註冊裝置進行閒置偵測, (PoRegisterDeviceForIdleDetection) 。 如果裝置已註冊,請取消註冊。 如果驅動程式對裝置執行自己的閒置偵測,請暫停這類偵測。

  • 清除 IRP 上裝置堆疊) 上裝置 (裝置物件的DO_POWER_PAGABLE位。

  • 裝置 的IRP_MN_QUERY_STOP_DEVICEIRP_MN_QUERY_REMOVE_DEVICE 要求失敗。

針對裝置上的 DeviceUsageTypeHibernation 檔案,驅動程式必須執行下列動作:

  • 鎖定其 DispatchReadDispatchWriteDispatchDeviceControlDispatchPower 常式的記憶體中的程式碼。

  • 當驅動程式收到 S4 系統電源 IRP 指出系統即將休眠時,請確定裝置處於 D0 狀態。

  • 請勿關閉裝置,以回應屬於 S4 休眠動作的 D3 set-power IRP。 如需詳細資訊,請參閱 系統電源動作

    收到這類 D3 設定電源 IRP 時,請執行將裝置置於 D3 狀態所需的所有工作,但關閉裝置並通知電源管理員 (PoSetPowerState) 。 裝置必須保留電源,直到寫入休眠檔案為止。

  • 清除 IRP 上裝置堆疊) 上裝置 (裝置物件的DO_POWER_PAGABLE位。

  • 裝置 的IRP_MN_QUERY_STOP_DEVICEIRP_MN_QUERY_REMOVE_DEVICE 要求失敗。

如需裝置電源狀態、電源 IRP 和支援驅動程式電源管理的詳細資訊,請參閱 電源 管理。

傳送此 IRP

驅動程式可以傳送 IRP_MN_DEVICE_USAGE_INFORMATION IRP,但只能將裝置使用量資訊傳播到另一個裝置堆疊。 驅動程式永遠不會是裝置使用資訊的初始來源。

規格需求

標頭

Wdm.h (包括 Wdm.h、Ntddk.h 或 Ntifs.h)

另請參閱

DispatchDeviceControl

DispatchPower

DispatchRead

DispatchWrite

IoAdjustPagingPathCount

IoCallDriver

IoCompleteRequest

IO_STACK_LOCATION

IRP_MJ_PNP

IRP_MN_QUERY_DEVICE_RELATIONS

IRP_MN_QUERY_PNP_DEVICE_STATE

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_QUERY_STOP_DEVICE

PoRegisterDeviceForIdleDetection

PoSetPowerState