You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
6.6 KiB
202 lines
6.6 KiB
//==========================================================================;
|
|
//
|
|
// Registry.CPP
|
|
// WDM MiniDrivers development.
|
|
// Global space.
|
|
// Registry data management.
|
|
// Copyright (c) 1996 - 1997 ATI Technologies Inc. All Rights Reserved.
|
|
//
|
|
// $Date: 15 Apr 1999 11:08:06 $
|
|
// $Revision: 1.6 $
|
|
// $Author: Tashjian $
|
|
//
|
|
//==========================================================================;
|
|
|
|
#include "common.h"
|
|
|
|
#include "registry.h"
|
|
|
|
|
|
ULONG g_DebugLevel;
|
|
PCHAR g_DebugComponent = WDM_DRIVER_NAME " not set in registry: ";
|
|
|
|
|
|
/*^^*
|
|
* OpenRegistryFolder()
|
|
* Purpose : Gets the specified Registry folder handle ( opens the folder) to be used later on
|
|
*
|
|
* Inputs : PDEVICE_OBJECT pDeviceObject : pointer to DeviceObject
|
|
* PWCHAR pwchFolderName : name of the Registry folder to open, might be NULL
|
|
* Outputs : HANDLE, NULL if the Registry folder has not been opened
|
|
* Author : IKLEBANOV
|
|
*^^*/
|
|
HANDLE OpenRegistryFolder( PDEVICE_OBJECT pDeviceObject, PWCHAR pwchFolderName)
|
|
{
|
|
HANDLE hFolder, hDevice;
|
|
NTSTATUS ntStatus;
|
|
UNICODE_STRING FolderName;
|
|
OBJECT_ATTRIBUTES attr;
|
|
|
|
hFolder = hDevice = NULL;
|
|
|
|
ENSURE
|
|
{
|
|
ntStatus = ::IoOpenDeviceRegistryKey( pDeviceObject,
|
|
PLUGPLAY_REGKEY_DRIVER, STANDARD_RIGHTS_ALL,
|
|
&hDevice);
|
|
|
|
if( !NT_SUCCESS( ntStatus) || ( hDevice == NULL))
|
|
FAIL;
|
|
|
|
if( pwchFolderName != NULL)
|
|
{
|
|
::RtlInitUnicodeString( &FolderName, pwchFolderName);
|
|
InitializeObjectAttributes( &attr, &FolderName, OBJ_INHERIT|OBJ_KERNEL_HANDLE, hDevice, NULL);
|
|
|
|
ntStatus = ::ZwOpenKey( &hFolder, KEY_QUERY_VALUE, &attr);
|
|
::ZwClose( hDevice);
|
|
|
|
if( !NT_SUCCESS( ntStatus))
|
|
FAIL;
|
|
}
|
|
else
|
|
hFolder = hDevice;
|
|
|
|
return( hFolder);
|
|
|
|
} END_ENSURE;
|
|
|
|
return( NULL);
|
|
}
|
|
|
|
|
|
|
|
/*^^*
|
|
* SetMiniDriverDebugLevel()
|
|
* Purpose : Sets the Debugging level required by user
|
|
*
|
|
* Inputs : PUNICODE_STRING pRegistryPath : MiniDriver's private Registry path
|
|
* Outputs : none
|
|
*
|
|
* Author : IKLEBANOV
|
|
*^^*/
|
|
extern "C"
|
|
void SetMiniDriverDebugLevel( PUNICODE_STRING pRegistryPath)
|
|
{
|
|
OBJECT_ATTRIBUTES objectAttributes;
|
|
HANDLE hFolder;
|
|
ULONG ulValue;
|
|
WCHAR wcDriverName[20];
|
|
|
|
// Set the default value as no Debug
|
|
g_DebugLevel = 0;
|
|
|
|
InitializeObjectAttributes( &objectAttributes,
|
|
pRegistryPath,
|
|
OBJ_CASE_INSENSITIVE,
|
|
NULL,
|
|
NULL);
|
|
|
|
if( NT_SUCCESS( ZwOpenKey( &hFolder, KEY_READ, &objectAttributes)))
|
|
{
|
|
ulValue = 0;
|
|
|
|
if( NT_SUCCESS( ReadStringFromRegistryFolder( hFolder,
|
|
UNICODE_WDM_DEBUGLEVEL_INFO,
|
|
( PWCHAR)&ulValue,
|
|
sizeof( ULONG))))
|
|
g_DebugLevel = ulValue;
|
|
|
|
// fetch the driver name from the registry
|
|
if( NT_SUCCESS( ReadStringFromRegistryFolder( hFolder,
|
|
UNICODE_WDM_DRIVER_NAME,
|
|
wcDriverName,
|
|
sizeof(wcDriverName)))) {
|
|
|
|
// set g_DebugComponent by using driver name
|
|
ANSI_STRING stringDriverName;
|
|
UNICODE_STRING unicodeDriverName;
|
|
|
|
// convert unicode driver name to ansi
|
|
RtlInitAnsiString(&stringDriverName, g_DebugComponent);
|
|
RtlInitUnicodeString(&unicodeDriverName, wcDriverName);
|
|
RtlUnicodeStringToAnsiString(&stringDriverName, &unicodeDriverName, FALSE);
|
|
|
|
// remove extension and put a colon
|
|
PCHAR pExt = strchr(g_DebugComponent, '.');
|
|
if (pExt) {
|
|
*pExt++ = ':';
|
|
*pExt++ = ' ';
|
|
*pExt = 0;
|
|
}
|
|
|
|
// convert to upper case (or lower case... whatever your fancy)
|
|
//_strupr(g_DebugComponent);
|
|
//_strlwr(g_DebugComponent);
|
|
}
|
|
ZwClose( hFolder);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*^^*
|
|
* ReadStringFromRegistryFolder
|
|
* Purpose : Read ASCII string from the Registry folder
|
|
*
|
|
* Inputs : HANDLE hFolder : Registry folder handle to read the values from
|
|
* PWCHAR pwcKeyNameString : pointer to the StringValue to read
|
|
* PWCHAR pwchBuffer : pointer to the buffer to read into
|
|
* ULONG ulDataLength : length of the data to be expected to read
|
|
*
|
|
* Outputs : NTSTATUS of the registry read operation
|
|
* Author : IKLEBANOV
|
|
*^^*/
|
|
NTSTATUS ReadStringFromRegistryFolder( HANDLE hFolder, PWCHAR pwcKeyNameString, PWCHAR pwchBuffer, ULONG ulDataLength)
|
|
{
|
|
NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
|
|
UNICODE_STRING unicodeKeyName;
|
|
ULONG ulLength;
|
|
PKEY_VALUE_FULL_INFORMATION FullInfo;
|
|
|
|
ENSURE
|
|
{
|
|
::RtlInitUnicodeString( &unicodeKeyName, pwcKeyNameString);
|
|
|
|
ulLength = sizeof( KEY_VALUE_FULL_INFORMATION) + unicodeKeyName.MaximumLength + ulDataLength;
|
|
|
|
FullInfo = ( PKEY_VALUE_FULL_INFORMATION)::ExAllocatePool( PagedPool, ulLength);
|
|
|
|
if( FullInfo)
|
|
{
|
|
ntStatus = ::ZwQueryValueKey( hFolder,
|
|
&unicodeKeyName,
|
|
KeyValueFullInformation,
|
|
FullInfo,
|
|
ulLength,
|
|
&ulLength);
|
|
|
|
if( NT_SUCCESS( ntStatus))
|
|
{
|
|
if( ulDataLength >= FullInfo->DataLength)
|
|
RtlCopyMemory( pwchBuffer, (( PUCHAR)FullInfo) + FullInfo->DataOffset, FullInfo->DataLength);
|
|
else
|
|
{
|
|
TRAP;
|
|
ntStatus = STATUS_BUFFER_TOO_SMALL;
|
|
} // buffer right length
|
|
|
|
} // if success
|
|
|
|
::ExFreePool( FullInfo);
|
|
}
|
|
else
|
|
{
|
|
ntStatus = STATUS_NO_MEMORY;
|
|
}
|
|
|
|
} END_ENSURE;
|
|
|
|
return( ntStatus);
|
|
}
|