Ф-ции из DDK заюзать в User-mode
- From
- Alexey Nevolin (2:5030/1272.64)
- To
- Ivan Zaitsev ()
- Date
- 2001-10-08T18:37Z
- Area
- SU.WINDOWS.NT.PROG
■ Hi there, Ivan !
■ Ivan Zaitsev -> Ilya Rudakov aka Random (07 Oct 01 02:06):
IZ> А все ли с такими пpефиксами можно? Я посмотpел експоpтиpуемые ф-ции
IZ> ntdll.dll там очень много ф-ций с пpефиксами Zw,Nt,Rtl и т.д. пpичем в
IZ> DDK описана только малая часть. Получается что я могу юзать ф-ции из
IZ> NTDLL.DLL как из kernel-mode так и из user-mode?
Не пробовал....
IZ> А ф-ции с пpефиксом Io, я думаю, никаким обpазом в user-mode не
IZ> получится юзать?
Нет. Они лежат в ntoskrnl.exe
IZ> И еще вопpос. Может где есть пpимеp, как пpи помощи ZwCreateKey
IZ> создать в pеестpе новый ключ? Я делаю вот так:
Почему нет? RegCreateKeyEx - оно так и делает =)
IZ> #include "ntdll.h"
IZ> #pragma comment(lib, "ntdll.lib")
IZ> int main(int argc, char* argv[])
IZ> {
IZ> NT::OBJECT_ATTRIBUTES oAttr;
IZ> PHANDLE hKey;
^^^^^^^ HANDLE Key;
IZ> NT::UNICODE_STRING oName;
IZ> oName.Buffer=L"\\zuysoft";
oName.Buffer = L"Registry\\Machine\\Software\\zuysoft";
IZ> oName.Length=sizeof(NT::UNICODE_STRING);
IZ> oName.MaximumLength=oName.Length+1;
^+2; // sizeof(WCHAR)
IZ> oAttr.Length
IZ> =sizeof(NT::OBJECT_ATTRIBUTES);
IZ> oAttr.RootDirectory =HKEY_CURRENT_USER;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ HKEY_CURRENT_USER - не handle, а посему должно быть NULL. Если хочешь получить handle ветки реестра на текущего пользователя - RtlOpenCurrentUser тебе в руки.
IZ> oAttr.ObjectName =&oName;
IZ> oAttr.Attributes =NULL;
^^^^ ну если так пошлО, то 0.
IZ> oAttr.SecurityDescriptor=NULL;
IZ> oAttr.SecurityQualityOfService=NULL;
IZ> NTSTATUS status=NT::ZwCreateKey(hKey, KEY_ALL_ACCESS, &oAttr,
IZ> NULL,NULL,NULL,NULL);
NTSTATUS ntStatus = NT::ZwCreateKey(&Key, KEY_ALL_ACCESS, &oAttr, 0, NULL,0, NULL);
IZ> return 0;
IZ> }
IZ> Это из user-mode.
IZ> Оба ваpианта возвpащают hKey=0 и status=0xc0000008 т.е. error. Где
IZ> гpабли?
//
// MessageId: STATUS_INVALID_HANDLE
//
// MessageText:
//
// An invalid HANDLE was specified.
//
#define STATUS_INVALID_HANDLE ((NTSTATUS)0xC0000008L) // winnt
Вообще, как оно должно выглядеть:
#include "ntdll.h"
using namespace NT;
void main(void)
{
NTSTATUS ntStatus;
UNICODE_STRING RegPath;
OBJECT_ATTRIBUTES objAttr;
HANDLE KeyHandle, UserHandle;
WCHAR KeyPath[] = L"\\Software\\suxkey";
ntStatus = RtlOpenCurrentUser(MAXIMUM_ALLOWED, &UserHandle);
if (! NT_SUCCESS( ntStatus))
{
// add anything on you own =)
}
RtlInitUnicodeString(&RegPath, KetPath);
InitializeObjectAttributes(&objAttr, &RegPath, OBJ_PERMANENT | OBJ_INHERIT, UserHandle, NULL);
ntStatus = NtCreateKey(&KeyHandle, KEY_ALL_ACCESS, &objAttr, 0, NULL, 0, NULL);
};
Еще вопросы? В мыло!
■ cul8r Ivan
■ wbr Alexey Nevolin.
... lurking in a dismal fog, hungry for your blood...
--- GoldEd 3.01 under NT4+SP5. -- /_ct.nightmail.ru_/ -- 1087/1-SpbSTU
* Origin: Page Fault Station (2:5030/1272.64)