Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygensacdrv.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
1.7.6.1
|