windows-nt/Source/XPSP1/NT/base/ntos/lpc/lpcinit.c
2020-09-26 16:20:57 +08:00

247 lines
5.3 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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"
//
// The following two object types are defined system wide to handle lpc ports
//
POBJECT_TYPE LpcPortObjectType;
POBJECT_TYPE LpcWaitablePortObjectType;
//
// This is the default access mask mapping for lpc port objects
//
#ifdef ALLOC_DATA_PRAGMA
#pragma const_seg("INITCONST")
#pragma data_seg("PAGEDATA")
#endif // ALLOC_DATA_PRAGMA
const GENERIC_MAPPING LpcpPortMapping = {
READ_CONTROL | PORT_CONNECT,
DELETE | PORT_CONNECT,
0,
PORT_ALL_ACCESS
};
ULONG LpcpNextMessageId = 1;
ULONG LpcpNextCallbackId = 1;
#ifdef ALLOC_DATA_PRAGMA
#pragma const_seg()
#pragma data_seg()
#endif // ALLOC_DATA_PRAGMA
//
// This lock is used to protect practically everything in lpc
//
LPC_MUTEX LpcpLock;
//
// The following array of strings is used to debugger purposes and the
// values correspond to the Port message types defined in ntlpcapi.h
//
#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"
};
#endif // ENABLE_LPC_TRACING
#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT,LpcInitSystem)
#if ENABLE_LPC_TRACING
#pragma alloc_text(PAGE,LpcpGetCreatorName)
#endif // ENABLE_LPC_TRACING
#endif // ALLOC_PRAGMA
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;
//
// Initialize our global lpc lock
//
LpcpInitializeLpcpLock();
//
// Create the object type for the port object
//
RtlInitUnicodeString( &PortTypeName, L"Port" );
RtlZeroMemory( &ObjectTypeInitializer, sizeof( ObjectTypeInitializer ));
ObjectTypeInitializer.Length = sizeof( ObjectTypeInitializer );
ObjectTypeInitializer.GenericMapping = LpcpPortMapping;
ObjectTypeInitializer.MaintainTypeList = FALSE;
ObjectTypeInitializer.PoolType = PagedPool;
ObjectTypeInitializer.DefaultPagedPoolCharge = FIELD_OFFSET( LPCP_PORT_OBJECT, WaitEvent );
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 );
//
// Create the object type for the waitable port object
//
RtlInitUnicodeString( &PortTypeName, L"WaitablePort" );
ObjectTypeInitializer.PoolType = NonPagedPool;
ObjectTypeInitializer.DefaultNonPagedPoolCharge += sizeof( LPCP_PORT_OBJECT );
ObjectTypeInitializer.DefaultPagedPoolCharge = 0;
ObjectTypeInitializer.UseDefaultObject = FALSE;
ObCreateObjectType( &PortTypeName,
&ObjectTypeInitializer,
(PSECURITY_DESCRIPTOR)NULL,
&LpcWaitablePortObjectType );
//
// Initialize the lpc port zone. Each element can contain a max
// message, plus an LPCP message structure, plus an LPCP connection
// message
//
ZoneElementSize = PORT_MAXIMUM_MESSAGE_LENGTH +
sizeof( LPCP_MESSAGE ) +
sizeof( LPCP_CONNECTION_MESSAGE );
//
// Round up the size to the next 16 byte alignment
//
ZoneElementSize = (ZoneElementSize + LPCP_ZONE_ALIGNMENT - 1) &
LPCP_ZONE_ALIGNMENT_MASK;
//
// Initialize the zone
//
LpcpInitializePortZone( ZoneElementSize );
return( TRUE );
}
#if ENABLE_LPC_TRACING
char *
LpcpGetCreatorName (
PLPCP_PORT_OBJECT PortObject
)
/*++
Routine Description:
This routine returns the name of the process that created the specified
port object
Arguments:
PortObject - Supplies the port object being queried
Return Value:
char * - The image name of the process that created the port process
--*/
{
NTSTATUS Status;
PEPROCESS Process;
//
// First find the process that created the port object
//
Status = PsLookupProcessByProcessId( PortObject->Creator.UniqueProcess, &Process );
//
// If we were able to get the process then return the name of the process
// to our caller
//
if (NT_SUCCESS( Status )) {
return (char *)Process->ImageFileName;
} else {
//
// Otherwise tell our caller we don't know the name
//
return "Unknown";
}
}
#endif // ENABLE_LPC_TRACING