413 lines
12 KiB
C
413 lines
12 KiB
C
//+-------------------------------------------------------------------------
|
||
//
|
||
// Microsoft Windows
|
||
//
|
||
// Copyright (C) Microsoft Corporation, 1998 - 1999
|
||
//
|
||
// File: registry.c
|
||
//
|
||
//--------------------------------------------------------------------------
|
||
|
||
#include "pch.h"
|
||
|
||
NTSTATUS
|
||
PptRegGetDeviceParameterDword(
|
||
IN PDEVICE_OBJECT Pdo,
|
||
IN PWSTR ParameterName,
|
||
IN OUT PULONG ParameterValue
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
retrieve a devnode registry parameter of type dword
|
||
|
||
Arguments:
|
||
|
||
Pdo - ParPort PDO
|
||
|
||
ParameterName - parameter name to look up
|
||
|
||
ParameterValue - default parameter value
|
||
|
||
Return Value:
|
||
|
||
Status - if RegKeyValue does not exist or other failure occurs,
|
||
then default is returned via ParameterValue
|
||
|
||
--*/
|
||
{
|
||
NTSTATUS status;
|
||
HANDLE hKey;
|
||
RTL_QUERY_REGISTRY_TABLE queryTable[2];
|
||
ULONG defaultValue;
|
||
|
||
PAGED_CODE();
|
||
|
||
status = IoOpenDeviceRegistryKey(Pdo, PLUGPLAY_REGKEY_DEVICE, KEY_READ, &hKey);
|
||
|
||
if(!NT_SUCCESS(status)) {
|
||
return status;
|
||
}
|
||
|
||
defaultValue = *ParameterValue;
|
||
|
||
RtlZeroMemory(&queryTable, sizeof(queryTable));
|
||
|
||
queryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
|
||
queryTable[0].Name = ParameterName;
|
||
queryTable[0].EntryContext = ParameterValue;
|
||
queryTable[0].DefaultType = REG_DWORD;
|
||
queryTable[0].DefaultData = &defaultValue;
|
||
queryTable[0].DefaultLength = sizeof(ULONG);
|
||
|
||
status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE, hKey, queryTable, NULL, NULL);
|
||
|
||
if ( !NT_SUCCESS(status) ) {
|
||
*ParameterValue = defaultValue;
|
||
}
|
||
|
||
ZwClose(hKey);
|
||
|
||
return status;
|
||
}
|
||
|
||
NTSTATUS
|
||
PptRegSetDeviceParameterDword(
|
||
IN PDEVICE_OBJECT Pdo,
|
||
IN PWSTR ParameterName,
|
||
IN PULONG ParameterValue
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Create/set a devnode registry parameter of type dword
|
||
|
||
Arguments:
|
||
|
||
Pdo - ParPort PDO
|
||
|
||
ParameterName - parameter name
|
||
|
||
ParameterValue - parameter value
|
||
|
||
Return Value:
|
||
|
||
Status - status from attempt
|
||
|
||
--*/
|
||
{
|
||
NTSTATUS status;
|
||
HANDLE hKey;
|
||
UNICODE_STRING valueName;
|
||
PPDO_EXTENSION pdx = Pdo->DeviceExtension;
|
||
|
||
PAGED_CODE();
|
||
|
||
status = IoOpenDeviceRegistryKey(Pdo, PLUGPLAY_REGKEY_DEVICE, KEY_WRITE, &hKey);
|
||
|
||
if( !NT_SUCCESS( status ) ) {
|
||
DD((PCE)pdx,DDE,"PptRegSetDeviceParameterDword - openKey FAILED w/status=%x",status);
|
||
return status;
|
||
}
|
||
|
||
RtlInitUnicodeString( &valueName, ParameterName );
|
||
|
||
status = ZwSetValueKey( hKey, &valueName, 0, REG_DWORD, ParameterValue, sizeof(ULONG) );
|
||
if( !NT_SUCCESS( status ) ) {
|
||
DD((PCE)pdx,DDE,"PptRegSetDeviceParameterDword - setValue FAILED w/status=%x",status);
|
||
}
|
||
|
||
ZwClose(hKey);
|
||
|
||
return status;
|
||
}
|
||
|
||
/************************************************************************/
|
||
/* PptRegGetDword */
|
||
/************************************************************************/
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Read a REG_DWORD from the registry. This is a wrapper for
|
||
// function RtlQueryRegistryValues.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// RelativeTo - starting point for the Path
|
||
// Path - path to the registry key
|
||
// ParameterName - name of the value to be read
|
||
// ParameterValue - used to return the DWORD value read from the registry
|
||
//
|
||
// Return Value:
|
||
//
|
||
// NTSTATUS
|
||
//
|
||
// Notes:
|
||
//
|
||
// - On an ERROR or if the requested registry value does not exist,
|
||
// *ParameterValue retains its original value.
|
||
//
|
||
// Log:
|
||
//
|
||
/************************************************************************/
|
||
NTSTATUS
|
||
PptRegGetDword(
|
||
IN ULONG RelativeTo,
|
||
IN PWSTR Path,
|
||
IN PWSTR ParameterName,
|
||
IN OUT PULONG ParameterValue
|
||
)
|
||
{
|
||
NTSTATUS status;
|
||
RTL_QUERY_REGISTRY_TABLE paramTable[2];
|
||
ULONG defaultValue;
|
||
|
||
if( ( NULL == Path ) || ( NULL == ParameterName ) || ( NULL == ParameterValue ) ) {
|
||
return STATUS_INVALID_PARAMETER;
|
||
}
|
||
|
||
DD(NULL,DDT,"PptRegGetDword - RelativeTo= %x, Path=<%S>, ParameterName=<%S>\n", RelativeTo, Path, ParameterName);
|
||
|
||
//
|
||
// set up table entries for call to RtlQueryRegistryValues
|
||
//
|
||
// leave paramTable[1] as all zeros to terminate the table
|
||
//
|
||
// use original value as default value
|
||
//
|
||
// use RtlQueryRegistryValues to do the grunge work
|
||
//
|
||
RtlZeroMemory( paramTable, sizeof(paramTable) );
|
||
|
||
defaultValue = *ParameterValue;
|
||
|
||
paramTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
|
||
paramTable[0].Name = ParameterName;
|
||
paramTable[0].EntryContext = ParameterValue;
|
||
paramTable[0].DefaultType = REG_DWORD;
|
||
paramTable[0].DefaultData = &defaultValue;
|
||
paramTable[0].DefaultLength = sizeof(ULONG);
|
||
|
||
status = RtlQueryRegistryValues( RelativeTo | RTL_REGISTRY_OPTIONAL,
|
||
Path,
|
||
¶mTable[0],
|
||
NULL,
|
||
NULL);
|
||
|
||
if( status != STATUS_SUCCESS ) {
|
||
DD(NULL,DDW,"PptRegGetDword - RtlQueryRegistryValues FAILED w/status=%x\n",status);
|
||
}
|
||
|
||
DD(NULL,DDT,"PptRegGetDword - post-query <%S> *ParameterValue = %x\n", ParameterName, *ParameterValue);
|
||
|
||
return status;
|
||
}
|
||
|
||
|
||
/************************************************************************/
|
||
/* PptRegSetDword */
|
||
/************************************************************************/
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Write a REG_DWORD to the registry. This is a wrapper for
|
||
// function RtlWriteRegistryValue.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// RelativeTo - starting point for the Path
|
||
// Path - path to the registry key
|
||
// ParameterName - name of the value to write
|
||
// ParameterValue - points to the DWORD value to write to the registry
|
||
//
|
||
// Return Value:
|
||
//
|
||
// NTSTATUS
|
||
//
|
||
// Notes:
|
||
//
|
||
// Log:
|
||
//
|
||
/************************************************************************/
|
||
NTSTATUS
|
||
PptRegSetDword(
|
||
IN ULONG RelativeTo,
|
||
IN PWSTR Path,
|
||
IN PWSTR ParameterName,
|
||
IN PULONG ParameterValue
|
||
)
|
||
{
|
||
NTSTATUS status;
|
||
|
||
if( (NULL == Path) || (NULL == ParameterName) || (NULL == ParameterValue) ) {
|
||
status = STATUS_INVALID_PARAMETER;
|
||
} else {
|
||
status = RtlWriteRegistryValue( RelativeTo,
|
||
Path,
|
||
ParameterName,
|
||
REG_DWORD,
|
||
ParameterValue,
|
||
sizeof(ULONG) );
|
||
}
|
||
return status;
|
||
}
|
||
|
||
/************************************************************************/
|
||
/* PptRegGetSz */
|
||
/************************************************************************/
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Read a REG_SZ from the registry. This is a wrapper for
|
||
// function RtlQueryRegistryValues.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// RelativeTo - starting point for the Path
|
||
// Path - path to the registry key
|
||
// ParameterName - name of the value to be read
|
||
// ParameterValue - points to a UNICODE_STRING structure used to return
|
||
// the REG_SZ read from the registry
|
||
//
|
||
// Return Value:
|
||
//
|
||
// NTSTATUS
|
||
//
|
||
//
|
||
// Notes:
|
||
//
|
||
// - All fields of *ParameterValue UNICODE_STRING structure must be
|
||
// initialized to zero by the caller.
|
||
// - On SUCCESS ParameterValue->Buffer points to an allocated buffer. The
|
||
// caller is responsible for freeing this buffer when done.
|
||
// - On SUCCESS ParameterValue->Buffer is UNICODE_NULL terminated and is
|
||
// safe to use as a PWSTR.
|
||
//
|
||
// Log:
|
||
//
|
||
/************************************************************************/
|
||
NTSTATUS
|
||
PptRegGetSz(
|
||
IN ULONG RelativeTo,
|
||
IN PWSTR Path,
|
||
IN PWSTR ParameterName,
|
||
IN OUT PUNICODE_STRING ParameterValue
|
||
)
|
||
{
|
||
NTSTATUS status;
|
||
RTL_QUERY_REGISTRY_TABLE paramTable[2];
|
||
|
||
//
|
||
// sanity check parameters - reject NULL pointers and invalid
|
||
// UNICODE_STRING field initializations
|
||
//
|
||
if( ( NULL == Path ) || ( NULL == ParameterName ) || ( NULL == ParameterValue ) ) {
|
||
return STATUS_INVALID_PARAMETER;
|
||
}
|
||
if( (ParameterValue->Length != 0) || (ParameterValue->MaximumLength !=0) || (ParameterValue->Buffer != NULL) ) {
|
||
return STATUS_INVALID_PARAMETER;
|
||
}
|
||
|
||
DD(NULL,DDT,"PptRegGetSz - RelativeTo=%x, Path=<%S>, ParameterName=<%S>\n", RelativeTo, Path, ParameterName);
|
||
|
||
//
|
||
// set up table entries for call to RtlQueryRegistryValues
|
||
//
|
||
// leave paramTable[1] as all zeros to terminate the table
|
||
//
|
||
// use RtlQueryRegistryValues to do the grunge work
|
||
//
|
||
RtlZeroMemory( paramTable, sizeof(paramTable) );
|
||
|
||
paramTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
|
||
paramTable[0].Name = ParameterName;
|
||
paramTable[0].EntryContext = ParameterValue;
|
||
paramTable[0].DefaultType = REG_SZ;
|
||
paramTable[0].DefaultData = L"";
|
||
paramTable[0].DefaultLength = 0;
|
||
|
||
status = RtlQueryRegistryValues( RelativeTo | RTL_REGISTRY_OPTIONAL,
|
||
Path,
|
||
¶mTable[0],
|
||
NULL,
|
||
NULL);
|
||
|
||
if( status != STATUS_SUCCESS ) {
|
||
DD(NULL,DDW,"PptRegGetSz - RtlQueryRegistryValues FAILED w/status=%x\n",status);
|
||
}
|
||
|
||
//
|
||
// Try to make ParameterValue->Buffer safe to use as a PWSTR parameter.
|
||
// Clean up the allocation and fail this request if we are unable to do so.
|
||
//
|
||
if( (STATUS_SUCCESS == status) && (ParameterValue->Buffer != NULL) ) {
|
||
|
||
if( ParameterValue->MaximumLength >= (ParameterValue->Length + sizeof(WCHAR)) ) {
|
||
|
||
(ParameterValue->Buffer)[ ParameterValue->Length / sizeof(WCHAR) ] = UNICODE_NULL;
|
||
DD(NULL,DDT,"PptRegGetSz - post-query *ParameterValue=<%S>\n", ParameterValue->Buffer);
|
||
|
||
} else {
|
||
|
||
ExFreePool( ParameterValue->Buffer );
|
||
ParameterValue->Length = 0;
|
||
ParameterValue->MaximumLength = 0;
|
||
ParameterValue->Buffer = 0;
|
||
status = STATUS_UNSUCCESSFUL;
|
||
|
||
}
|
||
}
|
||
|
||
return status;
|
||
}
|
||
|
||
/************************************************************************/
|
||
/* PptRegSetSz */
|
||
/************************************************************************/
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Write a REG_SZ to the registry. This is a wrapper for
|
||
// function RtlWriteRegistryValue.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// RelativeTo - starting point for the Path
|
||
// Path - path to the registry key
|
||
// ParameterName - name of the value to write
|
||
// ParameterValue - points to the PWSTR to write to the registry
|
||
//
|
||
// Return Value:
|
||
//
|
||
// NTSTATUS
|
||
//
|
||
// Notes:
|
||
//
|
||
// Log:
|
||
//
|
||
/************************************************************************/
|
||
NTSTATUS
|
||
PptRegSetSz(
|
||
IN ULONG RelativeTo,
|
||
IN PWSTR Path,
|
||
IN PWSTR ParameterName,
|
||
IN PWSTR ParameterValue
|
||
)
|
||
{
|
||
NTSTATUS status;
|
||
|
||
if( (NULL == Path) || (NULL == ParameterName) || (NULL == ParameterValue) ) {
|
||
status = STATUS_INVALID_PARAMETER;
|
||
} else {
|
||
status = RtlWriteRegistryValue( RelativeTo,
|
||
Path,
|
||
ParameterName,
|
||
REG_SZ,
|
||
ParameterValue,
|
||
( wcslen(ParameterValue) + sizeof(CHAR) ) * sizeof(WCHAR) );
|
||
}
|
||
return status;
|
||
}
|