Получение пути из хэндла
От: Holms США  
Дата: 24.05.05 23:04
Оценка:
Привет

Проблема: получить полный путь ветки реестра заня ее путь.
На форуме пару раз спрашивали никто толком не ответил
После усиленного посика в инета нашлась инфа что можно использвать 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 allocating
    try
        SetString(Result,asString.Buffer,asString.Length);
    finally
        RtlFreeAnsiString(@asString); // free allocated memory
    end;
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 результат получается нулевой.
Помогите пожалуйста разобратся с этой функцией.
Спасибо
The life is relative and reversible.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.