Re: [Lazarus] Windows Registry, how do I read data from rdExpandString

2018-02-07 Thread Sven Barth via Lazarus
On 07.02.2018 20:52, Bo Berglund via Lazarus wrote:
> I had the impression before embarking on this that the 32 bit
> applications would read/write into Software/Wow6432Node/
> and would not be able to reach the Software/.
> But that seems not to be the case for my Lazarus program because in my
> viewer I can navigate the registry and I see the Wow6432Node item and
> can step into it too.

32-bit applications are de facto accessing Software/Wow6432Node/, but to them it appears as if they're accessing Software/. This is handled transparently by Windows.
If you want to disable this, you need to create the TRegistry class with
the KEY_WOW64_64KEY flag set, this way you'll access the real
Software/. Same is true if you use RegCreateKeyEx(),
RegOpenKeyEx() or RegDeleteKeyEx() directly.

Regards,
Sven
-- 
___
Lazarus mailing list
Lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus


Re: [Lazarus] Windows Registry, how do I read data from rdExpandString

2018-02-07 Thread Bo Berglund via Lazarus
On Tue, 6 Feb 2018 13:35:28 +0100, Alexander Hofmann via Lazarus
 wrote:

>Hi,
>
>as stated in the MSDN article you cited, the REG_EXPAND_SZ type is a
>hint to the API/API-User, that the string (stored as any other string
>either 2-byte or 1-byte depending in the Version) might contain
>environment variables, that need to be expanded before use.
>
>Respective M$ PowerShell, REG.exe versions etc. honor this hint and
>expand the variables before returning you the results...
>
...
>
>As for displaying - I would suggest displaying the "original" value
>(without expansion) alongside with a "current reading" e.g. containing
>the expanded string for the current system/user.
>

Thanks, then I will use ReadString for both types and let the registry
"fix" the values and expand the environment variables as needed.

While I have been looking at this I am getting more and more confused
about the 32/64 bit issues

I had the impression before embarking on this that the 32 bit
applications would read/write into Software/Wow6432Node/
and would not be able to reach the Software/.
But that seems not to be the case for my Lazarus program because in my
viewer I can navigate the registry and I see the Wow6432Node item and
can step into it too.
I will have to stuff this into Delphi to see if it holds true there as
well. Very confusing.

I have not yet embarked on 64 bit computing (at least I believe not).


-- 
Bo Berglund
Developer in Sweden

-- 
___
Lazarus mailing list
Lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus


Re: [Lazarus] Windows Registry, how do I read data from rdExpandString

2018-02-06 Thread Alexander Hofmann via Lazarus
Hi,

as stated in the MSDN article you cited, the REG_EXPAND_SZ type is a
hint to the API/API-User, that the string (stored as any other string
either 2-byte or 1-byte depending in the Version) might contain
environment variables, that need to be expanded before use.

Respective M$ PowerShell, REG.exe versions etc. honor this hint and
expand the variables before returning you the results...

Am 06.02.2018 um 11:15 schrieb Bo Berglund via Lazarus:
>
> If I use Reg.ReadString method on a REG_EXPAND_SZ item which I have
> found in the user settings in the registry for CVSNT I get back a
> string looking like this:
> C:\Programs\cvsnt\cvsnt-default.pem
Does it look like this in Regedit.exe? I think yes in this case. The
REG_EXPAND_SZ was "misused" here, because the next hex data below
translates to the same text. The intended use of REG_EXPAND_SZ would be
to store "%programfiles%\cvsnt\cvsnt-default.pem" instead - so that on
internationalized (pre-win7/vista) systems it might expand to e.g.
"c:\Programme\"...

> But if I export the registry key with RegEdit I get this instead:
> "CertificateFile"=hex(2):43,00,3a,00,5c,00,50,00,72,00,6f,00,67,00,72,00,61,00,\
>
> 6d,00,73,00,5c,00,63,00,76,00,73,00,6e,00,74,00,5c,00,63,00,76,00,73,00,6e,\
>
> 00,74,00,2d,00,64,00,65,00,66,00,61,00,75,00,6c,00,74,00,2e,00,70,00,65,00,\
>   6d,00,00,00
See e.g.
https://social.msdn.microsoft.com/Forums/en-US/6bbef2d0-425d-4fb7-8ced-29ff18b91698/regexpandsz-to-regsz-question?forum=vblanguage
REG_EXPAND_SZ has to be encoded in Hex to be compatible with old Regedit
versions / to be sure it is stored with the correct datatype.
> Can someone explain how it works? And why there is no TRegistry class
> method for fetching the REG_EXPAND_SZ data type?
That I don't know - but according to
https://msdn.microsoft.com/de-de/library/windows/desktop/ms724884(v=vs.85).aspx,
you are required to do the conversion yourself, i.e. call
ExpandEnvironmentStrings to get a usable path. But - you should try
reading a "correct" REG_EXPAND_SZ value first, or look at the code of
TRegistry, to see if there is any conversion going on at all.

