Как получить имя ключа, имея HKEY?
От: Der Teufel Зимбабве  
Дата: 16.11.01 14:09
Оценка:
Привет всем.
Вот такая вот задачка.
Есть HKEY, надо бы получить че енто за ключ (типа HKEY_LOCAL_MACHINE\Software\Microsoft).
Помогите, а....
Re: Как получить имя ключа, имея HKEY?
От: OlegO Россия http://www.mediachase.ru
Дата: 16.11.01 14:57
Оценка:
Здравствуйте Der Teufel, Вы писали:

DT>Привет всем.

DT>Вот такая вот задачка.
DT>Есть HKEY, надо бы получить че енто за ключ (типа HKEY_LOCAL_MACHINE\Software\Microsoft).
DT>Помогите, а....

Как вариант используя RegSaveKey сохранить ключ в файл, а потом разобрать этот файл.
С уважением, OlegO.
Re[2]: Как получить имя ключа, имея HKEY?
От: Der Teufel Зимбабве  
Дата: 16.11.01 15:12
Оценка:
Здравствуйте OlegO, Вы писали:

OO>Здравствуйте Der Teufel, Вы писали:


DT>>Привет всем.

DT>>Вот такая вот задачка.
DT>>Есть HKEY, надо бы получить че енто за ключ (типа HKEY_LOCAL_MACHINE\Software\Microsoft).
DT>>Помогите, а....

OO>Как вариант используя RegSaveKey сохранить ключ в файл, а потом разобрать этот файл.


Ну так конечно можно. Спасибо.
Но это же ИЗВРАТ.
:-)
Re[3]: Как получить имя ключа, имея HKEY?
От: OlegO Россия http://www.mediachase.ru
Дата: 16.11.01 15:27
Оценка:
Здравствуйте Der Teufel, Вы писали:

DT>Здравствуйте OlegO, Вы писали:


OO>>Здравствуйте Der Teufel, Вы писали:


DT>>>Привет всем.

DT>>>Вот такая вот задачка.
DT>>>Есть HKEY, надо бы получить че енто за ключ (типа HKEY_LOCAL_MACHINE\Software\Microsoft).
DT>>>Помогите, а....

OO>>Как вариант используя RegSaveKey сохранить ключ в файл, а потом разобрать этот файл.


DT>Ну так конечно можно. Спасибо.

DT>Но это же ИЗВРАТ.
DT>:-)

Да изврат не спорю, еще вариант поискать может кто разбирал структуру HKEY'я
из нее наверняка можно все вытащить.
С уважением, OlegO.
Как получить имя ключа, имея HKEY?
От: Alex Fedotov США  
Дата: 16.11.01 17:28
Оценка: 31 (3) :)
#Имя: FAQ.winapi.hkeytoname
Здравствуйте OlegO, Вы писали:

DT>>>>Привет всем.

DT>>>>Вот такая вот задачка.
DT>>>>Есть HKEY, надо бы получить че енто за ключ (типа HKEY_LOCAL_MACHINE\Software\Microsoft).
DT>>>>Помогите, а....

OO>Да изврат не спорю, еще вариант поискать может кто разбирал структуру HKEY'я из нее наверняка можно все вытащить.


HKEY — это handle, вся его структура — это 32 бита.

В NT требуемую информацию можно получить с помошью native функции ZwQueryKey:

NTSYSAPI
NTSTATUS
NTAPI
ZwQueryKey(
    IN HANDLE KeyHandle,
    IN KEY_INFORMATION_CLASS KeyInformationClass,
    OUT PVOID KeyInformation,
    IN ULONG KeyInformationLength,
    OUT PULONG ResultLength
    );

typedef enum _KEY_INFORMATION_CLASS {
    KeyBasicInformation,
    KeyNodeInformation,
    KeyFullInformation,
    KeyNameInformation
} KEY_INFORMATION_CLASS;

typedef struct _KEY_BASIC_INFORMATION {
    LARGE_INTEGER LastWriteTime;
    ULONG TitleIndex;
    ULONG NameLength;
    WCHAR Name[1]; // Variable length string
} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;


(c) Windows NT/2000 Native API Reference, Gary Nebbett.

В Win9x — скорее бы она сдохла, что ли.
-- Alex Fedotov
Re[4]: Как получить имя ключа, имея HKEY?
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.11.01 21:59
Оценка:
Здравствуйте OlegO.

Интересно, а как удается получить хандл не передавая пути к ключу? Может проще запоминать, что открывал?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Как получить имя ключа, имея HKEY?
От: Alex Fedotov США  
Дата: 16.11.01 22:07
Оценка: :))) :)
Здравствуйте VladD2, Вы писали:

VD>Здравствуйте OlegO.


VD>Интересно, а как удается получить хандл не передавая пути к ключу? Может проще запоминать, что открывал?


Так, прости, каждый может. Надо сначала сделать себе трудностей, а потом самоотверженно их решать.
-- Alex Fedotov
Re[6]: Как получить имя ключа, имея HKEY?
От: Аноним  
Дата: 05.08.05 10:36
Оценка:
VD>>Интересно, а как удается получить хандл не передавая пути к ключу? Может проще запоминать, что открывал?

Очень просто — SetupDiOpenDevRegKey например
Re[7]: Как получить имя ключа, имея HKEY?
От: serg_fork  
Дата: 05.08.05 12:38
Оценка:
Здравствуйте, Аноним, Вы писали:

