|
@@ -61,8 +61,8 @@ Type
|
|
|
Function CreateKey(KeyPath : String) : Boolean;
|
|
|
Function GetValueSize(Name : String) : Integer;
|
|
|
Function GetValueType(Name : String) : TDataType;
|
|
|
- Function GetValueInfo(Name : String; Var Info : TDataInfo) : Boolean;
|
|
|
- Function GetKeyInfo(Var Info : TKeyInfo) : Boolean;
|
|
|
+ Function GetValueInfo(Name : String; Out Info : TDataInfo) : Boolean;
|
|
|
+ Function GetKeyInfo(Out Info : TKeyInfo) : Boolean;
|
|
|
Function EnumSubKeys(List : TStrings) : Integer;
|
|
|
Function EnumValues(List : TStrings) : Integer;
|
|
|
Function KeyExists(KeyPath : String) : Boolean;
|
|
@@ -71,7 +71,7 @@ Type
|
|
|
Function DeleteValue(S : String) : Boolean;
|
|
|
Procedure Flush;
|
|
|
Procedure Load;
|
|
|
- Function GetValueData(Name : String; Var DataType : TDataType; Var Data; Var DataSize : Integer) : Boolean;
|
|
|
+ Function GetValueData(Name : String; Out DataType : TDataType; Var Data; Var DataSize : Integer) : Boolean;
|
|
|
Function SetValueData(Name : String; DataType : TDataType; Const Data; DataSize : Integer) : Boolean;
|
|
|
Property FileName : String Read FFileName Write SetFileName;
|
|
|
Property RootKey : String Read FRootKey Write SetRootkey;
|
|
@@ -285,7 +285,7 @@ begin
|
|
|
MaybeFlush;
|
|
|
end;
|
|
|
|
|
|
-Function TXmlRegistry.GetValueData(Name : String; Var DataType : TDataType; Var Data; Var DataSize : Integer) : Boolean;
|
|
|
+Function TXmlRegistry.GetValueData(Name : String; Out DataType : TDataType; Var Data; Var DataSize : Integer) : Boolean;
|
|
|
|
|
|
Type
|
|
|
PCardinal = ^Cardinal;
|
|
@@ -293,7 +293,7 @@ Type
|
|
|
Var
|
|
|
Node : TDomElement;
|
|
|
DataNode : TDomNode;
|
|
|
- ND : Integer;
|
|
|
+ BL,ND,NS : Integer;
|
|
|
S : UTF8String;
|
|
|
HasData: Boolean;
|
|
|
IntValue: Integer;
|
|
@@ -309,38 +309,37 @@ begin
|
|
|
If Result then
|
|
|
begin
|
|
|
DataType:=TDataType(ND);
|
|
|
+ NS:=0; // Initialize, for optional nodes.
|
|
|
Case DataType of
|
|
|
dtDWORD : begin // DataNode is required
|
|
|
- if HasData and TryStrToInt(DataNode.NodeValue,IntValue) then
|
|
|
- begin
|
|
|
+ NS:=SizeOf(Cardinal);
|
|
|
+ Result:=HasData and TryStrToInt(DataNode.NodeValue,IntValue) and (DataSize>=NS);
|
|
|
+ if Result then
|
|
|
PCardinal(@Data)^:=IntValue;
|
|
|
- DataSize:=SizeOf(Cardinal);
|
|
|
- end
|
|
|
- else
|
|
|
- Result:=False;
|
|
|
end;
|
|
|
- dtString : begin // DataNode is optional
|
|
|
+ dtString : // DataNode is optional
|
|
|
if HasData then
|
|
|
begin
|
|
|
S:=UTF8Encode(DataNode.NodeValue); // Convert to ansistring
|
|
|
- DataSize:=Length(S);
|
|
|
- if (DataSize>0) then
|
|
|
- Move(S[1],Data,DataSize);
|
|
|
- end
|
|
|
- else
|
|
|
- DataSize:=0;
|
|
|
- end;
|
|
|
- dtBinary : begin // DataNode is optional
|
|
|
+ NS:=Length(S);
|
|
|
+ Result:=(DataSize>=NS);
|
|
|
+ if Result then
|
|
|
+ Move(S[1],Data,NS);
|
|
|
+ end;
|
|
|
+
|
|
|
+ dtBinary : // DataNode is optional
|
|
|
if HasData then
|
|
|
begin
|
|
|
- DataSize:=Length(DataNode.NodeValue);
|
|
|
- If (DataSize>0) then
|
|
|
- HexToBuf(DataNode.NodeValue,Data,DataSize);
|
|
|
- end
|
|
|
- else
|
|
|
- DataSize:=0;
|
|
|
- end;
|
|
|
+ BL:=Length(DataNode.NodeValue);
|
|
|
+ NS:=BL div 2;
|
|
|
+ Result:=DataSize>=NS;
|
|
|
+ If Result then
|
|
|
+ // No need to check for -1, We checked NS before calling.
|
|
|
+ NS:=HexToBuf(DataNode.NodeValue,Data,BL);
|
|
|
+ end;
|
|
|
end;
|
|
|
+ // Report needed/used size in all cases
|
|
|
+ DataSize:=NS;
|
|
|
end;
|
|
|
end;
|
|
|
end;
|
|
@@ -539,16 +538,21 @@ end;
|
|
|
Function TXMLRegistry.hexToBuf(Const Str : String; Var Buf; Var Len : Integer ) : Integer;
|
|
|
|
|
|
Var
|
|
|
- I : Integer;
|
|
|
+ NLeN,I : Integer;
|
|
|
P : PByte;
|
|
|
S : String;
|
|
|
B : Byte;
|
|
|
Code : Integer;
|
|
|
|
|
|
begin
|
|
|
- P:=@Buf;
|
|
|
- Len:= Length(Str) div 2;
|
|
|
Result:=0;
|
|
|
+ P:=@Buf;
|
|
|
+ NLen:= Length(Str) div 2;
|
|
|
+ If (NLen>Len) then
|
|
|
+ begin
|
|
|
+ Len:=NLen;
|
|
|
+ Exit(-1);
|
|
|
+ end;
|
|
|
For I:=0 to Len-1 do
|
|
|
begin
|
|
|
S:='$'+Copy(Str,(I*2)+1,2);
|
|
@@ -602,7 +606,7 @@ begin
|
|
|
Result:=dtUnknown;
|
|
|
end;
|
|
|
|
|
|
-Function TXMLRegistry.GetValueInfo(Name : String; Var Info : TDataInfo) : Boolean;
|
|
|
+Function TXMLRegistry.GetValueInfo(Name : String; Out Info : TDataInfo) : Boolean;
|
|
|
|
|
|
Var
|
|
|
N : TDomElement;
|
|
@@ -633,14 +637,14 @@ begin
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
-Function TXMLRegistry.GetKeyInfo(Var Info : TKeyInfo) : Boolean;
|
|
|
+Function TXMLRegistry.GetKeyInfo(Out Info : TKeyInfo) : Boolean;
|
|
|
|
|
|
Var
|
|
|
Node,DataNode : TDOMNode;
|
|
|
L : Integer;
|
|
|
|
|
|
begin
|
|
|
- FillChar(Info,SizeOf(Info),0);
|
|
|
+ Info:=Default(TKeyInfo);
|
|
|
Result:=FCurrentElement<>Nil;
|
|
|
If Result then
|
|
|
With Info do
|