As for displaying - I would suggest displaying the "original" value
(without expansion) alongside with a "current reading" e.g. containing
the expanded string for the current system/user.

Greetings,
Alex
-- 
___
Lazarus mailing list
Lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus


Re: [Lazarus] Windows Registry, how do I read data from rdExpandString

2018-02-06 Thread Bo Berglund via Lazarus
On Tue, 06 Feb 2018 10:58:21 +0100, Bo Berglund via Lazarus
 wrote:

>What I want to know is how to treat data of the type REG_EXPAND_SZ in
>the registry when reading it. There are not that many such but for
>completeness I want to be able to display these kinds of data too.

If I use Reg.ReadString method on a REG_EXPAND_SZ item which I have
found in the user settings in the registry for CVSNT I get back a
string looking like this:
C:\Programs\cvsnt\cvsnt-default.pem

But if I export the registry key with RegEdit I get this instead:
"CertificateFile"=hex(2):43,00,3a,00,5c,00,50,00,72,00,6f,00,67,00,72,00,61,00,\

6d,00,73,00,5c,00,63,00,76,00,73,00,6e,00,74,00,5c,00,63,00,76,00,73,00,6e,\

00,74,00,2d,00,64,00,65,00,66,00,61,00,75,00,6c,00,74,00,2e,00,70,00,65,00,\
  6d,00,00,00

It looks like the data is encoded with 16 bit values per character and
stored in successive 1-byte hex values with lsb first, but is this
always the case and why does the ReadString function not deliver the
hex in that case.

Can someone explain how it works? And why there is no TRegistry class
method for fetching the REG_EXPAND_SZ data type?
Does it have something to do with Unicode on Windows (I am testing on
a Windows 7 Pro X64 machine)?


-- 
Bo Berglund
Developer in Sweden

-- 
___
Lazarus mailing list
Lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus


Re: [Lazarus] Windows Registry, how do I read data from rdExpandString

2018-02-06 Thread Bo Berglund via Lazarus
On Sun, 04 Feb 2018 20:44:03 +0100, Bo Berglund via Lazarus
 wrote:

>So there is a case construct taht uses the data type reported on each
>item, but I don't know what to do about rdExpandString.
>In fact I don't know what kind of data may hide behind this data
>type...

What I want to know is how to treat data of the type REG_EXPAND_SZ in
the registry when reading it. THere are not tha many such but for
completeness I want to be able to display these kinds of data too.

And my code example in my previous post is not working, it contains a
few obvious bugs like using a loop variable inside the loop as a new
loop variable. But these are ironed out already so right now my main
concerns is still the treatment of REG_EXPAND_SZ data...

I googled and followed links into the Microsoft site where the format
should be described but it was only in words and no exact spec that I
could find. Like this:
https://support.microsoft.com/en-us/help/256986

Any ideas on what to do?


-- 
Bo Berglund
Developer in Sweden

-- 
___
Lazarus mailing list
Lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus


[Lazarus] Windows Registry, how do I read data from rdExpandString

2018-02-04 Thread Bo Berglund via Lazarus
I am writing a little Lazarus program to examine the registry values
stored by a program we use.
So far I have only used strings and integers in the registry, and I
have known in advance what type they are. Now I want to make a more
general kind of reader and so I have created a read function like
shown below.
So there is a case construct taht uses the data type reported on each
item, but I don't know what to do about rdExpandString.
In fact I don't know what kind of data may hide behind this data
type...

I would apprecieate to get some clarification on this because googling
has so far not resulted in anything for Pascal.

function ReadRegValues(Root: HKEY; Key: string; List: TStrings):
boolean;
var
  Reg: TRegistry;
  i: integer;
  sVal: string;
  siz: integer;
  DT: TRegDataType;
  BUF: TBytes;
begin
  List.Clear;
  Result := false;
  Reg := TRegistry.Create;
  try
Reg.RootKey := Root;
if not Reg.OpenKeyReadOnly(Key) then
  exit;
try
  Reg.GetValueNames(List);
  for i := 0 to List.Count-1 do
  begin
sVal := '';
try
  if Reg.ValueExists(List[i]) then
  begin
DT := Reg.GetDataType(List[i]);
  // one of (rdUnknown, rdString, rdExpandString, rdBinary, rdInteger)
case DT of
  rdString:
  sVal := Reg.ReadString(List[i]);
  rdExpandString: What to do here;
  rdBinary:
  begin
siz := Reg.GetDataSize(List[i]);
SetLength(BUF, siz);
sVal := '';
Reg.ReadBinaryData(List[i], BUF, siz);
for i := 0 to siz-1 do
  sVal := sVal + IntToHex(BUF[i], 2) + ' ';
  end;
  rdInteger:
  sVal := IntToStr(Reg.ReadInteger(List[i]));
end;

  end;
  List[i] := List[i] + '=' + sVal;
except
end;
  end;
  Result := true;
except
end;
  finally
Reg.Free;
  end;
end;


-- 
Bo Berglund
Developer in Sweden

-- 
___
Lazarus mailing list
Lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus