|
|
/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
adtutil.c - Security Auditing - Utility Routines
Abstract:
This Module contains miscellaneous utility routines private to the Security Auditing Component.
Author:
Robert Reichel (robertre) September 10, 1991
Environment:
Kernel Mode
Revision History:
--*/
#include "pch.h"
#pragma hdrstop
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE,SepRegQueryDwordValue)
#endif
NTSTATUS SepRegQueryHelper( IN PCWSTR KeyName, IN PCWSTR ValueName, IN ULONG ValueType, IN ULONG ValueLength, OUT PVOID ValueBuffer, OUT PULONG LengthRequired ) /*++
Routine Description:
Open regkey KeyName, read the value specified by ValueName and return the value.
Arguments:
KeyName - name of key to open
ValueName - name of value to read
ValueType - type of value to read (REG_DWORD etc.)
ValueLength - size in bytes of the value to read
ValueBuffer - pointer to returned value
LengthRequired - if the passed buffer is not sufficient to hold the value, this param will return the actual size in bytes required.
Return Value:
NTSTATUS - Standard Nt Result Code
Notes:
--*/ { UNICODE_STRING usKey, usValue; OBJECT_ATTRIBUTES ObjectAttributes = { 0 };
//
// we will read-in data upto 64 bytes in stack buffer
//
CHAR KeyInfo[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 64]; PKEY_VALUE_PARTIAL_INFORMATION pKeyInfo; HANDLE hKey = NULL; NTSTATUS Status = STATUS_SUCCESS; NTSTATUS CloseStatus; ULONG ResultLength; PAGED_CODE();
RtlInitUnicodeString( &usKey, KeyName ); InitializeObjectAttributes( &ObjectAttributes, &usKey, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL );
Status = ZwOpenKey( &hKey, KEY_QUERY_VALUE | OBJ_KERNEL_HANDLE, &ObjectAttributes );
if (NT_SUCCESS( Status )) { RtlInitUnicodeString( &usValue, ValueName );
Status = ZwQueryValueKey( hKey, &usValue, KeyValuePartialInformation, KeyInfo, sizeof(KeyInfo), &ResultLength ); if (NT_SUCCESS( Status )) { pKeyInfo = (PKEY_VALUE_PARTIAL_INFORMATION)KeyInfo;
if (( pKeyInfo->Type == ValueType) && ( pKeyInfo->DataLength == ValueLength )) { switch (ValueType) { case REG_DWORD: *((PULONG)ValueBuffer) = *((PULONG) (pKeyInfo->Data)); break;
case REG_BINARY: RtlCopyMemory( ValueBuffer, pKeyInfo->Data, ValueLength ); break; default: Status = STATUS_INVALID_PARAMETER; break; } } else { Status = STATUS_OBJECT_TYPE_MISMATCH; } }
CloseStatus = ZwClose(hKey); ASSERT( NT_SUCCESS( CloseStatus )); }
return Status; }
NTSTATUS SepRegQueryDwordValue( IN PCWSTR KeyName, IN PCWSTR ValueName, OUT PULONG Value ) /*++
Routine Description:
Open regkey KeyName, read a REG_DWORD value specified by ValueName and return the value.
Arguments:
KeyName - name of key to open
ValueName - name of value to read
Value - pointer to returned value
Return Value:
NTSTATUS - Standard Nt Result Code
Notes:
--*/ { return SepRegQueryHelper( KeyName, ValueName, REG_DWORD, sizeof(ULONG), Value, NULL ); }
|