2013-05-15 33 views
0

MSDN稱,與RegEnumValue了字符串數據RegEnumValue和REG_MULTI_SZ類型

如果數據是REG_SZ,REG_MULTI_SZ或REG_EXPAND_SZ類型, 字符串可能不被存儲以空終止 字符。因此,即使該函數返回ERROR_SUCCESS, 應用程序應該確保該字符串在使用前正確終止 ;否則,它可能會覆蓋緩衝區。 (請注意, REG_MULTI_SZ字符串應該有兩個空的結束字符)。

假設值是REG_MULTI_SZ,這是否意味着每個序列中的字符串可以或不可以是空值終止,或者僅僅只最後一個雙空終止符可能不存在,但所有內空終止符都存在?

回答

2

假設值是REG_MULTI_SZ,這是否意味着每個序列中的字符串可以或不可以是空值終止

序列中的字符串必須被空終止否則將無法確定其中一個字符串結束和下一個字符串開始的位置。從Registry Value Types描述REG_MULTI_SZ

 
A sequence of null-terminated strings, terminated by an empty string (\0). 
The following is an example: 

    String1\0String2\0String3\0LastString\0\0 

The first \0 terminates the first string, the second to the last \0 terminates 
the last string, and the final \0 terminates the sequence. 
Note that the final terminator must be factored into the length of the string. 

的文檔是模糊的,但我的理解是,最後空終止可能會丟失:

String1\0String2\0String3\0LastString 

和讀碼值必須確保它們存在後續列提取。

如果用於包含該值的緩衝區足夠大,包括用於終止空字符的空間,只要代碼確保尾隨空值存在,則沒有任何事項需要關注。

1

你必須小心只爲最後的終結者。只需檢查它是否存在。

1

這是處理C字符串的程序中的一個非常常見的錯誤,他們很容易使用strlen()或wcslen()來測量字符串長度並將其作爲RegSetValueEx()的參數傳遞。忘記零終止符,那些錯誤的錯誤是猖獗的。 Windows不關心,它只是寫字節,並不試圖解釋字符串。

因此,當您讀取註冊表值時會出現問題,您將得到沒有零終止符的字節。如果您再次將其解釋爲C字符串,則只有0.4%的機率可以看到實際的字符串,使用調試分配器時的可能性爲零。你可以通過自己編寫零終止符來避免它。如果它已經存在,則無關緊要,以可能的緩衝區溢出爲模,如果不是的話,則使用不良數據避免程序。