VD>>>Интересно, а как удается получить хандл не передавая пути к ключу? Может проще запоминать, что открывал?


А>Очень просто — SetupDiOpenDevRegKey например


Ну так и продолжай юзать SetupDi...
ИМХО, либо ты сразу начинаешь лазить по реестру сам, либо до конца продолжаешь использовать Setup API
Re: Как получить имя ключа, имея HKEY?
От: Xsyst  
Дата: 17.12.08 11:20
Оценка:
Здравствуйте, Alex Fedotov, Вы писали:

AF>Здравствуйте OlegO, Вы писали:


DT>>>>>Привет всем.

DT>>>>>Вот такая вот задачка.
DT>>>>>Есть HKEY, надо бы получить че енто за ключ (типа HKEY_LOCAL_MACHINE\Software\Microsoft).
DT>>>>>Помогите, а....

OO>>Да изврат не спорю, еще вариант поискать может кто разбирал структуру HKEY'я из нее наверняка можно все вытащить.


AF>HKEY — это handle, вся его структура — это 32 бита.


AF>В NT требуемую информацию можно получить с помошью native функции ZwQueryKey:


AF>
AF>NTSYSAPI
AF>NTSTATUS
AF>NTAPI
AF>ZwQueryKey(
AF>    IN HANDLE KeyHandle,
AF>    IN KEY_INFORMATION_CLASS KeyInformationClass,
AF>    OUT PVOID KeyInformation,
AF>    IN ULONG KeyInformationLength,
AF>    OUT PULONG ResultLength
AF>    );

AF>typedef enum _KEY_INFORMATION_CLASS {
AF>    KeyBasicInformation,
AF>    KeyNodeInformation,
AF>    KeyFullInformation,
AF>    KeyNameInformation
AF>} KEY_INFORMATION_CLASS;

AF>typedef struct _KEY_BASIC_INFORMATION {
AF>    LARGE_INTEGER LastWriteTime;
AF>    ULONG TitleIndex;
AF>    ULONG NameLength;
AF>    WCHAR Name[1]; // Variable length string
AF>} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
AF>


AF>(c) Windows NT/2000 Native API Reference, Gary Nebbett.


AF>В Win9x — скорее бы она сдохла, что ли.


Возможен ли вызов ZwQueryKey в пользовательском режиме? Или только в режиме ядра?
Re[2]: Как получить имя ключа, имея HKEY?
От: TarasCo  
Дата: 17.12.08 11:41
Оценка:
X>Возможен ли вызов ZwQueryKey в пользовательском режиме? Или только в режиме ядра?

А вы посмотрите экспорты ntdll и узнаете. Там функции — парами Nt и Zw. В ядре префикс — имеет большое значение, в ring3 это псевдонимы. Я для ring3 использовал бы вызовы с префиксом Nt, хотя это вкусовой момент.
Да пребудет с тобою сила
Re[5]: Как получить имя ключа, имея HKEY?
От: dudkin  
Дата: 28.12.08 06:56
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте OlegO.


VD>Интересно, а как удается получить хандл не передавая пути к ключу?


IEGetWriteableHKCU
Re: Как получить имя ключа, имея HKEY?
От: Аноним  
Дата: 22.01.09 14:37
Оценка:
Здравствуйте, Alex Fedotov, Вы писали:

AF>Здравствуйте OlegO, Вы писали:


AF>В NT требуемую информацию можно получить с помошью native функции ZwQueryKey


Такой вопрос: ZwQueryKey в KEY_BASIC_INFORMATION возвращает только короткое имя ключа, указанного в KeyHandle, т.е. если открыт ключ HKEY_LOCAL_MACHINE\Software\Microsoft, то KEY_BASIC_INFORMATION будет содержать имя Microsoft. А как получить полное имя или HKEY родительского ключа?
Re[2]: Как получить имя ключа, имея HKEY?
От: x64 Россия  
Дата: 22.01.09 14:51
Оценка:
А>Такой вопрос: ZwQueryKey в KEY_BASIC_INFORMATION возвращает только короткое имя ключа, указанного в KeyHandle, т.е. если открыт ключ HKEY_LOCAL_MACHINE\Software\Microsoft, то KEY_BASIC_INFORMATION будет содержать имя Microsoft. А как получить полное имя или HKEY родительского ключа?

NtQueryObject() с флагом ObjectNameInformation, расположенная в ntdll.dll:

NTSYSAPI 
NTSTATUS
NTAPI
NtQueryObject (
    IN HANDLE               ObjectHandle OPTIONAL,
    IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
    OUT PVOID               ObjectInformation,
    IN ULONG                Length,
    OUT PULONG              ResultLength );

typedef enum _OBJECT_INFORMATION_CLASS
{
    ObjectBasicInformation,            // Result is OBJECT_BASIC_INFORMATION structure
    ObjectNameInformation,            // Result is OBJECT_NAME_INFORMATION structure
    ObjectTypeInformation,            // Result is OBJECT_TYPE_INFORMATION structure
    ObjectAllInformation,            // Result is OBJECT_ALL_INFORMATION structure
    ObjectDataInformation            // Result is OBJECT_DATA_INFORMATION structure
}
OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS;

typedef struct _OBJECT_NAME_INFORMATION
{
    UNICODE_STRING          ObjectName;
}
OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.