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

ntoskrnl.h
Go to the documentation of this file.
00001 #pragma once
00002 
00003 /*
00004  * Use these to place a function in a specific section of the executable
00005  */
00006 #define PLACE_IN_SECTION(s) __attribute__((section (s)))
00007 #ifdef __GNUC__
00008 #define INIT_FUNCTION
00009 #define PAGE_LOCKED_FUNCTION    PLACE_IN_SECTION("pagelk")
00010 #define PAGE_UNLOCKED_FUNCTION  PLACE_IN_SECTION("pagepo")
00011 #else
00012 #define INIT_FUNCTION
00013 #define PAGE_LOCKED_FUNCTION
00014 #define PAGE_UNLOCKED_FUNCTION
00015 #endif
00016 
00017 #ifdef _NTOSKRNL_
00018 
00019 #ifndef _ARM_
00020 #define KeGetCurrentThread  _KeGetCurrentThread
00021 #define KeGetPreviousMode   _KeGetPreviousMode
00022 #endif
00023 #undef  PsGetCurrentProcess
00024 #define PsGetCurrentProcess _PsGetCurrentProcess
00025 
00026 #define RVA(m, b) ((PVOID)((ULONG_PTR)(b) + (ULONG_PTR)(m)))
00027 
00028 //
00029 // We are very lazy on ARM -- we just import intrinsics
00030 // Question: Why wasn't this done for x86 too? (see fastintrlck.asm)
00031 //
00032 #define InterlockedDecrement         _InterlockedDecrement
00033 #define InterlockedDecrement16       _InterlockedDecrement16
00034 #define InterlockedIncrement         _InterlockedIncrement
00035 #define InterlockedIncrement16       _InterlockedIncrement16
00036 #define InterlockedCompareExchange   _InterlockedCompareExchange
00037 #define InterlockedCompareExchange16 _InterlockedCompareExchange16
00038 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
00039 #define InterlockedExchange          _InterlockedExchange
00040 #define InterlockedExchangeAdd       _InterlockedExchangeAdd
00041 #define InterlockedOr                _InterlockedOr
00042 #define InterlockedAnd               _InterlockedAnd
00043 
00044 //
00045 // Use inlined versions of fast/guarded mutex routines
00046 //
00047 #define ExEnterCriticalRegionAndAcquireFastMutexUnsafe _ExEnterCriticalRegionAndAcquireFastMutexUnsafe
00048 #define ExReleaseFastMutexUnsafeAndLeaveCriticalRegion _ExReleaseFastMutexUnsafeAndLeaveCriticalRegion
00049 #define ExAcquireFastMutex _ExAcquireFastMutex
00050 #define ExReleaseFastMutex _ExReleaseFastMutex
00051 #define ExAcquireFastMutexUnsafe _ExAcquireFastMutexUnsafe
00052 #define ExReleaseFastMutexUnsafe _ExReleaseFastMutexUnsafe
00053 #define ExTryToAcquireFastMutex _ExTryToAcquireFastMutex
00054 
00055 #define KeInitializeGuardedMutex _KeInitializeGuardedMutex
00056 #define KeAcquireGuardedMutex _KeAcquireGuardedMutex
00057 #define KeReleaseGuardedMutex _KeReleaseGuardedMutex
00058 #define KeAcquireGuardedMutexUnsafe _KeAcquireGuardedMutexUnsafe
00059 #define KeReleaseGuardedMutexUnsafe _KeReleaseGuardedMutexUnsafe
00060 #define KeTryToAcquireGuardedMutex _KeTryToAcquireGuardedMutex
00061 
00062 #include "tag.h"
00063 #include "ke.h"
00064 #include "ob.h"
00065 #include "mm.h"
00066 #include "ex.h"
00067 #include "cm.h"
00068 #include "ps.h"
00069 #include "cc.h"
00070 #include "io.h"
00071 #include "po.h"
00072 #include "se.h"
00073 #include "ldr.h"
00074 #ifndef _WINKD_
00075 #include "kd.h"
00076 #else
00077 #include "kd64.h"
00078 #endif
00079 #include "fsrtl.h"
00080 #include "lpc.h"
00081 #include "rtl.h"
00082 #ifdef KDBG
00083 #include "../kdbg/kdb.h"
00084 #endif
00085 #include "dbgk.h"
00086 #include "spinlock.h"
00087 #include "test.h"
00088 #include "inbv.h"
00089 #include "vdm.h"
00090 #include "hal.h"
00091 #include "hdl.h"
00092 #include "arch/intrin_i.h"
00093 
00094 /*
00095  * generic information class probing code
00096  */
00097 
00098 #define ICIF_QUERY               0x1
00099 #define ICIF_SET                 0x2
00100 #define ICIF_QUERY_SIZE_VARIABLE 0x4
00101 #define ICIF_SET_SIZE_VARIABLE   0x8
00102 #define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE)
00103 
00104 typedef struct _INFORMATION_CLASS_INFO
00105 {
00106   ULONG RequiredSizeQUERY;
00107   ULONG RequiredSizeSET;
00108   ULONG AlignmentSET;
00109   ULONG AlignmentQUERY;
00110   ULONG Flags;
00111 } INFORMATION_CLASS_INFO, *PINFORMATION_CLASS_INFO;
00112 
00113 #define ICI_SQ_SAME(Type, Alignment, Flags)                                    \
00114   { Type, Type, Alignment, Alignment, Flags }
00115 
00116 #define ICI_SQ(TypeQuery, TypeSet, AlignmentQuery, AlignmentSet, Flags)        \
00117   { TypeQuery, TypeSet, AlignmentQuery, AlignmentSet, Flags }
00118 
00119 //
00120 // TEMPORARY
00121 //
00122 #define IQS_SAME(Type, Alignment, Flags)                                    \
00123   { sizeof(Type), sizeof(Type), sizeof(Alignment), sizeof(Alignment), Flags }
00124 
00125 #define IQS(TypeQuery, TypeSet, AlignmentQuery, AlignmentSet, Flags)        \
00126   { sizeof(TypeQuery), sizeof(TypeSet), sizeof(AlignmentQuery), sizeof(AlignmentSet), Flags }
00127 
00128 /*
00129  * Use IsPointerOffset to test whether a pointer should be interpreted as an offset
00130  * or as a pointer
00131  */
00132 #if defined(_X86_) || defined(_M_AMD64) || defined(_MIPS_) || defined(_PPC_) || defined(_ARM_)
00133 
00134 /* for x86 and x86-64 the MSB is 1 so we can simply test on that */
00135 #define IsPointerOffset(Ptr) ((LONG_PTR)(Ptr) >= 0)
00136 
00137 #elif defined(_IA64_)
00138 
00139 /* on Itanium if the 24 most significant bits are set, we're not dealing with
00140    offsets anymore. */
00141 #define IsPointerOffset(Ptr)  (((ULONG_PTR)(Ptr) & 0xFFFFFF0000000000ULL) == 0)
00142 
00143 #else
00144 #error IsPointerOffset() needs to be defined for this architecture
00145 #endif
00146 
00147 #endif
00148 
00149 #ifdef _M_IX86
00150 C_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, SystemCall) == 0x300);
00151 
00152 C_ASSERT(FIELD_OFFSET(KTHREAD, InitialStack) == KTHREAD_INITIAL_STACK);
00153 C_ASSERT(FIELD_OFFSET(KTHREAD, KernelStack) == KTHREAD_KERNEL_STACK);
00154 C_ASSERT(FIELD_OFFSET(KTHREAD, SystemAffinityActive) == FIELD_OFFSET(KTHREAD, WaitBlock) + FIELD_OFFSET(KWAIT_BLOCK, SpareByte));
00155 C_ASSERT(FIELD_OFFSET(KTHREAD, ApcState.Process) == KTHREAD_APCSTATE_PROCESS);
00156 C_ASSERT(FIELD_OFFSET(KTHREAD, ApcQueueable) == FIELD_OFFSET(KTHREAD, ApcState.UserApcPending) + 1);
00157 C_ASSERT(FIELD_OFFSET(KTHREAD, ApcQueueable) == 0x3F);
00158 C_ASSERT(FIELD_OFFSET(KTHREAD, NextProcessor) == 0x40);
00159 C_ASSERT(FIELD_OFFSET(KTHREAD, DeferredProcessor) == 0x41);
00160 C_ASSERT(FIELD_OFFSET(KTHREAD, AdjustReason) == 0x42);
00161 C_ASSERT(FIELD_OFFSET(KTHREAD, NpxState) == KTHREAD_NPX_STATE);
00162 C_ASSERT(FIELD_OFFSET(KTHREAD, Alertable) == 0x58);
00163 C_ASSERT(FIELD_OFFSET(KTHREAD, SwapBusy) == 0x05D);
00164 C_ASSERT(FIELD_OFFSET(KTHREAD, Teb) == KTHREAD_TEB);
00165 C_ASSERT(FIELD_OFFSET(KTHREAD, Timer) == 0x078);
00166 C_ASSERT(FIELD_OFFSET(KTHREAD, ThreadFlags) == 0x0A0);
00167 C_ASSERT(FIELD_OFFSET(KTHREAD, WaitBlock) == 0x0A8);
00168 C_ASSERT(FIELD_OFFSET(KTHREAD, WaitBlockFill0) == 0x0A8);
00169 C_ASSERT(FIELD_OFFSET(KTHREAD, QueueListEntry) == 0x108);
00170 C_ASSERT(FIELD_OFFSET(KTHREAD, PreviousMode) == KTHREAD_PREVIOUS_MODE);
00171 C_ASSERT(FIELD_OFFSET(KTHREAD, PreviousMode) == FIELD_OFFSET(KTHREAD, WaitBlock) + sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareByte));
00172 C_ASSERT(FIELD_OFFSET(KTHREAD, ResourceIndex) == FIELD_OFFSET(KTHREAD, WaitBlock) + 2*sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareByte));
00173 C_ASSERT(FIELD_OFFSET(KTHREAD, LargeStack) == FIELD_OFFSET(KTHREAD, WaitBlock) + 3*sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareByte));
00174 C_ASSERT(FIELD_OFFSET(KTHREAD, TrapFrame) == KTHREAD_TRAP_FRAME);
00175 C_ASSERT(FIELD_OFFSET(KTHREAD, CallbackStack) == KTHREAD_CALLBACK_STACK);
00176 C_ASSERT(FIELD_OFFSET(KTHREAD, ServiceTable) == KTHREAD_SERVICE_TABLE);
00177 C_ASSERT(FIELD_OFFSET(KTHREAD, FreezeCount) == FIELD_OFFSET(KTHREAD, SavedApcState.UserApcPending) + 1);
00178 C_ASSERT(FIELD_OFFSET(KTHREAD, Quantum) == FIELD_OFFSET(KTHREAD, SuspendApc.SpareByte0));
00179 C_ASSERT(FIELD_OFFSET(KTHREAD, QuantumReset) == FIELD_OFFSET(KTHREAD, SuspendApc.SpareByte1));
00180 C_ASSERT(FIELD_OFFSET(KTHREAD, KernelTime) == FIELD_OFFSET(KTHREAD, SuspendApc.SpareLong0));
00181 C_ASSERT(FIELD_OFFSET(KTHREAD, TlsArray) == FIELD_OFFSET(KTHREAD, SuspendApc.SystemArgument1));
00182 C_ASSERT(FIELD_OFFSET(KTHREAD, LegoData) == FIELD_OFFSET(KTHREAD, SuspendApc.SystemArgument2));
00183 C_ASSERT(FIELD_OFFSET(KTHREAD, PowerState) == FIELD_OFFSET(KTHREAD, SuspendApc.Inserted) + 1);
00184 C_ASSERT(sizeof(KTHREAD) == 0x1B8);
00185 
00186 C_ASSERT(FIELD_OFFSET(KPROCESS, DirectoryTableBase) == KPROCESS_DIRECTORY_TABLE_BASE);
00187 
00188 C_ASSERT(FIELD_OFFSET(KPCR, NtTib.ExceptionList) == KPCR_EXCEPTION_LIST);
00189 C_ASSERT(FIELD_OFFSET(KPCR, SelfPcr) == KPCR_SELF);
00190 C_ASSERT(FIELD_OFFSET(KPCR, IRR) == KPCR_IRR);
00191 C_ASSERT(FIELD_OFFSET(KPCR, IDR) == KPCR_IDR);
00192 C_ASSERT(FIELD_OFFSET(KPCR, Irql) == KPCR_IRQL);
00193 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, CurrentThread) == KPCR_CURRENT_THREAD);
00194 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, NextThread) == KPCR_PRCB_NEXT_THREAD);
00195 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, NpxThread) == KPCR_NPX_THREAD);
00196 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) == KPCR_PRCB_DATA);
00197 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, KeSystemCalls) == KPCR_SYSTEM_CALLS);
00198 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, DpcData) + FIELD_OFFSET(KDPC_DATA, DpcQueueDepth) == KPCR_PRCB_DPC_QUEUE_DEPTH);
00199 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, DpcData) + 16 == KPCR_PRCB_DPC_COUNT);
00200 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, DpcStack) == KPCR_PRCB_DPC_STACK);
00201 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, TimerRequest) == KPCR_PRCB_TIMER_REQUEST);
00202 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, MaximumDpcQueueDepth) == KPCR_PRCB_MAXIMUM_DPC_QUEUE_DEPTH);
00203 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, DpcRequestRate) == KPCR_PRCB_DPC_REQUEST_RATE);
00204 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, DpcInterruptRequested) == KPCR_PRCB_DPC_INTERRUPT_REQUESTED);
00205 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, DpcRoutineActive) == KPCR_PRCB_DPC_ROUTINE_ACTIVE);
00206 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, DpcLastCount) == KPCR_PRCB_DPC_LAST_COUNT);
00207 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, TimerRequest) == KPCR_PRCB_TIMER_REQUEST);
00208 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, QuantumEnd) == KPCR_PRCB_QUANTUM_END);
00209 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, DeferredReadyListHead) == KPCR_PRCB_DEFERRED_READY_LIST_HEAD);
00210 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, PowerState) == KPCR_PRCB_POWER_STATE_IDLE_FUNCTION);
00211 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, PrcbLock) == KPCR_PRCB_PRCB_LOCK);
00212 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, DpcStack) == KPCR_PRCB_DPC_STACK);
00213 C_ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, IdleSchedule) == KPCR_PRCB_IDLE_SCHEDULE);
00214 C_ASSERT(sizeof(FX_SAVE_AREA) == SIZEOF_FX_SAVE_AREA);
00215 
00216 /* Platform specific checks */
00217 C_ASSERT(FIELD_OFFSET(KPROCESS, IopmOffset) == KPROCESS_IOPM_OFFSET);
00218 C_ASSERT(FIELD_OFFSET(KPROCESS, LdtDescriptor) == KPROCESS_LDT_DESCRIPTOR0);
00219 C_ASSERT(FIELD_OFFSET(KTSS, Esp0) == KTSS_ESP0);
00220 C_ASSERT(FIELD_OFFSET(KTSS, IoMapBase) == KTSS_IOMAPBASE);
00221 #endif

Generated on Fri May 25 2012 04:17:20 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.