Changeset 5224 for trunk/src/win32k/dev32/d32CallGate.asm
- Timestamp:
- Feb 21, 2001, 8:47:59 AM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/win32k/dev32/d32CallGate.asm
r5203 r5224 1 ; $Id: d32CallGate.asm,v 1. 1 2001-02-20 05:00:13bird Exp $1 ; $Id: d32CallGate.asm,v 1.2 2001-02-21 07:44:57 bird Exp $ 2 2 ; 3 3 ; 32-bit CallGate used to communitcate fast between Ring-3 and Ring-0. … … 11 11 .386p 12 12 13 ; 14 ; Defined Constants And Macros 15 ; 16 INCL_ERRORS EQU 1 17 13 18 14 19 ; 15 20 ; Header Files 16 21 ; 22 include bseerr.inc 17 23 include devsegdf.inc 18 24 include devhlp.inc 25 include win32k.inc 19 26 20 27 … … 22 29 ; Exported symbols 23 30 ; 31 public CallGateGDT 32 24 33 public InitCallGate 25 26 27 ; 28 ; extrns 29 ; 30 extrn _Device_Help:dword 34 public Win32kAPIRouter 35 36 37 ; 38 ; External symbols 39 ; 40 extrn _Device_Help:dword 41 extrn pulTKSSBase32:dword 42 31 43 extrn KMEnterKmodeSEF:near 32 44 extrn KMExitKmodeSEF8:near 33 extrn Win32kAPIRouter:near 45 extrn _TKFuBuff@16:near 46 47 extrn k32AllocMemEx:near 48 extrn k32QueryOTEs:near 49 extrn k32QueryOptionsStatus:near 50 extrn k32SetOptions:near 51 extrn k32ProcessReadWrite:near 52 ;extrn k32HandleSystemEvent:near 53 extrn k32QuerySystemMemInfo:near 54 extrn k32QueryCallGate:near 34 55 35 56 … … 44 65 GDTR_limit dw ? ; The limit field of the GDTR. 45 66 GDTR_base dd ? ; The base field of the GDTR. (linear flat address) 67 68 69 ; 70 ; Structure containing the K32 API parameter packet size. 71 ; 72 ; Used for parameter packet validation, and for copying the parameter 73 ; packet from user address space into system address space (the stack). 74 ; 75 acbK32Params: 76 dd 0 ; Not used - ie. invalid 77 dd SIZE K32ALLOCMEMEX ; K32_ALLOCMEMEX 0x01 78 dd SIZE K32QUERYOTES ; K32_QUERYOTES 0x02 79 dd SIZE K32QUERYOPTIONSSTATUS ; K32_QUERYOPTIONSSTATUS 0x03 80 dd SIZE K32SETOPTIONS ; K32_SETOPTIONS 0x04 81 dd SIZE K32PROCESSREADWRITE ; K32_PROCESSREADWRITE 0x05 82 dd SIZE K32HANDLESYSTEMEVENT ; K32_HANDLESYSTEMEVENT 0x06 83 dd SIZE K32QUERYSYSTEMMEMINFO ; K32_QUERYSYSTEMMEMINFO 0x07 84 dd SIZE K32QUERYCALLGATE ; K32_QUERYCALLGATE 0x08 85 86 ; 87 ; Structure containing the offsets of K32 API worker routines. 88 ; 89 ; Used for calling the workers indirectly. 90 ; 91 apfnK32APIs: 92 dd FLAT:k32APIStub ; Not used - ie. invalid 93 dd FLAT:k32AllocMemEx ; K32_ALLOCMEMEX 0x01 94 dd FLAT:k32QueryOTEs ; K32_QUERYOTES 0x02 95 dd FLAT:k32QueryOptionsStatus ; K32_QUERYOPTIONSSTATUS 0x03 96 dd FLAT:k32SetOptions ; K32_SETOPTIONS 0x04 97 dd FLAT:k32ProcessReadWrite ; K32_PROCESSREADWRITE 0x05 98 ;dd FLAT:k32HandleSystemEvent ; K32_HANDLESYSTEMEVENT 0x06 99 dd FLAT:k32APIStub 100 dd FLAT:k32QuerySystemMemInfo ; K32_QUERYSYSTEMMEMINFO 0x07 101 dd FLAT:k32QueryCallGate ; K32_QUERYCALLGATE 0x08 46 102 DATA32 ends 47 48 49 103 50 104 … … 66 120 push ebp 67 121 mov ebp, esp 68 sub esp, 10h69 122 push edi 70 123 push esi … … 75 128 ; 76 129 ; Allocate GDT selector for the call gate. 77 ; ( seems like this call also allocates 68kb of virtual memory which i don't need.)130 ; (URG! This call also allocates 68kb of virtual memory which i don't need!) 78 131 ; 79 132 mov di, seg DATA16:CallGateGDT … … 93 146 ; 94 147 ICG_allocok: 95 pop ds96 push ds ; restore ds (make sure it's flat)97 148 ASSUME ds:FLAT 98 149 sgdt GDTR_limit ; Get the GDTR content. … … 100 151 mov ebx, GDTR_base 101 152 movzx ecx, CallGateGDT 102 and cx, 0fff8h ; clear the dpl bits and descriptor type bit. 153 and cx, 0fff8h ; clear the dpl bits and descriptor type bit. (paranoia!) 103 154 cmp cx, ax ; check limit. (paranoia!!!) 104 155 jl ICG_limitok … … 138 189 139 190 ICG_end: 191 pop es 140 192 pop ds 141 pop es142 193 pop ebx 143 194 pop esi … … 159 210 ; @author knut st. osmundsen (knut.stange.osmundsen@mynd.no) 160 211 ; @remark 161 ; stack frame :162 ; -- -topof stack---212 ; stack frame - before KMEnterKmodeSEF: 213 ; --bottom of stack--- 163 214 ; calling ss 1ch 164 215 ; calling esp 18h … … 170 221 ; flags (pushf) 4h 171 222 ; parameter size (push 8h) 0h 172 ; ---I start repushing parameters here. 173 ; 223 ; 224 ; After the call to KMEnterKmodeSEF: 225 ; --bottom of stack--- 226 ; calling ss 50 227 ; calling esp 4c 228 ; pParameter (parameter 1) 48 229 ; ulFunctionCode (parameter 0) 44 230 ; sef_cs 40 231 ; sef_eip 3c 232 ; sef_eflag 38 233 ; sef_cbargs 34 234 ; sef_retaddr 30 235 ; sef_ds 2c 236 ; sef_es 28 237 ; sef_fs 24 238 ; sef_gs 20 239 ; sef_eax 1c 240 ; sef_ecx 18 241 ; sef_edx 14 242 ; sef_ebx 10 243 ; sef_padesp c 244 ; sef_ebp 8 245 ; sef_esi 4h 246 ; sef_edi 0h 174 247 ; 175 248 Win32kCallGate proc near 176 pushf ; Push all flags 249 ASSUME ds:nothing, ss:nothing 250 pushfd ; Push all flags (eflags) 177 251 push 8h ; Size of parameters. 178 252 … … 180 254 ; kernel entry housekeeping. 181 255 182 mov edx, [esp + 14h] ; pParameter (parameter 1)183 mov eax, [esp + 10h] ; ulFunctionCode (parameter 2)256 mov edx, [esp + 48h] ; pParameter (parameter 1) 257 mov eax, [esp + 44h] ; ulFunctionCode (parameter 2) 184 258 sub esp, 8h ; (Even when using _Oplink we have to reserve space for parameters.) 185 259 call Win32kAPIRouter ; This is my Ring-0 api. (d32Win32kIOCtl.c) … … 191 265 192 266 267 ;; 268 ; Internal function router which calls the correct function. 269 ; Called from IOCtl worker in d32Win32kIOCtl.c and callgate. 270 ; @cproto APIRET _Optlink Win32kAPIRouter(ULONG ulFunction, PVOID pvParam); 271 ; @returns function return code. 272 ; 0xdeadbeef if invalid function number. 273 ; @param eax - ulFunction Function number to call. 274 ; @param edx - pvParam Parameter packet for that function. 275 ; @uses eax, edx, ecx 276 ; @sketch Validate function number 277 ; Fetch the parameter pacted from user mode and place it on the stack. 278 ; Validate the size field of the parameter packet. 279 ; Remove the packet header from the stack => we have a callframe for the api. 280 ; Call the API worker. 281 ; Return. 282 ; @status Completely implemented. 283 ; @author knut st. osmundsen (knut.stange.osmundsen@mynd.no) 284 Win32kAPIRouter proc near 285 ASSUME ds:FLAT, es:nothing, ss:nothing 286 ; 287 ; Validate function number. 288 ; 289 cmp eax, 0 290 jne APIR_notnull ; This code should be faster (though it may look stupid to 291 ; jump around like this). IIRC branch prediction allways 292 ; takes a branch. And btw there are 4 NOPs after this jump! 293 jmp APIR_InvalidFunction 294 295 APIR_notnull: 296 cmp eax, K32_LASTIOCTLFUNCTION 297 jle APIR_ValidFunction 298 APIR_InvalidFunction: 299 mov eax, 0deadbeefh 300 ret 301 302 ; 303 ; We have a valid function number now. 304 ; Copy the parameter struct on to the stack. 305 ; 306 APIR_ValidFunction: 307 push ebp ; Make stack frame 308 mov ebp, esp 309 mov [ebp+8], eax ; Save eax on the stack (reserved by caller according to _Optlink) 310 mov ecx, acbK32Params[eax*4] ; ecx <- size of parameter packet. 311 sub esp, ecx ; Reserve stack space for the parameter packet. 312 mov eax, [pulTKSSBase32] 313 mov eax, [eax] 314 add eax, esp ; Calculate the FLAT address of esp. 315 push ecx ; Save the size. 316 ; TKFuBuff(pv, pvParam, acbParams[ulFunction], TK_FUSU_NONFATAL); 317 push 0 ; TK_FUSU_NOFATAL 318 push ecx ; Size of parameter packet 319 push edx ; Pointer to user memory to fetch 320 push eax ; Pointer to target memory. 321 call _TKFuBuff@16 ; __stdcall (cleanup done by the called function) 322 pop ecx ; Restore size 323 test eax, eax 324 jz APIR_FetchOK 325 jmp APIR_end 326 327 ; 328 ; Parameter packet is now read onto the stack. esp is pointing to it. 329 ; Check the size of the struct as the caller sees it. 330 ; 331 APIR_FetchOK: 332 cmp ecx, [esp] ; (esp now point at the parameter struct) 333 je APIR_sizeok 334 mov eax, ERROR_BAD_ARGUMENTS ; return code. 335 jmp APIR_end 336 337 ; 338 ; The size is correct. 339 ; Call the worker and return. 340 ; 341 APIR_sizeok: 342 add esp, SIZE K32HDR ; Skip the parameter header. 343 mov eax, [ebp + 8] ; Restore function number. 344 mov eax, apfnK32APIs[eax*4] ; eax <- address of the K32 API worker. 345 call eax ; Call the worker. 346 ; No cleanup needed as leave takes care of that 347 ; We're ready for returning. 348 APIR_end: 349 leave 350 ret 351 Win32kAPIRouter endp 352 353 354 ;; 355 ; This is a stub function which does nothing but returning an error code. 356 ; @return ERROR_NOT_SUPPORTED 357 k32APIStub proc near 358 mov eax, ERROR_NOT_SUPPORTED 359 ret 360 k32APIStub endp 361 193 362 CODE32 ends 194 363 … … 198 367 199 368 CODE16 segment 200 assume cs:CODE16, ds: nothing, ss:nothing, es:nothing369 assume cs:CODE16, ds:FLAT 201 370 202 371 ;
Note:
See TracChangeset
for help on using the changeset viewer.