296 lines
6.6 KiB
C++
296 lines
6.6 KiB
C++
//----------------------------------------------------------------------------
|
|
//
|
|
// .ini file support.
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1999-2000.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "pch.cpp"
|
|
#pragma hdrstop
|
|
|
|
#include "conio.hpp"
|
|
#include "engine.hpp"
|
|
#include "ini.hpp"
|
|
#include "main.hpp"
|
|
|
|
#define INI_SECTION_DEFAULT "dbgeng"
|
|
|
|
static char *(g_Tokens[]) =
|
|
{
|
|
"debugchildren",
|
|
"debugoutput",
|
|
"stopfirst",
|
|
"verboseoutput",
|
|
"lazyload",
|
|
"true",
|
|
"false",
|
|
"$u0",
|
|
"$u1",
|
|
"$u2",
|
|
"$u3",
|
|
"$u4",
|
|
"$u5",
|
|
"$u6",
|
|
"$u7",
|
|
"$u8",
|
|
"$u9",
|
|
"stoponprocessexit",
|
|
"sxd",
|
|
"sxe",
|
|
"inifile",
|
|
"setdll",
|
|
"lines",
|
|
"srcopt",
|
|
"srcpath+"
|
|
};
|
|
|
|
int
|
|
GetIniToken(
|
|
PSTR* ppsz,
|
|
PSTR limit
|
|
)
|
|
{
|
|
PSTR psz = *ppsz;
|
|
int token;
|
|
|
|
while ((*psz == ' ' || *psz == '\t' || *psz == ':') &&
|
|
*psz && psz < limit)
|
|
{
|
|
psz++;
|
|
}
|
|
if (psz >= limit)
|
|
{
|
|
return 0;
|
|
}
|
|
*ppsz = psz;
|
|
while (*psz != ' ' && *psz != '\t' && *psz != ':' && *psz != '\n' &&
|
|
*psz != '\r'&& *psz && psz < limit)
|
|
{
|
|
*psz = (char)tolower(*psz);
|
|
psz++;
|
|
}
|
|
*psz = 0;
|
|
if (**ppsz == '[')
|
|
{
|
|
return NTINI_END;
|
|
}
|
|
|
|
for (token = 1; token < NTINI_INVALID; token++)
|
|
{
|
|
if (!strcmp(*ppsz, g_Tokens[token-1]))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
*ppsz = psz + 1;
|
|
return token;
|
|
}
|
|
|
|
BOOL
|
|
FindIniSection(FILE* File, PSTR Section)
|
|
{
|
|
char Ch, Tst;
|
|
ULONG Index = 0;
|
|
|
|
Ch = *Section;
|
|
while (Ch && !feof(File))
|
|
{
|
|
Tst = (char)fgetc(File);
|
|
if ((char)tolower(Ch) == (char)tolower(Tst))
|
|
{
|
|
Ch = Section[++Index];
|
|
}
|
|
else
|
|
{
|
|
Ch = Section[Index = 0];
|
|
}
|
|
}
|
|
|
|
return Ch == 0;
|
|
}
|
|
|
|
void
|
|
ReadIniFile(
|
|
PULONG debugType
|
|
)
|
|
{
|
|
FILE* file;
|
|
char pszName[256];
|
|
char rchBuf[_MAX_PATH];
|
|
PSTR pszMark;
|
|
PSTR pchCur;
|
|
DWORD length;
|
|
int index;
|
|
int token, value;
|
|
|
|
length = GetEnvironmentVariable(INI_DIR,
|
|
pszName,
|
|
sizeof(pszName) - sizeof(INI_FILE));
|
|
if (length == 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
strcpy(pszName + length, INI_FILE);
|
|
|
|
if (!(file = fopen(pszName, "r")))
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Look for a section specific to this debugger first.
|
|
if (!FindIniSection(file, g_DebuggerName))
|
|
{
|
|
// Didn't find a specific section, look for
|
|
// the generic debugger settings section.
|
|
rewind(file);
|
|
if (!FindIniSection(file, INI_SECTION_DEFAULT))
|
|
{
|
|
fclose(file);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Now just read the lines in
|
|
do
|
|
{
|
|
PSTR psz = rchBuf;
|
|
|
|
if (!fgets(rchBuf, sizeof(rchBuf), file))
|
|
{
|
|
break;
|
|
}
|
|
|
|
for (index = 0; rchBuf[index] && rchBuf[index] > 26; index++)
|
|
{
|
|
;
|
|
}
|
|
rchBuf[index] = 0;
|
|
|
|
token = GetIniToken(&psz, rchBuf + sizeof(rchBuf));
|
|
if (token >= NTINI_USERREG0 && token <= NTINI_USERREG9)
|
|
{
|
|
while ((*psz == ' ' || *psz == '\t' || *psz == ':') && *psz)
|
|
{
|
|
psz++;
|
|
}
|
|
if (*psz)
|
|
{
|
|
g_DbgControl->SetTextMacro(token - NTINI_USERREG0, psz);
|
|
}
|
|
continue;
|
|
}
|
|
|
|
switch (token)
|
|
{
|
|
case NTINI_SXD:
|
|
case NTINI_SXE:
|
|
ExecuteCmd("sx", *(psz - 2), ' ', psz);
|
|
continue;
|
|
case NTINI_INIFILE:
|
|
g_InitialInputFile = (PSTR)calloc(1, strlen(psz) + 1);
|
|
if (!g_InitialInputFile)
|
|
{
|
|
ErrorExit("%s: Input file memory allocation failed\n",
|
|
g_DebuggerName);
|
|
}
|
|
strcpy(g_InitialInputFile, psz);
|
|
continue;
|
|
case NTINI_DEFAULTEXT:
|
|
ULONG64 Handle;
|
|
|
|
g_DbgControl->AddExtension(psz, DEBUG_EXTENSION_AT_ENGINE,
|
|
&Handle);
|
|
continue;
|
|
case NTINI_SRCOPT:
|
|
while ((*psz == ' ' || *psz == '\t' || *psz == ':') && *psz)
|
|
{
|
|
psz++;
|
|
}
|
|
ExecuteCmd("l+", 0, 0, psz);
|
|
continue;
|
|
case NTINI_SRCPATHA:
|
|
ExecuteCmd(".srcpath+", 0, ' ', psz);
|
|
continue;
|
|
}
|
|
|
|
value = GetIniToken(&psz, rchBuf + sizeof(rchBuf)) != NTINI_FALSE;
|
|
switch (token)
|
|
{
|
|
case NTINI_STOPONPROCESSEXIT:
|
|
if (value)
|
|
{
|
|
g_DbgControl->AddEngineOptions(DEBUG_ENGOPT_FINAL_BREAK);
|
|
}
|
|
else
|
|
{
|
|
g_DbgControl->RemoveEngineOptions(DEBUG_ENGOPT_FINAL_BREAK);
|
|
}
|
|
break;
|
|
case NTINI_DEBUGCHILDREN:
|
|
if (value)
|
|
{
|
|
*debugType = DEBUG_PROCESS;
|
|
}
|
|
break;
|
|
case NTINI_DEBUGOUTPUT:
|
|
if (value)
|
|
{
|
|
g_IoMode = IO_DEBUG;
|
|
}
|
|
else
|
|
{
|
|
g_IoMode = IO_CONSOLE;
|
|
}
|
|
break;
|
|
case NTINI_STOPFIRST:
|
|
if (value)
|
|
{
|
|
g_DbgControl->AddEngineOptions(DEBUG_ENGOPT_INITIAL_BREAK);
|
|
}
|
|
else
|
|
{
|
|
g_DbgControl->RemoveEngineOptions(DEBUG_ENGOPT_INITIAL_BREAK);
|
|
}
|
|
break;
|
|
case NTINI_VERBOSEOUTPUT:
|
|
ULONG OutMask;
|
|
g_DbgClient->GetOutputMask(&OutMask);
|
|
if (value)
|
|
{
|
|
OutMask |= DEBUG_OUTPUT_VERBOSE;
|
|
}
|
|
else
|
|
{
|
|
OutMask &= ~DEBUG_OUTPUT_VERBOSE;
|
|
}
|
|
g_DbgClient->SetOutputMask(OutMask);
|
|
g_DbgControl->SetLogMask(OutMask);
|
|
break;
|
|
case NTINI_LAZYLOAD:
|
|
if (value)
|
|
{
|
|
g_DbgSymbols->AddSymbolOptions(SYMOPT_DEFERRED_LOADS);
|
|
}
|
|
else
|
|
{
|
|
g_DbgSymbols->RemoveSymbolOptions(SYMOPT_DEFERRED_LOADS);
|
|
}
|
|
break;
|
|
case NTINI_LINES:
|
|
if (value)
|
|
{
|
|
g_DbgSymbols->AddSymbolOptions(SYMOPT_LOAD_LINES);
|
|
}
|
|
else
|
|
{
|
|
g_DbgSymbols->RemoveSymbolOptions(SYMOPT_LOAD_LINES);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
while (token != NTINI_END);
|
|
fclose(file);
|
|
}
|