Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.25;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2005.07.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.033 c
1-1120724743
qwer-10
2005-07-07 12:25
2005.07.25
Проверка в в FindFirst/FindNext.


1-1120649855
maxim______m
2005-07-06 15:37
2005.07.25
string to string


6-1113550613
X-Disa
2005-04-15 11:36
2005.07.25
Проверка коннекта


3-1118818906
salexn
2005-06-15 11:01
2005.07.25
Oracle и работа с датами


14-1119957288
ReaderT_T
2005-06-28 15:14
2005.07.25
Книги