2025-04-27 07:49:33 -04:00

181 lines
4.7 KiB
C++

//==========================================================================;
//
// I2CLog.CPP
// WDM MiniDrivers development.
// I2CScript implementation.
// I2CLog Class implemenation.
// Copyright (c) 1997 - 1998 ATI Technologies Inc. All Rights Reserved.
//
// $Date: 28 Apr 1998 09:34:38 $
// $Revision: 1.0 $
// $Author: KLEBANOV $
//
//==========================================================================;
extern"C"
{
#include "strmini.h"
#include "wdmdebug.h"
}
#include "i2script.h"
#include "i2clog.h"
#include "wdmdrv.h"
#include "registry.h"
/*^^*
* ~CI2CLog() destructor
* Purpose : close I2C Log file
*
* Inputs : none
* Outputs : none
* Author : IKLEBANOV
*^^*/
CI2CLog::~CI2CLog( void)
{
if( m_hLogFile != NULL)
::ZwClose( m_hLogFile);
}
/*^^*
* CI2CLog() constructor
* Purpose : Finds out from the Registry, if the I2C Log option is enabled, and
* gets teh Log file name ( if not specified the default log file name
* is used). The Log file is overwritten every system reboot.
*
* Inputs : PDEVICE_OBJECT pDeviceObject : pointer to DeviceObject
* PBOOL pbLogStarted : poinetr to return BOOL
* Outputs : none
* Author : IKLEBANOV
*^^*/
CI2CLog::CI2CLog( PDEVICE_OBJECT pDeviceObject)
{
#if 0
HANDLE hDevice;
NTSTATUS ntStatus;
WCHAR wchFileName[MAXIMUM_FILENAME_LENGTH];
PWCHAR pwchLogFileName;
ULONG ulEnable, ulLength;
UNICODE_STRING unicodeFullName, unicodeName;
OBJECT_ATTRIBUTES objectAttributes;
IO_STATUS_BLOCK ioStatus;
hDevice = NULL;
m_bLogStarted = FALSE;
unicodeFullName.Buffer = NULL;
ENSURE
{
ntStatus = ::IoOpenDeviceRegistryKey( pDeviceObject,
PLUGPLAY_REGKEY_DRIVER, STANDARD_RIGHTS_ALL,
&hDevice);
if( !NT_SUCCESS( ntStatus) || ( hDevice == NULL))
FAIL;
if( !NT_SUCCESS( ::ReadStringFromRegistryFolder( hDevice,
UNICODE_WDM_I2CLOG_ENABLE,
( PWCHAR)&ulEnable,
sizeof( ULONG))))
FAIL;
if( !ulEnable)
FAIL;
if( NT_SUCCESS( ::ReadStringFromRegistryFolder( hDevice,
UNICODE_WDM_I2CLOG_FILENAME,
wchFileName,
sizeof( wchFileName))))
pwchLogFileName = wchFileName;
else
// the default file name is used
if( NT_SUCCESS( ::ReadStringFromRegistryFolder( hDevice,
L"NTMPDriver",
wchFileName,
sizeof( wchFileName))))
{
ulLength = 0;
while( ulLength < MAXIMUM_FILENAME_LENGTH)
if( wchFileName[ulLength ++] == L'.')
break;
if( ulLength >= MAXIMUM_FILENAME_LENGTH)
FAIL;
::RtlMoveMemory( &wchFileName[ulLength],
UNICODE_WDM_I2CLOG_DEFAULTEXTENSION,
sizeof( UNICODE_WDM_I2CLOG_DEFAULTEXTENSION));
pwchLogFileName = wchFileName;
}
else
FAIL;
::RtlInitUnicodeString( &unicodeName, pwchLogFileName);
ulLength = sizeof( UNICODE_WDM_I2CLOG_ABSOLUTEPATH) - sizeof( WCHAR) + unicodeName.MaximumLength;
unicodeFullName.Buffer = ( USHORT *)::ExAllocatePool( NonPagedPool, ulLength);
if( unicodeFullName.Buffer == NULL)
{
OutputDebugError(( "CI2CLog: Full file name buffer allocation failure ulLength = %d\n", ulLength));
FAIL;
}
unicodeFullName.MaximumLength = ( USHORT)ulLength;
// don't copy the trailing NULL
ulLength = sizeof( UNICODE_WDM_I2CLOG_ABSOLUTEPATH) - sizeof( WCHAR);
::RtlMoveMemory( unicodeFullName.Buffer,
UNICODE_WDM_I2CLOG_ABSOLUTEPATH,
ulLength);
unicodeFullName.Length = ( USHORT)ulLength;
if( !NT_SUCCESS( ::RtlAppendUnicodeStringToString( &unicodeFullName, &unicodeName)))
FAIL;
InitializeObjectAttributes( &objectAttributes,
&unicodeFullName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
OutputDebugTrace(( "CI2CLog: creating I2C Private Log file %wZ\n", pwchLogFileName));
FAIL;
ntStatus = ::ZwCreateFile( &m_hLogFile,
GENERIC_WRITE | SYNCHRONIZE | FILE_APPEND_DATA,
&objectAttributes,
&ioStatus,
NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_OVERWRITE_IF,
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
if( !NT_SUCCESS( ntStatus))
FAIL;
m_bLogStarted = TRUE;
} END_ENSURE;
if( !m_bLogStarted)
OutputDebugError(( "CI2CLog: creating I2C Private Log failure\n"));
if( hDevice != NULL)
::ZwClose( hDevice);
if( unicodeFullName.Buffer != NULL)
::ExFreePool( unicodeFullName.Buffer);
#else
OutputDebugError(( "I2C Log feature is yet not available\n"));
#endif // not compiled
}