1 /* $Id: usercall.c,v 1.27 2004/07/01 01:52:37 royce Exp $
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 ******************************************************************/
14 #define NTOS_MODE_KERNEL
16 #include <internal/ntoskrnl.h>
17 #include <internal/ke.h>
18 #include <internal/ps.h>
19 #include <internal/i386/segment.h>
20 #include <internal/i386/mm.h>
23 #include <internal/debug.h>
25 #include <internal/ps.h>
27 /* FUNCTIONS *****************************************************************/
30 KiSystemCallHook(ULONG Nr
, ...)
38 DbgPrint("%x/%d ", KeServiceDescriptorTable
[0].SSDT
[Nr
].SysCallPtr
, Nr
);
39 DbgPrint("%x (", KeServiceDescriptorTable
[0].SSPT
[Nr
].ParamBytes
);
40 for (i
= 0; i
< KeServiceDescriptorTable
[0].SSPT
[Nr
].ParamBytes
/ 4; i
++)
42 DbgPrint("%x, ", va_arg(ap
, ULONG
));
45 assert_irql(PASSIVE_LEVEL
);
51 KiAfterSystemCallHook(PKTRAP_FRAME TrapFrame
)
53 if (KeGetCurrentThread()->Alerted
[1] != 0 && TrapFrame
->Cs
!= KERNEL_CS
)
57 if (KeGetCurrentThread()->Alerted
[0] != 0 && TrapFrame
->Cs
!= KERNEL_CS
)
59 KiDeliverUserApc(TrapFrame
);
65 KiServiceCheck (ULONG Nr
)
69 Thread
= PsGetCurrentThread();
72 DbgPrint ("KiServiceCheck(%p) called\n", Thread
);
73 DbgPrint ("Service %d (%p)\n", Nr
, KeServiceDescriptorTableShadow
[1].SSDT
[Nr
].SysCallPtr
);
76 if (Thread
->Tcb
.ServiceTable
!= KeServiceDescriptorTableShadow
)
79 DbgPrint ("Initialize Win32 thread\n");
82 PsInitWin32Thread (Thread
);
84 Thread
->Tcb
.ServiceTable
= KeServiceDescriptorTableShadow
;
88 // This function should be used by win32k.sys to add its own user32/gdi32 services
89 // TableIndex is 0 based
90 // ServiceCountTable its not used at the moment
95 KeAddSystemServiceTable (
97 PULONG ServiceCounterTable
,
98 ULONG NumberOfServices
,
103 if (TableIndex
> SSDT_MAX_ENTRIES
- 1)
106 /* check if descriptor table entry is free */
107 if ((KeServiceDescriptorTable
[TableIndex
].SSDT
!= NULL
) ||
108 (KeServiceDescriptorTableShadow
[TableIndex
].SSDT
!= NULL
))
111 /* initialize the shadow service descriptor table */
112 KeServiceDescriptorTableShadow
[TableIndex
].SSDT
= SSDT
;
113 KeServiceDescriptorTableShadow
[TableIndex
].SSPT
= SSPT
;
114 KeServiceDescriptorTableShadow
[TableIndex
].NumberOfServices
= NumberOfServices
;
115 KeServiceDescriptorTableShadow
[TableIndex
].ServiceCounterTable
= ServiceCounterTable
;
117 /* initialize the service descriptor table (not for win32k services) */
120 KeServiceDescriptorTable
[TableIndex
].SSDT
= SSDT
;
121 KeServiceDescriptorTable
[TableIndex
].SSPT
= SSPT
;
122 KeServiceDescriptorTable
[TableIndex
].NumberOfServices
= NumberOfServices
;
123 KeServiceDescriptorTable
[TableIndex
].ServiceCounterTable
= ServiceCounterTable
;
134 KeRemoveSystemServiceTable(
149 IN PVOID InputBuffer
,
150 IN ULONG InputLength
,
151 OUT PVOID
*OutputBuffer
,
152 OUT PULONG OutputLength