Branch setupapi (again)
[reactos.git] / reactos / ntoskrnl / ke / i386 / usercall.c
1 /* $Id$
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 KIRQL oldIrql;
45
46 /* If we are returning to umode, deliver one pending umode apc.
47 * Note that kmode apcs are also delivered, even if deliverymode is UserMode.
48 * This is because we can't return to umode with pending kmode apcs!
49 * FIXME: Should we deliver pending kmode apcs when returning from a
50 * kmode-to-kmode syscall (ZwXxx calls)?????
51 * -Gunnar
52 */
53 if (TrapFrame->Cs != KERNEL_CS)
54 {
55 KeRaiseIrql(APC_LEVEL, &oldIrql);
56 KiDeliverApc(UserMode, NULL, TrapFrame);
57 KeLowerIrql(oldIrql);
58 }
59
60 }
61
62
63 VOID
64 KiServiceCheck (ULONG Nr)
65 {
66 PETHREAD Thread;
67
68 Thread = PsGetCurrentThread();
69
70 #if 0
71 DbgPrint ("KiServiceCheck(%p) called\n", Thread);
72 DbgPrint ("Service %d (%p)\n", Nr, KeServiceDescriptorTableShadow[1].SSDT[Nr].SysCallPtr);
73 #endif
74
75 if (Thread->Tcb.ServiceTable != KeServiceDescriptorTableShadow)
76 {
77 #if 0
78 DbgPrint ("Initialize Win32 thread\n");
79 #endif
80
81 PsInitWin32Thread (Thread);
82
83 Thread->Tcb.ServiceTable = KeServiceDescriptorTableShadow;
84 }
85 }
86
87 // This function should be used by win32k.sys to add its own user32/gdi32 services
88 // TableIndex is 0 based
89 // ServiceCountTable its not used at the moment
90 /*
91 * @implemented
92 */
93 BOOLEAN STDCALL
94 KeAddSystemServiceTable (
95 PSSDT SSDT,
96 PULONG ServiceCounterTable,
97 ULONG NumberOfServices,
98 PSSPT SSPT,
99 ULONG TableIndex
100 )
101 {
102 if (TableIndex > SSDT_MAX_ENTRIES - 1)
103 return FALSE;
104
105 /* check if descriptor table entry is free */
106 if ((KeServiceDescriptorTable[TableIndex].SSDT != NULL) ||
107 (KeServiceDescriptorTableShadow[TableIndex].SSDT != NULL))
108 return FALSE;
109
110 /* initialize the shadow service descriptor table */
111 KeServiceDescriptorTableShadow[TableIndex].SSDT = SSDT;
112 KeServiceDescriptorTableShadow[TableIndex].SSPT = SSPT;
113 KeServiceDescriptorTableShadow[TableIndex].NumberOfServices = NumberOfServices;
114 KeServiceDescriptorTableShadow[TableIndex].ServiceCounterTable = ServiceCounterTable;
115
116 /* initialize the service descriptor table (not for win32k services) */
117 if (TableIndex != 1)
118 {
119 KeServiceDescriptorTable[TableIndex].SSDT = SSDT;
120 KeServiceDescriptorTable[TableIndex].SSPT = SSPT;
121 KeServiceDescriptorTable[TableIndex].NumberOfServices = NumberOfServices;
122 KeServiceDescriptorTable[TableIndex].ServiceCounterTable = ServiceCounterTable;
123 }
124
125 return TRUE;
126 }
127
128 /*
129 * @unimplemented
130 */
131 BOOLEAN
132 STDCALL
133 KeRemoveSystemServiceTable(
134 IN PUCHAR Number
135 )
136 {
137 UNIMPLEMENTED;
138 return FALSE;
139 }
140
141 /*
142 * @unimplemented
143 */
144 NTSTATUS
145 STDCALL
146 KeUserModeCallback(
147 IN ULONG FunctionID,
148 IN PVOID InputBuffer,
149 IN ULONG InputLength,
150 OUT PVOID *OutputBuffer,
151 OUT PULONG OutputLength
152 )
153 {
154 UNIMPLEMENTED;
155 return 0;
156 }
157
158 /* EOF */