216 lines
4.6 KiB
C
216 lines
4.6 KiB
C
/*++
|
||
|
||
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
|
||
|