2004-08-15 Casper S. Hornstrup <chorns@users.sourceforge.net>
[reactos.git] / reactos / ntoskrnl / ke / i386 / usercall.c
1 /* $Id: usercall.c,v 1.28 2004/08/15 16:39:05 chorns Exp $
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/hal/x86/usercall.c
6 * PURPOSE: 2E interrupt handler
7 * PROGRAMMER: David Welch (david.welch@seh.ox.ac.uk)
8 * UPDATE HISTORY:
9 * ???
10 */
11
12 /* INCLUDES ******************************************************************/
13
14 #include <ntoskrnl.h>
15 #define NDEBUG
16 #include <internal/debug.h>
17
18 /* FUNCTIONS *****************************************************************/
19
20 VOID
21 KiSystemCallHook(ULONG Nr, ...)
22 {
23 #if 0
24 va_list ap;
25 ULONG i;
26
27 va_start(ap, Nr);
28
29 DbgPrint("%x/%d ", KeServiceDescriptorTable[0].SSDT[Nr].SysCallPtr, Nr);
30 DbgPrint("%x (", KeServiceDescriptorTable[0].SSPT[Nr].ParamBytes);
31 for (i = 0; i < KeServiceDescriptorTable[0].SSPT[Nr].ParamBytes / 4; i++)
32 {
33 DbgPrint("%x, ", va_arg(ap, ULONG));
34 }
35 DbgPrint(")\n");
36 assert_irql(PASSIVE_LEVEL);
37 va_end(ap);
38 #endif
39 }
40
41 VOID
42 KiAfterSystemCallHook(PKTRAP_FRAME TrapFrame)
43 {
44 if (KeGetCurrentThread()->Alerted[1] != 0 && TrapFrame->Cs != KERNEL_CS)
45 {
46 KiDeliverNormalApc();
47 }
48 if (KeGetCurrentThread()->Alerted[0] != 0 && TrapFrame->Cs != KERNEL_CS)
49 {
50 KiDeliverUserApc(TrapFrame);
51 }
52 }
53
54
55 VOID
56 KiServiceCheck (ULONG Nr)
57 {
58 PETHREAD Thread;
59
60 Thread = PsGetCurrentThread();
61
62 #if 0
63 DbgPrint ("KiServiceCheck(%p) called\n", Thread);
64 DbgPrint ("Service %d (%p)\n", Nr, KeServiceDescriptorTableShadow[1].SSDT[Nr].SysCallPtr);
65 #endif
66
67 if (Thread->Tcb.ServiceTable != KeServiceDescriptorTableShadow)
68 {
69 #if 0
70 DbgPrint ("Initialize Win32 thread\n");
71 #endif
72
73 PsInitWin32Thread (Thread);
74
75 Thread->Tcb.ServiceTable = KeServiceDescriptorTableShadow;
76 }
77 }
78
79 // This function should be used by win32k.sys to add its own user32/gdi32 services
80 // TableIndex is 0 based
81 // ServiceCountTable its not used at the moment
82 /*
83 * @implemented
84 */
85 BOOLEAN STDCALL
86 KeAddSystemServiceTable (
87 PSSDT SSDT,
88 PULONG ServiceCounterTable,
89 ULONG NumberOfServices,
90 PSSPT SSPT,
91 ULONG TableIndex
92 )
93 {
94 if (TableIndex > SSDT_MAX_ENTRIES - 1)
95 return FALSE;
96
97 /* check if descriptor table entry is free */
98 if ((KeServiceDescriptorTable[TableIndex].SSDT != NULL) ||
99 (KeServiceDescriptorTableShadow[TableIndex].SSDT != NULL))
100 return FALSE;
101
102 /* initialize the shadow service descriptor table */
103 KeServiceDescriptorTableShadow[TableIndex].SSDT = SSDT;
104 KeServiceDescriptorTableShadow[TableIndex].SSPT = SSPT;
105 KeServiceDescriptorTableShadow[TableIndex].NumberOfServices = NumberOfServices;
106 KeServiceDescriptorTableShadow[TableIndex].ServiceCounterTable = ServiceCounterTable;
107
108 /* initialize the service descriptor table (not for win32k services) */
109 if (TableIndex != 1)
110 {
111 KeServiceDescriptorTable[TableIndex].SSDT = SSDT;
112 KeServiceDescriptorTable[TableIndex].SSPT = SSPT;
113 KeServiceDescriptorTable[TableIndex].NumberOfServices = NumberOfServices;
114 KeServiceDescriptorTable[TableIndex].ServiceCounterTable = ServiceCounterTable;
115 }
116
117 return TRUE;
118 }
119
120 /*
121 * @unimplemented
122 */
123 STDCALL
124 BOOLEAN
125 KeRemoveSystemServiceTable(
126 IN PUCHAR Number
127 )
128 {
129 UNIMPLEMENTED;
130 return FALSE;
131 }
132
133 /*
134 * @unimplemented
135 */
136 STDCALL
137 NTSTATUS
138 KeUserModeCallback(
139 IN ULONG FunctionID,
140 IN PVOID InputBuffer,
141 IN ULONG InputLength,
142 OUT PVOID *OutputBuffer,
143 OUT PULONG OutputLength
144 )
145 {
146 UNIMPLEMENTED;
147 return 0;
148 }
149
150 /* EOF */