簡體   English   中英

讀取REG_BINARY會破壞方法的參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM