C++ C++;读取LPCVOID指针的值

C++ C++;读取LPCVOID指针的值,c++,kernel32,detours,C++,Kernel32,Detours,我在kernel32.dll的Writefile命令上有一个钩子。钩子正在被触发,但是,我无法读取缓冲区内容 目标:Msgbox显示发送到com端口的缓冲区内容 问题:msgbox正在打印一系列看似随机的数字,我假设这是内存地址,而不是lpBuffer的实际内容 C++代码: void hookedFunc(HANDLE hfile, LPCVOID * lpBuffer, DWORD nNumberBytesToWrite, LPWORD lpNumberofBytesWritten, LPO

我在kernel32.dll的Writefile命令上有一个钩子。钩子正在被触发,但是,我无法读取缓冲区内容

目标:Msgbox显示发送到com端口的缓冲区内容

问题:msgbox正在打印一系列看似随机的数字,我假设这是内存地址,而不是lpBuffer的实际内容

C++代码:

void hookedFunc(HANDLE hfile, LPCVOID * lpBuffer, DWORD nNumberBytesToWrite, LPWORD lpNumberofBytesWritten, LPOVERLAPPED lpOverlapped) {

    char *pString = reinterpret_cast<char *>(lpBuffer);

    //Msgbox - arg 1//////////////////////////////////////////////////////////////////////////////
    WCHAR szTest[45];
    swprintf_s(szTest, 45, L"%d|\n", pString);
    MessageBox(NULL, szTest, L"BUFFER CONTENTS", MB_OK);
    swprintf_s(szTest, 45, L"%d", nNumberBytesToWrite);
    MessageBox(NULL, szTest, L"TEST", MB_OK);

}
void hookedFunc(句柄hfile,LPCVOID*lpBuffer,DWORD nNumberBytesToWrite,LPWORD lpnumberofbytes writed,LPOVERLAPPED LPOVERLAPPED){
char*pString=reinterpret_cast(lpBuffer);
//Msgbox-arg 1//////////////////////////////////////////////////////////////////////////////
WCHAR-szTest[45];
swprintf_s(szTest,45,L“%d |\n”,pString);
MessageBox(NULL,szTest,L“缓冲区内容”,MB_OK);
swprintf_s(szTest,45,L“%d”,nNumberBytesToWrite);
消息框(空,szTest,L“TEST”,MB_OK);
}
LPCVOID是指针(指向常数),lpBuffer是指向该指针的指针。我想

const char* pString = reinterpret_cast<const char *>(*lpBuffer);
const char*pString=reinterpret_cast(*lpBuffer);
是您想要的。LPCVOID是指针(指向常量),lpBuffer是指向该指针的指针。我想

const char* pString = reinterpret_cast<const char *>(*lpBuffer);
const char*pString=reinterpret_cast(*lpBuffer);

是您想要的。

在您的示例中,
szTest
将包含垃圾,因为

swprintf_s(szTest, 45, L"%d|\n", pString);
表示将
pString
解释为整数(感谢
%d
),并将该整数转换为ascii并存储在
szTest

是的,你正在打印一个地址,但可能只是其中的一部分

增编:
长颈鹿船长的回答指出了另一个错误:你找错了字符串的位置。

在你的示例中,
szTest
将包含垃圾,因为

swprintf_s(szTest, 45, L"%d|\n", pString);
表示将
pString
解释为整数(感谢
%d
),并将该整数转换为ascii并存储在
szTest

是的,你正在打印一个地址,但可能只是其中的一部分

增编:
Giraffe上尉的回答指出了另一个错误:您找错了字符串的位置。

将%d更改为%s会导致程序出错crash@user1698144原因有两个。一个是Giraffe队长在回答中指出的错误,另一个是
\u s
函数默认在输入错误时中止程序,而不是在未定义的行为后尝试跛行。你有两个bug,不是一个。这个程序的唯一目的就是找到那个值。在实现了Griaffe的修复后,msgbox会输出,但它完全是胡言乱语。看起来就像是同一个汉字反复出现,以启动调试器并查看到底发生了什么。缓冲区里有什么?既然它是指向指针的指针,你确定应该有什么东西在那里吗?通常,当您将指向指针的指针视为参数时,函数应为其他人提供指针。缓冲区应包含指向串行端口的命令(0x0A、0xA0、0x50、0x05)。查看VS debugger中的指针,显示它指向mem地址0x0c5cdb20。问题似乎是我的角色转换和输出到msgbox?将%d更改为%s会导致程序失败crash@user1698144原因有两个。一个是Giraffe队长在回答中指出的错误,另一个是
\u s
函数默认在输入错误时中止程序,而不是在未定义的行为后尝试跛行。你有两个bug,不是一个。这个程序的唯一目的就是找到那个值。在实现了Griaffe的修复后,msgbox会输出,但它完全是胡言乱语。看起来就像是同一个汉字反复出现,以启动调试器并查看到底发生了什么。缓冲区里有什么?既然它是指向指针的指针,你确定应该有什么东西在那里吗?通常,当您将指向指针的指针视为参数时,函数应为其他人提供指针。缓冲区应包含指向串行端口的命令(0x0A、0xA0、0x50、0x05)。查看VS debugger中的指针,显示它指向mem地址0x0c5cdb20。问题似乎是我的演员和输出到msgbox?