我有一个用于注射的DLL。这是通过CBT-hook注入的。现在,当想要的时候 通过CBT遇到进程,我用我自己的绕过WinAPI的ExtTextOutW。 ExtTextOutW的规范是:
BOOL ExtTextOutW(HDC hdc,
INT x,
INT y,
UINT flags,
const RECT* lprect,
LPCWSTR str,
UINT count,
const INT* lpDx)
在我的绕道ExtTextOutW中,我试图使用以下代码将str(LPCWSTR)转换为多字节:
BOOL Mine_ExtTextOutW(HDC hdc,
INT x,
INT y,
UINT flags,
const RECT* lprect,
LPCWSTR str,
UINT count,
const INT* lpDx)
{
BOOL rv = Real_ExtTextOutW(hdc, x, y, flags, lprect, str, count, lpDx);
HANDLE h = ::WindowFromDC(hdc);
if (!h || !str)
return ev;
CHAR *buffer = (CHAR *)::LocalAlloc(count + 1);
int l = ::WideCharToMultiByte(CP_APC, 0, str, count, buffer, count, NULL, NULL);
if (l > -1) {
buffer[l] = '\0';
g_pClient->SendViaIPC(buffer);
}
::LocalFree(buffer);
return rv;
}
不幸的是,这不起作用。 WideCharToMultiByte挂起注入的进程。为什么呢?
答案 0 :(得分:2)
您的代码看起来有点奇怪,是否编译?
LocalAlloc应该有两个参数,你的意思是CP_ACP。无论如何,我会:
这样的事情:
int nMultiByteSize = ::WideCharToMultiByte( CP_ACP, NULL, str, count, NULL, 0, NULL, NULL );
if ( nMultiByteSize > 0 )
{
std:string strMulti;
strMulti.resize( nMultiByteSize );
if ( ::WideCharToMultiByte( CP_ACP, NULL, str, count, &strMulti[0], (int)strMulti.size(), NULL, NULL ) > 0)
{
g_pClient->SendViaIPC(strMulti.c_str());
}
}
答案 1 :(得分:0)
我不知道为什么它会挂起你的过程,它看起来应该对我正常工作。你确定这是导致它的WC2MB呼叫吗?一些可能性:
WC2MB的回报值是多少?如果不成功,该函数返回0.
LocalAlloc的返回值是多少?也许分配返回null表示无法分配内存?然后你会为缓冲区传递NULL,但是一些大于0的数字可能会导致崩溃。