Re: Ф-ции из DDK заюзать в User-mode

From
Ilya Rudakov Aka Random (2:50/551.13)
To
Ivan Zaitsev ()
Date
2001-10-07T23:53:22Z
Area
SU.WINDOWS.NT.PROG
  Hi Ivan !

 IZ>>>  Могу ли я в обычном Win32 пpиложении заюзать некотоpые ф-ции из
 IZ>>> DDK?  Или все что там пpописанно будет pаботать втолько в
 IZ>>> Kernel-mode?  Если можно, то как узнать какие можно, а какие нет?
 IRaR>>  Можно использовать функции с пpефиксом Zw и пpефиксом Nt, т.е. native
 IRaR>> API, пpи этом не забудь подключить ntdll.lib. Pекомендую почитать
 IRaR>> Кобеpниченко "Недокументиpованные возможности Windows NT" (кажется так,
 IZ>   А все ли с такими пpефиксами можно? Я посмотpел експоpтиpуемые ф-ции
 IZ> ntdll.dll там очень много ф-ций с пpефиксами Zw,Nt,Rtl и т.д. пpичем в DDK
 IZ> описана только малая часть. Получается что я могу юзать ф-ции из NTDLL.DLL
 IZ> как из kernel-mode так и из user-mode? А как такое возможно? А ф-ции с
 IZ> пpефиксом Io, я думаю, никаким обpазом в user-mode не получится юзать?
 Да, про Rtl я забыл сказать. Есть еще Csr и Ldr. В принципе можно юзать все
функции из ntdll. Я лично использовал только Nt(и соответственно Zw - это одни и
те же функции),Rtl и Ldr. У Русиновича есть статейка где описывается процесс их
вызова. Если дизассемблировать функции Nt, то ты увидишь там что-то типа этого:
     mov     eax, 23h        ; функция (здесь NtCreateKey)
     lea     edx, [esp+4]    ;указатель на параметры
     int     2Eh
и все. При вызове в режиме пользователя такой функции возникает исключение (int
2e), в результате чего следует переключение в KM, и в ловушке этого исключения
происходит вызов соответствующей функции (кстати по такому же принципу
вызываются функции GDI). Т.е. фактически функции вызываются в режиме ядра, т.е.
никакого парадокса здесь нет. Соответственно через ловушку вызывается только то,
о чем эта ловушка "знает", Io она не знает, так что здесь облом.
Если есть желание пришлю ntdll.h и книжки...
 IZ>И еще вопpос. Может где есть пpимеp, как пpи помощи ZwCreateKey создать
 IZ>в
 IZ> pеестpе новый ключ? Я делаю вот так:
 [skip]
 1)oName.Length=sizeof(UNICODE_STRING);
 Занятно:) oName.Length будет всегда равно 8:) Тебе нужен размер строки а не
структуры. Обычно все белые люди используют RtlInitUnicodeString и не имеют
гемороя.
 2)oAttr.RootDirectory=HKEY_CURRENT_USER;
 Так делать нельзя. То, что такой макрос неопределен в DDK не заставляет тебя
задуматься о том, что функции КМ его не используют? Я бы сделал так:

 OBJECT_ATTRIBUTES oAttr;
 UNICODE_STRING oName;
 HANDLE hKey;
 NTSTATUS status;

 RtlInitUnicodeString(
        &oName,
        L"\\Registry\\User\\CurrentUser\\zuysoft"
        );

 InitializeObjectAttributes( &oAttr,
                             &oName,
                             OBJ_CASE_INSENSITIVE,
                             NULL,
                             (PSECURITY_DESCRIPTOR) NULL );

 status=ZwCreateKey(&hKey,
                    KEY_ALL_ACCESS,
                    &oAttr,
                    0,
                    NULL,
                    REG_OPTION_NON_VOLATILE,
                    NULL);


 IZ> Оба ваpианта возвpащают hKey=0 и status=0xc0000008 т.е. error. Где
 IZ> гpабли?
 Дык STATUS_INVALID_HANDLE, однако.
 Читайте книжки - они рулез!(с)не помню
 Сравни мой код со своим и найди 10 отличий:)) Все ошибки я расписывать не
стал, т.к. некоторые совсем детские:)) (не обижайся только).
  Всего наилучшего Ivan!

 mailto: random@beda.stup.ac.ru

       Teams:[Depeche Mode] [CRPG] [Роджер Желязны] [F1 McLaren]
             [NT-rulezz] [NT Drivers] [Задолбали слюниксоиды!]
--- GoldED+/W32 1.1.4.1
 * Origin: Хочь и мочь - две большие разницы... (2:50/551.13)