2 * PROJECT: ReactOS Drivers
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/sac/driver/sacdrv.h
5 * PURPOSE: Driver for the Server Administration Console (SAC) for EMS
6 * PROGRAMMERS: ReactOS Portable Systems Group
12 /* INCLUDES *******************************************************************/
16 #include <ntoskrnl/include/internal/hdl.h>
19 /* DEFINES ********************************************************************/
22 // SAC Heap Allocator Macros
24 #define SacAllocatePool(Length, Tag) \
25 MyAllocatePool(Length, Tag, __FILE__, __LINE__)
26 #define SacFreePool(Pointer) \
27 MyFreePool((PVOID*)(&Pointer))
30 // SAC Debugging Macro and Constants
32 #define SAC_DBG_ENTRY_EXIT 0x01
33 #define SAC_DBG_UTIL 0x02
34 #define SAC_DBG_INIT 0x04
35 #define SAC_DBG_MM 0x1000
36 #define SAC_DBG_MACHINE 0x2000
37 #define SAC_DBG(x, ...) \
40 DbgPrint("SAC %s: ", __FUNCTION__); \
41 DbgPrint(__VA_ARGS__); \
45 // SAC Parameter Checking Macros
47 #define CHECK_PARAMETER_WITH_STATUS(Parameter, Status) \
49 ASSERT(((PVOID)(Parameter)) != NULL); \
50 if (((PVOID)(Parameter)) == NULL) \
55 #define CHECK_PARAMETER(x) \
56 CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER)
57 #define CHECK_PARAMETER1(x) \
58 CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER_1)
59 #define CHECK_PARAMETER2(x) \
60 CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER_2)
61 #define CHECK_PARAMETER3(x) \
62 CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER_3)
63 #define CHECK_PARAMETER4(x) \
64 CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER_4)
65 #define CHECK_ALLOCATION(x) \
66 CHECK_PARAMETER_WITH_STATUS(x, STATUS_NO_MEMORY)
69 // SAC Channel Event Macros
71 #define ChannelInitializeEvent(Channel, Attributes, x) \
73 PVOID Object, WaitObject; \
76 if (!VerifyEventWaitable(Attributes->x, &Object, &WaitObject)) \
80 Channel->x = Attributes->x; \
81 Channel->x##ObjectBody = Object; \
82 Channel->x##WaitObjectBody = WaitObject; \
85 #define ChannelUninitializeEvent(Channel, x, f) \
87 ASSERT(ChannelGetFlags(Channel) & (f)); \
88 ASSERT(Channel->x##ObjectBody); \
89 ASSERT(Channel->x##WaitObjectBody); \
90 if (Channel->x##ObjectBody) \
92 ObDereferenceObject(Channel->x##ObjectBody); \
93 Channel->Flags &= ~(f); \
95 Channel->x##ObjectBody = NULL; \
96 Channel->x##WaitObjectBody = NULL; \
99 #define ChannelSetEvent(Channel, x) \
101 ASSERT(Channel->x); \
102 ASSERT(Channel->x##ObjectBody); \
103 ASSERT(Channel->x##WaitObjectBody); \
104 if (Channel->x##WaitObjectBody) \
106 KeSetEvent(Channel->x##WaitObjectBody, EVENT_INCREMENT, FALSE); \
107 Status = STATUS_SUCCESS; \
111 Status = STATUS_UNSUCCESSFUL; \
114 #define ChannelClearEvent(Channel, x) \
116 ASSERT(Channel->x); \
117 ASSERT(Channel->x##ObjectBody); \
118 ASSERT(Channel->x##WaitObjectBody); \
119 if (Channel->x##WaitObjectBody) \
121 KeClearEvent(Channel->x##WaitObjectBody); \
122 Status = STATUS_SUCCESS; \
126 Status = STATUS_UNSUCCESSFUL; \
131 // SAC Pool Tags, taken from pooltag.txt:
133 // Rcp? - sacdrv.sys - SAC Driver (Headless)
134 // RcpA - sacdrv.sys - Internal memory mgr alloc block
135 // RcpI - sacdrv.sys - Internal memory mgr initial heap block
136 // RcpS - sacdrv.sys - Security related block
137 #define GENERIC_TAG '?pcR'
138 #define ALLOC_BLOCK_TAG 'ApcR'
139 #define INITIAL_BLOCK_TAG 'IpcR'
140 #define SECURITY_BLOCK_TAG 'SpcR'
141 #define FREE_POOL_TAG 'FpcR'
142 #define GLOBAL_BLOCK_TAG 'GpcR'
143 #define CHANNEL_BLOCK_TAG 'CpcR'
144 #define LOCAL_MEMORY_SIGNATURE 'SSEL'
145 #define GLOBAL_MEMORY_SIGNATURE 'DAEH'
150 #define SAC_MEMORY_LIST_SIZE (1 * 1024 * 1024) // 1MB
151 #define SAC_OBUFFER_SIZE (2 * 1024) // 2KB
152 #define SAC_CHANNEL_NAME_SIZE 64
153 #define SAC_CHANNEL_DESCRIPTION_SIZE 256
154 #define SAC_MAX_CHANNELS 10
155 #define SAC_SERIAL_PORT_BUFFER_SIZE 1024 // 1KB
156 #define SAC_MAX_MESSAGES 200
157 #define SAC_VTUTF8_COL_WIDTH 80
158 #define SAC_VTUTF8_COL_HEIGHT 25
159 #define SAC_VTUTF8_ROW_HEIGHT 24
160 #define MAX_UTF8_ENCODE_BLOCK_LENGTH (Utf8ConversionBufferSize / 3 - 1)
161 #define SAC_VTUTF8_OBUFFER_SIZE 0x2D00
162 #define SAC_VTUTF8_IBUFFER_SIZE 0x2000
163 #define SAC_RAW_OBUFFER_SIZE 0x2000
164 #define SAC_RAW_IBUFFER_SIZE 0x2000
169 #define SAC_CHANNEL_FLAG_INTERNAL 0x1
170 #define SAC_CHANNEL_FLAG_CLOSE_EVENT 0x2
171 #define SAC_CHANNEL_FLAG_HAS_NEW_DATA_EVENT 0x4
172 #define SAC_CHANNEL_FLAG_LOCK_EVENT 0x8
173 #define SAC_CHANNEL_FLAG_REDRAW_EVENT 0x10
174 #define SAC_CHANNEL_FLAG_APPLICATION 0x20
179 #define SAC_CELL_FLAG_BLINK 1
180 #define SAC_CELL_FLAG_BOLD 2
181 #define SAC_CELL_FLAG_INVERTED 4
184 // Forward definitions
189 // Structures used by the SAC Heap Allocator
191 typedef struct _SAC_MEMORY_ENTRY
196 } SAC_MEMORY_ENTRY
, *PSAC_MEMORY_ENTRY
;
197 typedef struct _SAC_MEMORY_LIST
200 PSAC_MEMORY_ENTRY LocalDescriptor
;
202 struct _SAC_MEMORY_LIST
* Next
;
203 } SAC_MEMORY_LIST
, *PSAC_MEMORY_LIST
;
205 typedef struct _SAC_MESSAGE_ENTRY
209 } SAC_MESSAGE_ENTRY
, *PSAC_MESSAGE_ENTRY
;
212 // These are the VT-100/220/ANSI Escape Codes supported by SAC as input
214 typedef enum _SAC_ANSI_COMMANDS
232 SacEraseStartOfScreen
,
234 SacSetCursorPosition
,
237 SacSetBackgroundColor
,
239 SacSetColorsAndAttributes
243 // These are the VT-100/220/ANSI Escape Codes send by SAC as output
245 typedef enum _SAC_ANSI_DISPATCH
248 SacAnsiClearEndOfScreen
,
249 SacAnsiClearEndOfLine
,
252 SacAnsiClearAttributes
,
253 SacAnsiSetInverseAttribute
,
254 SacAnsiClearInverseAttribute
,
255 SacAnsiSetBlinkAttribute
,
256 SacAnsiClearBlinkAttribute
,
257 SacAnsiSetBoldAttribute
,
258 SacAnsiClearBoldAttribute
262 // Commands that the consumer and producer share
264 typedef enum _SAC_POST_COMMANDS
273 // SAC supports 3 different channel output types
275 typedef enum _SAC_CHANNEL_TYPE
283 // A SAC channel can be active or inactive
285 typedef enum _SAC_CHANNEL_STATUS
289 } SAC_CHANNEL_STATUS
, *PSAC_CHANNEL_STATUS
;
292 // A SAC channel identifier
294 typedef struct _SAC_CHANNEL_ID
298 } SAC_CHANNEL_ID
, *PSAC_CHANNEL_ID
;
301 // Reference-counted SAC channel semaphore lock
303 typedef struct _SAC_CHANNEL_LOCK
307 } SAC_CHANNEL_LOCK
, *PSAC_CHANNEL_LOCK
;
310 // Structure of the cell-buffer when in VT-UTF8 Mode
312 typedef struct _SAC_CELL_DATA
318 } SAC_CELL_DATA
, *PSAC_CELL_DATA
;
319 C_ASSERT(sizeof(SAC_CELL_DATA
) == 6);
322 // Screen buffer when in VT-UTF8 Mode
324 typedef struct _SAC_VTUTF8_SCREEN
326 SAC_CELL_DATA Cell
[SAC_VTUTF8_ROW_HEIGHT
][SAC_VTUTF8_COL_WIDTH
];
327 } SAC_VTUTF8_SCREEN
, *PSAC_VTUTF8_SCREEN
;
330 // Small optimization to easily recognize the most common VT-100/ANSI codes
332 typedef struct _SAC_STATIC_ESCAPE_STRING
337 } SAC_STATIC_ESCAPE_STRING
, *PSAC_STATIC_ESCAPE_STRING
;
344 (NTAPI
*PSAC_CHANNEL_CREATE
)(
345 IN
struct _SAC_CHANNEL
* Channel
350 (NTAPI
*PSAC_CHANNEL_DESTROY
)(
351 IN
struct _SAC_CHANNEL
* Channel
356 (NTAPI
*PSAC_CHANNEL_OREAD
)(
357 IN
struct _SAC_CHANNEL
* Channel
,
365 (NTAPI
*PSAC_CHANNEL_OECHO
)(
366 IN
struct _SAC_CHANNEL
* Channel
,
373 (NTAPI
*PSAC_CHANNEL_OFLUSH
)(
374 IN
struct _SAC_CHANNEL
* Channel
379 (NTAPI
*PSAC_CHANNEL_OWRITE
)(
380 IN
struct _SAC_CHANNEL
* Channel
,
387 (NTAPI
*PSAC_CHANNEL_IREAD
)(
388 IN
struct _SAC_CHANNEL
* Channel
,
391 IN PULONG ReturnBufferSize
396 (NTAPI
*PSAC_CHANNEL_IBUFFER_FULL
)(
397 IN
struct _SAC_CHANNEL
* Channel
,
398 OUT PBOOLEAN BufferStatus
403 (NTAPI
*PSAC_CHANNEL_IBUFFER_LENGTH
)(
404 IN
struct _SAC_CHANNEL
* Channel
409 (NTAPI
*PSAC_CHANNEL_IREAD_LAST
)(
410 IN
struct _SAC_CHANNEL
* Channel
415 (NTAPI
*PSAC_CHANNEL_IWRITE
)(
416 IN
struct _SAC_CHANNEL
* Channel
,
422 // A channel and its attributes
424 typedef struct _SAC_CHANNEL
427 SAC_CHANNEL_ID ChannelId
;
429 PVOID CloseEventObjectBody
;
430 PKEVENT CloseEventWaitObjectBody
;
431 HANDLE HasNewDataEvent
;
432 PVOID HasNewDataEventObjectBody
;
433 PKEVENT HasNewDataEventWaitObjectBody
;
435 PVOID LockEventObjectBody
;
436 PKEVENT LockEventWaitObjectBody
;
438 PVOID RedrawEventObjectBody
;
439 PKEVENT RedrawEventWaitObjectBody
;
440 PFILE_OBJECT FileObject
;
441 SAC_CHANNEL_TYPE ChannelType
;
442 SAC_CHANNEL_STATUS ChannelStatus
;
443 WCHAR NameBuffer
[SAC_CHANNEL_NAME_SIZE
+ 1];
444 WCHAR DescriptionBuffer
[SAC_CHANNEL_DESCRIPTION_SIZE
+ 1];
446 GUID ApplicationType
;
450 LONG ChannelHasNewIBufferData
;
458 ULONG OBufferFirstGoodIndex
;
459 LONG ChannelHasNewOBufferData
;
460 PSAC_CHANNEL_CREATE ChannelCreate
;
461 PSAC_CHANNEL_DESTROY ChannelDestroy
;
462 PSAC_CHANNEL_OFLUSH ChannelOutputFlush
;
463 PSAC_CHANNEL_OECHO ChannelOutputEcho
;
464 PSAC_CHANNEL_OWRITE ChannelOutputWrite
;
465 PSAC_CHANNEL_OREAD ChannelOutputRead
;
466 PSAC_CHANNEL_IWRITE ChannelInputWrite
;
467 PSAC_CHANNEL_IREAD ChannelInputRead
;
468 PSAC_CHANNEL_IREAD_LAST ChannelInputReadLast
;
469 PSAC_CHANNEL_IBUFFER_FULL ChannelInputBufferIsFull
;
470 PSAC_CHANNEL_IBUFFER_LENGTH ChannelInputBufferLength
;
471 SAC_CHANNEL_LOCK ChannelAttributeLock
;
472 SAC_CHANNEL_LOCK ChannelOBufferLock
;
473 SAC_CHANNEL_LOCK ChannelIBufferLock
;
474 } SAC_CHANNEL
, *PSAC_CHANNEL
;
476 typedef struct _SAC_CHANNEL_ATTRIBUTES
478 SAC_CHANNEL_TYPE ChannelType
;
479 WCHAR NameBuffer
[SAC_CHANNEL_NAME_SIZE
+ 1];
480 WCHAR DescriptionBuffer
[SAC_CHANNEL_DESCRIPTION_SIZE
+ 1];
483 HANDLE HasNewDataEvent
;
487 } SAC_CHANNEL_ATTRIBUTES
, *PSAC_CHANNEL_ATTRIBUTES
;
490 // Cached Machine Information
492 typedef struct _SAC_MACHINE_INFO
496 PWCHAR ProcessorArchitecture
;
501 } SAC_MACHINE_INFO
, *PSAC_MACHINE_INFO
;
504 // The device extension for the SAC
506 typedef struct _SAC_DEVICE_EXTENSION
508 PDEVICE_OBJECT DeviceObject
;
511 BOOLEAN PriorityFail
;
512 BOOLEAN RundownInProgress
;
513 KPRIORITY PriorityBoost
;
518 HANDLE WorkerThreadHandle
;
519 KEVENT WorkerThreadEvent
;
523 } SAC_DEVICE_EXTENSION
, *PSAC_DEVICE_EXTENSION
;
531 IN PDEVICE_OBJECT DeviceObject
,
537 DispatchDeviceControl(
538 IN PDEVICE_OBJECT DeviceObject
,
544 DispatchShutdownControl(
545 IN PDEVICE_OBJECT DeviceObject
,
552 IN PDRIVER_OBJECT DriverObject
556 // Initialization and shutdown routines
567 IN PDEVICE_OBJECT DeviceObject
572 InitializeDeviceData(
573 IN PDEVICE_OBJECT DeviceObject
578 InitializeGlobalData(
579 IN PUNICODE_STRING RegistryPath
,
580 IN PDRIVER_OBJECT DriverObject
585 InitializeMemoryManagement(
591 FreeMemoryManagement(
597 InitializeCmdEventInfo(
603 InitializeMachineInformation(
609 PreloadGlobalMessageTable(
615 TearDownGlobalMessageTable(
621 GetCommandConsoleLaunchingPermission(
622 OUT PBOOLEAN Permission
627 ImposeSacCmdServiceStartTypePolicy(
633 RegisterBlueScreenMachineInformation(
639 FreeMachineInformation(
644 // DPC, Timer, Thread Callbacks
650 IN PVOID DeferredContext
,
651 IN PVOID SystemArgument1
,
652 IN PVOID SystemArgument2
656 // Custom SAC Heap Allocator Routines
674 // Connection Manager Routines
684 ConMgrWorkerProcessEvents(
685 IN PSAC_DEVICE_EXTENSION DeviceExtension
696 ConMgrSimpleEventMessage(
697 IN ULONG MessageIndex
,
704 IN ULONG MessageIndex
716 IN PSAC_CHANNEL Channel
,
718 IN ULONG BufferLength
724 IN PSAC_CHANNEL Channel
729 ConMgrIsWriteEnabled(
730 IN PSAC_CHANNEL Channel
737 IN PSAC_CHANNEL Channel
,
742 // Channel Manager Routines
758 ChanMgrCreateChannel(
759 OUT PSAC_CHANNEL
*Channel
,
760 IN PSAC_CHANNEL_ATTRIBUTES Attributes
766 IN SAC_CHANNEL_ID ChannelId
,
767 OUT PSAC_CHANNEL
* TargetChannel
772 ChanMgrReleaseChannel(
773 IN PSAC_CHANNEL Channel
778 ChanMgrGetNextActiveChannel(
779 IN PSAC_CHANNEL CurrentChannel
,
780 IN PULONG TargetIndex
,
781 OUT PSAC_CHANNEL
*TargetChannel
787 IN PSAC_CHANNEL Channel
796 IN PSAC_CHANNEL Channel
802 IN PSAC_CHANNEL Channel
,
803 IN PSAC_CHANNEL_ID ChannelId
809 IN PSAC_CHANNEL Channel
,
817 IN PSAC_CHANNEL Channel
822 ChannelSetRedrawEvent(
823 IN PSAC_CHANNEL Channel
828 ChannelClearRedrawEvent(
829 IN PSAC_CHANNEL Channel
834 ChannelHasRedrawEvent(
835 IN PSAC_CHANNEL Channel
,
842 IN PSAC_CHANNEL Channel
848 IN PSAC_CHANNEL Channel
,
855 IN PSAC_CHANNEL Channel
,
856 IN PSAC_CHANNEL_ID ChannelId
862 IN PSAC_CHANNEL Channel
,
863 IN PSAC_CHANNEL_ATTRIBUTES Attributes
,
864 IN SAC_CHANNEL_ID ChannelId
870 IN PSAC_CHANNEL Channel
876 IN PSAC_CHANNEL Channel
,
884 IN PSAC_CHANNEL Channel
889 ChannelIBufferLength(
890 IN PSAC_CHANNEL Channel
896 IN PSAC_CHANNEL Channel
,
899 IN OUT PULONG ResultBufferSize
908 IN PSAC_CHANNEL Channel
914 IN PSAC_CHANNEL Channel
920 IN PSAC_CHANNEL Channel
,
929 IN PSAC_CHANNEL Channel
,
937 IN PSAC_CHANNEL Channel
943 IN PSAC_CHANNEL Channel
,
951 IN PSAC_CHANNEL Channel
,
954 IN PULONG ReturnBufferSize
959 RawChannelIBufferIsFull(
960 IN PSAC_CHANNEL Channel
,
961 OUT PBOOLEAN BufferStatus
966 RawChannelIBufferLength(
967 IN PSAC_CHANNEL Channel
973 IN PSAC_CHANNEL Channel
979 IN PSAC_CHANNEL Channel
,
985 // VT-UTF8 Channel Table
990 IN PSAC_CHANNEL Channel
995 VTUTF8ChannelDestroy(
996 IN PSAC_CHANNEL Channel
1002 IN PSAC_CHANNEL Channel
,
1004 IN ULONG BufferSize
,
1005 OUT PULONG ByteCount
1011 IN PSAC_CHANNEL Channel
,
1018 VTUTF8ChannelOFlush(
1019 IN PSAC_CHANNEL Channel
1024 VTUTF8ChannelOWrite(
1025 IN PSAC_CHANNEL Channel
,
1033 IN PSAC_CHANNEL Channel
,
1035 IN ULONG BufferSize
,
1036 IN PULONG ReturnBufferSize
1041 VTUTF8ChannelIBufferIsFull(
1042 IN PSAC_CHANNEL Channel
,
1043 OUT PBOOLEAN BufferStatus
1048 VTUTF8ChannelIBufferLength(
1049 IN PSAC_CHANNEL Channel
1054 VTUTF8ChannelIReadLast(
1055 IN PSAC_CHANNEL Channel
1060 VTUTF8ChannelIWrite(
1061 IN PSAC_CHANNEL Channel
,
1072 SacTranslateUtf8ToUnicode(
1074 IN PCHAR Utf8Buffer
,
1075 OUT PWCHAR Utf8Value
1080 GetMessageLineCount(
1081 IN ULONG MessageIndex
1086 SerialBufferGetChar(
1098 TranslateMachineInformationXML(
1106 IN ULONG MessageIndex
1111 VerifyEventWaitable(
1113 OUT PVOID
*WaitObject
,
1114 OUT PVOID
*ActualWaitObject
1119 SacTranslateUnicodeToUtf8(
1120 IN PWCHAR SourceBuffer
,
1121 IN ULONG SourceBufferLength
,
1122 OUT PCHAR DestinationBuffer
,
1123 IN ULONG DestinationBufferSize
,
1124 OUT PULONG UTF8Count
,
1125 OUT PULONG ProcessedCount
1129 // SAC Command Functions
1163 DoLowerPriorityCommand(
1169 DoRaisePriorityCommand(
1175 DoLimitMemoryCommand(
1176 IN PCHAR LimitString
1187 DoMachineInformationCommand(
1194 IN PCHAR ChannelString
1200 IN PCHAR InputString
1223 DoSetIpAddressCommand(
1236 extern ULONG SACDebug
;
1237 extern PSAC_MESSAGE_ENTRY GlobalMessageTable
;
1238 extern KMUTEX CurrentChannelLock
;
1239 extern LONG CurrentChannelRefCount
;
1240 extern PCHAR SerialPortBuffer
;
1241 extern LONG SerialPortConsumerIndex
, SerialPortProducerIndex
;
1242 extern PCHAR Utf8ConversionBuffer
;
1243 extern BOOLEAN GlobalPagingNeeded
, GlobalDoThreads
;
1244 extern ULONG Utf8ConversionBufferSize
;
1245 extern BOOLEAN CommandConsoleLaunchingEnabled
;
1248 // Function to initailize a SAC Semaphore Lock
1252 SacInitializeLock(IN PSAC_CHANNEL_LOCK Lock
)
1254 KeInitializeSemaphore(&Lock
->Lock
, 1, 1);
1258 // Function to acquire a SAC Semaphore Lock
1262 SacAcquireLock(IN PSAC_CHANNEL_LOCK Lock
)
1264 KeWaitForSingleObject(&Lock
->Lock
, Executive
, KernelMode
, FALSE
, NULL
);
1265 ASSERT(Lock
->RefCount
== 0);
1266 _InterlockedIncrement(&Lock
->RefCount
);
1270 // Function to release a SAC Semaphore Lock
1274 SacReleaseLock(IN PSAC_CHANNEL_LOCK Lock
)
1276 ASSERT(Lock
->RefCount
== 1);
1277 _InterlockedDecrement(&Lock
->RefCount
);
1278 KeReleaseSemaphore(&Lock
->Lock
, SEMAPHORE_INCREMENT
, 1, FALSE
);
1282 // Function to check if the SAC Mutex Lock is held
1286 SacAssertMutexLockHeld(VOID
)
1288 ASSERT(CurrentChannelRefCount
== 1);
1289 ASSERT(KeReadStateMutex(&CurrentChannelLock
) == 0);
1293 // Function to check if the SAC Mutex Lock is held
1297 SacInitializeMutexLock(VOID
)
1299 KeInitializeMutex(&CurrentChannelLock
, 0);
1300 CurrentChannelRefCount
= 0;
1304 // Function to acquire the SAC Mutex Lock
1308 SacAcquireMutexLock(VOID
)
1310 KeWaitForSingleObject(&CurrentChannelLock
, Executive
, KernelMode
, FALSE
, NULL
);
1311 ASSERT(CurrentChannelRefCount
== 0);
1312 _InterlockedIncrement(&CurrentChannelRefCount
);
1316 // Function to release the SAC Mutex Lock
1320 SacReleaseMutexLock(VOID
)
1322 ASSERT(CurrentChannelRefCount
== 1);
1323 _InterlockedDecrement(&CurrentChannelRefCount
);
1324 KeReleaseMutex(&CurrentChannelLock
, FALSE
);
1330 #define ChannelLockCreates() SacAcquireLock(&ChannelCreateLock);
1331 #define ChannelUnlockCreates() SacReleaseLock(&ChannelCreateLock);
1332 #define ChannelLockOBuffer(x) SacAcquireLock(&x->ChannelOBufferLock);
1333 #define ChannelUnlockOBuffer(x) SacReleaseLock(&x->ChannelOBufferLock);
1334 #define ChannelLockIBuffer(x) SacAcquireLock(&x->ChannelIBufferLock);
1335 #define ChannelUnlockIBuffer(x) SacReleaseLock(&x->ChannelIBufferLock);
1336 #define ChannelLockAttributes(x) SacAcquireLock(&x->ChannelAttributeLock);
1337 #define ChannelUnlockAttributes(x) SacReleaseLock(&x->ChannelAttributeLock);
1338 #define ChannelSlotLock(x) SacAcquireLock(&ChannelSlotLock[x]);
1339 #define ChannelSlotUnlock(x) SacReleaseLock(&ChannelSlotLock[x]);
1342 // Channel Accessors
1346 ChannelGetFlags(IN PSAC_CHANNEL Channel
)
1348 return Channel
->Flags
;
1353 ChannelGetIndex(IN PSAC_CHANNEL Channel
)
1355 /* Return the index of the channel */
1356 return Channel
->Index
;
1361 ChannelHasNewIBufferData(IN PSAC_CHANNEL Channel
)
1363 /* Return if there's any new data in the input buffer */
1364 return Channel
->ChannelHasNewIBufferData
;
1371 // Source: http://en.wikipedia.org/wiki/ANSI_escape_code
1373 typedef enum _VT_ANSI_ATTRIBUTES
1376 // Attribute modifiers (mostly supported)
1390 // Font selectors (not supported)
1404 // Additional attributes (not supported)
1410 // Attribute Un-modifiers (mostly supported)
1422 // Standard Text Color
1425 SetColorBlack
= SetColorStart
,
1433 SetColorMax
= SetColorWhite
,
1436 // Extended Text Color (not supported)
1442 // Standard Background Color
1445 SetBackColorBlack
= SetBackColorStart
,
1453 SetBackColorMax
= SetBackColorWhite
,
1456 // Extended Background Color (not supported)
1459 SetBackColorDefault
,
1462 // Extra Attributes (not supported)
1476 // Ideograms (not supported)
1478 } VT_ANSI_ATTRIBUTES
;
1481 // The following site is a good reference on VT100/ANSI escape codes
1482 // http://www.termsys.demon.co.uk/vtansi.htm
1484 #define VT_ANSI_ESCAPE L'\x1B'
1485 #define VT_ANSI_COMMAND L'['
1487 #define VT_ANSI_CURSOR_UP_CHAR L'A'
1488 #define VT_ANSI_CURSOR_UP L"[A"
1490 #define VT_ANSI_CURSOR_DOWN_CHAR L'B'
1491 #define VT_ANSI_CURSOR_DOWN L"[B"
1493 #define VT_ANSI_CURSOR_RIGHT_CHAR L'C'
1494 #define VT_ANSI_CURSOR_RIGHT L"[C"
1496 #define VT_ANSI_CURSOR_LEFT_CHAR L'D'
1497 #define VT_ANSI_CURSOR_LEFT L"[D"
1499 #define VT_ANSI_ERASE_LINE_CHAR L'K'
1500 #define VT_ANSI_ERASE_END_LINE L"[K"
1501 #define VT_ANSI_ERASE_START_LINE L"[1K"
1502 #define VT_ANSI_ERASE_ENTIRE_LINE L"[2K"
1504 #define VT_ANSI_ERASE_SCREEN_CHAR L'J'
1505 #define VT_ANSI_ERASE_DOWN_SCREEN L"[J"
1506 #define VT_ANSI_ERASE_UP_SCREEN L"[1J"
1507 #define VT_ANSI_ERASE_ENTIRE_SCREEN L"[2J"
1509 #define VT_ANSI_BACKTAB_CHAR L'Z'
1510 #define VT_220_BACKTAB L"[0Z"
1512 #define VT_ANSI_SET_ATTRIBUTE_CHAR L'm'
1513 #define VT_ANSI_SEPARATOR_CHAR L';'
1514 #define VT_ANSI_HVP_CURSOR_CHAR L'f'
1515 #define VT_ANSI_CUP_CURSOR_CHAR L'H'
1516 #define VT_ANSI_SCROLL_CHAR L'r'
1518 #endif /* _SACDRV_H_ */