Leaked source code of windows server 2003
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

//==========================================================================;
//
// 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);
}