windows-nt/Source/XPSP1/NT/net/rras/ras/autodial/rasauto/reg.c

216 lines
4.6 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright(c) 1995 Microsoft Corporation
MODULE NAME
reg.c
ABSTRACT
Registry routines for the automatic connection service.
AUTHOR
Anthony Discolo (adiscolo) 20-Mar-1995
REVISION HISTORY
Original version from Gurdeep
--*/
#define UNICODE
#define _UNICODE
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>
#include <npapi.h>
#include <acd.h>
#include <debug.h>
#include "reg.h"
#include "misc.h"
//
// The maximum size of TOKEN_USER information.
//
#define TOKEN_INFORMATION_SIZE (sizeof (TOKEN_USER) + sizeof (SID) + (sizeof (ULONG) * SID_MAX_SUB_AUTHORITIES))
HKEY
GetHkeyCurrentUser(
HANDLE hToken
)
{
BOOLEAN fSuccess;
HKEY hkey = NULL;
UCHAR TokenInformation[TOKEN_INFORMATION_SIZE];
DWORD dwReturnLength;
UNICODE_STRING sidString, keyString;
OBJECT_ATTRIBUTES objectAttributes;
if (!GetTokenInformation(
hToken,
TokenUser,
TokenInformation,
sizeof (TokenInformation),
&dwReturnLength))
{
RASAUTO_TRACE1(
"GetHkeyCurrentUser: GetTokenInformation failed (error=%d)",
GetLastError());
return NULL;
}
if (RtlConvertSidToUnicodeString(
&sidString,
((PTOKEN_USER)TokenInformation)->User.Sid,
TRUE) != STATUS_SUCCESS)
{
RASAUTO_TRACE1(
"GetHkeyCurrentUser: RtlConvertSidToUnicodeString failed (error=%d)",
GetLastError());
return NULL;
}
keyString.Length = 0;
keyString.MaximumLength =
sidString.Length + sizeof (L"\\REGISTRY\\USER\\") + sizeof (L"\0");
keyString.Buffer = LocalAlloc(LPTR, keyString.MaximumLength);
if (keyString.Buffer == NULL) {
RASAUTO_TRACE("GetHkeyCurrentUser: LocalAlloc failed");
RtlFreeUnicodeString(&sidString);
return NULL;
}
//
// Copy \REGISTRY\USER to keyString.
//
RtlAppendUnicodeToString(&keyString, L"\\REGISTRY\\USER\\");
//
// Append the user's SID to keyString.
//
if (RtlAppendUnicodeStringToString(
&keyString,
&sidString) != STATUS_SUCCESS)
{
RASAUTO_TRACE1(
"GetHkeyCurrentUser: RtlAppendUnicodeToString failed (error=%d)",
GetLastError());
RtlFreeUnicodeString(&sidString);
LocalFree(keyString.Buffer);
return NULL;
}
RtlFreeUnicodeString(&sidString);
RASAUTO_TRACE1(
"GetHkeyCurrentUser: HKEY_CURRENT_USER is %S",
keyString.Buffer);
//
// Initialize the object attributes.
//
InitializeObjectAttributes(
&objectAttributes,
&keyString,
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
//
// Open the registry key.
//
if (NtOpenKey(
&hkey,
MAXIMUM_ALLOWED,
&objectAttributes) != STATUS_SUCCESS)
{
RASAUTO_TRACE1(
"GetHkeyCurrentUser: NtOpenKey failed (error=%d)",
GetLastError());
LocalFree(keyString.Buffer);
return NULL;
}
LocalFree(keyString.Buffer);
return hkey;
} // GetHkeyCurrentUser
BOOLEAN
RegGetValue(
IN HKEY hkey,
IN LPTSTR pszKey,
OUT PVOID *ppvData,
OUT LPDWORD pdwcbData,
OUT LPDWORD pdwType
)
{
DWORD dwError, dwType, dwSize;
PVOID pvData;
//
// Get the length of the string.
//
dwError = RegQueryValueEx(
hkey,
pszKey,
NULL,
&dwType,
NULL,
&dwSize);
if (dwError != ERROR_SUCCESS)
return FALSE;
pvData = LocalAlloc(LPTR, dwSize);
if (pvData == NULL) {
RASAUTO_TRACE("RegGetValue: LocalAlloc failed");
return FALSE;
}
//
// Read the value for real this time.
//
dwError = RegQueryValueEx(
hkey,
pszKey,
NULL,
NULL,
(LPBYTE)pvData,
&dwSize);
if (dwError != ERROR_SUCCESS) {
LocalFree(pvData);
return FALSE;
}
if(NULL != pdwType)
{
*pdwType = dwType;
}
*ppvData = pvData;
if (pdwcbData != NULL)
*pdwcbData = dwSize;
return TRUE;
} // RegGetValue
BOOLEAN
RegGetDword(
IN HKEY hkey,
IN LPTSTR pszKey,
OUT LPDWORD pdwValue
)
{
DWORD dwError, dwType, dwSize = sizeof (DWORD);
dwError = RegQueryValueEx(
hkey,
pszKey,
NULL,
&dwType,
(LPBYTE)pdwValue,
&dwSize);
if (dwError != ERROR_SUCCESS || dwType != REG_DWORD)
return FALSE;
return TRUE;
} // RegGetDword