Проблема: получить полный путь ветки реестра заня ее путь.
На форуме пару раз спрашивали никто толком не ответил
После усиленного посика в инета нашлась инфа что можно использвать 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 allocatingtry
SetString(Result,asString.Buffer,asString.Length);
finally
RtlFreeAnsiString(@asString); // free allocated memoryend;
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 результат получается нулевой.
Помогите пожалуйста разобратся с этой функцией.
Спасибо
Здравствуйте, 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
Здравствуйте, MShura, Вы писали:
MS>Все нормальные API экспортируют имена в стиле "C", чтобы не было проблем с разными компиляторами.
это было то что нужно. Спасибо
Только теперь у меня видимо лыжи не едут или ...
в итоге код такой
MS>>Все нормальные API экспортируют имена в стиле "C", чтобы не было проблем с разными компиляторами. H>это было то что нужно. Спасибо H> Только теперь у меня видимо лыжи не едут или ... H>в итоге код такой
Или.
1. Name в структуре KEY_BASIC_INFORMATION может быть и не ограничена нулем. Длина явно указана полем NameLength, посему надо выводить как printf("%.*S", NameLength, Name)
2. Различным классам из KEY_INFORMATION_CLASS соответствуют различные структуры. Вы же для всех классов лепите одну. Где логика, спрашивается?
Вердикт — скачайте книгу Гарри Неббета, там все описано, подробно и с примерами. Удачи.
Здравствуйте, 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);
Здравствуйте, 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?
Ведь когда я искал готового примера не нашел.
H>[/pascal] H>2 Moderator: может стоить добавить вышеприведенный пример в FAQ? H>Ведь когда я искал готового примера не нашел.
А готового примера и не нужно. Нужно лишь задать правильное направление движения. В faq все сказано четко — не более, и не менее. То, что у вас не получилось этим воспользоваться — это конечно жаль, но отнюдь не показатель.