|
|
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
datafilt.c
Abstract:
Routines to filter registry values.
Author:
Jim Schmidt (jimschm) 11-Mar-1997
Revision History:
jimschm 23-Sep-1998 Debugging message fix jimschm 10-Sep-1998 Mapping mechanism jimschm 25-Mar-1998 Added FilterRegValue
--*/
#include "pch.h"
#include "mergep.h"
#define DBG_DATAFILTER "Data Filter"
VOID SpecialFileFixup ( PTSTR Buffer ) { PTSTR p;
// check for rundll32 with no .exe extension
p = (PTSTR) _tcsistr (Buffer, TEXT("rundll32")); if (p) { // replace foo\rundll32 <args> with rundll32.exe <args>
p += 8; // go beyond the characters "rundll32"
if (_tcsnextc (p) != TEXT('.')) { // p points to start of arg list or a nul if no args
MoveMemory (Buffer + 12, p, SizeOfString (p)); _tcsncpy (Buffer, TEXT("rundll32.exe"), 12); } return; } }
VOID AddQuotesIfNecessary ( PTSTR File ) { if (_tcspbrk (File, TEXT(" ;,"))) { MoveMemory (File + 1, File, SizeOfString (File)); *File = TEXT('\"'); StringCat (File, TEXT("\"")); } }
BOOL CanFileBeInRegistryData ( IN PCTSTR Data ) { //
// Scan registry data for a colon or a dot
//
if (_tcspbrk (Data, TEXT(":.\\"))) { return TRUE; }
return FALSE; }
BOOL FilterObject ( IN OUT PDATAOBJECT SrcObPtr ) { if (IsWin95Object (SrcObPtr) && (SrcObPtr->Value.Size < MAX_TCHAR_PATH * sizeof (TCHAR)) && (SrcObPtr->Value.Size > 4 * sizeof (TCHAR)) // must have drive letter
) { TCHAR Buffer[MAX_CMDLINE];
switch (SrcObPtr->Type) { case REG_NONE: if (*((PCTSTR) (SrcObPtr->Value.Buffer + SrcObPtr->Value.Size - sizeof (TCHAR)))) { // don't process unless it is nul-terminated
break; } // fall through
case REG_SZ: // Require the data to contain a basic symbol that a path or file requires
if (!CanFileBeInRegistryData ((PCTSTR) SrcObPtr->Value.Buffer)) { break; }
_tcssafecpy (Buffer, (PCTSTR) SrcObPtr->Value.Buffer, MAX_CMDLINE); if (ConvertWin9xCmdLine (Buffer, DEBUGENCODER(SrcObPtr), NULL)) { // cmd line has changed
ReplaceValue (SrcObPtr, (PBYTE) Buffer, SizeOfString (Buffer)); } break;
case REG_EXPAND_SZ: ExpandEnvironmentStrings ((PCTSTR) SrcObPtr->Value.Buffer, Buffer, sizeof (Buffer) / sizeof (TCHAR));
// Require the data to contain a basic symbol that a path or file requires
if (!CanFileBeInRegistryData ((PCTSTR) Buffer)) { break; }
if (ConvertWin9xCmdLine (Buffer, DEBUGENCODER(SrcObPtr), NULL)) { // cmd line has changed
DEBUGMSG ((DBG_VERBOSE, "%s was expanded from %s", Buffer, SrcObPtr->Value.Buffer)); ReplaceValue (SrcObPtr, (PBYTE) Buffer, SizeOfString (Buffer)); } break; } }
return TRUE; }
PBYTE FilterRegValue ( IN PBYTE Data, IN DWORD DataSize, IN DWORD DataType, IN PCTSTR KeyForDbgMsg, OPTIONAL OUT PDWORD NewDataSize )
/*++
Routine Description:
FilterRegValue examines the specified registry data and updates any paths that have moved.
Arguments:
Data - Specifies a ReuseAlloc'd buffer containing the registry value data. DataSize - Specifies the size of the registry value data, as returned by the registry APIs. DataType - Specifies the type of the registry data, as specified by the registry APIs.
KeyForDbgMsg - Specifies registry key, used only for debug messages
NewDataSize - Receives the size of the data returned
Return Value:
Returns Data if no changes were made, or a reallocated pointer if changes were made. If NULL is returned, an error occurred.
--*/
{ TCHAR Buffer[MAX_CMDLINE]; PBYTE NewData = Data; DWORD Size;
*NewDataSize = DataSize;
switch (DataType) { case REG_NONE: if (*((PCTSTR) (Data + DataSize - sizeof (TCHAR)))) { // don't process unless it is nul-terminated
break; } // fall through
case REG_SZ: // Require the data to contain a basic symbol that a path or file requires
if (!CanFileBeInRegistryData ((PCTSTR) Data)) { break; }
_tcssafecpy (Buffer, (PCTSTR) Data, MAX_CMDLINE); if (ConvertWin9xCmdLine (Buffer, KeyForDbgMsg, NULL)) { // cmd line has changed
Size = SizeOfString (Buffer); NewData = (PBYTE) ReuseAlloc (g_hHeap, Data, Size);
if (NewData) { StringCopy ((PTSTR) NewData, Buffer); *NewDataSize = Size; } else { NewData = Data; DEBUGMSG ((DBG_ERROR, "FilterRegValue: ReuseAlloc failed")); } } break;
case REG_EXPAND_SZ: ExpandEnvironmentStrings ((PCTSTR) Data, Buffer, sizeof (Buffer) / sizeof (TCHAR));
// Require the data to contain a basic symbol that a path or file requires
if (!CanFileBeInRegistryData ((PCTSTR) Buffer)) { break; }
if (ConvertWin9xCmdLine (Buffer, KeyForDbgMsg, NULL)) { // cmd line has changed
DEBUGMSG ((DBG_VERBOSE, "%s was expanded from %s", Buffer, Data));
Size = SizeOfString (Buffer); NewData = (PBYTE) ReuseAlloc (g_hHeap, Data, Size);
if (NewData) { StringCopy ((PTSTR) NewData, Buffer); *NewDataSize = Size; } else { NewData = Data; DEBUGMSG ((DBG_ERROR, "FilterRegValue: ReuseAlloc failed")); } } break; }
return NewData; }
|