159 lines
3.2 KiB
C
159 lines
3.2 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1990 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
SysInit.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module implements the Log File Service initialization.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Brian Andrew [BrianAn] 20-June-1991
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "lfsprocs.h"
|
|||
|
|
|||
|
//
|
|||
|
// The debug trace level
|
|||
|
//
|
|||
|
|
|||
|
#define Dbg (DEBUG_TRACE_INITIALIZATION)
|
|||
|
|
|||
|
#undef MODULE_POOL_TAG
|
|||
|
#define MODULE_POOL_TAG ('IsfL')
|
|||
|
|
|||
|
#ifdef ALLOC_PRAGMA
|
|||
|
#pragma alloc_text(PAGE, LfsInitializeLogFileService)
|
|||
|
#endif
|
|||
|
|
|||
|
extern USHORT LfsUsaSeqNumber;
|
|||
|
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
LfsInitializeLogFileService (
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine must be called during system initialization before the
|
|||
|
first call to logging service, to allow the Log File Service to initialize
|
|||
|
its global data structures. This routine has no dependencies on other
|
|||
|
system components being initialized.
|
|||
|
|
|||
|
This routine will initialize the global structures used by the logging
|
|||
|
service and start the Lfs worker thread.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE if initialization was successful
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
LARGE_INTEGER CurrentTime;
|
|||
|
|
|||
|
PAGED_CODE();
|
|||
|
|
|||
|
DebugTrace( +1, Dbg, "LfsInitializeLogFileService: Enter\n", 0 );
|
|||
|
|
|||
|
//
|
|||
|
// If the structure has already been initialized then we can return
|
|||
|
// immediately.
|
|||
|
//
|
|||
|
|
|||
|
if (LfsData.NodeTypeCode == LFS_NTC_DATA
|
|||
|
&& LfsData.NodeByteSize == sizeof( LFS_DATA )
|
|||
|
&& FlagOn( LfsData.Flags, LFS_DATA_INITIALIZED )) {
|
|||
|
|
|||
|
DebugTrace( -1, Dbg, "LfsInitializeLogFileService: Exit -> %01x\n", TRUE );
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Zero out the structure initially.
|
|||
|
//
|
|||
|
|
|||
|
RtlZeroMemory( &LfsData, sizeof( LFS_DATA ));
|
|||
|
|
|||
|
//
|
|||
|
// Assume the operation will fail.
|
|||
|
//
|
|||
|
|
|||
|
LfsData.Flags = LFS_DATA_INIT_FAILED;
|
|||
|
|
|||
|
//
|
|||
|
// Initialize the global structure for Lfs.
|
|||
|
//
|
|||
|
|
|||
|
LfsData.NodeTypeCode = LFS_NTC_DATA;
|
|||
|
LfsData.NodeByteSize = sizeof( LFS_DATA );
|
|||
|
|
|||
|
InitializeListHead( &LfsData.LfcbLinks );
|
|||
|
|
|||
|
//
|
|||
|
// Initialize the synchronization objects.
|
|||
|
//
|
|||
|
|
|||
|
ExInitializeFastMutex( &LfsData.LfsDataLock );
|
|||
|
|
|||
|
//
|
|||
|
// Initialize the buffer allocation. System will be robust enough to tolerate
|
|||
|
// allocation failures.
|
|||
|
//
|
|||
|
|
|||
|
ExInitializeFastMutex( &LfsData.BufferLock );
|
|||
|
KeInitializeEvent( &LfsData.BufferNotification, NotificationEvent, TRUE );
|
|||
|
LfsData.Buffer1 = LfsAllocatePoolNoRaise( PagedPool, LFS_BUFFER_SIZE );
|
|||
|
|
|||
|
if (LfsData.Buffer1 == NULL) {
|
|||
|
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
LfsData.Buffer2 = LfsAllocatePoolNoRaise( PagedPool, LFS_BUFFER_SIZE );
|
|||
|
|
|||
|
//
|
|||
|
// Make sure we got both.
|
|||
|
//
|
|||
|
|
|||
|
if (LfsData.Buffer2 == NULL) {
|
|||
|
|
|||
|
LfsFreePool( LfsData.Buffer1 );
|
|||
|
LfsData.Buffer1 = NULL;
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Initialization has been successful.
|
|||
|
//
|
|||
|
|
|||
|
ClearFlag( LfsData.Flags, LFS_DATA_INIT_FAILED );
|
|||
|
SetFlag( LfsData.Flags, LFS_DATA_INITIALIZED );
|
|||
|
|
|||
|
//
|
|||
|
// Get a random number as a seed for the Usa sequence numbers. Use the lower
|
|||
|
// bits of the current time.
|
|||
|
//
|
|||
|
|
|||
|
KeQuerySystemTime( &CurrentTime );
|
|||
|
LfsUsaSeqNumber = (USHORT) CurrentTime.LowPart;
|
|||
|
|
|||
|
DebugTrace( -1, Dbg, "LfsInitializeLogFileService: Exit -> %01x\n", TRUE );
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|