/****************************************************************************/ // 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; }