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
9 /* INCLUDES *******************************************************************/
11 #include <ntoskrnl/include/internal/hdl.h>
13 #define SAC_DBG_ENTRY_EXIT 0x01
14 #define SAC_DBG_INIT 0x04
15 #define SAC_DBG_MM 0x1000
17 #define SAC_DBG(x, ...) \
20 DbgPrint("SAC %s: ", __FUNCTION__); \
21 DbgPrint(__VA_ARGS__); \
24 #define CHECK_PARAMETER_WITH_STATUS(Parameter, Status) \
26 ASSERT((Parameter)); \
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)
43 #define SacAllocatePool(Length, Tag) \
44 MyAllocatePool(Length, Tag, __FILE__, __LINE__)
46 #define ChannelLock(Channel, x) \
48 KeWaitForSingleObject( \
54 ASSERT((Channel)->x.RefCount == 0); \
55 InterlockedIncrement(&(Channel)->x.RefCount); \
58 #define ChannelUnlock(Channel, x) \
60 ASSERT((Channel)->x.RefCount == 1); \
61 InterlockedDecrement(&(Channel)->x.RefCount); \
64 SEMAPHORE_INCREMENT, \
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);
76 #define ChannelInitializeEvent(Channel, Attributes, x) \
78 PVOID Object, WaitObject; \
81 if (!VerifyEventWaitable(Attributes->x, &Object, &WaitObject)) \
85 Channel->x = Attributes->x; \
86 Channel->x##ObjectBody = Object; \
87 Channel->x##WaitObjectBody = WaitObject; \
91 #define ChannelSetEvent(Channel, x) \
94 ASSERT(Channel->x##ObjectBody); \
95 ASSERT(Channel->x##WaitObjectBody); \
98 KeSetEvent(Channel->x, EVENT_INCREMENT, FALSE); \
99 Status = STATUS_SUCCESS; \
103 Status = STATUS_UNSUCCESSFUL; \
107 #define ChannelClearEvent(Channel, x) \
109 ASSERT(Channel->x); \
110 ASSERT(Channel->x##ObjectBody); \
111 ASSERT(Channel->x##WaitObjectBody); \
114 KeClearEvent(Channel->x); \
115 Status = STATUS_SUCCESS; \
119 Status = STATUS_UNSUCCESSFUL; \
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'
133 #define LOCAL_MEMORY_SIGNATURE 'SSEL'
134 #define GLOBAL_MEMORY_SIGNATURE 'DAEH'
136 #define SAC_MEMORY_LIST_SIZE (1 * 1024 * 1024)
138 #define SAC_OBUFFER_SIZE (2 * 1024)
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
145 typedef struct _SAC_MEMORY_ENTRY
150 } SAC_MEMORY_ENTRY
, *PSAC_MEMORY_ENTRY
;
152 typedef struct _SAC_MEMORY_LIST
155 PSAC_MEMORY_ENTRY LocalDescriptor
;
157 struct _SAC_MEMORY_LIST
* Next
;
158 } SAC_MEMORY_LIST
, *PSAC_MEMORY_LIST
;
160 typedef enum _SAC_CHANNEL_TYPE
167 typedef enum _SAC_CHANNEL_STATUS
171 } SAC_CHANNEL_STATUS
, *PSAC_CHANNEL_STATUS
;
173 typedef struct _SAC_CHANNEL_ID
177 } SAC_CHANNEL_ID
, *PSAC_CHANNEL_ID
;
179 typedef struct _SAC_CHANNEL_LOCK
183 } SAC_CHANNEL_LOCK
, *PSAC_CHANNEL_LOCK
;
189 (*PSAC_CHANNEL_CREATE
)(
190 IN
struct _SAC_CHANNEL
* Channel
195 (*PSAC_CHANNEL_DESTROY
)(
196 IN
struct _SAC_CHANNEL
* Channel
201 (*PSAC_CHANNEL_OREAD
)(
202 IN
struct _SAC_CHANNEL
* Channel
,
210 (*PSAC_CHANNEL_OECHO
)(
211 IN
struct _SAC_CHANNEL
* Channel
,
218 (*PSAC_CHANNEL_OFLUSH
)(
219 IN
struct _SAC_CHANNEL
* Channel
224 (*PSAC_CHANNEL_OWRITE
)(
225 IN
struct _SAC_CHANNEL
* Channel
,
232 (*PSAC_CHANNEL_IREAD
)(
233 IN
struct _SAC_CHANNEL
* Channel
,
236 IN PULONG ReturnBufferSize
241 (*PSAC_CHANNEL_IBUFFER_FULL
)(
242 IN
struct _SAC_CHANNEL
* Channel
,
243 OUT PBOOLEAN BufferStatus
248 (*PSAC_CHANNEL_IBUFFER_LENGTH
)(
249 IN
struct _SAC_CHANNEL
* Channel
254 (*PSAC_CHANNEL_IREAD_LAST
)(
255 IN
struct _SAC_CHANNEL
* Channel
260 (*PSAC_CHANNEL_IWRITE
)(
261 IN
struct _SAC_CHANNEL
* Channel
,
266 typedef struct _SAC_CHANNEL
269 SAC_CHANNEL_ID ChannelId
;
271 PVOID CloseEventObjectBody
;
272 PKEVENT CloseEventWaitObjectBody
;
273 HANDLE HasNewDataEvent
;
274 PVOID HasNewDataEventObjectBody
;
275 PKEVENT HasNewDataEventWaitObjectBody
;
277 PVOID LockEventObjectBody
;
278 PKEVENT LockEventWaitObjectBody
;
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];
288 GUID ApplicationType
;
289 BOOLEAN WriteEnabled
;
292 BOOLEAN ChannelHasNewIBufferData
;
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
;
318 typedef struct _SAC_DEVICE_EXTENSION
320 PDEVICE_OBJECT DeviceObject
;
323 BOOLEAN PriorityFail
;
324 KPRIORITY PriorityBoost
;
329 HANDLE WorkerThreadHandle
;
330 KEVENT WorkerThreadEvent
;
334 } SAC_DEVICE_EXTENSION
, *PSAC_DEVICE_EXTENSION
;
336 typedef struct _SAC_CHANNEL_ATTRIBUTES
338 SAC_CHANNEL_TYPE ChannelType
;
339 WCHAR NameBuffer
[64 + 1];
340 WCHAR DescriptionBuffer
[256 + 1];
343 PKEVENT HasNewDataEvent
;
347 } SAC_CHANNEL_ATTRIBUTES
, *PSAC_CHANNEL_ATTRIBUTES
;
351 IN PDEVICE_OBJECT DeviceObject
,
357 DispatchDeviceControl(
358 IN PDEVICE_OBJECT DeviceObject
,
363 DispatchShutdownControl(
364 IN PDEVICE_OBJECT DeviceObject
,
370 IN PDRIVER_OBJECT DriverObject
379 InitializeDeviceData(
380 IN PDEVICE_OBJECT DeviceObject
384 InitializeGlobalData(
385 IN PUNICODE_STRING RegistryPath
,
386 IN PDRIVER_OBJECT DriverObject
389 extern ULONG SACDebug
;