fixes
[reactos.git] / reactos / subsys / psxss / init.c
1 /* $Id: init.c,v 1.1 1999/07/17 23:10:31 ea Exp $
2 *
3 * init.c
4 *
5 * ReactOS Operating System
6 *
7 */
8 #include <ddk/ntddk.h>
9 #include <internal/lpc.h>
10
11 struct _SERVER_DIRECTORIES
12 {
13 HANDLE Root; /* MS & Interix(tm): \PSXSS\ */
14 HANDLE Session; /* MS & Interix(tm): \PSXSS\PSXSES\ */
15 HANDLE System; /* Interix(tm) only: \PSXSS\SYSTEM\ */
16 };
17
18 struct _SERVER_PORT
19 {
20 HANDLE Port;
21 THREAD Thread;
22 };
23
24 struct _SERVER
25 {
26 struct _SERVER_DIRECTORIES Directory;
27 struct _SERVER_PORT Api;
28 struct _SERVER_PORT SbApi;
29
30 };
31
32 void Thread_Api(void*);
33 void Thread_SbApi(void*);
34
35 struct _SERVER
36 Server =
37 {
38 {INVALID_HANDLE_VALUE,INVALID_HANDLE_VALUE},
39 {INVALID_HANDLE_VALUE,Thread_Api},
40 {INVALID_HANDLE_VALUE,Thread_SbApi}
41 };
42
43
44 static
45 void
46 Thread_Api(void * pPort)
47 {
48 HANDLE port;
49
50 port = * (HANDLE*) pPort;
51
52 NtListenPort(port);
53 while (TRUE)
54 {
55 NtAcceptConnectPort(
56 port
57 );
58 if (NT_SUCCESS(NtCompleteConnectPort(port)))
59 {
60 /* dispatch call */
61 }
62 }
63 }
64
65
66 static
67 void
68 Thread_SbApi(void * pPort)
69 {
70 HANDLE port;
71
72 port = * (HANDLE*) pPort;
73
74 NtListenPort(port);
75 while (TRUE)
76 {
77 NtAcceptConnectPort(
78 port
79 );
80 if (NT_SUCCESS(NtCompleteConnectPort(port)))
81 {
82 /* dispatch call */
83 continue;
84 }
85 /* error */
86 }
87 }
88
89
90 /***********************************************************************
91 * InitializeServer
92 *
93 * DESCRIPTION
94 * Initialize the POSIX+ subsystem server process. That is:
95 *
96 * 1. create the directory object "\PSXSS\";
97 * 2. create the API port "\PSXSS\ApiPort";
98 * 3. create the debug port "\PSXSS\SbApiPort";
99 * 4. create the sessions directory object "\PSXSS\PSXSES\";
100 * 5. create the system directory object "\PSXSS\SYSTEM\";
101 * 6. initialize port threads
102 *
103 * RETURN VALUE
104 * TRUE Initialization succeeded:
105 * FALSE Initialization failed.
106 *
107 * NOTE
108 * The "\PSXSS\SYSTEM\" directory object does not exist
109 * in the MS implementation, but appears in WNT's namespace
110 * when the Interix(tm) subsystem is installed.
111 */
112 BOOL
113 InitializeServer(void)
114 {
115 NTSTATUS Status;
116 OBJECT_ATTRIBUTES ObAttributes;
117
118
119 /*
120 * STEP 1
121 * Create the directory object "\PSXSS\"
122 *
123 */
124 Status = NtCreateDirectoryObject(
125 PSXSS_DIRECTORY_NAME_ROOT
126 & Server.Directory.Root
127 );
128 /*
129 * STEP 2
130 * Create the LPC port "\PSXSS\ApiPort"
131 *
132 */
133 Server.Api.Port =
134 NtCreatePort(
135 PSXSS_PORT_NAME_APIPORT,
136 ...
137 );
138 NtCreateThread(
139 & Server.Api.Thread,
140 0, /* desired access */
141 & ObAttributes, /* object attributes */
142 NtCurrentProcess(), /* process' handle */
143 0, /* client id */
144 Thread_ApiPort,
145 (void*) & Server.Api.Port
146 );
147 /*
148 * STEP 3
149 * Create the LPC port "\PSXSS\SbApiPort"
150 *
151 */
152 Server.SbApi.Port =
153 NtCreatePort(
154 PSXSS_PORT_NAME_SBAPIPORT,
155 ...
156 );
157 Status = NtCreateThread(
158 & Server.SbApi.Thread,
159 Thread_SbApi,
160 (void*) & Server.SbApi.Port
161 );
162 /*
163 * STEP 4
164 * Create the POSIX+ session directory object
165 * "\PSXSS\PSXSES\"
166 *
167 */
168 Status = NtCreateDirectoryObject(
169 PSXSS_DIRECTORY_NAME_SESSIONS
170 & Server.Directory.Sessions
171 );
172 /*
173 * STEP 5
174 * Create the POSIX+ system directory object
175 * "\PSXSS\SYSTEM\"
176 *
177 */
178 Status = NtCreateDirectoryObject(
179 PSXSS_DIRECTORY_NAME_SYSTEM
180 & Server.Directory.System
181 );
182 return TRUE;
183 }
184
185
186 /* EOF */