资源管理器的 ResourceManagerNotification 回调例程接收和处理 事务通知。
语法
PTM_RM_NOTIFICATION PtmRmNotification;
NTSTATUS PtmRmNotification(
[in] PKENLISTMENT EnlistmentObject,
[in] PVOID RMContext,
[in] PVOID TransactionContext,
[in] ULONG TransactionNotification,
[in, out] PLARGE_INTEGER TmVirtualClock,
[in] ULONG ArgumentLength,
[in] PVOID Argument
)
{...}
参数
[in] EnlistmentObject
指向 登记对象的指针。 ResourceManagerNotification 回调例程正在接收此对象所表示的登记通知。
[in] RMContext
以前为 TmEnableCallbacks 例程的 RMKey 参数指定的资源管理器的值。
[in] TransactionContext
以前为 ZwCreateEnlistment 例程的 EnlistmentKey 参数指定的资源管理器值。
[in] TransactionNotification
在 Ktmtypes.h 中定义的TRANSACTION_NOTIFY_XXX 值之一。 此值指定 KTM 发送到调用方的交易通知的类型。
[in, out] TmVirtualClock
指向包含 虚拟时钟值的位置的指针,该位置 KTM 准备通知以传送到资源管理器。 如果回调例程在返回之前增加此值,KTM 会将虚拟时钟更新为新值。 (通常,资源管理器不会修改虚拟时钟值。
[in] ArgumentLength
参数 指向的缓冲区的长度(以字节为单位)。 如果缓冲区不可用,则此参数为零。
[in] Argument
指向包含通知特定参数的缓冲区的指针。 如果 TransactionNotification 参数指定的通知不需要参数缓冲区,则此参数 NULL。
有关包含其他参数缓冲区的通知列表,请参阅 TRANSACTION_NOTIFICATION的“备注”部分。
返回值
ResourceManagerNotification 回调例程必须返回STATUS_SUCCESS或其他状态值(NT_SUCCESS(状态)等于 TRUE(如果作成功)。
通常,如果资源管理器以同步方式为通知提供服务,并且STATUS_PENDING以异步方式为通知提供服务,则资源管理器 STATUS_SUCCESS返回STATUS_PENDING,但无论在哪种情况下,它都可以返回STATUS_PENDING。 但是,资源管理器只能为响应通知返回STATUS_PENDING,方法是调用其中一个 TmXxxComplete 或 ZwXxxComplete 例程。
换句话说,如果资源管理器必须通过调用某个 TmXxxComplete 或 ZwXxxComplete 例程来响应通知, 它可以返回通知的STATUS_PENDING,然后调用相应的 TmXxxComplete 或 ZwXxxComplete 例程。
如果发生错误,回调例程必须返回一个状态值,NT_SUCCESS(status) 等于 FALSE。
言论
若要注册 ResourceManagerNotification 回调例程,资源管理器必须调用 TmEnableCallbacks。
请注意,ResourceManagerNotification 回调例程接收指向登记对象的指针,而不是句柄。 可以将登记对象指针传递给登记对象的 TmXxx 例程。
有关 ResourceManagerNotification 回调例程的详细信息,请参阅 创建资源管理器。
ResourceManagerNotification 回调例程在 IRQL = PASSIVE_LEVEL 调用,必须在 IRQL = PASSIVE_LEVEL返回。
要求
| 要求 | 价值 |
|---|---|
| 最低支持的客户端 | 在 Windows Vista 和更高版本的作系统版本中可用。 |
| 目标平台 | 桌面 |
| 标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
| IRQL | PASSIVE_LEVEL(请参阅“备注”部分) |