Перехват проблем с extTextOut

Я работаю над программным обеспечением для внедрения dll в С#, внедренная dll также находится в С#, и я использую pinvoke для определенных системных функций.

При использовании extTextOut я получаю зашифрованную строку, и строки смешиваются вместе. Что я делаю неправильно?

Я подключил extTextOut с помощью EasyHook с codeplex.com следующим образом:

try
            {                
                CreateFileHook = LocalHook.Create(
                    LocalHook.GetProcAddress("gdi32.dll", "ExtTextOutW"),
                    new DExtTextOutW(ExtTextOutW_Hooked),
                   this);

                CreateFileHook.ThreadACL.SetExclusiveACL(new Int32[1]);

            }

и мой метод extTextOut

[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.StdCall)]
        static extern bool ExtTextOutW(IntPtr hdc,
                                       int X,
                                       int Y,
                                       uint fuOptions,
                                       [In] ref RECT lprc,
                                       string lpString,
                                       uint cbCount,
                                       [In] IntPtr lpDx);

static bool ExtTextOutW_Hooked(
            IntPtr hdc,
            int X,
            int Y,
            uint fuOptions,
            [In] ref RECT lprc,
            string lpString,
            uint cbCount,
            [In] IntPtr lpDx)
        {


            try
            {
                DemoInjection This = (DemoInjection)HookRuntimeInfo.Callback;

                lock (This.Queue)
                {                    
                    This.Queue.Push(lpString);

                }
            }
            catch
            {
            }           

            return ExtTextOutW(
                 hdc,
                 X,
                 Y,
                 fuOptions,
                 ref lprc,
                 lpString,
                 cbCount,
                 lpDx
                  );

        }

И еще вопрос, если позволите. Как я могу постоянно следить за окном, которое не в фокусе или свернуто (при таком подходе это не работает должным образом)

Большое спасибо!


person psergiu    schedule 30.04.2010    source источник


Ответы (1)


Если я правильно понимаю, что вы имели в виду под «зашифрованной строкой и перепутанными строками», то есть две проблемы, которые могут вам помочь:

  1. Строка может быть выведена как индексы Glyphs, а не как Chars (поэтому будет отображаться как зашифрованный текст).

  2. Вы должны ссылаться только на количество символов, предоставленных параметром cbCount, другие символы в строке могут быть «мусорными».

Надеюсь, это помогло.

person Momico    schedule 07.12.2010
comment
На данный момент я испытываю ту же проблему. Даже когда я просто передаю параметры в функцию ExtTextOutW, у меня все еще есть проблемы в перехваченной программе - она ​​показывает какие-то иероглифы вместо латинского текста. Я уверен, проблема в том, что MarshalAs меняет что-то в исходных данных при преобразовании в строку CLR. Проблема проявляется только при установленном флаге Glyphs, в противном случае хук работает корректно и текст хука не портится. - person Alexander Sobolev; 14.01.2013