181 lines
4.7 KiB
C++
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
|
|
}
|