RtlStringCbCopyUnicodeStringEx 函数 (ntstrsafe.h)

RtlStringCbCopyUnicodeStringEx 函数将UNICODE_STRING结构的内容复制到指定的目标。

语法

NTSTRSAFEDDI RtlStringCbCopyUnicodeStringEx(
  [out]           NTSTRSAFE_PWSTR  pszDest,
  [in]            size_t           cbDest,
  [in]            PCUNICODE_STRING SourceString,
  [out]           NTSTRSAFE_PWSTR  *ppszDestEnd,
  [out, optional] size_t           *pcbRemaining,
  [in]            DWORD            dwFlags
);

参数

[out] pszDest

可选。 指向接收复制字符串的缓冲区的指针。 SourceString 参数UNICODE_STRING结构指向的字符串将复制到 pszDest 处的缓冲区,并使用 null 字符终止。 此指针可以为 NULL,但仅在 dwFlags 中设置STRSAFE_IGNORE_NULLS时。

[in] cbDest

目标缓冲区的大小(以字节为单位)。 缓冲区对于字符串和终止 null 字符必须足够大。 缓冲区中的最大字节数为 NTSTRSAFE_MAX_CCH * sizeof (WCHAR) 。

[in] SourceString

可选。 指向包含要复制的字符串 的UNICODE_STRING 结构的指针。 字符串中的最大字节数为 NTSTRSAFE_UNICODE_STRING_MAX_CCH * sizeof (WCHAR) 。 此指针可以为 NULL,但仅在 dwFlags 中设置STRSAFE_IGNORE_NULLS时。

[out] ppszDestEnd

可选。 如果调用方提供非 NULL 地址指针,则在复制操作完成后,该函数会将该地址与指向目标缓冲区生成的 NULL 字符串终止符的指针一起加载该地址。

[out, optional] pcbRemaining

可选。 如果调用方提供非 NULL 地址指针,则函数将加载缓冲区中未使用的字节数(包括用于终止 null 字符的字节)的地址。

[in] dwFlags

一个或多个标志(可选)填充字节。 标志的定义如下:

STRSAFE_FILL_BEHIND_NULL

如果设置此标志并且函数成功, 则 dwFlags 的低字节用于填充终止 null 字符之后的目标缓冲区部分。

STRSAFE_IGNORE_NULLS

如果设置了此标志,则源指针或目标指针或两者都可以为 NULLRtlStringCbCopyUnicodeStringEx 将 NULL 源缓冲区指针视为 字符串 (TEXT (“”) ) ,可以复制。 NULL 目标缓冲区指针无法接收无空字符串。

STRSAFE_FILL_ON_FAILURE

如果设置了此标志并且函数失败, 则 dwFlags 的低字节用于填充整个目标缓冲区,并且缓冲区为 null 终止。 此操作覆盖任何预先存在的缓冲区内容。

STRSAFE_NULL_ON_FAILURE

如果设置了此标志并且函数失败,则目标缓冲区设置为空字符串, (TEXT (“”) ) 。 此操作覆盖任何预先存在的缓冲区内容。

STRSAFE_NO_TRUNCATION

如果设置此标志并且函数返回STATUS_BUFFER_OVERFLOW,则不会修改目标缓冲区的内容。

返回值

RtlStringCbCopyUnicodeStringEx 返回以下 NTSTATUS 值之一。

返回代码 说明
STATUS_SUCCESS
成功 状态表示源数据存在、字符串在没有截断的情况下复制,并且生成的目标缓冲区以 null 结尾。
STATUS_BUFFER_OVERFLOW
警告 状态意味着复制操作由于目标缓冲区中的空间不足而未完成。 如果在 dwFlags 中设置了STRSAFE_NO_TRUNCATION,则不会修改目标缓冲区。 如果未设置标志,则目标缓冲区包含复制的字符串的截断版本。
STATUS_INVALID_PARAMETER
此错误状态表示函数收到了无效的输入参数。 有关详细信息,请参阅以下列表。
 

发生以下任一情况时,RtlStringCbCopyUnicodeStringEx 将返回STATUS_INVALID_PARAMETER值:

  • UNICODE_STRING结构的内容无效。
  • dwFlags 中指定了无效标志。
  • cbDest 中的值大于最大缓冲区大小。
  • 目标缓冲区 (pszDest 指向) 已满。
  • 缓冲区指针为 NULL ,未指定STRSAFE_IGNORE_NULLS标志。
  • 目标缓冲区指针为 NULL,但缓冲区大小不为零。
  • 目标缓冲区指针为 NULL 或其长度为零,但存在非零长度源字符串。
有关如何测试 NTSTATUS 值的信息,请参阅 使用 NTSTATUS 值

备注

RtlStringCbCopyUnicodeStringEx 函数使用目标缓冲区的大小 (,cbDest 参数指定) 以确保复制操作不会写入缓冲区末尾。

RtlStringCbCopyUnicodeStringEx 通过返回指向目标字符串末尾的指针以及该字符串中未使用的字节数,将 RtlStringCbCopyUnicodeString 函数的功能添加到 RtlStringCbCopyUnicodeString 函数的功能。 可以将标志传递给函数以获取其他控件。

如果源字符串和目标字符串重叠,则未定义函数的行为。

除非在 dwFlags 中设置了STRSAFE_IGNORE_NULLS标志,否则 SourceString pszDest 指针不能为 NULL。 如果设置了STRSAFE_IGNORE_NULLS,则其中一个或两个指针可以是 NULL。 如果 pszDest 指针为 NULLSourceString 指针必须为 NULL ,或者 UNICODE_STRING 结构必须描述空字符串。

有关安全字符串函数的详细信息,请参阅 使用安全字符串函数

要求

   
最低受支持的客户端 在 Windows XP 中提供 Service Pack 1 (SP1) 及更高版本的 Windows。
目标平台 桌面
Header ntstrsafe.h (包括 Ntstrsafe.h)
Library Ntstrsafe.lib
IRQL PASSIVE_LEVEL

另请参阅

RtlStringCbCopyUnicodeString

RtlStringCchCopyUnicodeStringEx

UNICODE_STRING