[适用于 KMDF 和 UMDF]
WdfWaitLockAcquire 方法获取指定的等待锁。
语法
NTSTATUS WdfWaitLockAcquire(
[in] WDFWAITLOCK Lock,
[in, optional] PLONGLONG Timeout
);
参数
[in] Lock
框架等待锁对象的句柄,由先前调用 WdfWaitLockCreate获取。
[in, optional] Timeout
指向超时值的可选指针。 超时值以系统时间单位(100 纳秒间隔)指定。
如果指针是非NULL,则框架将取消在指定超时期限内未完成锁定的尝试。 超时值可以是负值、正值或零,如下所示:
- 如果超时值为负值,则过期时间相对于当前系统时间。
- 如果超时值为正值,则过期时间指定为绝对时间(实际上相对于 1601 年 1 月 1 日)。
- 如果超时值为零,WdfWaitLockAcquire 尝试获取锁,然后立即返回,无论是否已获取锁。
该框架提供 时间转换函数, 将时间值转换为系统时间单位。
如果调用方提供 NULL 指针,该方法将无限期等待,直到获取锁。
返回值
WdfWaitLockAcquire 可以返回以下 NTSTATUS 值:
| 返回代码 | 描述 |
|---|---|
|
调用方已获取等待锁。 |
|
指定的 超时 间隔在获取锁之前过期。 |
请注意,对于所有这些状态值,NT_SUCCESS(status)等于 TRUE。
如果 超时 指针 NULL,则调用方不必检查返回值,因为在这种情况下 ,WdfWaitLockAcquire 仅在获取锁后返回。
如果驱动程序提供无效的对象句柄,则会发生 bug 检查。
言论
WdfWaitLockAcquire 方法在获取等待锁或超时期限到期之前不会返回。
WdfWaitLockAcquire 在获取等待锁之前调用 KeEnterCriticalRegion。 因此,当方法返回时,正常内核 APC 处于禁用状态。 WdfWaitLockAcquire 不会更改调用方 IRQL。
如果 超时 指针 NULL,或者超时值不为零,则必须在 IRQL = PASSIVE_LEVEL调用 WdfWaitLockAcquire WdfWaitLockAcquire。
如果超时值为零,则必须在 IRQL DISPATCH_LEVEL 调用 WdfWaitLockAcquire <。 请注意,这与头文件(wdfsync.h)存在分歧,这表示可以在DISPATCH_LEVEL调用此方法。
有关等待锁的详细信息,请参阅 Framework-Based 驱动程序 同步技术。
例子
下面的代码示例获取等待锁,将设备对象添加到对象集合,并释放等待锁。
WdfWaitLockAcquire(
FilterDeviceCollectionLock,
NULL
);
status = WdfCollectionAdd(
FilterDeviceCollection,
deviceHandle
);
if (!NT_SUCCESS(status)) {
addFailed = TRUE;
}
WdfWaitLockRelease(FilterDeviceCollectionLock);
要求
| 要求 | 价值 |
|---|---|
| 目标平台 | 普遍 |
| 最低 KMDF 版本 | 1.0 |
| 最低 UMDF 版本 | 2.0 |
| 标头 | wdfsync.h (包括 Wdf.h) |
| 库 | Wdf01000.sys(KMDF):WUDFx02000.dll (UMDF) |
| IRQL | 请参阅“备注”部分。 |
| DDI 符合性规则 | DriverCreate(kmdf),KmdfIrql(kmdf),KmdfIrql2(kmdf),KmdfIrqlExplicitit,WdfWaitlock(kmdf),WdfWaitlockRelease(kmdf) |