Перехватил NtGdiExtTextOutW, но как выяснилось, она не вызывается напрямую. Смотрю реализацию ExtTextOutW, там вызова сервиса не происходит, вместо этого вызывается не экспортируемая _bBatchTextOut. Внутри используя указатель pGdiSharedHandleTable строки куда то там копируются. Дадее идет вызов NtGdiFlush(), и в ядре каким то образом эти строки извлекаются и отображаются. Собственно вопрос - как этот текст получить и где взять описание GdiSharedHandleTable.
А описание можете взять из "Windows Graphics Programming: Win32 GDI and DirectDraw" (Feng Yuan), для NT 6 небольшие изменения есть, но думаю, быстро разберетесь.
Так к сожалению не получится тк в NtGdiFlushUserBatch строка не через стек передается. Стек ExtTextOutW к тому времени не существует. klzlk Все верно, буду хукать NtGdiFlushUserBatch а не NtGdiFlush.
Упустил из виду очевидную вещь "после чего вызов любого теневого сервиса приведёт к вызову калбэка NtGdiFlushUserBatch()" SSDT хук тут не подходит. Таблица адресов колбэков заполняется при загрузке win32k с помощю функции PsEstablishWin32Callouts. Сама таблица адресов колбэков находится в ntoskrnl, я ее нашел добавлением смещения к KeServiceDescriptorTable. Может кому то пригоднится.
assorted Вопрос за чем это надо? тем более таким способом ... Так как ядро будет легко ронять, скорее всего ...
У вас есть конструктивные предложения про перехвату текста от ExtTextOutW? Не вижу по какой причение "ядро будет легко ронять"
Почему перехват происходит в ядре? Фузинг роняет такие вещи на раз, точнее механизм буферизации очень сложен в реализации для таких вещей ... Это какой форм грабер? тогда адекватный вопрос время жизни объекта(текста) в драйвере? А как на счет компабилити DC и DIB bitmpa ? где количество вывода текста может расти как минимум с алго прогрессией не используя дополнительную память ... П.С. возможен ли инжект в процесс ?
shchetinin Хуки в юземоде не приемлимы. Количество вывода, думаю, не такое уж большое для конкретного PID. "На счет компабилити DC и DIB bitmpa" - имеете виду я не узнаю успешно ли текст вывелся или нет? Это не столь важно. Не понятно почему я не могу в хуке перед вызовом оригинальной NtGdiFlushUserBatch дергать текст, как вы говорите. Буду пробовать. Если это способ не оптимальный то какие еще есть идеи?
Еще такое навравление есть. Внутри ExtTextOutW cmp _GdiBatchLimit, 1 jbe loc_77F1AB62 Если GdiBatchLimit не более 1 то NtExtTextOutW все же вызывается.