Sync with trunk r58740.
[reactos.git] / drivers / sac / driver / sacdrv.h
1 /*
2 * PROJECT: ReactOS Boot Loader
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/sac/driver/sacdrv.h
5 * PURPOSE: Header for the Server Administration Console (SAC) for EMS
6 * PROGRAMMERS: ReactOS Portable Systems Group
7 */
8
9 /* INCLUDES *******************************************************************/
10 #include <ntifs.h>
11 #include <ntoskrnl/include/internal/hdl.h>
12
13 #define SAC_DBG_ENTRY_EXIT 0x01
14 #define SAC_DBG_INIT 0x04
15 #define SAC_DBG_MM 0x1000
16
17 #define SAC_DBG(x, ...) \
18 if (SACDebug & x) \
19 { \
20 DbgPrint("SAC %s: ", __FUNCTION__); \
21 DbgPrint(__VA_ARGS__); \
22 }
23
24 #define CHECK_PARAMETER_WITH_STATUS(Parameter, Status) \
25 { \
26 ASSERT((Parameter)); \
27 if (!Parameter) \
28 { \
29 return Status; \
30 } \
31 }
32 #define CHECK_PARAMETER(x) \
33 CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER)
34 #define CHECK_PARAMETER1(x) \
35 CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER_1)
36 #define CHECK_PARAMETER2(x) \
37 CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER_2)
38 #define CHECK_PARAMETER3(x) \
39 CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER_3)
40 #define CHECK_ALLOCATION(x) \
41 CHECK_PARAMETER_WITH_STATUS(x, STATUS_OUT_OF_MEMORY)
42
43 #define SacAllocatePool(Length, Tag) \
44 MyAllocatePool(Length, Tag, __FILE__, __LINE__)
45
46 #define ChannelLock(Channel, x) \
47 { \
48 KeWaitForSingleObject( \
49 &(Channel)->x.Lock, \
50 Executive, \
51 KernelMode, \
52 FALSE, \
53 NULL); \
54 ASSERT((Channel)->x.RefCount == 0); \
55 InterlockedIncrement(&(Channel)->x.RefCount); \
56 }
57
58 #define ChannelUnlock(Channel, x) \
59 { \
60 ASSERT((Channel)->x.RefCount == 1); \
61 InterlockedDecrement(&(Channel)->x.RefCount); \
62 KeReleaseSemaphore( \
63 &(Channel)->x.Lock, \
64 SEMAPHORE_INCREMENT, \
65 1, \
66 FALSE); \
67 }
68
69 #define ChannelLockOBuffer(Channel) ChannelLock(Channel, ChannelOBufferLock);
70 #define ChannelUnlockOBuffer(Channel) ChannelUnlock(Channel, ChannelOBufferLock);
71 #define ChannelLockIBuffer(Channel) ChannelLock(Channel, ChannelIBufferLock);
72 #define ChannelUnlockIBuffer(Channel) ChannelUnlock(Channel, ChannelIBufferLock);
73 #define ChannelLockAttributes(Channel) ChannelLock(Channel, ChannelAttributesLock);
74 #define ChannelUnlockAttributes(Channel) ChannelUnlock(Channel, ChannelAttributesLock);
75
76 #define ChannelInitializeEvent(Channel, Attributes, x) \
77 { \
78 PVOID Object, WaitObject; \
79 if (Attributes->x) \
80 { \
81 if (!VerifyEventWaitable(Attributes->x, &Object, &WaitObject)) \
82 { \
83 goto FailChannel; \
84 } \
85 Channel->x = Attributes->x; \
86 Channel->x##ObjectBody = Object; \
87 Channel->x##WaitObjectBody = WaitObject; \
88 } \
89 }
90
91 #define ChannelSetEvent(Channel, x) \
92 { \
93 ASSERT(Channel->x); \
94 ASSERT(Channel->x##ObjectBody); \
95 ASSERT(Channel->x##WaitObjectBody); \
96 if (Channel->x) \
97 { \
98 KeSetEvent(Channel->x, EVENT_INCREMENT, FALSE); \
99 Status = STATUS_SUCCESS; \
100 } \
101 else \
102 { \
103 Status = STATUS_UNSUCCESSFUL; \
104 } \
105 }
106
107 #define ChannelClearEvent(Channel, x) \
108 { \
109 ASSERT(Channel->x); \
110 ASSERT(Channel->x##ObjectBody); \
111 ASSERT(Channel->x##WaitObjectBody); \
112 if (Channel->x) \
113 { \
114 KeClearEvent(Channel->x); \
115 Status = STATUS_SUCCESS; \
116 } \
117 else \
118 { \
119 Status = STATUS_UNSUCCESSFUL; \
120 } \
121 }
122
123 //Rcp? - sacdrv.sys - SAC Driver (Headless)
124 //RcpA - sacdrv.sys - Internal memory mgr alloc block
125 //RcpI - sacdrv.sys - Internal memory mgr initial heap block
126 //RcpS - sacdrv.sys - Security related block
127 #define GENERIC_TAG '?pcR'
128 #define ALLOC_BLOCK_TAG 'ApcR'
129 #define INITIAL_BLOCK_TAG 'IpcR'
130 #define SECURITY_BLOCK_TAG 'SpcR'
131 #define FREE_POOL_TAG 'FpcR'
132
133 #define LOCAL_MEMORY_SIGNATURE 'SSEL'
134 #define GLOBAL_MEMORY_SIGNATURE 'DAEH'
135
136 #define SAC_MEMORY_LIST_SIZE (1 * 1024 * 1024)
137
138 #define SAC_OBUFFER_SIZE (2 * 1024)
139
140 #define SAC_CHANNEL_FLAG_CLOSE_EVENT 0x2
141 #define SAC_CHANNEL_FLAG_HAS_NEW_DATA_EVENT 0x4
142 #define SAC_CHANNEL_FLAG_LOCK_EVENT 0x8
143 #define SAC_CHANNEL_FLAG_REDRAW_EVENT 0x10
144
145 typedef struct _SAC_MEMORY_ENTRY
146 {
147 ULONG Signature;
148 ULONG Tag;
149 ULONG Size;
150 } SAC_MEMORY_ENTRY, *PSAC_MEMORY_ENTRY;
151
152 typedef struct _SAC_MEMORY_LIST
153 {
154 ULONG Signature;
155 PSAC_MEMORY_ENTRY LocalDescriptor;
156 ULONG Size;
157 struct _SAC_MEMORY_LIST* Next;
158 } SAC_MEMORY_LIST, *PSAC_MEMORY_LIST;
159
160 typedef enum _SAC_CHANNEL_TYPE
161 {
162 VtUtf8,
163 Cmd,
164 Raw
165 } SAC_CHANNEL_TYPE;
166
167 typedef enum _SAC_CHANNEL_STATUS
168 {
169 Inactive,
170 Active
171 } SAC_CHANNEL_STATUS, *PSAC_CHANNEL_STATUS;
172
173 typedef struct _SAC_CHANNEL_ID
174 {
175 GUID ChannelGuid;
176 ULONG ChannelId;
177 } SAC_CHANNEL_ID, *PSAC_CHANNEL_ID;
178
179 typedef struct _SAC_CHANNEL_LOCK
180 {
181 LONG RefCount;
182 KSEMAPHORE Lock;
183 } SAC_CHANNEL_LOCK, *PSAC_CHANNEL_LOCK;
184
185 struct _SAC_CHANNEL;
186
187 typedef
188 NTSTATUS
189 (*PSAC_CHANNEL_CREATE)(
190 IN struct _SAC_CHANNEL* Channel
191 );
192
193 typedef
194 NTSTATUS
195 (*PSAC_CHANNEL_DESTROY)(
196 IN struct _SAC_CHANNEL* Channel
197 );
198
199 typedef
200 NTSTATUS
201 (*PSAC_CHANNEL_OREAD)(
202 IN struct _SAC_CHANNEL* Channel,
203 IN PCHAR Buffer,
204 IN ULONG BufferSize,
205 OUT PULONG ByteCount
206 );
207
208 typedef
209 NTSTATUS
210 (*PSAC_CHANNEL_OECHO)(
211 IN struct _SAC_CHANNEL* Channel,
212 IN PWCHAR String,
213 IN ULONG Length
214 );
215
216 typedef
217 NTSTATUS
218 (*PSAC_CHANNEL_OFLUSH)(
219 IN struct _SAC_CHANNEL* Channel
220 );
221
222 typedef
223 NTSTATUS
224 (*PSAC_CHANNEL_OWRITE)(
225 IN struct _SAC_CHANNEL* Channel,
226 IN PWCHAR String,
227 IN ULONG Length
228 );
229
230 typedef
231 NTSTATUS
232 (*PSAC_CHANNEL_IREAD)(
233 IN struct _SAC_CHANNEL* Channel,
234 IN PWCHAR Buffer,
235 IN ULONG BufferSize,
236 IN PULONG ReturnBufferSize
237 );
238
239 typedef
240 NTSTATUS
241 (*PSAC_CHANNEL_IBUFFER_FULL)(
242 IN struct _SAC_CHANNEL* Channel,
243 OUT PBOOLEAN BufferStatus
244 );
245
246 typedef
247 NTSTATUS
248 (*PSAC_CHANNEL_IBUFFER_LENGTH)(
249 IN struct _SAC_CHANNEL* Channel
250 );
251
252 typedef
253 CHAR
254 (*PSAC_CHANNEL_IREAD_LAST)(
255 IN struct _SAC_CHANNEL* Channel
256 );
257
258 typedef
259 NTSTATUS
260 (*PSAC_CHANNEL_IWRITE)(
261 IN struct _SAC_CHANNEL* Channel,
262 IN PCHAR Buffer,
263 IN ULONG BufferSize
264 );
265
266 typedef struct _SAC_CHANNEL
267 {
268 ULONG Index;
269 SAC_CHANNEL_ID ChannelId;
270 HANDLE CloseEvent;
271 PVOID CloseEventObjectBody;
272 PKEVENT CloseEventWaitObjectBody;
273 HANDLE HasNewDataEvent;
274 PVOID HasNewDataEventObjectBody;
275 PKEVENT HasNewDataEventWaitObjectBody;
276 HANDLE LockEvent;
277 PVOID LockEventObjectBody;
278 PKEVENT LockEventWaitObjectBody;
279 HANDLE RedrawEvent;
280 PVOID RedrawEventObjectBody;
281 PKEVENT RedrawEventWaitObjectBody;
282 PFILE_OBJECT FileObject;
283 SAC_CHANNEL_TYPE ChannelType;
284 SAC_CHANNEL_STATUS ChannelStatus;
285 WCHAR NameBuffer[64 + 1];
286 WCHAR DescriptionBuffer[256 + 1];
287 ULONG Flags;
288 GUID ApplicationType;
289 BOOLEAN WriteEnabled;
290 ULONG IBufferIndex;
291 PVOID IBuffer;
292 BOOLEAN ChannelHasNewIBufferData;
293 UCHAR CursorRow;
294 UCHAR CursorCol;
295 UCHAR CursorY;
296 UCHAR CursorX;
297 UCHAR CursorVisible;
298 PVOID OBuffer;
299 ULONG OBufferIndex;
300 ULONG OBufferFirstGoodIndex;
301 BOOLEAN ChannelHasNewOBufferData;
302 PSAC_CHANNEL_CREATE ChannelCreate;
303 PSAC_CHANNEL_DESTROY ChannelDestroy;
304 PSAC_CHANNEL_OFLUSH OBufferFlush;
305 PSAC_CHANNEL_OECHO OBufferEcho;
306 PSAC_CHANNEL_OWRITE OBufferWrite;
307 PSAC_CHANNEL_OREAD OBufferRead;
308 PSAC_CHANNEL_OWRITE IBufferWrite;
309 PSAC_CHANNEL_IREAD IBufferRead;
310 PSAC_CHANNEL_IREAD_LAST IBufferReadLast;
311 PSAC_CHANNEL_IBUFFER_FULL IBufferIsFull;
312 PSAC_CHANNEL_IBUFFER_LENGTH IBufferLength;
313 SAC_CHANNEL_LOCK ChannelAttributeLock;
314 SAC_CHANNEL_LOCK ChannelOBufferLock;
315 SAC_CHANNEL_LOCK ChannelIBufferLock;
316 } SAC_CHANNEL, *PSAC_CHANNEL;
317
318 typedef struct _SAC_DEVICE_EXTENSION
319 {
320 PDEVICE_OBJECT DeviceObject;
321 BOOLEAN Initialized;
322 BOOLEAN Rundown;
323 BOOLEAN PriorityFail;
324 KPRIORITY PriorityBoost;
325 PEPROCESS Process;
326 KSPIN_LOCK Lock;
327 KEVENT RundownEvent;
328 KEVENT Event;
329 HANDLE WorkerThreadHandle;
330 KEVENT WorkerThreadEvent;
331 KTIMER Timer;
332 KDPC Dpc;
333 LIST_ENTRY List;
334 } SAC_DEVICE_EXTENSION, *PSAC_DEVICE_EXTENSION;
335
336 typedef struct _SAC_CHANNEL_ATTRIBUTES
337 {
338 SAC_CHANNEL_TYPE ChannelType;
339 WCHAR NameBuffer[64 + 1];
340 WCHAR DescriptionBuffer[256 + 1];
341 ULONG Flag;
342 PKEVENT CloseEvent;
343 PKEVENT HasNewDataEvent;
344 PKEVENT LockEvent;
345 PKEVENT RedrawEvent;
346 GUID ChannelId;
347 } SAC_CHANNEL_ATTRIBUTES, *PSAC_CHANNEL_ATTRIBUTES;
348
349 NTSTATUS
350 Dispatch(
351 IN PDEVICE_OBJECT DeviceObject,
352 IN PIRP Irp
353 );
354
355 NTSTATUS
356 NTAPI
357 DispatchDeviceControl(
358 IN PDEVICE_OBJECT DeviceObject,
359 IN PIRP Irp
360 );
361
362 NTSTATUS
363 DispatchShutdownControl(
364 IN PDEVICE_OBJECT DeviceObject,
365 IN PIRP Irp
366 );
367
368 VOID
369 UnloadHandler(
370 IN PDRIVER_OBJECT DriverObject
371 );
372
373 VOID
374 FreeGlobalData(
375 VOID
376 );
377
378 BOOLEAN
379 InitializeDeviceData(
380 IN PDEVICE_OBJECT DeviceObject
381 );
382
383 BOOLEAN
384 InitializeGlobalData(
385 IN PUNICODE_STRING RegistryPath,
386 IN PDRIVER_OBJECT DriverObject
387 );
388
389 extern ULONG SACDebug;
390