|
|
/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
lpcinit.c
Abstract:
Initialization module for the LPC subcomponent of NTOS
Author:
Steve Wood (stevewo) 15-May-1989
Revision History:
--*/
#include "lpcp.h"
POBJECT_TYPE LpcPortObjectType;
GENERIC_MAPPING LpcpPortMapping = { READ_CONTROL | PORT_CONNECT, DELETE | PORT_CONNECT, 0, PORT_ALL_ACCESS };
FAST_MUTEX LpcpLock;
BOOLEAN LpcpRequestMsgType[] = { FALSE, TRUE, // LPC_REQUEST
FALSE, // LPC_REPLY
FALSE, // LPC_DATAGRAM
FALSE, // LPC_LOST_REPLY
FALSE, // LPC_PORT_CLOSED
FALSE, // LPC_CLIENT_DIED
TRUE, // LPC_EXCEPTION
TRUE, // LPC_DEBUG_EVENT
TRUE // LPC_ERROR_EVENT
};
#if ENABLE_LPC_TRACING
char *LpcpMessageTypeName[] = { "UNUSED_MSG_TYPE", "LPC_REQUEST", "LPC_REPLY", "LPC_DATAGRAM", "LPC_LOST_REPLY", "LPC_PORT_CLOSED", "LPC_CLIENT_DIED", "LPC_EXCEPTION", "LPC_DEBUG_EVENT", "LPC_ERROR_EVENT", "LPC_CONNECTION_REQUEST" };
char * LpcpGetCreatorName( PLPCP_PORT_OBJECT PortObject ) { NTSTATUS Status; PEPROCESS Process;
Status = PsLookupProcessByProcessId( PortObject->Creator.UniqueProcess, &Process ); if (NT_SUCCESS( Status )) { return Process->ImageFileName; } else { return "Unknown"; } }
#endif // ENABLE_LPC_TRACING
#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT,LpcInitSystem)
#endif
BOOLEAN LpcInitSystem( VOID ) /*++
Routine Description:
This function performs the system initialization for the LPC package. LPC stands for Local Inter-Process Communication.
Arguments:
None.
Return Value:
TRUE if successful and FALSE if an error occurred.
The following errors can occur:
- insufficient memory
--*/ { OBJECT_TYPE_INITIALIZER ObjectTypeInitializer; UNICODE_STRING PortTypeName; ULONG ZoneElementSize; NTSTATUS Status;
ExInitializeFastMutex( &LpcpLock );
RtlInitUnicodeString( &PortTypeName, L"Port" );
RtlZeroMemory( &ObjectTypeInitializer, sizeof( ObjectTypeInitializer ) ); ObjectTypeInitializer.Length = sizeof( ObjectTypeInitializer ); ObjectTypeInitializer.GenericMapping = LpcpPortMapping; ObjectTypeInitializer.MaintainTypeList = TRUE; ObjectTypeInitializer.PoolType = PagedPool; ObjectTypeInitializer.DefaultPagedPoolCharge = sizeof( LPCP_PORT_OBJECT ); ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof( LPCP_NONPAGED_PORT_QUEUE ); ObjectTypeInitializer.InvalidAttributes = OBJ_VALID_ATTRIBUTES ^ PORT_VALID_OBJECT_ATTRIBUTES; ObjectTypeInitializer.ValidAccessMask = PORT_ALL_ACCESS; ObjectTypeInitializer.CloseProcedure = LpcpClosePort; ObjectTypeInitializer.DeleteProcedure = LpcpDeletePort; ObjectTypeInitializer.UseDefaultObject = TRUE; ObCreateObjectType( &PortTypeName, &ObjectTypeInitializer, (PSECURITY_DESCRIPTOR)NULL, &LpcPortObjectType );
ZoneElementSize = PORT_MAXIMUM_MESSAGE_LENGTH + sizeof( LPCP_MESSAGE ) + sizeof( LPCP_CONNECTION_MESSAGE ); ZoneElementSize = (ZoneElementSize + LPCP_ZONE_ALIGNMENT - 1) & LPCP_ZONE_ALIGNMENT_MASK;
LpcpNextMessageId = 1; LpcpNextCallbackId = 1;
Status = LpcpInitializePortZone( ZoneElementSize, PAGE_SIZE, LPCP_ZONE_MAX_POOL_USAGE ); if (!NT_SUCCESS( Status )) { return( FALSE ); }
return( TRUE ); }
|