mirror of
https://github.com/reactos/reactos.git
synced 2024-09-14 06:42:52 +00:00
143 lines
4 KiB
C
143 lines
4 KiB
C
|
/*
|
||
|
* PROJECT: Filesystem Filter Manager
|
||
|
* LICENSE: GPL - See COPYING in the top level directory
|
||
|
* FILE: drivers/filters/fltmgr/Misc.c
|
||
|
* PURPOSE: Uncataloged functions
|
||
|
* PROGRAMMERS: Ged Murphy (gedmurphy@reactos.org)
|
||
|
*/
|
||
|
|
||
|
/* INCLUDES ******************************************************************/
|
||
|
|
||
|
#include "fltmgr.h"
|
||
|
#include "fltmgrint.h"
|
||
|
|
||
|
#define NDEBUG
|
||
|
#include <debug.h>
|
||
|
|
||
|
|
||
|
/* DATA *********************************************************************/
|
||
|
|
||
|
#define REG_SERVICES_KEY L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"
|
||
|
#define REG_PATH_LENGTH 512
|
||
|
|
||
|
|
||
|
/* INTERNAL FUNCTIONS ******************************************************/
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
FltpOpenFilterServicesKey(
|
||
|
_In_ PFLT_FILTER Filter,
|
||
|
_In_ ACCESS_MASK DesiredAccess,
|
||
|
_In_opt_ PUNICODE_STRING SubKey,
|
||
|
_Out_ PHANDLE Handle)
|
||
|
{
|
||
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||
|
UNICODE_STRING ServicesKey;
|
||
|
UNICODE_STRING Path;
|
||
|
WCHAR Buffer[REG_PATH_LENGTH];
|
||
|
|
||
|
/* Setup a local buffer to hold the services key path */
|
||
|
Path.Length = 0;
|
||
|
Path.MaximumLength = REG_PATH_LENGTH;
|
||
|
Path.Buffer = Buffer;
|
||
|
|
||
|
/* Build up the serices key name */
|
||
|
RtlInitUnicodeString(&ServicesKey, REG_SERVICES_KEY);
|
||
|
RtlCopyUnicodeString(&Path, &ServicesKey);
|
||
|
RtlAppendUnicodeStringToString(&Path, &Filter->Name);
|
||
|
|
||
|
if (SubKey)
|
||
|
{
|
||
|
/* Tag on any child key */
|
||
|
RtlAppendUnicodeToString(&Path, L"\\");
|
||
|
RtlAppendUnicodeStringToString(&Path, SubKey);
|
||
|
}
|
||
|
|
||
|
InitializeObjectAttributes(&ObjectAttributes,
|
||
|
&Path,
|
||
|
OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
|
||
|
NULL,
|
||
|
NULL);
|
||
|
|
||
|
/* Open and return the key handle param*/
|
||
|
return ZwOpenKey(Handle, DesiredAccess, &ObjectAttributes);
|
||
|
}
|
||
|
|
||
|
NTSTATUS
|
||
|
FltpReadRegistryValue(_In_ HANDLE KeyHandle,
|
||
|
_In_ PUNICODE_STRING ValueName,
|
||
|
_In_opt_ ULONG Type,
|
||
|
_Out_writes_bytes_(BufferSize) PVOID Buffer,
|
||
|
_In_ ULONG BufferSize,
|
||
|
_Out_opt_ PULONG BytesRequired)
|
||
|
{
|
||
|
PKEY_VALUE_PARTIAL_INFORMATION Value = NULL;
|
||
|
ULONG ValueLength = 0;
|
||
|
NTSTATUS Status;
|
||
|
|
||
|
PAGED_CODE();
|
||
|
|
||
|
/* Get the size of the buffer required to hold the string */
|
||
|
Status = ZwQueryValueKey(KeyHandle,
|
||
|
ValueName,
|
||
|
KeyValuePartialInformation,
|
||
|
NULL,
|
||
|
0,
|
||
|
&ValueLength);
|
||
|
if (Status != STATUS_BUFFER_TOO_SMALL && Status != STATUS_BUFFER_OVERFLOW)
|
||
|
{
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
/* Allocate the buffer */
|
||
|
Value = (PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePoolWithTag(PagedPool,
|
||
|
ValueLength,
|
||
|
FM_TAG_TEMP_REGISTRY);
|
||
|
if (Value == NULL)
|
||
|
{
|
||
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||
|
goto Quit;
|
||
|
}
|
||
|
|
||
|
/* Now read in the value */
|
||
|
Status = ZwQueryValueKey(KeyHandle,
|
||
|
ValueName,
|
||
|
KeyValuePartialInformation,
|
||
|
Value,
|
||
|
ValueLength,
|
||
|
&ValueLength);
|
||
|
if (!NT_SUCCESS(Status))
|
||
|
{
|
||
|
goto Quit;
|
||
|
}
|
||
|
|
||
|
/* Make sure we got the type expected */
|
||
|
if (Value->Type != Type)
|
||
|
{
|
||
|
Status = STATUS_INVALID_PARAMETER;
|
||
|
goto Quit;
|
||
|
}
|
||
|
|
||
|
if (BytesRequired)
|
||
|
{
|
||
|
*BytesRequired = Value->DataLength;
|
||
|
}
|
||
|
|
||
|
/* Make sure the caller buffer is big enough to hold the data */
|
||
|
if (!BufferSize || BufferSize < Value->DataLength)
|
||
|
{
|
||
|
Status = STATUS_BUFFER_TOO_SMALL;
|
||
|
goto Quit;
|
||
|
}
|
||
|
|
||
|
/* Copy the data into the caller buffer */
|
||
|
RtlCopyMemory(Buffer, Value->Data, Value->DataLength);
|
||
|
|
||
|
Quit:
|
||
|
|
||
|
if (Value)
|
||
|
ExFreePoolWithTag(Value, FM_TAG_TEMP_REGISTRY);
|
||
|
|
||
|
return Status;
|
||
|
}
|