

easyhookを利用してExtTextOutをフックしました。  
実際にコンソールに出力してみるとテキストの内容が実際の入力と29ほどずれてしまいます。  
例えばabcと入力するとコンソールにはDEFと表示されます。  
なぜなのでしょうか？  
フックしている箇所のコードは下記のとおりです。  
それ以外の部分は  
<https://github.com/EasyHook/EasyHook-
Tutorials/tree/master/Managed/RemoteFileMonitor>  
を参考に作成しています。

[code]

        bool ExtTextOut_Hook(
            IntPtr hdc,
            int x,
            int y,
            uint fuOptions,
            [In] ref RECT lprc,
            string lpString,
            uint cbCount,
            [In] IntPtr lpDx)
        {
            try
            {
                lock (this._messageQueue)
                {
                    this._messageQueue.Enqueue(string.format("{0}", lpString);
                }
            }
            catch
            {
            }
    
            return ExtTextOutW(
                hdc,
                x,
                y,
                fuOptions,
                ref lprc,
                lpString,
                cbCount,
                lpDx);
        }
    
[/code]


CC BY-SA 3.0
2017-02-09T02:04:20.270
32517
2017-02-09T14:56:31.117
2298
question
c#
lpstringの内容が実際に入力した値とずれる


こちらで試したところ問題なくフックできます。  
c++ フック対象プロセス(32bit)

[code]

    #include <Windows.h>
    #include <string>
    #include <iostream>
    
    int main()
    {
        wchar_t str[] = L"abcdef";
        ::ExtTextOutW(NULL, 0, 0, 0, nullptr, str, _countof(str), nullptr);
        std::string tmp;
        std::getline(std::cin, tmp);
        return 0;
    }
    
[/code]

C# フックDLL  
FileMonitorHook/InjectionEntryPoint.cs  
への追加コード

[code]

        public void Run(
            EasyHook.RemoteHooking.IContext context,
            string channelName)
        {
             //省略
    
             var extextouthook = EasyHook.LocalHook.Create(
                EasyHook.LocalHook.GetProcAddress("gdi32.dll", "ExtTextOutW"),
                new ExtTextOutW_Delegate(ExtTextOutW_Hook),
                this);
    
             //省略
    
             extextouthook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
             //省略
    
        }
    
        //省略
    
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left, Top, Right, Bottom;
    
        }
        [DllImport("gdi32.dll", EntryPoint = "ExtTextOutW")]
        static extern bool ExtTextOut(IntPtr hdc, int X, int Y, uint fuOptions,
       [In] ref RECT lprc, [MarshalAs(UnmanagedType.LPWStr)] string lpString,
       uint cbCount, [In] IntPtr lpDx);
    
        [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        delegate bool ExtTextOutW_Delegate(
            IntPtr hdc,
            int x,
            int y,
            uint options,
            [In] ref RECT lprc,
            string lpString,
            uint c,
            IntPtr lpDx
            );
        bool ExtTextOutW_Hook(
            IntPtr hdc,
            int x,
            int y,
            uint options,
            [In] ref RECT lprc,
            string lpString,
            uint c,
            IntPtr lpDx
            )
        {
            bool result = ExtTextOut(hdc, x, y, options,ref lprc, lpString, c, lpDx);
            try
            {
                lock (this._messageQueue)
                {
                    if (this._messageQueue.Count < 1000)
                    {
                        if (string.IsNullOrEmpty(lpString))
                        {
    
                        }else
                        {
                            string msg = "ExtTextOutW_Hook:" + lpString;
                            this._messageQueue.Enqueue(msg);
                        }
                    }
                }
            }
            catch
            {
            }
            return result;
        }
    
        //省略
    
[/code]

"abcdef"  
という入力に対して  
ExtTextOutW_Hook:abcdef  
とコンソールに表示されます。

> 実際にコンソールに出力してみるとテキストの内容が実際の入力と29ほどずれてしまいます。  
>  例えばabcと入力するとコンソールにはDEFと表示されます。

「abcと入力すると」というのはExtTextOutWに対して"abc"として引数を渡したのでしょうか？  
何か別の操作を行ったように思えます。  
そのあたりを詳しく記載したほうが、あなたが何に疑問を持っているか分かると思います。


CC BY-SA 3.0
2017-02-09T14:56:31.117
32537
2017-02-09T14:56:31.117
20114
32517
answer