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)