关于RegEnumValue获得的字符串数据,
如果数据具有REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ类型,则字符串可能没有使用正确的空终止字符存储。因此,即使函数返回ERROR_SUCCESS,应用程序也应该确保字符串在使用它之前被正确终止;否则,它可能会覆盖缓冲区。(请注意,REG_MULTI_SZ字符串应该有两个空终止字符。)
假设一个值是REG_MULTI_SZ,这是否意味着序列中的每个字符串都可以或不能为空终止,或者仅仅表示只有最后一个双空终止符可能不存在,但所有内部空终止符都存在?
发布于 2013-05-15 11:00:10
你得照顾好最后一个终结者。只需检查它是否在那里。
发布于 2013-05-15 12:44:58
在处理C字符串的程序中,这是一个非常常见的错误,它们很容易使用strlen()或wcslen()来测量字符串长度,并将其作为RegSetValueEx()的RegSetValueEx参数传递。忘记了零终结者,那些与世隔绝的虫子是猖獗的。Windows并不在意,它只是写字节,不尝试解释字符串。
所以问题是,当您读取注册表值时,您将得到没有零终止符的字节。如果您再次将它解释为C字符串,那么在使用调试分配器时,您只会看到实际字符串的概率为0.4%,而不可能看到实际的字符串。你只需自己写“零终结者”就可以避免它。如果它已经存在了,那么没关系,模块化一个可能的缓冲区溢出,如果不是,那么您就避免了使用坏数据的程序。
https://stackoverflow.com/questions/16563208
复制相似问题