一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现4
? ? ? ? 今天為了KPI,搞了一天的PPT,搞得惡心想吐。最后還是回到這兒,這兒才是我的凈土,可以寫寫我的研究。
? ? ? ? 這兒講一些Reactos中一些明顯的錯誤。(轉載請指明出處)
? ? ? ? 在Reactos的RegQueryInfoKeyW中有段這樣的實現
if (lpcbMaxSubKeyLen != NULL){*lpcbMaxSubKeyLen = FullInfo->MaxNameLen / sizeof(WCHAR) + 1;}if (lpcbMaxClassLen != NULL){*lpcbMaxClassLen = FullInfo->MaxClassLen / sizeof(WCHAR) + 1;}if (lpcbMaxValueNameLen != NULL){*lpcbMaxValueNameLen = FullInfo->MaxValueNameLen / sizeof(WCHAR) + 1;}
? ? ? ? 這兒存在一個明顯的錯誤,當待查詢鍵不存在子鍵時,最長子鍵名長度肯定是0啊,怎么會是1呢?同樣的錯誤出現在最長Class長度和最長項名長度。Reactos源碼中對這些長度數據的處理最后都加上了1,使我很不解,看MSDN,對這些變量的說明是pcMaxSubKeyLen?[out, optional]
A pointer to a variable that receives the size of the key's subkey with the longest name,in Unicode characters, not including the terminating?null?character. This parameter can be?NULL.
lpcMaxClassLen?[out, optional]
A pointer to a variable that receives the size of the longest string that specifies a subkey class, in Unicode characters. The count returned does not include the terminating?null?character.This parameter can be?NULL.
lpcMaxValueNameLen?[out, optional]
A pointer to a variable that receives the size of the key's longest value name, in Unicode characters. The size does not include the terminating?null?character. This parameter can be?NULL.
? ? ? ? 可以見得,這些數據都不含結尾符的,那干嘛還要+1呢?我只能理解為,如果數據沒按WCHAR對齊,在除以sizeof(WCHAR)后,數據將“缺”一位,于是就要多加一個1。但是它沒有考慮到子鍵和子項不存在的情況。
? ? ? ? 我修改后的代碼是
if ( NULL != lpcMaxSubKeyLen ) {*lpcMaxSubKeyLen = ( ( FullInfo->MaxNameLen + 1 ) & ~1 ) / sizeof(WCHAR);}if ( NULL != lpcMaxClassLen ) {*lpcMaxClassLen = ( ( FullInfo->MaxClassLen + 1 ) & ~1 ) / sizeof(WCHAR);}if ( NULL != lpcMaxValueNameLen ) {*lpcMaxValueNameLen = ( ( FullInfo->MaxValueNameLen + 1 ) & ~1 ) / sizeof(WCHAR);}
總結
以上是生活随笔為你收集整理的一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现4的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一种注册表沙箱的思路、实现——研究Rea
- 下一篇: PE文件和COFF文件格式分析--概述