Правильная работа с GDI из ядра

Тема в разделе "WASM.NT.KERNEL", создана пользователем katrus, 5 июн 2008.

  1. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Попытавшись понять почему многие вызовы GDI API из ядра не работают, обнаружил занятную вещь: функции проверяют находится ли возвращаемое значение в user space и если нет - не работают. Например приблизительный код NtGdiGetDCPoint:
    Код (Text):
    1. BOOLEAN NtGdiGetDCPoint(HDC hdc, int type, POINT* point)
    2. {
    3.     BOOLEAN result;
    4.     POINT point_tmp;
    5.     SEH_prolog();
    6.     result = GreGetDCPoint(hdc, type, &point_tmp);
    7.     if (result)
    8.     {    
    9.         if (point_ >= 0x7FFF0000)  // здесь если point не в user space функция совершает "самоубийство"
    10.             *(DWORD*)0x7FFF0000 = 0;
    11.         *(point) = point_tmp;
    12.     }
    13.     SEH_epilog();
    14.     return result;
    15. }
    Собственно вопрос - WTF? Зачем нужна проверка аргумента на нахождение в user space? Очевидно, что обойти эту проверку можно аллокируя память для возвращаемого значения в user space. Но не совсем понятно как. Ведь драйвер не может этого делать
     
  2. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    Для таво штобы левые адреса не подсовывали из юзермода.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Как это не может.
    ZwAllocateVirtualMemory или MmMapLockedPages.

    Ой помню я пытался из драйвера CreateWindow сделать)) Столько еб... простите, сношался с NtUserCreateWindowEx, словами не описать:)
     
  4. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Great и что, ролучилось чтонибудь? :)
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Для таких целий и сужествует KeUserModeCallback(->ntdll!KiUserCallbackDispatcher).
     
  6. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    KeUserModeCallback не совсем подходит, так как мой драйвер работает в контексте произвольного user mode процесса. KeUserModeCallback, как я понял, вызывает функцию в том текущем контексте.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Так приаттачится можно к любому.