Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

232 lines
6.1 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 2001.
//
// File : prfutil.CXX
//
// Contents : Utility procedures stolen from the VGACTRS code in the DDK
//
// History: 22-Mar-94 t-joshh Created
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#define DEFINE_STRING
#include "prfutil.hxx"
WCHAR const wcsGlobal[] = L"Global";
WCHAR const wcsForeign[] = L"Foreign";
WCHAR const wcsCostly[] = L"Costly";
QueryType GetQueryType( WCHAR * lpValue )
{
if (lpValue == 0)
return QUERY_GLOBAL;
else if (*lpValue == 0)
return QUERY_GLOBAL;
//
// check for "Global" request
//
unsigned ccValue = wcslen( lpValue ) + 1;
if ( ccValue == sizeof(wcsGlobal)/sizeof(WCHAR) &&
RtlEqualMemory( lpValue, wcsGlobal, sizeof(wcsGlobal) ) )
{
return QUERY_GLOBAL;
}
//
// check for "Foreign" request
//
if ( ccValue == sizeof(wcsForeign)/sizeof(WCHAR) &&
RtlEqualMemory( lpValue, wcsForeign, sizeof(wcsForeign) ) )
{
return QUERY_FOREIGN;
}
//
// check for "Costly" request
//
if ( ccValue == sizeof(wcsCostly)/sizeof(WCHAR) &&
RtlEqualMemory( lpValue, wcsCostly, sizeof(wcsCostly) ) )
{
return QUERY_COSTLY;
}
// if not Global and not Foreign and not Costly,
// then it must be an item list
return QUERY_ITEMS;
}
BOOL
IsNumberInUnicodeList (
IN DWORD dwNumber,
IN LPWSTR lpwszUnicodeList
)
/*++
IsNumberInUnicodeList
Arguments:
IN dwNumber
DWORD number to find in list
IN lpwszUnicodeList
Null terminated, Space delimited list of decimal numbers
Return Value:
TRUE:
dwNumber was found in the list of unicode number strings
FALSE:
dwNumber was not found in the list.
--*/
{
DWORD dwThisNumber;
TCHAR *pwcThisChar;
BOOL bValidNumber;
BOOL bNewItem;
TCHAR wcDelimiter; // could be an argument to be more flexible
if (lpwszUnicodeList == 0) return FALSE; // null pointer, # not founde
pwcThisChar = lpwszUnicodeList;
dwThisNumber = 0;
wcDelimiter = TEXT(' ');
bValidNumber = FALSE;
bNewItem = TRUE;
while (TRUE) {
switch (EvalThisChar (*pwcThisChar, wcDelimiter)) {
case DIGIT:
// if this is the first digit after a delimiter, then
// set flags to start computing the new number
if (bNewItem) {
bNewItem = FALSE;
bValidNumber = TRUE;
}
if (bValidNumber) {
dwThisNumber *= 10;
dwThisNumber += (*pwcThisChar - TEXT('0'));
}
break;
case DELIMITER:
// a delimter is either the delimiter character or the
// end of the string ('\0') if when the delimiter has been
// reached a valid number was found, then compare it to the
// number from the argument list. if this is the end of the
// string and no match was found, then return.
//
if (bValidNumber) {
if (dwThisNumber == dwNumber) return TRUE;
bValidNumber = FALSE;
}
if (*pwcThisChar == 0) {
return FALSE;
} else {
bNewItem = TRUE;
dwThisNumber = 0;
}
break;
case INVALID:
// if an invalid character was encountered, ignore all
// characters up to the next delimiter and then start fresh.
// the invalid number is not compared.
bValidNumber = FALSE;
break;
default:
break;
}
pwcThisChar++;
}
} // IsNumberInUnicodeList
BOOL
MonBuildInstanceDefinition(
PERF_INSTANCE_DEFINITION *pBuffer,
PVOID *pBufferNext,
DWORD ParentObjectTitleIndex,
DWORD ParentObjectInstance,
DWORD UniqueID,
PUNICODE_STRING Name
)
/*++
MonBuildInstanceDefinition - Build an instance of an object
Inputs:
pBuffer - pointer to buffer where instance is to
be constructed
pBufferNext - pointer to a pointer which will contain
next available location, DWORD aligned
ParentObjectTitleIndex
- Title Index of parent object type; 0 if
no parent object
ParentObjectInstance
- Index into instances of parent object
type, starting at 0, for this instances
parent object instance
UniqueID - a unique identifier which should be used
instead of the Name for identifying
this instance
Name - Name of this instance
--*/
{
DWORD NameLength;
WCHAR *pName;
//
// Include trailing null in name size
//
NameLength = Name->Length;
if ( !NameLength ||
Name->Buffer[(NameLength/sizeof(WCHAR))-1] != UNICODE_NULL ) {
NameLength += sizeof(WCHAR);
}
pBuffer->ByteLength = sizeof(PERF_INSTANCE_DEFINITION) +
EIGHT_BYTE_MULTIPLE(NameLength);
pBuffer->ParentObjectTitleIndex = ParentObjectTitleIndex;
pBuffer->ParentObjectInstance = ParentObjectInstance;
pBuffer->UniqueID = UniqueID;
pBuffer->NameOffset = sizeof(PERF_INSTANCE_DEFINITION);
pBuffer->NameLength = NameLength;
pName = (PWCHAR)&pBuffer[1];
RtlMoveMemory(pName,Name->Buffer,Name->Length);
// Always null terminated. Space for this reserved above.
pName[(NameLength/sizeof(WCHAR))-1] = UNICODE_NULL;
*pBufferNext = (PVOID) ((PCHAR) pBuffer + pBuffer->ByteLength);
return 0;
}