Reactos
1
2#ifdef _M_ARM
3
4#include <ksarm.h>
5
6 GBLA SyscallId
7
8SyscallId SETA 0
9
10 MACRO
11 STUB_K $Name
12 LCLS ZwFuncName
13 LCLS ZwFuncEndName
14ZwFuncName SETS "Zw$Name"
15ZwFuncEndName SETS "$ZwFuncName":CC:"_end"
16 ALIGN 2
17 EXPORT $ZwFuncName [FUNC]
18$ZwFuncName
19 ROUT
20 mov r12, #SyscallId
21 svc #1
22 bx lr
23$ZwFuncEndName
24 MEND
25
26 MACRO
27 STUB_U $Name
28 LCLS NtFuncName
29 LCLS NtFuncEndName
30 LCLS ZwFuncName
31 LCLS ZwFuncEndName
32NtFuncName SETS "Nt$Name"
33NtFuncEndName SETS "$NtFuncName":CC:"_end"
34ZwFuncName SETS "Zw$Name"
35ZwFuncEndName SETS "$ZwFuncName":CC:"_end"
36 ALIGN 2
37 EXPORT $NtFuncName [FUNC]
38$NtFuncName
39 EXPORT $ZwFuncName [FUNC]
40$ZwFuncName
41 ROUT
42 mov r12, #SyscallId
43 svc #1
44 bx lr
45$NtFuncEndName
46$ZwFuncEndName
47 MEND
48
49#else
50
51#include <asm.inc>
52
53SyscallId = 0
54
55#ifdef _M_IX86
56#define KUSER_SHARED_SYSCALL HEX(7ffe0300)
57#define KGDT_R0_CODE 8
58MACRO(STUBCODE_U, Name, SyscallId, ArgCount)
59 StackBytes = 4 * ArgCount
60 FPO 0, 0, 0, 0, 0, FRAME_FPO
61 mov eax, SyscallId
62 mov edx, KUSER_SHARED_SYSCALL
63 call dword ptr [edx]
64 ret StackBytes
65ENDM
66MACRO(STUBCODE_K, Name, SyscallId, ArgCount)
67 StackBytes = 4 * &ArgCount
68 FPO 0, 0, 0, 0, 0, FRAME_FPO
69 mov eax, SyscallId
70 lea edx, [esp + 4]
71 pushfd
72 push KGDT_R0_CODE
73 call _KiSystemService
74 ret StackBytes
75ENDM
76#elif defined(_M_AMD64)
77MACRO(STUBCODE_U, Name, SyscallId, ArgCount)
78 .ENDPROLOG
79 mov eax, SyscallId
80 mov r10, rcx
81 syscall
82 ret
83ENDM
84MACRO(STUBCODE_K, Name, SyscallId, ArgCount)
85 .ENDPROLOG
86 EXTERN Nt&Name:PROC
87 lea rax, Nt&Name[rip]
88 mov r10, ArgCount * 8
89 jmp KiZwSystemService
90ENDM
91#elif defined(_M_PPC)
92MACRO(STUBCODE_U, Name, SyscallId, ArgCount)
93 stwu 1,-16(1)
94 mflr 0
95 stw 0,0(1)
96 li 0, SyscallId
97 sc
98 lwz 0,0(1)
99 mtlr 0
100 addi 1,1,16
101 blr
102ENDM
103#define STUBCODE_K STUBCODE_U
104#elif defined(_M_MIPS)
105MACRO(STUBCODE_U, Name, SyscallId, ArgCount)
106 li $8, KUSER_SHARED_SYSCALL
107 lw $8,0($8)
108 j $8
109 nop
110ENDM
111MACRO(STUBCODE_K, Name, SyscallId, ArgCount)
112 j KiSystemService
113 nop
114ENDM
115#else
116#error unsupported architecture
117#endif
118
119#ifdef _M_IX86
120MACRO(MAKE_LABEL, Name, StackBytes)
121 PUBLIC _&Name&@&StackBytes
122 _&Name&@&StackBytes:
123ENDM
124MACRO(START_PROC, Name, StackBytes)
125 PUBLIC _&Name&@&StackBytes
126 .PROC _&Name&@&StackBytes
127ENDM
128#else
129MACRO(MAKE_LABEL, Name, StackBytes)
130 PUBLIC &Name
131 &Name:
132ENDM
133MACRO(START_PROC, Name, StackBytes)
134 PUBLIC &Name
135 .PROC &Name
136ENDM
137#endif
138
139MACRO(STUB_U, Name, ArgCount)
140 MAKE_LABEL Zw&Name, %ArgCount * 4
141 START_PROC Nt&Name, %ArgCount * 4
142 STUBCODE_U Name, SyscallId, %ArgCount
143 .ENDP
144 SyscallId = SyscallId + 1
145ENDM
146
147MACRO(STUB_K, Name, ArgCount)
148 START_PROC Zw&Name, %ArgCount * 4
149 STUBCODE_K Name, SyscallId, %ArgCount
150 .ENDP
151 SyscallId = SyscallId + 1
152ENDM
153
154#endif