Попытавшись понять почему многие вызовы GDI API из ядра не работают, обнаружил занятную вещь: функции проверяют находится ли возвращаемое значение в user space и если нет - не работают. Например приблизительный код NtGdiGetDCPoint: Код (Text): BOOLEAN NtGdiGetDCPoint(HDC hdc, int type, POINT* point) { BOOLEAN result; POINT point_tmp; SEH_prolog(); result = GreGetDCPoint(hdc, type, &point_tmp); if (result) { if (point_ >= 0x7FFF0000) // здесь если point не в user space функция совершает "самоубийство" *(DWORD*)0x7FFF0000 = 0; *(point) = point_tmp; } SEH_epilog(); return result; } Собственно вопрос - WTF? Зачем нужна проверка аргумента на нахождение в user space? Очевидно, что обойти эту проверку можно аллокируя память для возвращаемого значения в user space. Но не совсем понятно как. Ведь драйвер не может этого делать
Как это не может. ZwAllocateVirtualMemory или MmMapLockedPages. Ой помню я пытался из драйвера CreateWindow сделать)) Столько еб... простите, сношался с NtUserCreateWindowEx, словами не описать
KeUserModeCallback не совсем подходит, так как мой драйвер работает в контексте произвольного user mode процесса. KeUserModeCallback, как я понял, вызывает функцию в том текущем контексте.