阅读:1892回复:2
请问这段代码中strcpy()函数有什么问题?导致系统蓝屏
是一个获取重命名文件名的代码,用的是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... |
|
沙发#
发布于:2008-04-13 10:19
strcpy,要注意字符串的结束字符是否正确,否则越界访问...
|
|
|
板凳#
发布于:2009-10-14 10:19
wcstombs的第三个参数 targetLength 的计算在路径包含中文的时候不准确把。。。
|
|