Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-1120751838
VasRog
2005-07-07 19:57
2005.07.25
Указатель на динамический массив


1-1120377854
VadimX
2005-07-03 12:04
2005.07.25
Помогите оптимизировать код


1-1120630131
Demidoff
2005-07-06 10:08
2005.07.25
Как произвести обработку архива в автономном режиме?


1-1120661064
Fay
2005-07-06 18:44
2005.07.25
Как обойти отсутствие AutoSize у TCheckBox ?


1-1120587319
АлексейС
2005-07-05 22:15
2005.07.25
Как оперировать данными интернет сайта ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский