reactos/sdk/lib/drivers/wdf/shared/inc/private/common/fxregkey.hpp
Victor Perevertkin 8a978a179f
[WDF] Add Windows Driver Framework files
Takern from Microsoft GitHub repo:
d9c6040fe9

Licensed under MIT
2020-11-03 00:06:26 +03:00

286 lines
6.1 KiB
C++

/*++
Copyright (c) Microsoft Corporation
Module Name:
FxRegKey.hpp
Abstract:
This is the C++ header for FxRegKey which represents a key into the registry
Author:
Revision History:
--*/
#ifndef _FXREGKEY_H_
#define _FXREGKEY_H_
class FxRegKey : public FxPagedObject {
public:
FxRegKey(
PFX_DRIVER_GLOBALS FxDriverGlobals
);
__drv_maxIRQL(PASSIVE_LEVEL)
~FxRegKey(
VOID
);
_Must_inspect_result_
__drv_maxIRQL(PASSIVE_LEVEL)
NTSTATUS
Create(
__in_opt HANDLE ParentKey,
__in PCUNICODE_STRING KeyName,
__in ACCESS_MASK DesiredAccess = KEY_ALL_ACCESS,
__in ULONG CreateOptions = REG_OPTION_NON_VOLATILE,
__out_opt PULONG CreateDisposition = NULL
)
{
return _Create(ParentKey,
KeyName,
&m_Key,
DesiredAccess,
CreateOptions,
CreateDisposition);
}
static
_Must_inspect_result_
__drv_maxIRQL(PASSIVE_LEVEL)
NTSTATUS
_Create(
__in_opt HANDLE ParentKey,
__in PCUNICODE_STRING KeyName,
__out HANDLE* NewKey,
__in ACCESS_MASK DesiredAccess = KEY_ALL_ACCESS,
__in ULONG CreateOptions = REG_OPTION_NON_VOLATILE,
__out_opt PULONG CreateDisposition = NULL
);
_Must_inspect_result_
__drv_maxIRQL(PASSIVE_LEVEL)
NTSTATUS
Open(
__in_opt HANDLE ParentKey,
__in PCUNICODE_STRING KeyName,
__in ACCESS_MASK DesiredAccess = KEY_ALL_ACCESS
)
{
return _OpenKey(ParentKey, KeyName, &m_Key, DesiredAccess);
}
static
_Must_inspect_result_
__drv_maxIRQL(PASSIVE_LEVEL)
NTSTATUS
_OpenKey(
__in_opt HANDLE ParentKey,
__in PCUNICODE_STRING KeyName,
__out HANDLE* Key,
__in ACCESS_MASK DesiredAccess = KEY_ALL_ACCESS
);
__inline
VOID
SetHandle(
__in HANDLE Key
)
{
m_Key = Key;
}
__inline
HANDLE
GetHandle(
VOID
)
{
return m_Key;
}
__drv_maxIRQL(PASSIVE_LEVEL)
NTSTATUS
Close(
VOID
)
{
HANDLE key;
key = m_Key;
m_Key = NULL;
#if (FX_CORE_MODE == FX_CORE_USER_MODE)
//
// For special cases where, due to user-mode restrictions,
// we cannot open a specific handle for write access,
// so we reuse a pre-opened one multiple times.
//
// In this case we do not want to close it when we close
// the FxRegKey object.
//
if (m_CanCloseHandle == FALSE) {
return STATUS_SUCCESS;
}
#endif
return _Close(key);
}
static
__drv_maxIRQL(PASSIVE_LEVEL)
NTSTATUS
_Close(
__in HANDLE Key
);
_Must_inspect_result_
__drv_maxIRQL(PASSIVE_LEVEL)
NTSTATUS
SetValue(
__in PCUNICODE_STRING ValueName,
__in ULONG ValueType,
__in_bcount(ValueLength) PVOID Value,
__in ULONG ValueLength
)
{
return _SetValue(m_Key,
ValueName,
ValueType,
Value,
ValueLength);
}
static
_Must_inspect_result_
__drv_maxIRQL(PASSIVE_LEVEL)
NTSTATUS
_SetValue(
_In_ HANDLE Key,
_In_ PCUNICODE_STRING ValueName,
_In_ ULONG ValueType,
_In_reads_bytes_(ValueLength) PVOID Value,
_In_ ULONG ValueLength
);
_Must_inspect_result_
__drv_maxIRQL(PASSIVE_LEVEL)
NTSTATUS
QueryValue(
__in PCUNICODE_STRING ValueName,
__in ULONG ValueLength,
__out_bcount_opt(ValueLength) PVOID Value,
__out_opt PULONG ValueLengthQueried,
__out_opt PULONG ValueType
)
{
return _QueryValue(m_Globals,
m_Key,
ValueName,
ValueLength,
Value,
ValueLengthQueried,
ValueType);
}
static
_Must_inspect_result_
__drv_maxIRQL(PASSIVE_LEVEL)
NTSTATUS
_QueryValue(
__in PFX_DRIVER_GLOBALS FxDriverGlobals,
__in HANDLE Key,
__in PCUNICODE_STRING ValueName,
__in ULONG ValueLength,
__out_bcount_opt(ValueLength) PVOID Value,
__out_opt PULONG ValueLengthQueried,
__out_opt PULONG ValueType
);
static
_Must_inspect_result_
__drv_maxIRQL(PASSIVE_LEVEL)
NTSTATUS
_QueryULong(
__in HANDLE Key,
__in PCUNICODE_STRING ValueName,
__out PULONG Value
);
static
_Must_inspect_result_
__drv_maxIRQL(PASSIVE_LEVEL)
NTSTATUS
_QueryQuadWord(
__in HANDLE Key,
__in PCUNICODE_STRING ValueName,
__out PLARGE_INTEGER Value
);
static
BOOLEAN
__inline
_IsValidSzType(
__in ULONG RegValueType
)
{
return (RegValueType == REG_SZ) || (RegValueType == REG_EXPAND_SZ);
}
static
_Must_inspect_result_
NTSTATUS
_VerifyMultiSzString(
__in PFX_DRIVER_GLOBALS FxDriverGlobals,
__in PCUNICODE_STRING RegValueName,
__in_bcount(DataLength) PWCHAR DataString,
__in ULONG DataLength
);
private:
static
__out_range(Length, (Length+sizeof(KEY_VALUE_PARTIAL_INFORMATION)-1))
ULONG
_ComputePartialSize(
__in_bound ULONG Length
)
{
return FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data) + Length;
}
protected:
HANDLE m_Key;
PFX_DRIVER_GLOBALS m_Globals;
#if (FX_CORE_MODE == FX_CORE_USER_MODE)
private:
//
// If FALSE, then closing or destroying the FxRegKey
// will have no effect on the HKEY m_Key.
//
BOOLEAN m_CanCloseHandle;
public:
VOID
__inline
SetCanCloseHandle(
BOOLEAN CanCloseHandle
)
{
m_CanCloseHandle = CanCloseHandle;
}
#endif
};
#endif // _FXREGKEY_H_