ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

sacdrv.h
Go to the documentation of this file.
00001 /*
00002  * PROJECT:      ReactOS Boot Loader
00003  * LICENSE:      BSD - See COPYING.ARM in the top level directory
00004  * FILE:         drivers/sac/driver/sacdrv.h
00005  * PURPOSE:      Header for the Server Administration Console (SAC) for EMS
00006  * PROGRAMMERS:  ReactOS Portable Systems Group
00007  */
00008 
00009 /* INCLUDES *******************************************************************/
00010 #include <ntifs.h>
00011 #include <ntoskrnl/include/internal/hdl.h>
00012 
00013 #define SAC_DBG_ENTRY_EXIT      0x01
00014 #define SAC_DBG_INIT            0x04
00015 #define SAC_DBG_MM              0x1000
00016 
00017 #define SAC_DBG(x, ...)                     \
00018     if (SACDebug & x)                       \
00019     {                                       \
00020         DbgPrint("SAC %s: ", __FUNCTION__); \
00021         DbgPrint(__VA_ARGS__);              \
00022     }
00023 
00024 #define CHECK_PARAMETER_WITH_STATUS(Parameter, Status)  \
00025 {   \
00026     ASSERT((Parameter)); \
00027     if (!Parameter) \
00028     {   \
00029         return Status; \
00030     }   \
00031 }
00032 #define CHECK_PARAMETER(x)      \
00033     CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER)
00034 #define CHECK_PARAMETER1(x)     \
00035     CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER_1)
00036 #define CHECK_PARAMETER2(x)     \
00037     CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER_2)
00038 #define CHECK_PARAMETER3(x)     \
00039     CHECK_PARAMETER_WITH_STATUS(x, STATUS_INVALID_PARAMETER_3)
00040 #define CHECK_ALLOCATION(x)     \
00041     CHECK_PARAMETER_WITH_STATUS(x, STATUS_OUT_OF_MEMORY)
00042     
00043 #define SacAllocatePool(Length, Tag)    \
00044     MyAllocatePool(Length, Tag, __FILE__, __LINE__)
00045 
00046 #define ChannelLock(Channel, x) \
00047 {   \
00048     KeWaitForSingleObject(  \
00049         &(Channel)->x.Lock, \
00050         Executive,  \
00051         KernelMode, \
00052         FALSE,  \
00053         NULL);  \
00054     ASSERT((Channel)->x.RefCount == 0); \
00055     InterlockedIncrement(&(Channel)->x.RefCount);   \
00056 }
00057 
00058 #define ChannelUnlock(Channel, x)   \
00059 {   \
00060     ASSERT((Channel)->x.RefCount == 1); \
00061     InterlockedDecrement(&(Channel)->x.RefCount);   \
00062     KeReleaseSemaphore( \
00063         &(Channel)->x.Lock, \
00064         SEMAPHORE_INCREMENT,    \
00065         1,  \
00066         FALSE); \
00067 }
00068 
00069 #define ChannelLockOBuffer(Channel)         ChannelLock(Channel, ChannelOBufferLock);
00070 #define ChannelUnlockOBuffer(Channel)       ChannelUnlock(Channel, ChannelOBufferLock);
00071 #define ChannelLockIBuffer(Channel)         ChannelLock(Channel, ChannelIBufferLock);
00072 #define ChannelUnlockIBuffer(Channel)       ChannelUnlock(Channel, ChannelIBufferLock);
00073 #define ChannelLockAttributes(Channel)      ChannelLock(Channel, ChannelAttributesLock);
00074 #define ChannelUnlockAttributes(Channel)    ChannelUnlock(Channel, ChannelAttributesLock);
00075 
00076 #define ChannelInitializeEvent(Channel, Attributes, x)  \
00077 {   \
00078     PVOID Object, WaitObject;   \
00079     if (Attributes->x)  \
00080     {   \
00081         if (!VerifyEventWaitable(Attributes->x, &Object, &WaitObject))  \
00082         {   \
00083             goto FailChannel;   \
00084         } \
00085         Channel->x = Attributes->x; \
00086         Channel->x##ObjectBody = Object;    \
00087         Channel->x##WaitObjectBody = WaitObject;    \
00088     }   \
00089 }
00090 
00091 #define ChannelSetEvent(Channel, x) \
00092 {   \
00093     ASSERT(Channel->x); \
00094     ASSERT(Channel->x##ObjectBody); \
00095     ASSERT(Channel->x##WaitObjectBody); \
00096     if (Channel->x) \
00097     {   \
00098         KeSetEvent(Channel->x, EVENT_INCREMENT, FALSE); \
00099         Status = STATUS_SUCCESS;    \
00100     }   \
00101     else    \
00102     {   \
00103         Status = STATUS_UNSUCCESSFUL;   \
00104     }   \
00105 }
00106 
00107 #define ChannelClearEvent(Channel, x)   \
00108 {   \
00109     ASSERT(Channel->x); \
00110     ASSERT(Channel->x##ObjectBody); \
00111     ASSERT(Channel->x##WaitObjectBody); \
00112     if (Channel->x) \
00113     {   \
00114         KeClearEvent(Channel->x);   \
00115         Status = STATUS_SUCCESS;    \
00116     }   \
00117     else    \
00118     {   \
00119         Status = STATUS_UNSUCCESSFUL;   \
00120     }   \
00121 }
00122 
00123 //Rcp? - sacdrv.sys - SAC Driver (Headless)
00124 //RcpA - sacdrv.sys -     Internal memory mgr alloc block
00125 //RcpI - sacdrv.sys -     Internal memory mgr initial heap block
00126 //RcpS - sacdrv.sys -     Security related block
00127 #define GENERIC_TAG             '?pcR'
00128 #define ALLOC_BLOCK_TAG         'ApcR'
00129 #define INITIAL_BLOCK_TAG       'IpcR'
00130 #define SECURITY_BLOCK_TAG      'SpcR'
00131 #define FREE_POOL_TAG           'FpcR'
00132 
00133 #define LOCAL_MEMORY_SIGNATURE  'SSEL'
00134 #define GLOBAL_MEMORY_SIGNATURE 'DAEH'
00135 
00136 #define SAC_MEMORY_LIST_SIZE    (1 * 1024 * 1024)
00137 
00138 #define SAC_OBUFFER_SIZE        (2 * 1024)
00139 
00140 #define SAC_CHANNEL_FLAG_CLOSE_EVENT        0x2
00141 #define SAC_CHANNEL_FLAG_HAS_NEW_DATA_EVENT 0x4
00142 #define SAC_CHANNEL_FLAG_LOCK_EVENT         0x8
00143 #define SAC_CHANNEL_FLAG_REDRAW_EVENT       0x10
00144 
00145 typedef struct _SAC_MEMORY_ENTRY
00146 {
00147     ULONG Signature;
00148     ULONG Tag;
00149     ULONG Size;
00150 } SAC_MEMORY_ENTRY, *PSAC_MEMORY_ENTRY;
00151 
00152 typedef struct _SAC_MEMORY_LIST
00153 {
00154     ULONG Signature;
00155     PSAC_MEMORY_ENTRY LocalDescriptor;
00156     ULONG Size;
00157     struct _SAC_MEMORY_LIST* Next;
00158 } SAC_MEMORY_LIST, *PSAC_MEMORY_LIST;
00159 
00160 typedef enum _SAC_CHANNEL_TYPE
00161 {
00162     VtUtf8,
00163     Cmd,
00164     Raw
00165 } SAC_CHANNEL_TYPE;
00166 
00167 typedef enum _SAC_CHANNEL_STATUS
00168 {
00169     Inactive,
00170     Active
00171 } SAC_CHANNEL_STATUS, *PSAC_CHANNEL_STATUS;
00172 
00173 typedef struct _SAC_CHANNEL_ID
00174 {
00175     GUID ChannelGuid;
00176     ULONG ChannelId;
00177 } SAC_CHANNEL_ID, *PSAC_CHANNEL_ID;
00178 
00179 typedef struct _SAC_CHANNEL_LOCK
00180 {
00181     LONG RefCount;
00182     KSEMAPHORE Lock;
00183 } SAC_CHANNEL_LOCK, *PSAC_CHANNEL_LOCK;
00184 
00185 struct _SAC_CHANNEL;
00186 
00187 typedef
00188 NTSTATUS
00189 (*PSAC_CHANNEL_CREATE)(
00190     IN struct _SAC_CHANNEL* Channel
00191     );
00192 
00193 typedef
00194 NTSTATUS
00195 (*PSAC_CHANNEL_DESTROY)(
00196     IN struct _SAC_CHANNEL* Channel
00197     );
00198 
00199 typedef
00200 NTSTATUS
00201 (*PSAC_CHANNEL_OREAD)(
00202     IN struct _SAC_CHANNEL* Channel,
00203     IN PCHAR Buffer,
00204     IN ULONG BufferSize,
00205     OUT PULONG ByteCount
00206     );
00207 
00208 typedef
00209 NTSTATUS
00210 (*PSAC_CHANNEL_OECHO)(
00211     IN struct _SAC_CHANNEL* Channel,
00212     IN PWCHAR String,
00213     IN ULONG Length
00214     );
00215 
00216 typedef
00217 NTSTATUS
00218 (*PSAC_CHANNEL_OFLUSH)(
00219     IN struct _SAC_CHANNEL* Channel
00220     );
00221 
00222 typedef
00223 NTSTATUS
00224 (*PSAC_CHANNEL_OWRITE)(
00225     IN struct _SAC_CHANNEL* Channel,
00226     IN PWCHAR String,
00227     IN ULONG Length
00228     );
00229 
00230 typedef
00231 NTSTATUS
00232 (*PSAC_CHANNEL_IREAD)(
00233     IN struct _SAC_CHANNEL* Channel,
00234     IN PWCHAR Buffer,
00235     IN ULONG BufferSize,
00236     IN PULONG ReturnBufferSize
00237     );
00238 
00239 typedef
00240 NTSTATUS
00241 (*PSAC_CHANNEL_IBUFFER_FULL)(
00242     IN struct _SAC_CHANNEL* Channel,
00243     OUT PBOOLEAN BufferStatus
00244     );
00245 
00246 typedef
00247 NTSTATUS
00248 (*PSAC_CHANNEL_IBUFFER_LENGTH)(
00249     IN struct _SAC_CHANNEL* Channel
00250     );
00251 
00252 typedef
00253 CHAR
00254 (*PSAC_CHANNEL_IREAD_LAST)(
00255     IN struct _SAC_CHANNEL* Channel
00256     );
00257 
00258 typedef
00259 NTSTATUS
00260 (*PSAC_CHANNEL_IWRITE)(
00261     IN struct _SAC_CHANNEL* Channel,
00262     IN PCHAR Buffer,
00263     IN ULONG BufferSize
00264     );
00265 
00266 typedef struct _SAC_CHANNEL
00267 {
00268     ULONG Index;
00269     SAC_CHANNEL_ID ChannelId;
00270     HANDLE CloseEvent;
00271     PVOID CloseEventObjectBody;
00272     PKEVENT CloseEventWaitObjectBody;
00273     HANDLE HasNewDataEvent;
00274     PVOID HasNewDataEventObjectBody;
00275     PKEVENT HasNewDataEventWaitObjectBody;
00276     HANDLE LockEvent;
00277     PVOID LockEventObjectBody;
00278     PKEVENT LockEventWaitObjectBody;
00279     HANDLE RedrawEvent;
00280     PVOID RedrawEventObjectBody;
00281     PKEVENT RedrawEventWaitObjectBody;
00282     PFILE_OBJECT FileObject;
00283     SAC_CHANNEL_TYPE ChannelType;
00284     SAC_CHANNEL_STATUS ChannelStatus;
00285     WCHAR NameBuffer[64 + 1];
00286     WCHAR DescriptionBuffer[256 + 1];
00287     ULONG Flags;
00288     GUID ApplicationType;
00289     BOOLEAN WriteEnabled;
00290     ULONG IBufferIndex;
00291     PVOID IBuffer;
00292     BOOLEAN ChannelHasNewIBufferData;
00293     UCHAR CursorRow;
00294     UCHAR CursorCol;
00295     UCHAR CursorY;
00296     UCHAR CursorX;
00297     UCHAR CursorVisible;
00298     PVOID OBuffer;
00299     ULONG OBufferIndex;
00300     ULONG OBufferFirstGoodIndex;
00301     BOOLEAN ChannelHasNewOBufferData;
00302     PSAC_CHANNEL_CREATE ChannelCreate;
00303     PSAC_CHANNEL_DESTROY ChannelDestroy;
00304     PSAC_CHANNEL_OFLUSH OBufferFlush;
00305     PSAC_CHANNEL_OECHO OBufferEcho;
00306     PSAC_CHANNEL_OWRITE OBufferWrite;
00307     PSAC_CHANNEL_OREAD OBufferRead;
00308     PSAC_CHANNEL_OWRITE IBufferWrite;
00309     PSAC_CHANNEL_IREAD IBufferRead;
00310     PSAC_CHANNEL_IREAD_LAST IBufferReadLast;
00311     PSAC_CHANNEL_IBUFFER_FULL IBufferIsFull;
00312     PSAC_CHANNEL_IBUFFER_LENGTH IBufferLength;
00313     SAC_CHANNEL_LOCK ChannelAttributeLock;
00314     SAC_CHANNEL_LOCK ChannelOBufferLock;
00315     SAC_CHANNEL_LOCK ChannelIBufferLock;
00316 } SAC_CHANNEL, *PSAC_CHANNEL;
00317 
00318 typedef struct _SAC_DEVICE_EXTENSION
00319 {
00320     PDEVICE_OBJECT DeviceObject;
00321     BOOLEAN Initialized;
00322     BOOLEAN Rundown;
00323     BOOLEAN PriorityFail;
00324     KPRIORITY PriorityBoost;
00325     PEPROCESS Process;
00326     KSPIN_LOCK Lock;
00327     KEVENT RundownEvent;
00328     KEVENT Event;
00329     HANDLE WorkerThreadHandle;
00330     KEVENT WorkerThreadEvent;
00331     KTIMER Timer;
00332     KDPC Dpc;
00333     LIST_ENTRY List;
00334 } SAC_DEVICE_EXTENSION, *PSAC_DEVICE_EXTENSION;
00335 
00336 typedef struct _SAC_CHANNEL_ATTRIBUTES
00337 {
00338     SAC_CHANNEL_TYPE ChannelType;
00339     WCHAR NameBuffer[64 + 1];
00340     WCHAR DescriptionBuffer[256 + 1];
00341     ULONG Flag;
00342     PKEVENT CloseEvent;
00343     PKEVENT HasNewDataEvent;
00344     PKEVENT LockEvent;
00345     PKEVENT RedrawEvent;
00346     GUID ChannelId;
00347 } SAC_CHANNEL_ATTRIBUTES, *PSAC_CHANNEL_ATTRIBUTES;
00348 
00349 NTSTATUS
00350 Dispatch(
00351     IN PDEVICE_OBJECT DeviceObject,
00352     IN PIRP Irp
00353 );
00354 
00355 NTSTATUS
00356 NTAPI
00357 DispatchDeviceControl(
00358     IN PDEVICE_OBJECT DeviceObject,
00359     IN PIRP Irp
00360 );
00361 
00362 NTSTATUS
00363 DispatchShutdownControl(
00364     IN PDEVICE_OBJECT DeviceObject,
00365     IN PIRP Irp
00366 );
00367 
00368 VOID
00369 UnloadHandler(
00370     IN PDRIVER_OBJECT DriverObject
00371 );
00372 
00373 VOID
00374 FreeGlobalData(
00375     VOID
00376 );
00377 
00378 BOOLEAN
00379 InitializeDeviceData(
00380     IN PDEVICE_OBJECT DeviceObject
00381 );
00382 
00383 BOOLEAN
00384 InitializeGlobalData(
00385     IN PUNICODE_STRING RegistryPath,
00386     IN PDRIVER_OBJECT DriverObject
00387 );
00388 
00389 extern ULONG SACDebug;
00390 

Generated on Sun May 27 2012 04:28:11 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.