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.h?rev=52554&r1=52553&r2=52554&view=diff
==============================================================================
--- 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


Reply via email to