Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Windows API / MS.NET Framework API (https://www.delphipraxis.net/20-library-windows-api-ms-net-framework-api/)
-   -   Delphi Registry symbolic links (REG_LINK) per Win32 API erstellen (https://www.delphipraxis.net/7264-registry-symbolic-links-reg_link-per-win32-api-erstellen.html)

Assarbad 7. Aug 2003 14:24


Registry symbolic links (REG_LINK) per Win32 API erstellen
 
Downloadbar ist das ganze von:
http://assarbad.net/stuff/!export/reglink.txt

Man sollte immer von dort downloaden, da eventuell eine neuere Version online verfügbar ist!

Delphi-Quellcode:
(******************************************************************************
                               REGLINK.TXT v1.00

                           The code is PUBLIC DOMAIN
                 [ http://assarbad.net/stuff/!export/reglink.txt ]

 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                 Written and published by -=Assarbad=- (2003-08-07)

                              [url]http://assarbad.net[/url]
                           Assarbad AT gmx DOT info
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 !!!!!!!!!!!!!!!!!This is considered to work on NT platform only!!!!!!!!!!!!!!!!

 -------------------------------------------------------------------------------
 It is recommended to check out the site: "http://www.ntinternals.net"
 for a way on how to delete symbolic links (aka REG_LINK).
 They use a method where the native API is being called. When trying to use the
 Win32 API with different flags I got bluescreens over and over. Therefore one
 should consider using the Native API.

 If I should find appropriate flags for deletion of REG_LINK I will update the
 source. If YOU find it, please let me know (but only if it is Win32 API!!! I
 can write a Native API function myself - but ii's more excting here to find the
 proper flags with the Win32 API).
 -------------------------------------------------------------------------------

 Although my method uses the Win32 API, I use undocumented flags that are anyway
 passed down to the Native API. That's why a cannot attest the correct function
 under all circumstances. It is more a prototype for studying REG_LINK. It's not
 meant to be used directly without careful testing!

 Therefore: YOU HAVE TO KNOW WHAT YOU DO WHEN USING THIS SOURCE. BACKUP THE
 REGISTRY BEFORE TO NOT DAMAGE IT! I TAKE NO RESPONSIBILITY FOR ANY DAMAGE
 CAUSED BY THE USE OF THIS CODE!
 
 IF YOU SET IMPROPER PATHES AS LINK TARGET, THE RESULTING LINKS CANNOT BE
 ACCESSED PROPERLY ANYMORE!

 ******************************************************************************)

{
const
  REG_OPTION_RESERVED        = $00000000; // Parameter is reserved
  REG_OPTION_NON_VOLATILE    = $00000000; // Key is preserved when system is rebooted
  REG_OPTION_VOLATILE        = $00000001; // Key is not preserved when system is rebooted
  REG_OPTION_CREATE_LINK     = $00000002; // Created key is a symbolic link
  REG_OPTION_BACKUP_RESTORE  = $00000004; // open for backup or restore special access rules privilege required
  REG_OPTION_OPEN_LINK       = $00000008; // Open symbolic link
}
const
  REG_OPTION_OPEN_LINK = $00000008; // Open unicode symbolic registry link

function CreateReglinkW(Keyname, LinkTarget: WideString): Boolean;
(*
  Creates a unicode symbolic link in the registry.
  That's why I called this function CreateRegLinkW() and not CreateRegLinkA().
  It will not work if you use a LinkTarget in ANSI format!!!

  Note: The format of the link target HAS TO BE in Windows NT native format.
        I am not sure wether this also implies that the function would only work
        on Windows NT and later.

        The Windows NT notion is, where Keyname lies in

        HKEY_LOCAL_MACHINE\Keyname -> \Registry\Machine\Keyname
        HKEY_USERS\Keyname        -> \Registry\User\Keyname

        The notion follows the common object namespace notion of NT.
*)
var
  key: HKEY;
  len, err: DWORD;
  data: Pointer;
begin
  Result := False;
  err := RegCreateKeyExW(HKEY_LOCAL_MACHINE, @keyname[1], 0, nil, REG_OPTION_CREATE_LINK, KEY_ALL_ACCESS, nil, key, nil);
  if err = ERROR_SUCCESS then
  try
    len := length(linktarget) * sizeof(WideChar);
    data := GetMemory(len + sizeof(WideChar));
    if Assigned(data) then
    try
      lstrcpynW(data, @linktarget[1], len + sizeof(WideChar));
      result := RegSetValueExW(key, 'SymbolicLinkValue', 0, REG_LINK, data, len) = ERROR_SUCCESS;
    finally
      FreeMemory(data);
    end;
  finally
    RegCloseKey(key);
  end;
end;

function SetReglinkW(Keyname, LinkTarget: WideString): Boolean;
(*
  Changes the LinkTarget of a symbolic link

  Parameters and conventions similar to CreateRegLinkW().
*)
var
  key: HKEY;
  len, err: DWORD;
  data: Pointer;
begin
  Result := False;
  err := RegCreateKeyExW(HKEY_LOCAL_MACHINE, @keyname[1], 0, nil, REG_OPTION_OPEN_LINK, KEY_ALL_ACCESS, nil, key, nil);
  if err = ERROR_SUCCESS then
  try
    len := length(linktarget) * sizeof(WideChar);
    data := GetMemory(len + sizeof(WideChar));
    if Assigned(data) then
    try
      lstrcpynW(data, @linktarget[1], len + sizeof(WideChar));
      result := RegSetValueExW(key, 'SymbolicLinkValue', 0, REG_LINK, data, len) = ERROR_SUCCESS;
    finally
      FreeMemory(data);
    end;
  finally
    RegCloseKey(key);
  end;
end;


//------------------------------------------------------------------------------
{
Here are two examples for calling the functions:

  if CreateRegLinkW('Software\!Testlink2', '\Registry\Machine\Software\Microsoft') then ;
  if SetRegLinkW('Software\!Testlink2', '\Registry\Machine\Software\Microsoft\Windows NT') then ;
}

Luckie 7. Aug 2003 14:28

Re: Registry symbolic links (REG_LINK) per Win32 API erstell
 
Was ist ein symbolischer Link?

Assarbad 7. Aug 2003 18:09

Re: Registry symbolic links (REG_LINK) per Win32 API erstell
 
zB HKEY_CURRENT_USER ist ein Symlink auf HKEY_USERS\S-R-I-S-S...

Wobei der rote Bereich die SID deines Accounts ist. So arbeitet auch mein LoggedOn um in Erfahrung zu bringen, wer eingeloggt ist.

Aber als sog. API-Professional solltest du das ja wissen ;)

Luckie 7. Aug 2003 18:11

Re: Registry symbolic links (REG_LINK) per Win32 API erstell
 
Zitat:

Zitat von Assarbad
zB HKEY_CURRENT_USER ist ein Symlink auf HKEY_USERS\S-R-I-S-S...

Wobei der rote Bereich die SID deines Accounts ist. So arbeitet auch mein LoggedOn um in Erfahrung zu bringen, wer eingeloggt ist.

Aha.
Zitat:

Aber als sog. API-Professional solltest du das ja wissen ;)
Das habe ich nie von mir behauptet. :wink:

Assarbad 7. Aug 2003 18:24

Re: Registry symbolic links (REG_LINK) per Win32 API erstell
 
Zitat:

Zitat von Luckie
Das habe ich nie von mir behauptet.

Aber andere *g* ... siehe PSDK kann ich da leider nicht sagen, weil es eben nicht dokumentiert ist. Habe es mir anhand von Nebbetts Buch erarbeitet. Der hat dort ZwCreateKey beschrieben (siehe auch DDK).

CurrentControlSet ist auch immer ein Symlink auf das aktuelle der (mind) beiden Hardwareprofile


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz