Получение пути из хэндла
От: Holms США  
Дата: 24.05.05 23:04
Оценка:
Привет

Проблема: получить полный путь ветки реестра заня ее путь.
На форуме пару раз спрашивали никто толком не ответил
После усиленного посика в инета нашлась инфа что можно использвать ZwQueryObject функцию
которой можно слать хэндл реестра и как второй параметр 1.
Набросал на вскидку такой код


uses
  ntdll;

function NtUnicodeStringToString( pusString : PNtUnicodeString ) : String;
var    asString : TNtAnsiString;
begin
    Result := '';
    if (pusString=nil)or(pusString^.Length=0) then Exit;
    RtlUnicodeStringToAnsiString(@asString,pusString,True); // with allocating
    try
        SetString(Result,asString.Buffer,asString.Length);
    finally
        RtlFreeAnsiString(@asString); // free allocated memory
    end;
end;
  
procedure TForm1.Button1Click(Sender: TObject);
var
  hK : HKEY;
  objName : PNtUnicodeString;
  buff : array[0..1024] of WideChar;
  dwRes : DWORD;
begin
  RegOpenKeyEx( HKEY_CURRENT_USER, 'Software\Far\Editor', 0, KEY_ALL_ACCESS, hK );

  FillChar( buff, sizeof( buff ), #0 );
  objName := GetMemory( sizeof( TNtUnicodeString ) );
  objName^.Length := 0;
  objName^.MaximumLength := sizeof( buff );
  objName^.Buffer := buff;
  dwRes := sizeof( TNtUnicodeString ) + sizeof( buff );  

  ZwQueryObject( hK, 1, Pointer( objName ), dwRes, dwRes );
  Caption := NtUnicodeStringToString( objName );

  RegCloseKey( hk );
  FreeMemory( objName );
end;

Видимо из-за незнания тонкостей Паскаля или NativeApi результат получается нулевой.
Помогите пожалуйста разобратся с этой функцией.
Спасибо
The life is relative and reversible.
Re: Получение пути из хэндла
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 25.05.05 02:24
Оценка:
Здравствуйте, Holms, Вы писали:

H>Проблема: получить полный путь ветки реестра заня ее путь.

H>На форуме пару раз спрашивали никто толком не ответил

http://gzip.rsdn.ru/?Forum/Info.aspx?name=FAQ.winapi.hkeytoname ?
... << RSDN@Home 1.1.4 beta 7 rev. 458>>
Re[2]: Получение пути из хэндла
От: Holms США  
Дата: 25.05.05 11:29
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

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


H>>Проблема: получить полный путь ветки реестра заня ее путь.

H>>На форуме пару раз спрашивали никто толком не ответил

OE>http://gzip.rsdn.ru/?Forum/Info.aspx?name=FAQ.winapi.hkeytoname ?

Спасибо. Вроде то что надо
собрал такой код

// testZwQueryKey.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

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;
#define NTSTATUS DWORD

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


int main(int argc, char* argv[])
{
  HKEY hKey;

  RegOpenKeyEx( HKEY_CURRENT_USER, "Software\\Far\\Editor", 0, KEY_ALL_ACCESS, &hKey );

  if( hKey )
  {
    ULONG l = 1024;
    PKEY_BASIC_INFORMATION kbi = (PKEY_BASIC_INFORMATION)(new char[l]);

    ZwQueryKey( hKey, KeyNodeInformation, kbi, l, &l );
    RegCloseKey( hKey );
  }
    return 0;
}

подключил к проекту ntdll.lib (пробовал две версии которые нашел в инете)
получаю такую ошибку

LINK : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/INCREMENTAL:NO' specification
testZwQueryKey.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) unsigned long __stdcall ZwQueryKey(void *,enum _KEY_INFORMATION_CLASS,void *,unsigned long,unsigned long *)" (__imp_?ZwQueryKey@@YGKPAXW4_KEY_INFORMATION_CLASS@@0KPAK@Z) referenced in function _main
.\Debug/testZwQueryKey.exe : fatal error LNK1120: 1 unresolved externals

Вопрос, где взять нормальную либу что-бы нашлось то что надо.
Если есть у кого скиньте на eugen. rata [dog] gmail.com

