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.
216 lines
7.3 KiB
216 lines
7.3 KiB
/****************************************************************************/
|
|
// omission.cpp
|
|
//
|
|
// Copyright (C) 2001 Microsoft Corp.
|
|
/****************************************************************************/
|
|
|
|
#include "precomp.h"
|
|
|
|
#include "omission.h"
|
|
|
|
extern NTSTATUS TermsrvGetRegPath(IN HANDLE hKey,
|
|
IN POBJECT_ATTRIBUTES pObjectAttr,
|
|
IN PWCHAR pInstPath,
|
|
IN ULONG ulbuflen);
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* RegPathExistsInOmissionList
|
|
*
|
|
* Determine whether the registry key exists in the list of registry values
|
|
* defined in the omission key
|
|
*
|
|
* ENTRY:
|
|
*
|
|
* IN PWCHAR pwchKeyToCheck: Registry key to check
|
|
*
|
|
*
|
|
* EXIT:
|
|
* Returns: True if the key matches one of those in the list
|
|
*
|
|
****************************************************************************/
|
|
BOOL RegPathExistsInOmissionList(PWCHAR pwchKeyToCheck)
|
|
{
|
|
BOOL bExists = FALSE;
|
|
HKEY hOmissionKey = NULL;
|
|
PKEY_FULL_INFORMATION pDefKeyInfo = NULL;
|
|
ULONG ultemp = 0;
|
|
|
|
if (pwchKeyToCheck == NULL)
|
|
return FALSE;
|
|
|
|
// Get the key info
|
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGISTRY_ENTRIES, 0, KEY_READ, &hOmissionKey) != ERROR_SUCCESS)
|
|
return FALSE;
|
|
|
|
// Get a buffer for the key info
|
|
ultemp = sizeof(KEY_FULL_INFORMATION) + MAX_PATH * sizeof(WCHAR);
|
|
pDefKeyInfo = (PKEY_FULL_INFORMATION)(RtlAllocateHeap(RtlProcessHeap(), 0, ultemp));
|
|
|
|
if (pDefKeyInfo && hOmissionKey)
|
|
{
|
|
if NT_SUCCESS(NtQueryKey(hOmissionKey,
|
|
KeyFullInformation,
|
|
pDefKeyInfo,
|
|
ultemp,
|
|
&ultemp))
|
|
{
|
|
bExists = ExistsInEnumeratedKeys(hOmissionKey, pDefKeyInfo, pwchKeyToCheck);
|
|
}
|
|
}
|
|
|
|
if (pDefKeyInfo)
|
|
RtlFreeHeap(RtlProcessHeap(), 0, pDefKeyInfo);
|
|
|
|
if (hOmissionKey)
|
|
RegCloseKey(hOmissionKey);
|
|
|
|
return bExists;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* HKeyExistsInOmissionList
|
|
*
|
|
* Determine whether the registry key exists in the list of registry values
|
|
* defined in the omission key. Assumes the key is in the TERMSRV_INSTALL path
|
|
*
|
|
* ENTRY:
|
|
*
|
|
* IN PHKEY phKeyToCheck: Registry key to check
|
|
*
|
|
*
|
|
* EXIT:
|
|
* Returns: True if the key matches one of those in the list
|
|
*
|
|
****************************************************************************/
|
|
BOOL HKeyExistsInOmissionList(HKEY hKeyToCheck)
|
|
{
|
|
BOOL bExists = FALSE;
|
|
ULONG ulMaxPathLength = 0;
|
|
PWCHAR pUserPath = NULL;
|
|
PWCHAR pUserSubPath = NULL;
|
|
|
|
if (hKeyToCheck == NULL)
|
|
return FALSE;
|
|
|
|
// Get a buffer to hold the user's path in the registry
|
|
ulMaxPathLength = MAX_PATH * sizeof(WCHAR);
|
|
pUserPath = RtlAllocateHeap(RtlProcessHeap(), 0, ulMaxPathLength);
|
|
if (pUserPath)
|
|
{
|
|
// Get the full path associated with this object attribute structure
|
|
if NT_SUCCESS(TermsrvGetRegPath(hKeyToCheck, NULL, pUserPath, ulMaxPathLength))
|
|
{
|
|
// Skip over first part of path + backslash
|
|
if (pUserPath)
|
|
{
|
|
if (wcslen(pUserPath) >= (sizeof(TERMSRV_INSTALL)/sizeof(WCHAR)))
|
|
{
|
|
pUserSubPath = pUserPath + (sizeof(TERMSRV_INSTALL)/sizeof(WCHAR)) - 1;
|
|
|
|
if (pUserSubPath)
|
|
{
|
|
if (wcslen(pUserSubPath) >= sizeof(SOFTWARE_PATH)/sizeof(WCHAR))
|
|
{
|
|
//Make sure the next part of the key path is SOFTWARE_PATH
|
|
if (!_wcsnicmp(pUserSubPath, SOFTWARE_PATH, sizeof(SOFTWARE_PATH)/sizeof(WCHAR) - 1))
|
|
bExists = RegPathExistsInOmissionList(pUserSubPath);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pUserPath)
|
|
RtlFreeHeap(RtlProcessHeap(), 0, pUserPath);
|
|
|
|
return bExists;
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* ExistsInEnumeratedKeys
|
|
*
|
|
* Determine whether the registry key exists in the list of registry
|
|
* values passed in thru the pDefKeyInfo structure
|
|
*
|
|
* ENTRY:
|
|
*
|
|
* IN HKEY hOmissionKey: Key containing the values against which to compare pwchKeyToCheck
|
|
* IN PKEY_FULL_INFORMATION pDefKeyInfo: Structure containing information about
|
|
* the list of values against which
|
|
* to compare pwchKeyToCheck
|
|
*
|
|
* IN PWCHAR pwchKeyToCheck: Key to check against the list
|
|
*
|
|
*
|
|
* EXIT:
|
|
* Returns: True if the key matches one of those in the list
|
|
*
|
|
****************************************************************************/
|
|
BOOL ExistsInEnumeratedKeys(HKEY hOmissionKey, PKEY_FULL_INFORMATION pDefKeyInfo, PWCHAR pwchKeyToCheck)
|
|
{
|
|
BOOL bExists = FALSE;
|
|
PKEY_VALUE_BASIC_INFORMATION pKeyValInfo = NULL;
|
|
ULONG ulbufsize = 0;
|
|
ULONG ulkey = 0;
|
|
ULONG ultemp = 0;
|
|
NTSTATUS Status;
|
|
|
|
if (!hOmissionKey || !pDefKeyInfo || !pwchKeyToCheck)
|
|
return FALSE;
|
|
|
|
if (wcslen(pwchKeyToCheck) <= (sizeof(SOFTWARE_PATH)/sizeof(WCHAR)))
|
|
return FALSE;
|
|
|
|
pwchKeyToCheck += (sizeof(SOFTWARE_PATH)/sizeof(WCHAR));
|
|
|
|
// Traverse the values for this key
|
|
if (pDefKeyInfo->Values)
|
|
{
|
|
ulbufsize = sizeof(KEY_VALUE_BASIC_INFORMATION) +
|
|
(pDefKeyInfo->MaxValueNameLen + 1) * sizeof(WCHAR) +
|
|
pDefKeyInfo->MaxValueDataLen;
|
|
|
|
pKeyValInfo = (PKEY_VALUE_BASIC_INFORMATION)(RtlAllocateHeap(RtlProcessHeap(), 0, ulbufsize));
|
|
|
|
// Get a buffer to hold current value of the key (for existence check)
|
|
if (pKeyValInfo)
|
|
{
|
|
for (ulkey = 0; ulkey < pDefKeyInfo->Values; ulkey++)
|
|
{
|
|
Status = NtEnumerateValueKey(hOmissionKey,
|
|
ulkey,
|
|
KeyValueBasicInformation,
|
|
pKeyValInfo,
|
|
ulbufsize,
|
|
&ultemp);
|
|
|
|
if ((Status == STATUS_SUCCESS) && (pwchKeyToCheck) && (pKeyValInfo->Name))
|
|
{
|
|
if (wcslen(pwchKeyToCheck) >= (pKeyValInfo->NameLength/sizeof(WCHAR)))
|
|
{
|
|
if ((pwchKeyToCheck[pKeyValInfo->NameLength/sizeof(WCHAR)] == L'\\') ||
|
|
(pwchKeyToCheck[pKeyValInfo->NameLength/sizeof(WCHAR)] == 0))
|
|
{
|
|
if (!_wcsnicmp(pwchKeyToCheck, pKeyValInfo->Name, (pKeyValInfo->NameLength/sizeof(WCHAR))))
|
|
{
|
|
bExists = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pKeyValInfo)
|
|
RtlFreeHeap(RtlProcessHeap(), 0, pKeyValInfo);
|
|
}
|
|
|
|
return bExists;
|
|
}
|
|
|