windows-nt/Source/XPSP1/NT/windows/winstate/cobra/utils/memdb/memdbutil.c
2020-09-26 16:20:57 +08:00

243 lines
5.8 KiB
C

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
memdbutil.c
Abstract:
MemDb Utility functions
Author:
Jim Schmidt (jimschm) 8-Aug-1996
Revision History:
mvander xx-xxx-1999 split from memdb.c
--*/
#include "pch.h"
BOOL
MemDbValidateDatabase (
VOID
)
{
// NTRAID#NTBUG9-153308-2000/08/01-jimschm Reimplement MemDbValidateDatabase
return TRUE;
}
/*++
Routine Description:
MemDbMakeNonPrintableKey converts the double-backslashe pairs in a string
to ASCII 1, a non-printable character. This allows the caller to store
properly escaped strings in MemDb.
This routine is desinged to be expanded for other types of escape
processing.
Arguments:
KeyName - Specifies the key text; receives the converted text. The DBCS
version may grow the text buffer, so the text buffer must be twice
the length of the inbound string.
Flags - Specifies the type of conversion. Currently only
MEMDB_CONVERT_DOUBLEWACKS_TO_ASCII_1 is supported.
Return Value:
none
--*/
VOID
MemDbMakeNonPrintableKeyA (
IN OUT PSTR KeyName,
IN UINT Flags
)
{
while (*KeyName) {
if (Flags & MEMDB_CONVERT_DOUBLEWACKS_TO_ASCII_1) {
if (_mbsnextc (KeyName) == '\\' &&
_mbsnextc (_mbsinc (KeyName)) == '\\'
) {
_setmbchar (KeyName, 1);
KeyName = _mbsinc (KeyName);
MYASSERT (_mbsnextc (KeyName) == '\\');
_setmbchar (KeyName, 1);
}
DEBUGMSG_IF ((
_mbsnextc (KeyName) == 1,
DBG_WHOOPS,
"MemDbMakeNonPrintableKeyA: Non-printable character "
"collision detected; key was damaged"
));
}
if (Flags & MEMDB_CONVERT_WILD_STAR_TO_ASCII_2) {
if (_mbsnextc (KeyName) == '*') {
_setmbchar (KeyName, 2);
}
DEBUGMSG_IF ((
_mbsnextc (_mbsinc (KeyName)) == 2,
DBG_WHOOPS,
"MemDbMakeNonPrintableKeyA: Non-printable character "
"collision detected; key was damaged"
));
}
if (Flags & MEMDB_CONVERT_WILD_QMARK_TO_ASCII_3) {
if (_mbsnextc (KeyName) == '?') {
_setmbchar (KeyName, 3);
}
DEBUGMSG_IF ((
_mbsnextc (_mbsinc (KeyName)) == 3,
DBG_WHOOPS,
"MemDbMakeNonPrintableKeyA: Non-printable character "
"collision detected; key was damaged"
));
}
KeyName = _mbsinc (KeyName);
}
}
VOID
MemDbMakeNonPrintableKeyW (
IN OUT PWSTR KeyName,
IN UINT Flags
)
{
while (*KeyName) {
if (Flags & MEMDB_CONVERT_DOUBLEWACKS_TO_ASCII_1) {
if (KeyName[0] == L'\\' && KeyName[1] == L'\\') {
KeyName[0] = 1;
KeyName[1] = 1;
KeyName++;
}
DEBUGMSG_IF ((
KeyName[0] == 1,
DBG_WHOOPS,
"MemDbMakeNonPrintableKeyW: Non-printable character "
"collision detected; key was damaged"
));
}
if (Flags & MEMDB_CONVERT_WILD_STAR_TO_ASCII_2) {
if (KeyName[0] == L'*') {
KeyName[0] = 2;
}
DEBUGMSG_IF ((
KeyName[1] == 2,
DBG_WHOOPS,
"MemDbMakeNonPrintableKeyW: Non-printable character "
"collision detected; key was damaged"
));
}
if (Flags & MEMDB_CONVERT_WILD_QMARK_TO_ASCII_3) {
if (KeyName[0] == L'*') {
KeyName[0] = 3;
}
DEBUGMSG_IF ((
KeyName[1] == 3,
DBG_WHOOPS,
"MemDbMakeNonPrintableKeyW: Non-printable character "
"collision detected; key was damaged"
));
}
KeyName++;
}
}
/*++
Routine Description:
MemDbMakePrintableKey converts the ASCII 1 characters to backslashes,
restoring the string converted by MemDbMakeNonPrintableKey.
This routine is desinged to be expanded for other types of escape
processing.
Arguments:
KeyName - Specifies the key text; receives the converted text. The DBCS
version may grow the text buffer, so the text buffer must be twice
the length of the inbound string.
Flags - Specifies the type of conversion. Currently only
MEMDB_CONVERT_DOUBLEWACKS_TO_ASCII_1 is supported.
Return Value:
none
--*/
VOID
MemDbMakePrintableKeyA (
IN OUT PSTR KeyName,
IN UINT Flags
)
{
while (*KeyName) {
if (Flags & MEMDB_CONVERT_DOUBLEWACKS_TO_ASCII_1) {
if (_mbsnextc (KeyName) == 1) {
_setmbchar (KeyName, '\\');
}
}
if (Flags & MEMDB_CONVERT_WILD_STAR_TO_ASCII_2) {
if (_mbsnextc (KeyName) == 2) {
_setmbchar (KeyName, '*');
}
}
if (Flags & MEMDB_CONVERT_WILD_QMARK_TO_ASCII_3) {
if (_mbsnextc (KeyName) == 3) {
_setmbchar (KeyName, '?');
}
}
KeyName = _mbsinc (KeyName);
}
}
VOID
MemDbMakePrintableKeyW (
IN OUT PWSTR KeyName,
IN UINT Flags
)
{
while (*KeyName) {
if (Flags & MEMDB_CONVERT_DOUBLEWACKS_TO_ASCII_1) {
if (KeyName[0] == 1) {
KeyName[0] = L'\\';
}
}
if (Flags & MEMDB_CONVERT_WILD_STAR_TO_ASCII_2) {
if (KeyName[0] == 2) {
KeyName[0] = L'*';
}
}
if (Flags & MEMDB_CONVERT_WILD_QMARK_TO_ASCII_3) {
if (KeyName[0] == 3) {
KeyName[0] = L'?';
}
}
KeyName++;
}
}