Author: sir_richard
Date: Thu Jul 7 12:02:32 2011
New Revision: 52554
URL:
http://svn.reactos.org/svn/reactos?rev=52554&view=rev
Log:
Patch by Anton Yarotsky:
[SACDRV]: Add type definitions for channel VTABLE.
[SACDRV]: Add channel event macros and flags.
[SACDRV]: Add channal lock macros.
[SACDRV]: Add macros for parameter validation.
[SACDRV]: Add macro for pool allocation.
[SACDRV]: Misc fixes.
Modified:
trunk/reactos/drivers/sac/driver/sacdrv.h
Modified: trunk/reactos/drivers/sac/driver/sacdrv.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/sac/driver/sacdrv.…
==============================================================================
--- trunk/reactos/drivers/sac/driver/sacdrv.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/sac/driver/sacdrv.h [iso-8859-1] Thu Jul 7 12:02:32 2011
@@ -20,6 +20,105 @@
DbgPrint("SAC %s: ", __FUNCTION__); \
DbgPrint(__VA_ARGS__); \
}
+
+#define CHECK_PARAMETER_WITH_STATUS(Parameter, Status) \
+{ \
+ ASSERT((Parameter)); \
+ if (!Parameter) \
+ { \
+ return Status; \
+ } \
+}
+#define CHECK_PARAMETER(x) \
+ CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER)
+#define CHECK_PARAMETER1(x) \
+ CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER_1)
+#define CHECK_PARAMETER2(x) \
+ CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER_2)
+#define CHECK_PARAMETER3(x) \
+ CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER_3)
+#define CHECK_ALLOCATION(x) \
+ CHECK_PARAMETER_WITH_STATUS(x, STATUS_OUT_OF_MEMORY)
+
+#define SacAllocatePool(Length, Tag) \
+ MyAllocatePool(Length, Tag, __FILE__, __LINE__)
+
+#define ChannelLock(Channel, x) \
+{ \
+ KeWaitForSingleObject( \
+ &(Channel)->x.Lock, \
+ Executive, \
+ KernelMode, \
+ FALSE, \
+ NULL); \
+ ASSERT((Channel)->x.RefCount == 0); \
+ InterlockedIncrement(&(Channel)->x.RefCount); \
+}
+
+#define ChannelUnlock(Channel, x) \
+{ \
+ ASSERT((Channel)->x.RefCount == 1); \
+ InterlockedDecrement(&(Channel)->x.RefCount); \
+ KeReleaseSemaphore( \
+ &(Channel)->x.Lock, \
+ SEMAPHORE_INCREMENT, \
+ 1, \
+ FALSE); \
+}
+
+#define ChannelLockOBuffer(Channel) ChannelLock(Channel, ChannelOBufferLock);
+#define ChannelUnlockOBuffer(Channel) ChannelUnlock(Channel, ChannelOBufferLock);
+#define ChannelLockIBuffer(Channel) ChannelLock(Channel, ChannelIBufferLock);
+#define ChannelUnlockIBuffer(Channel) ChannelUnlock(Channel, ChannelIBufferLock);
+#define ChannelLockAttributes(Channel) ChannelLock(Channel, ChannelAttributesLock);
+#define ChannelUnlockAttributes(Channel) ChannelUnlock(Channel, ChannelAttributesLock);
+
+#define ChannelInitializeEvent(Channel, Attributes, x) \
+{ \
+ PVOID Object, WaitObject; \
+ if (Attributes->x) \
+ { \
+ if (!VerifyEventWaitable(Attributes->x, &Object, &WaitObject)) \
+ { \
+ goto FailChannel; \
+ } \
+ Channel->x = Attributes->x; \
+ Channel->x##ObjectBody = Object; \
+ Channel->x##WaitObjectBody = WaitObject; \
+ } \
+}
+
+#define ChannelSetEvent(Channel, x) \
+{ \
+ ASSERT(Channel->x); \
+ ASSERT(Channel->x##ObjectBody); \
+ ASSERT(Channel->x##WaitObjectBody); \
+ if (Channel->x) \
+ { \
+ KeSetEvent(Channel->x, EVENT_INCREMENT, FALSE); \
+ Status = STATUS_SUCCESS; \
+ } \
+ else \
+ { \
+ Status = STATUS_UNSUCCESSFUL; \
+ } \
+}
+
+#define ChannelClearEvent(Channel, x) \
+{ \
+ ASSERT(Channel->x); \
+ ASSERT(Channel->x##ObjectBody); \
+ ASSERT(Channel->x##WaitObjectBody); \
+ if (Channel->x) \
+ { \
+ KeClearEvent(Channel->x); \
+ Status = STATUS_SUCCESS; \
+ } \
+ else \
+ { \
+ Status = STATUS_UNSUCCESSFUL; \
+ } \
+}
//Rcp? - sacdrv.sys - SAC Driver (Headless)
//RcpA - sacdrv.sys - Internal memory mgr alloc block
@@ -36,6 +135,13 @@
#define SAC_MEMORY_LIST_SIZE (1 * 1024 * 1024)
+#define SAC_OBUFFER_SIZE (2 * 1024)
+
+#define SAC_CHANNEL_FLAG_CLOSE_EVENT 0x2
+#define SAC_CHANNEL_FLAG_HAS_NEW_DATA_EVENT 0x4
+#define SAC_CHANNEL_FLAG_LOCK_EVENT 0x8
+#define SAC_CHANNEL_FLAG_REDRAW_EVENT 0x10
+
typedef struct _SAC_MEMORY_ENTRY
{
ULONG Signature;
@@ -73,8 +179,89 @@
typedef struct _SAC_CHANNEL_LOCK
{
LONG RefCount;
- KSEMAPHORE Semaphore;
+ KSEMAPHORE Lock;
} SAC_CHANNEL_LOCK, *PSAC_CHANNEL_LOCK;
+
+struct _SAC_CHANNEL;
+
+typedef
+NTSTATUS
+(*PSAC_CHANNEL_CREATE)(
+ IN struct _SAC_CHANNEL* Channel
+ );
+
+typedef
+NTSTATUS
+(*PSAC_CHANNEL_DESTROY)(
+ IN struct _SAC_CHANNEL* Channel
+ );
+
+typedef
+NTSTATUS
+(*PSAC_CHANNEL_OREAD)(
+ IN struct _SAC_CHANNEL* Channel,
+ IN PCHAR Buffer,
+ IN ULONG BufferSize,
+ OUT PULONG ByteCount
+ );
+
+typedef
+NTSTATUS
+(*PSAC_CHANNEL_OECHO)(
+ IN struct _SAC_CHANNEL* Channel,
+ IN PWCHAR String,
+ IN ULONG Length
+ );
+
+typedef
+NTSTATUS
+(*PSAC_CHANNEL_OFLUSH)(
+ IN struct _SAC_CHANNEL* Channel
+ );
+
+typedef
+NTSTATUS
+(*PSAC_CHANNEL_OWRITE)(
+ IN struct _SAC_CHANNEL* Channel,
+ IN PWCHAR String,
+ IN ULONG Length
+ );
+
+typedef
+NTSTATUS
+(*PSAC_CHANNEL_IREAD)(
+ IN struct _SAC_CHANNEL* Channel,
+ IN PWCHAR Buffer,
+ IN ULONG BufferSize,
+ IN PULONG ReturnBufferSize
+ );
+
+typedef
+NTSTATUS
+(*PSAC_CHANNEL_IBUFFER_FULL)(
+ IN struct _SAC_CHANNEL* Channel,
+ OUT PBOOLEAN BufferStatus
+ );
+
+typedef
+NTSTATUS
+(*PSAC_CHANNEL_IBUFFER_LENGTH)(
+ IN struct _SAC_CHANNEL* Channel
+ );
+
+typedef
+CHAR
+(*PSAC_CHANNEL_IREAD_LAST)(
+ IN struct _SAC_CHANNEL* Channel
+ );
+
+typedef
+NTSTATUS
+(*PSAC_CHANNEL_IWRITE)(
+ IN struct _SAC_CHANNEL* Channel,
+ IN PCHAR Buffer,
+ IN ULONG BufferSize
+ );
typedef struct _SAC_CHANNEL
{
@@ -112,20 +299,20 @@
ULONG OBufferIndex;
ULONG OBufferFirstGoodIndex;
BOOLEAN ChannelHasNewOBufferData;
- //PSAC_CHANNEL_CREATE ChannelCreate;
- //PSAC_CHANNEL_DESTROY ChannelDestroy;
- //PSAC_CHANNEL_OFLUSH ChannelOutputFlush;
- //PSAC_CHANNEL_OECHO ChannelOutputEcho;
- //PSAC_CHANNEL_OWRITE ChannelOutputWrite;
- //PSAC_CHANNEL_OREAD ChannelOutputRead;
- //PSAC_CHANNEL_OWRITE ChannelInputWrite;
- //PSAC_CHANNEL_IREAD ChannelInputRead;
- //PSAC_CHANNEL_IREAD_LAST ChannelInputReadLast;
- //PSAC_CHANNEL_IBUFFER_FULL ChannelInputBufferIsFull;
- //PSAC_CHANNEL_IBUFFER_LENGTH IBufferLength;
+ PSAC_CHANNEL_CREATE ChannelCreate;
+ PSAC_CHANNEL_DESTROY ChannelDestroy;
+ PSAC_CHANNEL_OFLUSH OBufferFlush;
+ PSAC_CHANNEL_OECHO OBufferEcho;
+ PSAC_CHANNEL_OWRITE OBufferWrite;
+ PSAC_CHANNEL_OREAD OBufferRead;
+ PSAC_CHANNEL_OWRITE IBufferWrite;
+ PSAC_CHANNEL_IREAD IBufferRead;
+ PSAC_CHANNEL_IREAD_LAST IBufferReadLast;
+ PSAC_CHANNEL_IBUFFER_FULL IBufferIsFull;
+ PSAC_CHANNEL_IBUFFER_LENGTH IBufferLength;
SAC_CHANNEL_LOCK ChannelAttributeLock;
SAC_CHANNEL_LOCK ChannelOBufferLock;
- SAC_CHANNEL_LOCK ChannelBufferLock;
+ SAC_CHANNEL_LOCK ChannelIBufferLock;
} SAC_CHANNEL, *PSAC_CHANNEL;
typedef struct _SAC_DEVICE_EXTENSION