dt1985324
驱动牛犊
驱动牛犊
  • 注册日期2008-05-06
  • 最后登录2009-02-10
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望106点
  • 贡献值1点
  • 好评度20点
  • 原创分0分
  • 专家分0分
阅读:1569回复:9

一个简单问题

楼主#
更多 发布于:2008-07-31 12:02
UNICODE_STRING dst;
UNICODE_STRING src ;            
UNICODE_STRING src = RtlInitUnicodeString(L”123”);
UNICODE_STRING dst = RtlInitUnicodeString(L”456”);

RtlCopyUnicodeString(&dst,&src);    // 字符串拷贝!

这样是否会蓝屏?
应该怎么样去自由更改已经初始化后的dst字符串?
dt1985324
驱动牛犊
驱动牛犊
  • 注册日期2008-05-06
  • 最后登录2009-02-10
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望106点
  • 贡献值1点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-07-31 12:04
菜鸟问题 谢谢大家指教
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
板凳#
发布于:2008-08-02 07:50
应该不会,如果蓝了,看dump找原因
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地板#
发布于:2008-08-02 07:51
没必要重复声明吧?去前两行去掉即可
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
dt1985324
驱动牛犊
驱动牛犊
  • 注册日期2008-05-06
  • 最后登录2009-02-10
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望106点
  • 贡献值1点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-08-05 08:47
不知道蓝的原因啊..
反正我后来是重新分配了一块足够大的内存给目标字符串,然后拷贝才成功,
不过这样,就需要自己手动释放内存了

不知道有没有聪明的办法..
Gmxpsoft
驱动牛犊
驱动牛犊
  • 注册日期2007-09-20
  • 最后登录2011-10-11
  • 粉丝1
  • 关注0
  • 积分3分
  • 威望61点
  • 贡献值1点
  • 好评度30点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2008-08-05 12:50
RtlInitUnicodeString(L”123”);
???
RtlInitUnicodeString函数是这么定义的吗?莫非我用的DDK已经过时了?
dreamsity
驱动小牛
驱动小牛
  • 注册日期2006-09-01
  • 最后登录2013-07-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望821点
  • 贡献值1点
  • 好评度68点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2008-08-06 00:35
对啊,好像参数不对吧。
一切都是时间问题!
dt1985324
驱动牛犊
驱动牛犊
  • 注册日期2008-05-06
  • 最后登录2009-02-10
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望106点
  • 贡献值1点
  • 好评度20点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-08-07 11:39
确实是写错了

粗心

我找了一下 ,好想真的没有封装好的字符串赋值函数....

我自己定义了一个

首先判断目标字符串BUF是否空,不空就释放,

然后根据源字符串大小分配目标字符串的内存空间

最后在COPY
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
8楼#
发布于:2008-08-07 12:28
会蓝....
因为dst的buffer指向一个const的区域
不能写的...所以会蓝

RtlInitUnicodeString很简单
if(input)
{
 string->Length = wcslen(input) * sizeof(WCHAR);
 string->Buffer = input;
 string->MaximumLength = string->Length + sizeof(WCHAR);
}
else
{
  string->Length = 0;
  string->Buffer = 0;
  string->MaximumLength = 0;
}

改本身没问题
问题出在你的dst的缓冲区是一个只读的缓冲区不能写的
所以蓝了
dt1985324
驱动牛犊
驱动牛犊
  • 注册日期2008-05-06
  • 最后登录2009-02-10
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望106点
  • 贡献值1点
  • 好评度20点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2008-08-07 15:49
谢谢tiamo,那个好象是一个常量空间,确实不能写.

就算不是常量空间,也不能直接复制,因为不能确定两个字符串的缓冲区大小相同,可能出现字符串被截断.

内核中使用真的很麻烦,连赋值都需要自己定义一个函数.
游客

返回顶部