2015-10-28 73 views
2

我一直在寻找有关这个问题的网络,这对我来说似乎很奇怪。 在我的节目我对下面的代码获取计算机的名称:GetComputerNameW在Windows 10中导致缓冲区溢出

TCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1]; 

memset(ComputerName, 0, sizeof(ComputerName)); 

DWORD dwNameLenght = MAX_COMPUTERNAME_LENGTH; 

GetComputerNameW(ComputerName, &dwNameLenght); 

我与包含Unicode字符的计算机名(ÆÆØ)测试,它工作正常(虽然GetLastError()返回代码203)。 如果名称是DESKTOP-IVHSIQD没有计算机名称,GetLastError()返回111,这被称为缓冲区溢出。 操作系统是Windows 10 x64。

+0

是否定义了UNICODE?而对于这个问题,如果你打算使用免除宏并直接使用'GetComputerNameW',为什么使用'TCHAR'而不是'wchar_t'? –

回答

4

我觉得你的缓冲区确实太小了,...上GetComputerNameW状态的文档:

lpnSize [IN,OUT] - 在输入时,指定缓冲区的大小,在TCHARS。输出时,复制到目标缓冲区的TCHAR数量不包括终止空字符。 lpnSize参数指定所需缓冲区的大小,包括终止空字符。

对我来说,意味着这两个缓冲区本身,及其在lpnSize大小应足以容纳最长的计算机名和后\0

您的缓冲区大小为MAX_COMPUTERNAME_LENGTH + 1(根据说明文件无误),但dwNameLenght的值小于1个字符。 DESKTOP-IVHSIQD也似乎完全是MAX_COMPUTERNAME_LENGTH长(15个字符),所以我会说当\0被追加到缓冲区时发生溢出。将dwNameLenght设置为MAX_COMPUTERNAME_LENGTH + 1可能会解决您的问题。

+0

谢谢!这正是问题所在。似乎我需要非常小心的文档:) –

+0

@AlexanderDemerdzhiev,不客气。 – SingerOfTheFall

+0

@AlexanderDemerdzhiev:的确你必须小心。当Windows告诉你传递缓冲区的长度时,你不应该传递长度1。 – MSalters