ClfsCreateLogFile 函数 (wdm.h)
ClfsCreateLogFile 例程创建或打开 CLFS 流。 如有必要,ClfsCreateLogFile 还会创建保存流记录的基础物理日志。
语法
CLFSUSER_API NTSTATUS ClfsCreateLogFile(
[out] PPLOG_FILE_OBJECT pplfoLog,
[in] PUNICODE_STRING puszLogFileName,
[in] ACCESS_MASK fDesiredAccess,
[in] ULONG dwShareMode,
[in, optional] PSECURITY_DESCRIPTOR psdLogFile,
[in] ULONG fCreateDisposition,
[in] ULONG fCreateOptions,
[in] ULONG fFlagsAndAttributes,
[in] ULONG fLogOptionFlag,
[in, optional] PVOID pvContext,
[in] ULONG cbContext
);
参数
[out] pplfoLog
指向一个变量的指针,该变量接收指向表示流打开实例的 LOG_FILE_OBJECT 结构的指针。
[in] puszLogFileName
指向提供流或基础物理日志名称的 UNICODE_STRING 结构的指针。
如果流已存在,并且是专用日志的唯一流,则名称具有表单日志:物理日志名称,其中 物理日志名称 是包含流记录的现有物理日志的路径名称。
如果流尚不存在,并且将成为专用日志(尚不存在)的唯一流,则名称具有表单日志:物理日志名称,其中 物理日志名称 是将创建用于保存流记录的物理日志的路径名称。
如果流是(或要成为)多路复用日志的流之一, 名称具有表单日志:物理日志名称::流名称,其中 物理日志名称 是包含流记录的物理日志的路径名称,流名称 是共享该物理日志(或将共享)该物理日志的流的名称。
如果要创建目前没有流的多路复用日志,请使用表单日志的名称:物理日志名称::,其中 物理日志名称 是要创建的物理日志的路径名称。
以下列表提供了有效名称的一些示例。
- “Log:c:\myLog”创建或打开专用日志及其一个流。
- “Log:c:\myCommonLog::”创建一个没有流的多路复用日志。
- “Log:c:\myCommonLog::Stream1”创建或打开复用日志的其中一个流(Stream1)。
[in] fDesiredAccess
提供客户端访问类型的 ACCESS_MASK(通过使用在 pplfoLog中返回的指针)到流。 如果此参数为零,则客户端可以查询流中的属性,但无法读取或写入流。 此参数可以是零或以下标志的任意组合:
旗 | 意义 |
---|---|
GENERIC_READ | 客户端对流具有读取访问权限。 |
GENERIC_WRITE | 客户端对流具有写入访问权限。 |
删除 | 客户端可以标记要删除的流。 |
[in] dwShareMode
流的共享模式,可以是零(不共享)或以下标志的任意组合:
旗 | 意义 |
---|---|
FILE_SHARE_DELETE | 打开具有删除访问权限的流的后续请求将成功。 |
FILE_SHARE_READ | 打开具有读取访问权限的流的后续请求将成功。 |
FILE_SHARE_WRITE | 打开具有写入访问权限的流的后续请求将成功。 |
[in, optional] psdLogFile
指向提供流安全属性的 SECURITY_DESCRIPTOR 结构的指针。 此参数可以 NULL。
[in] fCreateDisposition
要执行的作取决于流是否已存在。 此参数必须设置为以下值之一:
价值 | 意义 |
---|---|
CREATE_NEW | 如果流尚未退出,请创建新流。 如果流已存在,则失败。 |
OPEN_EXISTING | 打开现有流。 如果流尚不存在,则失败。 |
OPEN_ALWAYS | 打开现有流。 创建流(如果尚不存在)。 |
[in] fCreateOptions
一组标志,用于指定创建或打开流时要应用的选项。 此参数可以是零个或以下标志的兼容组合:
旗 | 意义 |
---|---|
FILE_NO_INTERMEDIATE_BUFFERING | 流记录不能缓存在驱动程序的内部缓冲区中。 |
FILE_SYNCHRONOUS_IO_ALERT | 对流执行的所有作都是同步执行的。 代表调用方的任何等待都受到警报的过早终止。 如果设置了此标志,则必须清除FILE_SYNCHRONOUS_IO_NONALERT标志。 |
FILE_SYNCHRONOUS_IO_NONALERT | 对流执行的所有作都是同步执行的。 在系统中等待同步 I/O 队列和完成不受警报约束。 如果设置了此标志,则必须清除FILE_SYNCHRONOUS_IO_ALERT标志。 |
[in] fFlagsAndAttributes
一个值,该值指定是为正常访问还是只读访问打开流。 此参数必须设置为任一
FILE_ATTRIBUTE_NORMAL或FILE_ATTRIBUTE_READONLY。
[in] fLogOptionFlag
有关 CLFS 与创建或打开流的组件之间的关系的提示。 此参数必须设置为以下值之一:
价值 | 意义 |
---|---|
CLFS_FLAG_NO_FLAGS | CLFS 和创建组件具有标准、正常关系。 内核模式组件使用此值,除非它们属于此表中列出的三个其他类别之一。 如果 pvContext 未 NULL,则 CLFS 会验证 cbContext 是否大于零。 否则,将忽略 pvContext 和 cbContext。 |
CLFS_FLAG_REENTRANT_FILE_SYSTEM | 创建组件是为 CLFS 提供基础存储的文件系统。 CLFS 使用文件系统分配容器,文件系统使用 CLFS 流。 在这种情况下,文件系统可以调用 CLFS,并让 CLFS 在同一线程或不同线程上回调文件系统。 如果 pvContext 未 NULL,则 CLFS 会验证 cbContext 是否大于零。 否则,将忽略 pvContext 和 cbContext。 |
CLFS_FLAG_NON_REENTRANT_FILTER | 创建组件是文件系统筛选器驱动程序,它将所有 CLFS I/O 发送到筛选器堆栈上自身下方的指定级别。 此选项允许筛选器驱动程序创建 CLFS 日志,而无需查看自己的日志记录 I/O。 调用方在 pvContext 参数中传递非NULL 目标设备对象,cbContext 设置为适当的大小。 CLFS 使用 IoCreateFileSpecifyDeviceObjectHint 例程在设备对象指定的 I/O 筛选器堆栈中创建目标级别的容器。 |
CLFS_FLAG_REENTRANT_FILTER | 创建组件是一个文件系统筛选器驱动程序,它将所有 CLFS I/O 发送到筛选器堆栈的顶部。 筛选器与 CLFS 具有递归关系,因为它在 CLFS 对其容器执行任何文件系统作时会筛选自己的日志记录 I/O。 pvContext 参数为筛选器提供了一种将可识别上下文与其 CLFS 容器相关联的方法,因为日志 I/O 会降低筛选器堆栈。 cbContext 参数指定不透明上下文的大小(以字节为单位)。 |
CLFS_FLAG_MINIFILTER_LEVEL | 创建组件是文件系统微型筛选器驱动程序,它将所有 CLFS I/O 发送到筛选器堆栈上自身下方的指定级别。 此选项允许微型筛选器创建 CLFS 日志,而无需看到自己的日志记录 I/O。 调用方在 pvContext 参数中传递非NULL 微筛选器上下文对象,cbContext 设置为适当的大小。 CLFS 使用 IoCreateFileSpecifyDeviceObjectHint 例程在筛选器管理器的微筛选器堆栈中(在微筛选器上下文中指定)创建容器。 |
[in, optional] pvContext
指向上下文的指针。 上下文的解释方式取决于传递给 fLogOptionsFlag的值。
[in] cbContext
pvContext指向的上下文的大小(以字节为单位)。 如果未 NULLpvContext,则此参数必须大于零。
返回值
ClfsCreateLogFile 如果成功,则返回STATUS_SUCCESS;否则,它将返回 Ntstatus.h 中定义的错误代码之一。
言论
创建 CLFS 流时,它由基础物理 CLFS 日志提供支持。 基础日志可以是专用(仅支持一个流)或多路复用(支持多个流)。 专用日志无法转换为多路复用日志,多路复用日志无法转换为专用日志。
物理 CLFS 日志名称不包括 .blf 扩展名。
有关 CLFS 概念和术语的说明,请参阅 通用日志文件系统。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 在 Windows Server 2003 R2、Windows Vista 和更高版本的 Windows 中可用。 |
目标平台 | 桌面 |
标头 | wdm.h (包括 Wdm.h) |
库 | Clfs.lib |
DLL | Clfs.sys |
IRQL | <= APC_LEVEL |