Спасибо
The life is relative and reversible.
Re[3]: Получение пути из хэндла
От: MShura  
Дата: 25.05.05 13:15
Оценка: 2 (1)
Здравствуйте, Holms, Вы писали:

H>

extern "C" {
H>NTSYSAPI
H>NTSTATUS
H>NTAPI
H>ZwQueryKey(
H>           IN HANDLE KeyHandle,
H>           IN KEY_INFORMATION_CLASS KeyInformationClass,
H>           OUT PVOID KeyInformation,
H>           IN ULONG KeyInformationLength,
H>           OUT PULONG ResultLength
H>           );
}
H>


H>Вопрос, где взять нормальную либу что-бы нашлось то что надо.

H>Если есть у кого скиньте на eugen. rata [dog] gmail.com

Все нормальные API экспортируют имена в стиле "C", чтобы не было проблем с разными компиляторами.
Re[4]: Получение пути из хэндла
От: Holms США  
Дата: 25.05.05 17:51
Оценка:
Здравствуйте, MShura, Вы писали:

MS>Все нормальные API экспортируют имена в стиле "C", чтобы не было проблем с разными компиляторами.

это было то что нужно. Спасибо
Только теперь у меня видимо лыжи не едут или ...
в итоге код такой

// testZwQueryKey.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>

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;
#define NTSTATUS DWORD

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

int main(int argc, char* argv[])
{
  HKEY hKey;

  RegOpenKeyEx( HKEY_CURRENT_USER, "Software\\Far\\Editor", 0, KEY_ALL_ACCESS, &hKey );

  if( hKey )
  {
    ULONG l = 1024;
    PKEY_BASIC_INFORMATION kbi = (PKEY_BASIC_INFORMATION)(new char[l]);

    memset( kbi, 0, l );
    ZwQueryKey( hKey, KeyBasicInformation, kbi, l, &l ); 
    wprintf(L"Basic Info:[%s]\n", kbi->Name);

    memset( kbi, 0, l );
    ZwQueryKey( hKey, KeyNodeInformation, kbi, l, &l );  
    wprintf(L"Node Info:[%s]\n", kbi->Name);

    memset( kbi, 0, l );
    ZwQueryKey( hKey, KeyFullInformation, kbi, l, &l );  
    wprintf(L"Full Info:[%s]\n", kbi->Name);

    memset( kbi, 0, l );
    ZwQueryKey( hKey, KeyNameInformation, kbi, l, &l );  
    wprintf(L"Name Info:[%s]\n", kbi->Name);

    RegCloseKey( hKey );
    delete [] (char*)kbi;
  }
    return 0;
}

на выходе получаю такую инфу

Basic Info:[Editor]
Node Info:[]
Full Info:[]
Name Info:[TRY\USER\S-1-5]

что-то никакого полного пути нету. Видимо опять что-то не так делаю.
Просветите
Спасибо
The life is relative and reversible.
Re[5]: Получение пути из хэндла
От: Andrew S Россия http://alchemy-lab.com
Дата: 25.05.05 18:08
Оценка:
MS>>Все нормальные API экспортируют имена в стиле "C", чтобы не было проблем с разными компиляторами.
H>это было то что нужно. Спасибо
H> Только теперь у меня видимо лыжи не едут или ...
H>в итоге код такой

Или.
1. Name в структуре KEY_BASIC_INFORMATION может быть и не ограничена нулем. Длина явно указана полем NameLength, посему надо выводить как printf("%.*S", NameLength, Name)
2. Различным классам из KEY_INFORMATION_CLASS соответствуют различные структуры. Вы же для всех классов лепите одну. Где логика, спрашивается?

Вердикт — скачайте книгу Гарри Неббета, там все описано, подробно и с примерами. Удачи.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[6]: Получение пути из хэндла
От: Holms США  
Дата: 25.05.05 18:11
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Или.

AS>1. Name в структуре KEY_BASIC_INFORMATION может быть и не ограничена нулем. Длина явно указана полем NameLength, посему надо выводить как printf("%.*S", NameLength, Name)
AS>2. Различным классам из KEY_INFORMATION_CLASS соответствуют различные структуры. Вы же для всех классов лепите одну. Где логика, спрашивается?
Незнаю, я думал везде одна структура

