![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ZwQueryObject + Delphi [D7, NT4, Win2k, WinXP]
Holms © (2005-05-25 23:50:00)Изначально вопрос, может кто знает другое решение.
Как имея хэндл на ветку реестра получить полный путь к этой ветке?
На С++ нашел такой код
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;
в итоге на С++ работает так как мне надо, на Делфи валится.
Помогите решить проблему перевода или свамого вопроса.
Спасибо
Holms (2005-05-26 23:04:00) [1]Спасибо Игорь, с меня пиво!
С использованием вашей версии все заработало так как надо!!
Ученик (2005-05-26 22:14:00) [2]>Holms © (26.05.05 15:30) [10]
Код рабочий, в rc какое значение ?
Игорь Шевченко (2005-05-26 16:40:00) [3]
> А можете ли скинуть вашу версию ntdll.pas
http://www.schevchenko.net.ru/SRC/Common_60.zip
Holms (2005-05-26 15:30:00) [4]Вот мой код
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 всегда возвращет фалсе :(
В чем может быть проблема. Ключ в реестре точно есть.
Спасибо
Holms (2005-05-26 15:14:00) [5]Спасибо Игорь Шевченко, похоже на что надо.
А можете ли скинуть вашу версию ntdll.pas а то моя что-то не хочет правильно работать.
emailto: eugen.rata [dog] gmail.com
Спасибо
Игорь Шевченко (2005-05-26 09:55:00) [6]
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.
Работает :)
Alex Konshin (2005-05-26 03:24:00) [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 01:19:00) [8]>Holms © (25.05.05 23:50)
Можно использовать
objName := AllocMem(2048), но есть проблемы с самой структурой или что-то еще
Holms (2005-05-26 00:24:00) [9]знаю про ZW функции, но другого выхода нету
RegQueryInfoKey - просто нету у нее такой функциональности.
А может есть функция которая возвращает родителя для имеющесего хэндла, ведь реестр то же дерево?
Eraser (2005-05-26 00:20:00) [10]Holms © (26.05.05 00:14) [3]
ZW- функции предназначины для работы в режиме ядра. Слышал что есть способы их вызывать и в user-mode, но имхо не стОит.
SHRegGetPath
Каюсь - не доглядел.
А какая проблема с RegQueryInfoKey?
Holms (2005-05-26 00:14:00) [11]RegQueryInfoKey не подходит, пробовал все возможные варианты, ничего хорошего не получил.
SHRegGetPath - используется для чтения системных переменных типа %ALLUSERSPROFILE%, %SystemRoot%,...
Инет сказал что только Zw функция здесь поможет
Eraser (2005-05-26 00:05:00) [12]Holms ©
Вот ещё одна ф-я: SHRegGetPath.
Eraser (2005-05-26 00:00:00) [13]Holms © (25.05.05 23:50)
Возможно поможет ф-я RegQueryInfoKey.
Использование Zw функций в user-mode дело рискованное.