[英]Reading a REG_BINARY corrupt the method's parameters
我正在嘗試使用以下代碼讀取REG_BINARY。 value
以正確的字符串結尾,但是在return語句后出現Acces違規錯誤。 經過一些調試后,我發現執行RegQueryValueExW
后該方法的參數被廢話覆蓋(例如, name
以“ test”開頭,並在RegQueryValueExW之后變為“ \\0ÎÎvv&...”)。
string GetREG_BINARYValue(HKEY hkey, DWORD cbData, wstring name)
{
DWORD* data = new DWORD[cbData];
DWORD size = cbData;
if( RegQueryValueExW(hkey,name.c_str(), NULL, NULL, reinterpret_cast<LPBYTE>(&data), &size) != ERROR_SUCCESS)
{
RegCloseKey(hkey);
return "Could not read REG_BINARY registry value";
}
string value = ByteArrayToString((BYTE*)&data, size);
return value;
}
該函數從以下方法調用:
string RegistryReader::ReadRegValue(HKEY root, string key, string name)
{
HKEY hkey;
DWORD type;
DWORD cbData;
string result;
wstring wkey, wname;
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
wkey=converter.from_bytes(key);
wname=converter.from_bytes(name);
if (RegOpenKeyExW(root, wkey.c_str(), 0, KEY_ACCESS_DEF64 , &hkey) != ERROR_SUCCESS)
{
if (RegOpenKeyExW(root, wkey.c_str(), 0, KEY_ACCESS_DEF32, &hkey) != ERROR_SUCCESS)
{
return "Could not find registry key";
}
}
if (RegQueryValueExW(hkey, wname.c_str(), NULL, &type, NULL, &cbData) != ERROR_SUCCESS)
{
RegCloseKey(hkey);
return "Could not open registry value";
}
switch (type)
{
case REG_SZ:
result=GetREG_SZValue(hkey, cbData, wname);
break;
case REG_DWORD:
result=GetREG_DWORDValue(hkey, cbData, wname);
break;
case REG_BINARY:
result=GetREG_BINARYValue(hkey, cbData, wname); //<--Here
break;
default:
return "Invalid data type";
break;
}
return result;
}
起初我雖然是一個數組大小問題,但最終還是得到了正確的結果,而cbData
始終包含我期望的大小。 我可能對RegQueryValueExW
做錯了事,但是我很難找到明確的文檔。 這段代碼顯然有什么問題嗎?
您的代碼有很多錯誤。 我在對問題的評論中列出了很多。 根本的問題是必須將一個指向長度為size
的數組的指針傳遞給RegQueryValueExW
。 但是你沒有。
現在, data
是一個指向DWORD
數組的指針,該數組的長度為size
。 因此它包含的字節數是您需要的四倍。 這本身還不錯。 但是,而不是傳遞data
,傳遞&data
。 這是指針的地址而不是數組的地址。 然后,當API函數覆蓋指針而不是寫入其指向的緩沖區時,您將調用未定義的行為。
必須投出的事實應該是第一個警告信號。 盡量不要投。 我再說一遍,盡量不要投。 當您強制轉換時,停止編譯器查找錯誤。 當編譯器告訴您您犯了一個錯誤時,請不要通過強制轉換忽略它。 聽這個。
如果必須使用以下全部大寫的Windows類型,則需要分配BYTE
數組:
BYTE* data = new BYTE[cbData];
現在,您可以將data
而不是&data
傳遞給API函數。 顯然也將data
傳遞給ByteArrayToString
。 並記得在完成處理后刪除該數組。
正如我在對問題的評論中所說的那樣,還有很多其他錯誤,我真的不想參與調試和更正所有這些錯誤。 希望我對您的評論給予了很好的指導,其余的歸您所有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.