AS>Вердикт — скачайте книгу Гарри Неббета, там все описано, подробно и с примерами. Удачи.

И где ее найти?

Пока заработал такой код

    memset( kbi, 0, l );
    ZwQueryObject( hKey, 1, kbi, l + sizeof(KEY_BASIC_INFORMATION) - 1, &l );  
    wprintf(L"Query Object:[%s]\n", kbi->Name);
The life is relative and reversible.
Re[7]: Получение пути из хэндла
От: Stanky  
Дата: 26.05.05 19:14
Оценка:
> И где ее найти?
>
Здесь!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Получение имени ключа из HKEY (Delphi)
От: Holms США  
Дата: 27.05.05 06:21
Оценка: 11 (1)
#Имя: FAQ.winapi.hkeytoname2
Здравствуйте, Stanky, Вы писали:

>> И где ее найти?

>>
S>Здесь!!!
Скачал, разобрался все прекрасно работает.
Спасибо
Были трудности с переводом на Делфи, помогли мастаковцы
Получилось такое:

uses
  ntdll, HsNtDef;


procedure TForm1.Button1Click(Sender: TObject);
var
  hK : HKEY;
  ObjectInfo : Pointer;
  ObjectInfoLength : ULONG;
  rc : NTSTATUS;
  ReturnedLength : ULONG;
begin
  RegOpenKeyEx( HKEY_CURRENT_USER, 'Software\Far\Editor', 0, KEY_ALL_ACCESS, hK );

  ObjectInfoLength := 16384;
  GetMem( ObjectInfo, ObjectInfoLength );
  try
    rc := NtQueryObject( hK, ObjectNameInformation, ObjectInfo, ObjectInfoLength, @ReturnedLength );
    if NT_SUCCESS( rc ) then
      with POBJECT_NAME_INFORMATION(ObjectInfo)^ do
        Caption := WideCharLenToString(Name.Buffer, Name.Length div SizeOf(WideChar));
  finally
    FreeMem( ObjectInfo );
    RegCloseKey( hk );
  end;
end;

2 Moderator: может стоить добавить вышеприведенный пример в FAQ?
Ведь когда я искал готового примера не нашел.
The life is relative and reversible.
Re: Получение имени ключа из HKEY (Delphi)
От: Andrew S Россия http://alchemy-lab.com
Дата: 27.05.05 07:31
Оценка:
H>[/pascal]
H>2 Moderator: может стоить добавить вышеприведенный пример в FAQ?
H>Ведь когда я искал готового примера не нашел.

А готового примера и не нужно. Нужно лишь задать правильное направление движения. В faq все сказано четко — не более, и не менее. То, что у вас не получилось этим воспользоваться — это конечно жаль, но отнюдь не показатель.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re: Получение имени ключа из HKEY (Delphi)
От: Аноним  
Дата: 07.10.05 16:12
Оценка:
H>procedure TForm1.Button1Click(Sender: TObject);
H>var
H> hK : HKEY;
H> ObjectInfo : Pointer;
H> ObjectInfoLength : ULONG;
H> rc : NTSTATUS;
H> ReturnedLength : ULONG;
H>begin
H> RegOpenKeyEx( HKEY_CURRENT_USER, 'Software\Far\Editor', 0, KEY_ALL_ACCESS, hK );

H> ObjectInfoLength := 16384;

H> GetMem( ObjectInfo, ObjectInfoLength );
H> try
H> rc := NtQueryObject( hK, ObjectNameInformation, ObjectInfo, ObjectInfoLength, @ReturnedLength );
H> if NT_SUCCESS( rc ) then
H> with POBJECT_NAME_INFORMATION(ObjectInfo)^ do
H> Caption := WideCharLenToString(Name.Buffer, Name.Length div SizeOf(WideChar));
H> finally
H> FreeMem( ObjectInfo );
H> RegCloseKey( hk );
H> end;
H>end;

ОГРОМНОЕ СПАСИБО ЗА ЭТОТ КУСОК КОДА!!!!!!!!!!!!!!!!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.