Ф-ции из 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)