无法使:: WideCharToMultiByte工作

时间:2009-09-04 08:05:09

标签: c++ detours

我有一个用于注射的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挂起注入的进程。为什么呢?

2 个答案:

答案 0 :(得分:2)

您的代码看起来有点奇怪,是否编译?

LocalAlloc应该有两个参数,你的意思是CP_ACP。无论如何,我会:

  • 请问WideCharToMultiByte的大小是否正确,以防您日后更改代码页。
  • 检查> 0(故障由0表示,而不是-1)
  • 使用std字符串只是为了确保没有任何内存泄漏,例外等。

这样的事情:

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呼叫吗?一些可能性:

  1. 你为什么使用LocalAlloc?在堆栈上使用缓冲区是不够的?
  2. 也许是“SendViaIPC”挂了?
  3. 你要转换的字符串有多大?也许缓冲区的大小不足?
  4. WC2MB的回报值是多少?如果不成功,该函数返回0.

    LocalAlloc的返回值是多少?也许分配返回null表示无法分配内存?然后你会为缓冲区传递NULL,但是一些大于0的数字可能会导致崩溃。