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 和创建组件具有标准、正常关系。 内核模式组件使用此值,除非它们属于此表中列出的三个其他类别之一。 如果 pvContextNULL,则 CLFS 会验证 cbContext 是否大于零。 否则,将忽略 pvContextcbContext
CLFS_FLAG_REENTRANT_FILE_SYSTEM 创建组件是为 CLFS 提供基础存储的文件系统。 CLFS 使用文件系统分配容器,文件系统使用 CLFS 流。 在这种情况下,文件系统可以调用 CLFS,并让 CLFS 在同一线程或不同线程上回调文件系统。 如果 pvContextNULL,则 CLFS 会验证 cbContext 是否大于零。 否则,将忽略 pvContextcbContext
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

另请参阅

ClfsCloseAndResetLogFile

ClfsCloseLogFileObject

ClfsDeleteLogByPointer

ClfsDeleteLogFile