Windows驱动程序工具包的RtlStringCbCopy函数

| 根据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。但是,在MSDN文档中从未提到过这种NTSTRSAFE_PWSTR类型。那么我应该使用哪种类型? 我对此函数的调用是这样的:
RtlStringCbCopyW((LPTSTR)pIrp->UserBuffer, 1024 ,L\"return value from driver\");
已邀请:
你打错了 这应显示为:
RtlStringCbCopyW( (wchar_t*) pIrp->UserBuffer, 1024 ,L\"return ...\");
这是由于以下事实:LPTSTR中的“ T”表示“依赖于unicode构建”。内核模式驱动程序不使用此功能。您总是应该知道您真正使用的是什么字符串,并且不应该在win32 api中的'unicode \'hack上de恼。 注意:Win32通过将所有(/大多数)功能分为2个变体来进行\'T \'类型映射。 W和A版本(DrawTextA / DrawTextW)。 comipler在调用非后缀版本时将解析为的版本只是将函数名称定义为相应的版本。 (DrawText解析为DrawTextA或DrawTextW)。这不是很可靠,最好通过对要传递的字符串使用正确的函数在代码中绕过它。
NTSTRSAFE_PWSTR
定义如下:
typedef __nullterminated wchar_t* NTSTRSAFE_PWSTR;
预快速工具使用ѭ5来检查参数。 Prefast是静态代码分析器。在这种情况下,它可能意味着“保证输出为null终止”。

要回复问题请先登录注册