wax_see
驱动牛犊
驱动牛犊
  • 注册日期2008-04-12
  • 最后登录2009-05-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望6点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:1892回复:2

请问这段代码中strcpy()函数有什么问题?导致系统蓝屏

楼主#
更多 发布于:2008-04-13 00:10
是一个获取重命名文件名的代码,用的是guyu_susa 在http://bbs.driverdevelop.com/htm_data/16/0211/25944.html中的一段代码,不过我的系统是XP。


/////////////代码要用到的数据定义
#define MAXPATHLEN      1024
PFILE_RENAME_INFORMATION                          renameInfo;  
char                *destname = NULL;    
WCHAR                * NewNameBuffer;
ULONG                startOffset = 0;
ULONG                prependChars = 0;
ULONG                targetLength = 0;
WCHAR                DriveLetter;
char                tmpbuf[MAXPATHLEN];
///////////


if (renameInfo->FileName[0] != L'\\')
{
    destname[0]=0;
    return (STATUS_SUCCESS);
}
if (0 == _wcsnicmp(L"\\DosDevices\\", renameInfo->FileName, 12))
{
    startOffset = 12;
}
else
{
    //for \"\\??\\\"
    if(0==_wcsnicmp(L"\\??\\",renameInfo->FileName,4))
        startOffset=4;
    else
        
        prependChars = 2;
}
targetLength = (renameInfo->FileNameLength/sizeof(WCHAR))-startOffset + prependChars + 1;
// make room for NULL too
if (targetLength < 4) {
    // must be at least \"D:\\\"
    return (STATUS_SUCCESS);
}
NewNameBuffer = ExAllocatePool(PagedPool, targetLength * sizeof(WCHAR));
if (NewNameBuffer == NULL) {
    destname[0]=0;
    return (STATUS_INSUFFICIENT_RESOURCES);
}
if (prependChars) {
    NewNameBuffer[0] = DriveLetter;
    NewNameBuffer[1] =  L':';
}
wcsncpy(NewNameBuffer, &renameInfo->FileName[startOffset],targetLength-1);
//把wchar 转换为char
wcstombs(tmpbuf,NewNameBuffer,targetLength-1/*MAXPATHLEN*/);
tmpbuf[targetLength-1]=0;
ExFreePool(NewNameBuffer);
if(0 == _strnicmp("\\??\\",tmpbuf,4))
{
   strcpy(destname,tmpbuf+4);
}
else
{
     strcpy(destname,tmpbuf); //调试到这里出现蓝屏
}



调试到strcpy(destname,tmpbuf); 前所有的变量里的内容都是正确的,一到strcpy就蓝屏。有点疑问的是ExFreePool(NewNameBuffer)后NewNameBuffer的内容还是没有改变,不知道是不是这个导致的问题。

还有调试的时候不知道有什么办法可以Irpstack->parameter.SetfFile下的完整的内容,默认只能看到两个?

在此先谢谢各位大哥大姐o(∩_∩)o...
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
沙发#
发布于:2008-04-13 10:19
strcpy,要注意字符串的结束字符是否正确,否则越界访问...
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
nth2say
驱动牛犊
驱动牛犊
  • 注册日期2009-10-09
  • 最后登录2014-03-17
  • 粉丝1
  • 关注0
  • 积分28分
  • 威望281点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-10-14 10:19
wcstombs的第三个参数 targetLength 的计算在路径包含中文的时候不准确把。。。
游客

返回顶部