Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

154 lines
3.7 KiB

/*++
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 );
}