1 /* $Id: usercall.c,v 1.28 2004/08/15 16:39:05 chorns 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 ******************************************************************/
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
)
44 if (KeGetCurrentThread()->Alerted
[1] != 0 && TrapFrame
->Cs
!= KERNEL_CS
)
48 if (KeGetCurrentThread()->Alerted
[0] != 0 && TrapFrame
->Cs
!= KERNEL_CS
)
50 KiDeliverUserApc(TrapFrame
);
56 KiServiceCheck (ULONG Nr
)
60 Thread
= PsGetCurrentThread();
63 DbgPrint ("KiServiceCheck(%p) called\n", Thread
);
64 DbgPrint ("Service %d (%p)\n", Nr
, KeServiceDescriptorTableShadow
[1].SSDT
[Nr
].SysCallPtr
);
67 if (Thread
->Tcb
.ServiceTable
!= KeServiceDescriptorTableShadow
)
70 DbgPrint ("Initialize Win32 thread\n");
73 PsInitWin32Thread (Thread
);
75 Thread
->Tcb
.ServiceTable
= KeServiceDescriptorTableShadow
;
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
86 KeAddSystemServiceTable (
88 PULONG ServiceCounterTable
,
89 ULONG NumberOfServices
,
94 if (TableIndex
> SSDT_MAX_ENTRIES
- 1)
97 /* check if descriptor table entry is free */
98 if ((KeServiceDescriptorTable
[TableIndex
].SSDT
!= NULL
) ||
99 (KeServiceDescriptorTableShadow
[TableIndex
].SSDT
!= NULL
))
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
;
108 /* initialize the service descriptor table (not for win32k services) */
111 KeServiceDescriptorTable
[TableIndex
].SSDT
= SSDT
;
112 KeServiceDescriptorTable
[TableIndex
].SSPT
= SSPT
;
113 KeServiceDescriptorTable
[TableIndex
].NumberOfServices
= NumberOfServices
;
114 KeServiceDescriptorTable
[TableIndex
].ServiceCounterTable
= ServiceCounterTable
;
125 KeRemoveSystemServiceTable(
140 IN PVOID InputBuffer
,
141 IN ULONG InputLength
,
142 OUT PVOID
*OutputBuffer
,
143 OUT PULONG OutputLength