Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

354 lines
7.8 KiB

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
common.c
Abstract:
Utility routines used by Lodctr and/or UnLodCtr
Author:
Bob Watson (a-robw) 12 Feb 93
Revision History:
--*/
#define UNICODE 1
#define _UNICODE 1
//
// "C" Include files
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
//
// Windows Include files
//
#include <windows.h>
#include <winperf.h>
#include <tchar.h>
//
// local include files
//
#include "common.h"
//
//
// Text string Constant definitions
//
const LPTSTR NamesKey = TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib");
const LPTSTR DefaultLangId = TEXT("009");
const LPTSTR Counters = TEXT("Counters");
const LPTSTR Help = TEXT("Help");
const LPTSTR VersionStr = TEXT("Version");
const LPTSTR LastHelp = TEXT("Last Help");
const LPTSTR LastCounter = TEXT("Last Counter");
const LPTSTR FirstHelp = TEXT("First Help");
const LPTSTR FirstCounter = TEXT("First Counter");
const LPTSTR Busy = TEXT("Updating");
const LPTSTR Slash = TEXT("\\");
const LPTSTR BlankString = TEXT(" ");
const LPSTR BlankAnsiString = " ";
const LPTSTR DriverPathRoot = TEXT("SYSTEM\\CurrentControlSet\\Services");
const LPTSTR Performance = TEXT("Performance");
const LPTSTR CounterNameStr = TEXT("Counter ");
const LPTSTR HelpNameStr = TEXT("Explain ");
const LPTSTR AddCounterNameStr = TEXT("Addcounter ");
const LPTSTR AddHelpNameStr = TEXT("Addexplain ");
//
// Global (to this module0 Buffers
//
static TCHAR DisplayStringBuffer[DISP_BUFF_SIZE];
static TCHAR TextFormat[DISP_BUFF_SIZE];
static HANDLE hMod = NULL; // process handle
static DWORD dwLastError = ERROR_SUCCESS;
//
// local static data
//
static TCHAR cDoubleQuote = TEXT('\"');
BOOL
__stdcall
DllEntryPoint(
IN HANDLE DLLHandle,
IN DWORD Reason,
IN LPVOID ReservedAndUnused
)
{
BOOL bReturn = FALSE;
ReservedAndUnused;
switch(Reason) {
case DLL_PROCESS_ATTACH:
hMod = DLLHandle; // use DLL handle , not APP handle
bReturn = TRUE;
break;
case DLL_PROCESS_DETACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
bReturn = TRUE;
}
return bReturn;
}
LPCTSTR
GetStringResource (
UINT wStringId
)
/*++
Retrived UNICODE strings from the resource file for display
--*/
{
if (!hMod) {
hMod = (HINSTANCE)GetModuleHandle(NULL); // get instance ID of this module;
}
if (hMod) {
if ((LoadString(hMod, wStringId, DisplayStringBuffer, DISP_BUFF_SIZE)) > 0) {
return (LPTSTR)&DisplayStringBuffer[0];
} else {
dwLastError = GetLastError();
return BlankString;
}
} else {
return BlankString;
}
}
LPCTSTR
GetFormatResource (
UINT wStringId
)
/*++
Returns an ANSI string for use as a format string in a printf fn.
--*/
{
if (!hMod) {
hMod = (HINSTANCE)GetModuleHandle(NULL); // get instance ID of this module;
}
if (hMod) {
if ((LoadString(hMod, wStringId, TextFormat, DISP_BUFF_SIZE)) > 0) {
return (LPCTSTR)&TextFormat[0];
} else {
dwLastError = GetLastError();
return BlankString;
}
} else {
return BlankString;
}
}
VOID
DisplayCommandHelp (
UINT iFirstLine,
UINT iLastLine
)
/*++
DisplayCommandHelp
displays usage of command line arguments
Arguments
NONE
Return Value
NONE
--*/
{
UINT iThisLine;
for (iThisLine = iFirstLine;
iThisLine <= iLastLine;
iThisLine++) {
_tprintf (TEXT("\n%s"), GetStringResource(iThisLine));
}
} // DisplayCommandHelp
BOOL
TrimSpaces (
IN OUT LPTSTR szString
)
/*++
Routine Description:
Trims leading and trailing spaces from szString argument, modifying
the buffer passed in
Arguments:
IN OUT LPTSTR szString
buffer to process
Return Value:
TRUE if string was modified
FALSE if not
--*/
{
LPTSTR szSource;
LPTSTR szDest;
LPTSTR szLast;
BOOL bChars;
szLast = szSource = szDest = szString;
bChars = FALSE;
while (*szSource != 0) {
// skip leading non-space chars
if (!_istspace(*szSource)) {
szLast = szDest;
bChars = TRUE;
}
if (bChars) {
// remember last non-space character
// copy source to destination & increment both
*szDest++ = *szSource++;
} else {
szSource++;
}
}
if (bChars) {
*++szLast = 0; // terminate after last non-space char
} else {
// string was all spaces so return an empty (0-len) string
*szString = 0;
}
return (szLast != szSource);
}
BOOL
IsDelimiter (
IN TCHAR cChar,
IN TCHAR cDelimiter
)
/*++
Routine Description:
compares the characte to the delimiter. If the delimiter is
a whitespace character then any whitespace char will match
otherwise an exact match is required
--*/
{
if (_istspace(cDelimiter)) {
// delimiter is whitespace so any whitespace char will do
return (_istspace(cChar));
} else {
// delimiter is not white space so use an exact match
return (cChar == cDelimiter);
}
}
LPCTSTR
GetItemFromString (
IN LPCTSTR szEntry,
IN DWORD dwItem,
IN TCHAR cDelimiter
)
/*++
Routine Description:
returns nth item from a list delimited by the cDelimiter Char.
Leaves (double)quoted strings intact.
Arguments:
IN LPCTSTR szEntry
Source string returned to parse
IN DWORD dwItem
1-based index indicating which item to return. (i.e. 1= first item
in list, 2= second, etc.)
IN TCHAR cDelimiter
character used to separate items. Note if cDelimiter is WhiteSpace
(e.g. a tab or a space) then any white space will serve as a delim.
Return Value:
pointer to buffer containing desired entry in string. Note, this
routine may only be called 4 times before the string
buffer is re-used. (i.e. don't use this function more than
4 times in single function call!!)
--*/
{
static TCHAR szReturnBuffer[4][MAX_PATH];
static LONG dwBuff;
LPTSTR szSource, szDest;
DWORD dwThisItem;
dwBuff = ++dwBuff % 4; // wrap buffer index
szSource = (LPTSTR)szEntry;
szDest = &szReturnBuffer[dwBuff][0];
// clear previous contents
memset (szDest, 0, (MAX_PATH * sizeof(TCHAR)));
// find desired entry in string
dwThisItem = 1;
while (dwThisItem < dwItem) {
if (*szSource != 0) {
while (!IsDelimiter(*szSource, cDelimiter) && (*szSource != 0)) {
if (*szSource == cDoubleQuote) {
// if this is a quote, then go to the close quote
szSource++;
while ((*szSource != cDoubleQuote) && (*szSource != 0)) szSource++;
}
if (*szSource != 0) szSource++;
}
}
dwThisItem++;
if (*szSource != 0) szSource++;
}
// copy this entry to the return buffer
if (*szSource != 0) {
while (!IsDelimiter(*szSource, cDelimiter) && (*szSource != 0)) {
if (*szSource == cDoubleQuote) {
// if this is a quote, then go to the close quote
// don't copy quotes!
szSource++;
while ((*szSource != cDoubleQuote) && (*szSource != 0)) {
*szDest++ = *szSource++;
}
if (*szSource != 0) szSource++;
} else {
*szDest++ = *szSource++;
}
}
*szDest = 0;
}
// remove any leading and/or trailing spaces
TrimSpaces (&szReturnBuffer[dwBuff][0]);
return &szReturnBuffer[dwBuff][0];
}