Author: tkreuzer Date: Fri Dec 18 01:11:11 2009 New Revision: 44643
URL: http://svn.reactos.org/svn/reactos?rev=44643&view=rev Log: Add service table definitions. They are only used for arm atm, because we have them asm.h, too and include that file on x86. Patch by Alex, fixed by me.
Modified: trunk/reactos/ntoskrnl/include/internal/ke.h
Modified: trunk/reactos/ntoskrnl/include/internal/ke.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/k... ============================================================================== --- trunk/reactos/ntoskrnl/include/internal/ke.h [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/include/internal/ke.h [iso-8859-1] Fri Dec 18 01:11:11 2009 @@ -151,6 +151,70 @@ /* One of the Reserved Wait Blocks, this one is for the Thread's Timer */ #define TIMER_WAIT_BLOCK 0x3L
+#ifdef _M_ARM // FIXME: remove this once our headers are cleaned up +// +// A system call ID is formatted as such: +// .________________________________________________________________. +// | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +// |--------------|-------------------------------------------------| +// | TABLE NUMBER | TABLE OFFSET | +// ----------------------------------------------------------------/ +// +// +// The table number is then used as an index into the service descriptor table. +#define TABLE_NUMBER_BITS 3 +#define TABLE_OFFSET_BITS 12 + +// +// There are 2 tables (kernel and shadow, used by Win32K) +// +#define NUMBER_SERVICE_TABLES 2 +#define NTOS_SERVICE_INDEX 0 +#define WIN32K_SERVICE_INDEX 1 + +// +// NB. From assembly code, the table number must be computed as an offset into +// the service descriptor table. +// +// Each entry into the table is 16 bytes long on 32-bit architectures, and +// 32 bytes long on 64-bit architectures. +// +// Thus, Table Number 1 is offset 16 (0x10) on x86, and offset 32 (0x20) on +// x64. +// +#ifdef _WIN64 +#define BITS_PER_ENTRY 5 // (1 << 5) = 32 bytes +#else +#define BITS_PER_ENTRY 4 // (1 << 4) = 16 bytes +#endif + +// +// We want the table number, but leave some extra bits to we can have the offset +// into the descriptor table. +// +#define SERVICE_TABLE_SHIFT (12 - BITS_PER_ENTRY) + +// +// Now the table number (as an offset) is corrupted with part of the table offset +// This mask will remove the extra unwanted bits, and give us the offset into the +// descriptor table proper. +// +#define SERVICE_TABLE_MASK (((1 << TABLE_NUMBER_BITS) - 1) << BITS_PER_ENTRY) + +// +// To get the table offset (ie: the service call number), just keep the 12 bits +// +#define SERVICE_NUMBER_MASK ((1 << TABLE_OFFSET_BITS) - 1) + +// +// We'll often need to check if this is a graphics call. This is done by comparing +// the table number offset with the known Win32K table number offset. +// This is usually index 1, so table number offset 0x10 (x86) or 0x20 (x64) +// +#define SERVICE_TABLE_TEST (WIN32K_SERVICE_INDEX << BITS_PER_ENTRY) + +#endif + /* INTERNAL KERNEL FUNCTIONS ************************************************/
VOID