функции с префиксом Nt и Zw.

Тема в разделе "WASM.BEGINNERS", создана пользователем asmic, 1 мар 2007.

  1. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Обьясните пожалуйста в чем отлицие функций с Nt префиксом от функций с Zw префиксом из (из ntdll.dll ). Заранее спасибо.
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    http://216.239.59.104/search?q=cache:e0zNVFXlsaMJ:www.osronline.com/article.cfm%3Farticle%3D257+Nt+vs+Zw&hl=ru&ct=clnk&cd=2&gl=ru
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    В ntdll.dll у них одинаковая точка входа (то есть функция по сути одна).
    В ядре:

     
  4. k2

    k2 New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    17
    а у Шрайбера опечатка чтоли?
    обьясните пожалуйста
    какая из них все таки работает через обработчик прерывания?
    зачем вызывать из ядра функцию через INT 2Eh, если цель его - оградить ринг3-приложение от ядра
     
  5. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    Некоторые функции ОС нельзя выполнить в 3 кольце.
     
  6. k2

    k2 New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    17
    rudik
    или я чего не понял или меня
    речь о ntoskrnl.Nt*, ntoskrnl.Zw*
    т.е. в коде драйвера разница в чем если я вызываю NtOpenFile или ZwOpenFile
    и непонятно зачем их сделали, эти Zw*

    и еще может ктонибудь обьяснить этот процесс:
     
  7. someone

    someone New Member

    Публикаций:
    0
    Регистрация:
    30 май 2007
    Сообщения:
    51
    1. функции Nt собсно говоря надстройки над Zw, т.е. когда ты вызываешь функцию нт, происходит некоторые операции, например проверка валидности операндов, а затем вызывается все равно функция Zw.

    2. функции Zw были "изначально"; "сделали" функции Nt.


    когдато мне так объяснили, и никаких проблем у меня не возникло (в смысле проверка на практике показала, что вроде бы так оно и есть)
     
  8. k2

    k2 New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    17
    вово
    а фразу типа
    подразумевают какбы наоброт что Zw надстройки над Nt, как тут не запутаться

    правильно я понял что эти операции происходят в обработчике прерываний?
    значит у шрайбера опечатка вышла
    правильно
    и получается что в драйвере безопаснее работать с Nt*, передача неправильных параметров к Zw может привести к BSOD, в то время как Nt обезопасит?
     
  9. k2

    k2 New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    17
    судя по следующему это распространенное заблуждение, на которое и я попался
    сечас напряг свои английские извилины и осилил статейку, которую дал gilg
    судя по дизассемблерному коду ntoskrnl.ZwReadFile
    Код (Text):
    1. 80504d4c b8b7000000       mov     eax,0xb7
    2. 80504d51 8d542404         lea     edx,[esp+0x4]
    3. 80504d55 9c               pushfd
    4. 80504d56 6a08             push    0x8
    5. 80504d58 e89e550300       call    nt!KiSystemService (8053a2fb)
    6. 80504d5d c22400           ret     0x24
    это аналог вызова ядерных функций из ринга3 из ntdll.dll, и получается что никакой опечатки нет у шрайбера
    Zw работают через шлюз, а Nt - непосредственно сама функция.
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    k2
    Zw* устанавливают PerviuosMode в KernelMode AFAIR и потом уже вызывают Nt*.
    В статье всё хорошо было расписано.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я еще в 3 посте процитировал руссиновича, где правильно написано..
    Насколько я понимаю, если вызов идёт из пользовательского режима, вызывается Zw, которая вызовет Nt, она проверит параметры, т.к. предывдущий режим был пользовательский и сделает все, что нужно, а Zw потом установит предыдущий режим обратно.
    А при вызове из драйверов стоит использовать Nt, получается, что так быстрее - не будет лишних проверок на KeGetPreviousMode и прочего, а Nt не будет проверять параметры, т.к. предыдущий режим ядерный.
    Повторюсь, это мое имхо
     
  12. k2

    k2 New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    17
    Great
    да вот определение это у Русиновича кривое какое-то и неполное, падеж неправильный
    можно подумать Nt сервисы устанавливают предыдущий режим
    не контролируются они в одном случае, если Zw* из KERNEL вызывать
    а если из USER MODE Zw* вызывать, они будут контролироваться

    потому как на самом деле все вызовы Nt* и Zw* из USER MODE, и только вызовы Zw* из KERNEL MODE в конечном итоге проходят через ядерный обработчик KiSystemService, в котором и устанавливается предыдущий режим, затем вызывается Nt* сервис.

    получается что я, только изучающий кернел мод уже утверждаю некоторые истины, что следовало бы делать вам, програмирующим в кернел мод )

    на счет того что лучше в драйвере, насколько я понял, автор советует использовать Zw*, а Nt* только если нужно проверить полученные из USER MODE параметры при передаче их другой ядерной функции.

    теперь не понятна фраза мне у Шрайбера такая
    дизассемблерный код он не привел
    откуда и был мой 1-й вопрос в этой теме
    как видно инструкциями типа INT, SYSINTER даже и не пахнет в ntoskrnl.Zw*, только вызов KiSystemService
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    SYSENTER в режиме ядра это очень интересно
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а почему бы и нет?
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    n0name
    я сомневаюсь что ее можно выполнить нормально в 0 кольце, даже если и можно то куда потом SYSEXIT управление-то передаст? в юзермод.. и этим все и закончится.
    Так что вряд ли SYSENTER в винде используется в ядре)
     
  16. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    несправедливо как то...
    в sysexit знач if CPL!=0 then #GP(0)..., а в sysenter нима проверки на CPL!=3 :)
     
  17. someone

    someone New Member

    Публикаций:
    0
    Регистрация:
    30 май 2007
    Сообщения:
    51
    вот бы сейчас сюда кодера из мелкософта, ну или когото кто точно знает ответ на этот вопрос.
    я, собственно, был уверен что Nt функции - это юзермодовые функции, которые в делают тоже что и Zw но с небольшими дополнениями, проверками, как и положено для юзермода.
    а Zw - тупо вызов соответствующей функции INT 2e.
    хотелось бы узнать точное.
     
  18. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Вот случайно "надыбал".
    Код (Text):
    1. If the system service is exported in the ZwXxx form, it can be used straightforwardly by
    2. kernel mode code. If the service is only exported in the NtXxx form, the kernel mode
    3. code must consider the checks performed on pointers and access to objects, as
    4. described in the Introduction.
    Код (Text):
    1. .text:0040142A ZwSetEvent      proc near
    2. .text:0040142A
    3. .text:0040142A EventHandle     = dword ptr  4
    4. .text:0040142A PreviousState   = dword ptr  8
    5. .text:0040142A
    6. .text:0040142A                 mov     eax, 0BFh
    7. .text:0040142F                 lea     edx, [esp+4]
    8. .text:00401433                 int     2Eh             ; DOS 2+ internal - EXECUTE COMMAND
    9. .text:00401433                                         ; DS:SI -> counted CR-terminated command string
    10. .text:00401435                 retn    8
    11. .text:00401435 ZwSetEvent      endp
    Код (Text):
    1. PAGE:00493813 ; NTSTATUS __stdcall NtSetEvent(HANDLE EventHandle,PULONG PreviousState)
    2. PAGE:00493813                 public NtSetEvent
    3. PAGE:00493813 NtSetEvent      proc near               ; CODE XREF: PAGE:004FC003p
    4. PAGE:00493813                                         ; PAGE:0052F6EFp
    5. PAGE:00493813
    6. PAGE:00493813 EventHandle     = dword ptr  8
    7. PAGE:00493813 PreviousState   = dword ptr  0Ch
    8. PAGE:00493813
    9. PAGE:00493813                 push    ebp
    10. PAGE:00493814                 mov     ebp, esp
    11. PAGE:00493816                 push    0FFFFFFFFh
    12. PAGE:00493818                 push    offset unk_402A88
    13. PAGE:0049381D                 push    offset _except_handler3
    14. PAGE:00493822                 mov     eax, large fs:0
    15. PAGE:00493828                 push    eax
    16. PAGE:00493829                 mov     large fs:0, esp
    17. PAGE:00493830                 push    ecx
    18. PAGE:00493831                 push    ecx
    19. PAGE:00493832                 sub     esp, 18h
    20. PAGE:00493835                 push    ebx
    21. PAGE:00493836                 push    esi
    22. PAGE:00493837                 push    edi
    23. PAGE:00493838                 mov     [ebp-18h], esp
    24. PAGE:0049383B                 xor     ebx, ebx
    25. PAGE:0049383D                 mov     [ebp-4], ebx
    26. PAGE:00493840                 mov     eax, large fs:124h
    27. PAGE:00493846                 mov     [ebp-30h], eax
    28. PAGE:00493849                 mov     al, [eax+134h]
    29. PAGE:0049384F                 mov     [ebp-24h], al
    30. PAGE:00493852                 cmp     al, bl
    31. PAGE:00493854                 mov     esi, [ebp+0Ch]
    32. PAGE:00493857                 jz      short loc_493861
    33. PAGE:00493859                 cmp     esi, ebx
    34. PAGE:0049385B                 jnz     loc_4C3DD7
    35. PAGE:00493861
    36. PAGE:00493861 loc_493861:                             ; CODE XREF: NtSetEvent+44j
    37. PAGE:00493861                                         ; PAGE:004C3DE6j
    38. PAGE:00493861                 push    ebx
    39. PAGE:00493862                 lea     eax, [ebp-1Ch]
    40. PAGE:00493865                 push    eax
    41. PAGE:00493866                 push    dword ptr [ebp-24h]
    42. PAGE:00493869                 push    ExEventObjectType
    43. PAGE:0049386F                 push    2
    44. PAGE:00493871                 push    dword ptr [ebp+8]
    45. PAGE:00493874                 call    ObReferenceObjectByHandle
    46. PAGE:00493879                 mov     [ebp-20h], eax
    47. PAGE:0049387C                 cmp     eax, ebx
    48. PAGE:0049387E                 jl      short loc_4938A4
    49. PAGE:00493880                 push    ebx
    50. PAGE:00493881                 push    dword_46D4B0
    51. PAGE:00493887                 push    dword ptr [ebp-1Ch]
    52. PAGE:0049388A                 call    KeSetEvent
    53. PAGE:0049388F                 mov     edi, eax
    54. PAGE:00493891                 mov     [ebp-28h], edi
    55. PAGE:00493894                 mov     ecx, [ebp-1Ch]
    56. PAGE:00493897                 call    ObfDereferenceObject
    57. PAGE:0049389C                 cmp     esi, ebx
    58. PAGE:0049389E                 jnz     loc_4C3DEB
    59. PAGE:004938A4
    60. PAGE:004938A4 loc_4938A4:                             ; CODE XREF: NtSetEvent+6Bj
    61. PAGE:004938A4                                         ; PAGE:004C3DF7j
    62. PAGE:004938A4                 or      dword ptr [ebp-4], 0FFFFFFFFh
    63. PAGE:004938A8                 mov     eax, [ebp-20h]
    64. PAGE:004938AB                 mov     ecx, [ebp-10h]
    65. PAGE:004938AE                 mov     large fs:0, ecx
    66. PAGE:004938B5                 pop     edi
    67. PAGE:004938B6                 pop     esi
    68. PAGE:004938B7                 pop     ebx
    69. PAGE:004938B8                 leave
    70. PAGE:004938B9                 retn    8
    71. PAGE:004938B9 NtSetEvent      endp ; sp =  24h
    72. PAGE:004938B9