Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
ВнизZwQueryObject + Delphi Найти похожие ветки
← →
Holms © (2005-05-25 23:50) [0]Изначально вопрос, может кто знает другое решение.
Как имея хэндл на ветку реестра получить полный путь к этой ветке?
На С++ нашел такой код
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
ZwQueryObject(
IN HANDLE KeyHandle,
IN ULONG KeyInformationClass,
OUT PVOID KeyInformation,
IN ULONG KeyInformationLength,
OUT PULONG ResultLength
);
}
void PrintInfo(HKEY hKey)
{
if( hKey )
{
ULONG l = 2048;
PKEY_BASIC_INFORMATION kbi = (PKEY_BASIC_INFORMATION)(new char[l]);
memset( kbi, 0, l );
ZwQueryObject( hKey, 1, kbi, l + sizeof(KEY_BASIC_INFORMATION) - 1, &l );
wprintf(L"\tQuery Object:[%s]\n", kbi->Name);
RegCloseKey( hKey );
delete [] (char*)kbi;
}
else
printf("\tKey not opened\n");
}
int main(int argc, char* argv[])
{
HKEY hKey;
char sPath[1024];
lstrcpyn( sPath, "Software\\Far\\Editor\\LastPositions", 1024 );
RegOpenKeyEx( HKEY_CURRENT_USER, sPath, 0, KEY_ALL_ACCESS, &hKey );
printf("HKEY_CURRENT_USER\\%s\n", sPath );
PrintInfo( hKey );
}
перевел это дело на Делфи
uses
ntdll;
type
_KEY_BASIC_INFORMATION = packed record
LastWriteTime : LARGE_INTEGER ;
TitleIndex : ULONG;
NameLength : ULONG;
Name : PWideChar;
end;
KEY_BASIC_INFORMATION = _KEY_BASIC_INFORMATION;
PKEY_BASIC_INFORMATION = ^KEY_BASIC_INFORMATION;
procedure TForm1.Button1Click(Sender: TObject);
var
hK : HKEY;
objName : PKEY_BASIC_INFORMATION;
ul : ULONG;
buff : array[0..2048] of char;
begin
RegOpenKeyEx( HKEY_CURRENT_USER, "Software\Far\Editor", 0, KEY_ALL_ACCESS, hK );
ul := 2048;
objName := PKEY_BASIC_INFORMATION( @buff[0] );
ZeroMemory( objName, ul );
ZwQueryObject( hK, 1, Pointer( objName ), ul - sizeof(KEY_BASIC_INFORMATION) - 1, ul );
Caption := objName.Name;
RegCloseKey( hk );
end;
в итоге на С++ работает так как мне надо, на Делфи валится.
Помогите решить проблему перевода или свамого вопроса.
Спасибо
← →
Eraser © (2005-05-26 00:00) [1]Holms © (25.05.05 23:50)
Возможно поможет ф-я RegQueryInfoKey.
Использование Zw функций в user-mode дело рискованное.
← →
Eraser © (2005-05-26 00:05) [2]Holms ©
Вот ещё одна ф-я: SHRegGetPath.
← →
Holms © (2005-05-26 00:14) [3]RegQueryInfoKey не подходит, пробовал все возможные варианты, ничего хорошего не получил.
SHRegGetPath - используется для чтения системных переменных типа %ALLUSERSPROFILE%, %SystemRoot%,...
Инет сказал что только Zw функция здесь поможет
← →
Eraser © (2005-05-26 00:20) [4]Holms © (26.05.05 00:14) [3]
ZW- функции предназначины для работы в режиме ядра. Слышал что есть способы их вызывать и в user-mode, но имхо не стОит.
SHRegGetPath
Каюсь - не доглядел.
А какая проблема с RegQueryInfoKey?
← →
Holms © (2005-05-26 00:24) [5]знаю про ZW функции, но другого выхода нету
RegQueryInfoKey - просто нету у нее такой функциональности.
А может есть функция которая возвращает родителя для имеющесего хэндла, ведь реестр то же дерево?
← →
Ученик (2005-05-26 01:19) [6]>Holms © (25.05.05 23:50)
Можно использовать
objName := AllocMem(2048), но есть проблемы с самой структурой или что-то еще
← →
Alex Konshin © (2005-05-26 03:24) [7]Ты неправильно перевел структуру:
WCHAR Name[1]; // Variable length string
Это совсем не PWideChar, а
Name : Array [0..0] of WideChar;
(Насчет WideChar не уверен - уже забыл как в Delphi оно обзывается).
Eraser © (26.05.05 00:20) [4]
Holms © (26.05.05 00:14) [3]
ZW- функции предназначины для работы в режиме ядра. Слышал что есть способы их вызывать и в user-mode, но имхо не стОит.
Это еще почему? Win32 ими пользуется, почему нам нельзя?
У меня на сайте и у Игоря Шевченко есть примеры работы с Native API.
← →
Игорь Шевченко © (2005-05-26 09:55) [8]
unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TfMain = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
function GetKeyName (const AHandle: HKEY): string;
end;
var
fMain: TfMain;
implementation
uses
Registry, Ntdll, HsNtDef;
{$R *.DFM}
procedure TfMain.Button1Click(Sender: TObject);
var
Reg: TRegistry;
begin
Reg := TRegistry.Create (KEY_READ);
Reg.RootKey := HKEY_CURRENT_USER;
Reg.OpenKey ("Software\Microsoft\Windows", false);
ShowMessageFmt("Name=%s", [GetKeyName(Reg.CurrentKey)]);
Reg.Free;
end;
function TfMain.GetKeyName(const AHandle: HKEY): string;
var
ReturnLength: DWORD;
ObjectInfo: Pointer;
ObjectInfoLength: Integer;
rc: NTSTATUS;
begin
ObjectInfoLength := 16384;
GetMem(ObjectInfo, ObjectInfoLength);
try
rc := NtQueryObject(AHandle, ObjectNameInformation, ObjectInfo,
ObjectInfoLength, @ReturnLength);
if NT_SUCCESS(rc) then
with POBJECT_NAME_INFORMATION(ObjectInfo)^ do
Result := WideCharLenToString(Name.Buffer,
Name.Length div SizeOf(WideChar));
finally
FreeMem(ObjectInfo);
end;
end;
end.
Работает :)
← →
Holms © (2005-05-26 15:14) [9]Спасибо Игорь Шевченко, похоже на что надо.
А можете ли скинуть вашу версию ntdll.pas а то моя что-то не хочет правильно работать.
emailto: eugen.rata [dog] gmail.com
Спасибо
← →
Holms © (2005-05-26 15:30) [10]Вот мой код
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 := ZwQueryObject( hK, 1, ObjectInfo, ObjectInfoLength, @ReturnedLength );
if NT_SUCCESS( rc ) then
with PNtObjectNameInformation(ObjectInfo)^ do
Caption := WideCharLenToString(Name.Buffer, Name.Length div SizeOf(WideChar));
finally
FreeMem( ObjectInfo );
RegCloseKey( hk );
end;
end;
NtStatus всегда возвращет фалсе :(
В чем может быть проблема. Ключ в реестре точно есть.
Спасибо
← →
Игорь Шевченко © (2005-05-26 16:40) [11]
> А можете ли скинуть вашу версию ntdll.pas
http://www.schevchenko.net.ru/SRC/Common_60.zip
← →
Ученик (2005-05-26 22:14) [12]>Holms © (26.05.05 15:30) [10]
Код рабочий, в rc какое значение ?
← →
Holms © (2005-05-26 23:04) [13]Спасибо Игорь, с меня пиво!
С использованием вашей версии все заработало так как надо!!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c