[LT2013]
[reactos.git] / ntoskrnl / lpc / port.c
1 /*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/lpc/port.c
5 * PURPOSE: Local Procedure Call: Port Management
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include <ntoskrnl.h>
12 #define NDEBUG
13 #include <debug.h>
14
15 /* GLOBALS *******************************************************************/
16
17 POBJECT_TYPE LpcPortObjectType, LpcWaitablePortObjectType;
18 ULONG LpcpMaxMessageSize;
19 PAGED_LOOKASIDE_LIST LpcpMessagesLookaside;
20 KGUARDED_MUTEX LpcpLock;
21 ULONG LpcpTraceLevel = 0;
22 ULONG LpcpNextMessageId = 1, LpcpNextCallbackId = 1;
23
24 static GENERIC_MAPPING LpcpPortMapping =
25 {
26 READ_CONTROL | PORT_CONNECT,
27 DELETE | PORT_CONNECT,
28 0,
29 PORT_ALL_ACCESS
30 };
31
32 /* PRIVATE FUNCTIONS *********************************************************/
33
34 BOOLEAN
35 NTAPI
36 INIT_FUNCTION
37 LpcInitSystem(VOID)
38 {
39 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
40 UNICODE_STRING Name;
41
42 /* Setup the LPC Lock */
43 KeInitializeGuardedMutex(&LpcpLock);
44
45 /* Create the Port Object Type */
46 RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
47 RtlInitUnicodeString(&Name, L"Port");
48 ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
49 ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(LPCP_NONPAGED_PORT_QUEUE);
50 ObjectTypeInitializer.DefaultPagedPoolCharge = FIELD_OFFSET(LPCP_PORT_OBJECT, WaitEvent);
51 ObjectTypeInitializer.GenericMapping = LpcpPortMapping;
52 ObjectTypeInitializer.PoolType = PagedPool;
53 ObjectTypeInitializer.UseDefaultObject = TRUE;
54 ObjectTypeInitializer.CloseProcedure = LpcpClosePort;
55 ObjectTypeInitializer.DeleteProcedure = LpcpDeletePort;
56 ObjectTypeInitializer.ValidAccessMask = PORT_ALL_ACCESS;
57 ObjectTypeInitializer.InvalidAttributes = OBJ_VALID_ATTRIBUTES & ~OBJ_CASE_INSENSITIVE;
58 ObCreateObjectType(&Name,
59 &ObjectTypeInitializer,
60 NULL,
61 &LpcPortObjectType);
62
63 RtlInitUnicodeString(&Name, L"WaitablePort");
64 ObjectTypeInitializer.PoolType = NonPagedPool;
65 ObjectTypeInitializer.DefaultNonPagedPoolCharge += sizeof(LPCP_PORT_OBJECT);
66 ObjectTypeInitializer.DefaultPagedPoolCharge = 0;
67 ObjectTypeInitializer.UseDefaultObject = FALSE;
68 ObCreateObjectType(&Name,
69 &ObjectTypeInitializer,
70 NULL,
71 &LpcWaitablePortObjectType);
72
73 /* Allocate the LPC lookaside list */
74 LpcpMaxMessageSize = LPCP_MAX_MESSAGE_SIZE;
75 ExInitializePagedLookasideList(&LpcpMessagesLookaside,
76 NULL,
77 NULL,
78 0,
79 LpcpMaxMessageSize,
80 'McpL',
81 32);
82
83 /* We're done */
84 return TRUE;
85 }
86
87 /* PUBLIC FUNCTIONS **********************************************************/
88
89 NTSTATUS
90 NTAPI
91 NtImpersonateClientOfPort(IN HANDLE PortHandle,
92 IN PPORT_MESSAGE ClientMessage)
93 {
94 UNIMPLEMENTED;
95 return STATUS_NOT_IMPLEMENTED;
96 }
97
98 NTSTATUS
99 NTAPI
100 NtQueryPortInformationProcess(VOID)
101 {
102 /* This is all this function does */
103 return STATUS_UNSUCCESSFUL;
104 }
105
106 NTSTATUS
107 NTAPI
108 NtQueryInformationPort(IN HANDLE PortHandle,
109 IN PORT_INFORMATION_CLASS PortInformationClass,
110 OUT PVOID PortInformation,
111 IN ULONG PortInformationLength,
112 OUT PULONG ReturnLength)
113 {
114 UNIMPLEMENTED;
115 return STATUS_NOT_IMPLEMENTED;
116 }
117
118 /* EOF */