Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
2e7b8cbc
Commit
2e7b8cbc
authored
Jul 09, 2008
by
Alexander Nicolaysen Sørnes
Committed by
Alexandre Julliard
Jul 10, 2008
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
regedit: Convert the rest of setValue to Unicode.
parent
f7f249e5
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
46 additions
and
27 deletions
+46
-27
regproc.c
programs/regedit/regproc.c
+46
-27
No files found.
programs/regedit/regproc.c
View file @
2e7b8cbc
...
...
@@ -26,6 +26,7 @@
#include <winnt.h>
#include <winreg.h>
#include <assert.h>
#include <wine/unicode.h>
#include "regproc.h"
#define REG_VAL_BUF_SIZE 4096
...
...
@@ -107,10 +108,13 @@ char* GetMultiByteString(const WCHAR* strW)
/******************************************************************************
* Converts a hex representation of a DWORD into a DWORD.
*/
static
BOOL
convertHexToDWord
(
char
*
str
,
DWORD
*
dw
)
static
BOOL
convertHexToDWord
(
WCHAR
*
str
,
DWORD
*
dw
)
{
char
buf
[
9
];
char
dummy
;
if
(
strlen
(
str
)
>
8
||
sscanf
(
str
,
"%x%c"
,
dw
,
&
dummy
)
!=
1
)
{
WideCharToMultiByte
(
CP_ACP
,
0
,
str
,
-
1
,
buf
,
9
,
NULL
,
NULL
);
if
(
lstrlenW
(
str
)
>
8
||
sscanf
(
buf
,
"%x%c"
,
dw
,
&
dummy
)
!=
1
)
{
fprintf
(
stderr
,
"%s: ERROR, invalid hex value
\n
"
,
getAppName
());
return
FALSE
;
}
...
...
@@ -120,17 +124,18 @@ static BOOL convertHexToDWord(char* str, DWORD *dw)
/******************************************************************************
* Converts a hex comma separated values list into a binary string.
*/
static
BYTE
*
convertHexCSVToHex
(
char
*
str
,
DWORD
*
size
)
static
BYTE
*
convertHexCSVToHex
(
WCHAR
*
strW
,
DWORD
*
size
)
{
char
*
s
;
BYTE
*
d
,
*
data
;
char
*
strA
=
GetMultiByteString
(
strW
);
/* The worst case is 1 digit + 1 comma per byte */
*
size
=
(
strlen
(
str
)
+
1
)
/
2
;
*
size
=
(
strlen
(
str
A
)
+
1
)
/
2
;
data
=
HeapAlloc
(
GetProcessHeap
(),
0
,
*
size
);
CHECK_ENOUGH_MEMORY
(
data
);
s
=
str
;
s
=
str
A
;
d
=
data
;
*
size
=
0
;
while
(
*
s
!=
'\0'
)
{
...
...
@@ -142,6 +147,7 @@ static BYTE* convertHexCSVToHex(char *str, DWORD *size)
fprintf
(
stderr
,
"%s: ERROR converting CSV hex stream. Invalid value at '%s'
\n
"
,
getAppName
(),
s
);
HeapFree
(
GetProcessHeap
(),
0
,
data
);
HeapFree
(
GetProcessHeap
(),
0
,
strA
);
return
NULL
;
}
*
d
++
=
(
BYTE
)
wc
;
...
...
@@ -150,6 +156,8 @@ static BYTE* convertHexCSVToHex(char *str, DWORD *size)
s
=
end
;
}
HeapFree
(
GetProcessHeap
(),
0
,
strA
);
return
data
;
}
...
...
@@ -160,17 +168,24 @@ static BYTE* convertHexCSVToHex(char *str, DWORD *size)
*
* Note: Updated based on the algorithm used in 'server/registry.c'
*/
static
DWORD
getDataType
(
LPSTR
*
lpValue
,
DWORD
*
parse_type
)
static
DWORD
getDataType
(
LP
W
STR
*
lpValue
,
DWORD
*
parse_type
)
{
struct
data_type
{
const
char
*
tag
;
int
len
;
int
type
;
int
parse_type
;
};
struct
data_type
{
const
WCHAR
*
tag
;
int
len
;
int
type
;
int
parse_type
;
};
static
const
WCHAR
quote
[]
=
{
'"'
};
static
const
WCHAR
str
[]
=
{
's'
,
't'
,
'r'
,
':'
,
'"'
};
static
const
WCHAR
str2
[]
=
{
's'
,
't'
,
'r'
,
'('
,
'2'
,
')'
,
':'
,
'"'
};
static
const
WCHAR
hex
[]
=
{
'h'
,
'e'
,
'x'
,
':'
};
static
const
WCHAR
dword
[]
=
{
'd'
,
'w'
,
'o'
,
'r'
,
'd'
,
':'
};
static
const
WCHAR
hexp
[]
=
{
'h'
,
'e'
,
'x'
,
'('
};
static
const
struct
data_type
data_types
[]
=
{
/* actual type */
/* type to assume for parsing */
{
"
\"
"
,
1
,
REG_SZ
,
REG_SZ
},
{
"str:
\"
"
,
5
,
REG_SZ
,
REG_SZ
},
{
"str(2):
\"
"
,
8
,
REG_EXPAND_SZ
,
REG_SZ
},
{
"hex:"
,
4
,
REG_BINARY
,
REG_BINARY
},
{
"dword:"
,
6
,
REG_DWORD
,
REG_DWORD
},
{
"hex("
,
4
,
-
1
,
REG_BINARY
},
{
quote
,
1
,
REG_SZ
,
REG_SZ
},
{
str
,
5
,
REG_SZ
,
REG_SZ
},
{
str2
,
8
,
REG_EXPAND_SZ
,
REG_SZ
},
{
hex
,
4
,
REG_BINARY
,
REG_BINARY
},
{
dword
,
6
,
REG_DWORD
,
REG_DWORD
},
{
hexp
,
4
,
-
1
,
REG_BINARY
},
{
NULL
,
0
,
0
,
0
}
};
...
...
@@ -178,7 +193,7 @@ static DWORD getDataType(LPSTR *lpValue, DWORD* parse_type)
int
type
;
for
(
ptr
=
data_types
;
ptr
->
tag
;
ptr
++
)
{
if
(
memcmp
(
ptr
->
tag
,
*
lpValue
,
ptr
->
len
))
if
(
strncmpW
(
ptr
->
tag
,
*
lpValue
,
ptr
->
len
))
continue
;
/* Found! */
...
...
@@ -186,13 +201,14 @@ static DWORD getDataType(LPSTR *lpValue, DWORD* parse_type)
type
=
ptr
->
type
;
*
lpValue
+=
ptr
->
len
;
if
(
type
==
-
1
)
{
char
*
end
;
WCHAR
*
end
;
/* "hex(xx):" is special */
type
=
(
int
)
strtoul
(
*
lpValue
,
&
end
,
16
);
type
=
(
int
)
strtoul
W
(
*
lpValue
,
&
end
,
16
);
if
(
**
lpValue
==
'\0'
||
*
end
!=
')'
||
*
(
end
+
1
)
!=
':'
)
{
type
=
REG_NONE
;
}
else
{
*
lpValue
=
end
+
2
;
*
lpValue
=
end
+
2
;
}
}
return
type
;
...
...
@@ -330,17 +346,18 @@ static HKEY currentKeyHandle = NULL;
* val_name - name of the registry value
* val_data - registry value data
*/
static
LONG
setValue
(
WCHAR
*
val_name
,
LPSTR
val_data
)
static
LONG
setValue
(
WCHAR
*
val_name
,
WCHAR
*
val_data
)
{
LONG
res
;
DWORD
dwDataType
,
dwParseType
;
LPBYTE
lpbData
;
DWORD
dwData
,
dwLen
;
WCHAR
del
[]
=
{
'-'
,
0
};
if
(
(
val_name
==
NULL
)
||
(
val_data
==
NULL
)
)
return
ERROR_INVALID_PARAMETER
;
if
(
strcmp
(
val_data
,
"-"
)
==
0
)
if
(
lstrcmpW
(
val_data
,
del
)
==
0
)
{
res
=
RegDeleteValueW
(
currentKeyHandle
,
val_name
);
return
(
res
==
ERROR_FILE_NOT_FOUND
?
ERROR_SUCCESS
:
res
);
...
...
@@ -351,19 +368,18 @@ static LONG setValue(WCHAR* val_name, LPSTR val_data)
if
(
dwParseType
==
REG_SZ
)
/* no conversion for string */
{
WCHAR
*
val_dataW
=
GetWideString
(
val_data
);
REGPROC_unescape_string
(
val_dataW
);
REGPROC_unescape_string
(
val_data
);
/* Compute dwLen after REGPROC_unescape_string because it may
* have changed the string length and we don't want to store
* the extra garbage in the registry.
*/
dwLen
=
lstrlenW
(
val_data
W
);
if
(
dwLen
>
0
&&
val_data
W
[
dwLen
-
1
]
==
'"'
)
dwLen
=
lstrlenW
(
val_data
);
if
(
dwLen
>
0
&&
val_data
[
dwLen
-
1
]
==
'"'
)
{
dwLen
--
;
val_data
W
[
dwLen
]
=
'\0'
;
val_data
[
dwLen
]
=
'\0'
;
}
lpbData
=
(
BYTE
*
)
val_data
W
;
lpbData
=
(
BYTE
*
)
val_data
;
dwLen
++
;
/* include terminating null */
dwLen
=
dwLen
*
sizeof
(
WCHAR
);
/* size is in bytes */
}
...
...
@@ -393,7 +409,7 @@ static LONG setValue(WCHAR* val_name, LPSTR val_data)
dwDataType
,
lpbData
,
dwLen
);
if
(
dwParseType
==
REG_BINARY
||
dwParseType
==
REG_SZ
)
if
(
dwParseType
==
REG_BINARY
)
HeapFree
(
GetProcessHeap
(),
0
,
lpbData
);
return
res
;
}
...
...
@@ -470,6 +486,7 @@ static void processSetValue(LPSTR line)
LPSTR
val_name
;
/* registry value name */
LPSTR
val_data
;
/* registry value data */
WCHAR
*
val_nameW
;
WCHAR
*
val_dataW
;
int
line_idx
=
0
;
/* current character under analysis */
LONG
res
;
...
...
@@ -510,9 +527,11 @@ static void processSetValue(LPSTR line)
val_data
=
line
+
line_idx
;
val_nameW
=
GetWideString
(
val_name
);
val_dataW
=
GetWideString
(
val_data
);
REGPROC_unescape_string
(
val_nameW
);
res
=
setValue
(
val_nameW
,
val_data
);
res
=
setValue
(
val_nameW
,
val_data
W
);
HeapFree
(
GetProcessHeap
(),
0
,
val_nameW
);
HeapFree
(
GetProcessHeap
(),
0
,
val_dataW
);
if
(
res
!=
ERROR_SUCCESS
)
fprintf
(
stderr
,
"%s: ERROR Key %s not created. Value: %s, Data: %s
\n
"
,
getAppName
(),
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment