1

根据 MSDN 文档,RtlStringCbCopy 安全字符串函数应该是这样的:

NTSTATUS RtlStringCbCopy(
  __out  LPTSTR pszDest,
  __in   size_t cbDest,
  __in   LPCTSTR pszSrc)

但是当我编译我的代码时,ddk 说:

1>c:\work\mydevdrv\loopback\driver.cpp(421):错误 C2664:“RtlStringCbCopyW”:无法将参数 1 从“LPTSTR”转换为“NTSTRSAFE_PWSTR”链接可执行文件 - i386\loopback.sys 1>链接:错误LNK1181:无法打开输入文件 'c:\work\mydevdrv\loopback\objchk _wxp_x86\i386\driver.obj' 构建:完成时间:2011 年 4 月 19 日星期二 20:21:51

似乎它期望第一个参数的类型是 NTSTRSAFE_PWSTR 而不是 LPTSTR。但是这种 NTSTRSAFE_PWSTR 类型从未在 MSDN 文档中提及。那么我应该使用哪种类型?

我对这个函数的调用是这样的:

RtlStringCbCopyW((LPTSTR)pIrp->UserBuffer, 1024 ,L"return value from driver");
4

1 回答 1

2

你的电话是错误的。

这应该是:

RtlStringCbCopyW( (wchar_t*) pIrp->UserBuffer, 1024 ,L"return ...");

这是因为 LPTSTR 中的“T”表示“依赖于 unicode 构建”。内核模式驱动程序不使用它。您始终应该知道您真正使用的字符串是什么,并且不应该依赖于 win32 api 中的“unicode”hack。

注意:Win32 通过在 2 个变体中具有所有(/大多数)功能来执行“T”类型映射。W 和 A 版本 (DrawTextA/DrawTextW)。编译器在调用非后缀版本时将解析到的版本只是将函数名称定义为相应的版本。(DrawText 解析为 DrawTextA 或 DrawTextW)。这不是很健壮,最好在代码中通过对要传递的字符串使用正确的函数来绕过。


NTSTRSAFE_PWSTR定义如下:

typedef __nullterminated wchar_t* NTSTRSAFE_PWSTR;

__nullterminatedprefast 工具用于检查参数。Prefast 是一个静态代码分析器。在这种情况下,它可能意味着“保证输出为空终止”。

于 2011-04-19T13:15:34.513 回答