mirror of https://github.com/tongzx/nt5src
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
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;
|
|
}
|
|
|