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)
12 /* INCLUDES ******************************************************************/
16 #include <internal/debug.h>
18 /* FUNCTIONS *****************************************************************/
21 KiSystemCallHook(ULONG Nr
, ...)
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
++)
33 DbgPrint("%x, ", va_arg(ap
, ULONG
));
36 ASSERT_IRQL(PASSIVE_LEVEL
);
42 KiAfterSystemCallHook(PKTRAP_FRAME TrapFrame
)
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)?????
53 if (TrapFrame
->Cs
!= KERNEL_CS
)
55 KeRaiseIrql(APC_LEVEL
, &oldIrql
);
56 KiDeliverApc(UserMode
, NULL
, TrapFrame
);
64 KiServiceCheck (ULONG Nr
)
68 Thread
= PsGetCurrentThread();
71 DbgPrint ("KiServiceCheck(%p) called\n", Thread
);
72 DbgPrint ("Service %d (%p)\n", Nr
, KeServiceDescriptorTableShadow
[1].SSDT
[Nr
].SysCallPtr
);
75 if (Thread
->Tcb
.ServiceTable
!= KeServiceDescriptorTableShadow
)
78 DbgPrint ("Initialize Win32 thread\n");
81 PsInitWin32Thread (Thread
);
83 Thread
->Tcb
.ServiceTable
= KeServiceDescriptorTableShadow
;
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
94 KeAddSystemServiceTable (
96 PULONG ServiceCounterTable
,
97 ULONG NumberOfServices
,
102 if (TableIndex
> SSDT_MAX_ENTRIES
- 1)
105 /* check if descriptor table entry is free */
106 if ((KeServiceDescriptorTable
[TableIndex
].SSDT
!= NULL
) ||
107 (KeServiceDescriptorTableShadow
[TableIndex
].SSDT
!= NULL
))
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
;
116 /* initialize the service descriptor table (not for win32k services) */
119 KeServiceDescriptorTable
[TableIndex
].SSDT
= SSDT
;
120 KeServiceDescriptorTable
[TableIndex
].SSPT
= SSPT
;
121 KeServiceDescriptorTable
[TableIndex
].NumberOfServices
= NumberOfServices
;
122 KeServiceDescriptorTable
[TableIndex
].ServiceCounterTable
= ServiceCounterTable
;
133 KeRemoveSystemServiceTable(
148 IN PVOID InputBuffer
,
149 IN ULONG InputLength
,
150 OUT PVOID
*OutputBuffer
,
151 OUT PULONG OutputLength