Ignore:
Timestamp:
Feb 21, 2001, 8:47:59 AM (25 years ago)
Author:
bird
Message:

CallGate changes.

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:13 bird Exp $
     1; $Id: d32CallGate.asm,v 1.2 2001-02-21 07:44:57 bird Exp $
    22;
    33; 32-bit CallGate used to communitcate fast between Ring-3 and Ring-0.
     
    1111    .386p
    1212
     13;
     14;   Defined Constants And Macros
     15;
     16    INCL_ERRORS EQU 1
     17
    1318
    1419;
    1520;   Header Files
    1621;
     22    include bseerr.inc
    1723    include devsegdf.inc
    1824    include devhlp.inc
     25    include win32k.inc
    1926
    2027
     
    2229; Exported symbols
    2330;
     31    public CallGateGDT
     32
    2433    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
    3143    extrn  KMEnterKmodeSEF:near
    3244    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
    3455
    3556
     
    4465GDTR_limit      dw ?                    ; The limit field of the GDTR.
    4566GDTR_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;
     75acbK32Params:
     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;
     91apfnK32APIs:
     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
    46102DATA32 ends
    47 
    48 
    49103
    50104
     
    66120    push    ebp
    67121    mov     ebp, esp
    68     sub     esp, 10h
    69122    push    edi
    70123    push    esi
     
    75128    ;
    76129    ; 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!)
    78131    ;
    79132    mov     di, seg DATA16:CallGateGDT
     
    93146    ;
    94147ICG_allocok:
    95     pop     ds
    96     push    ds                          ; restore ds (make sure it's flat)
    97148    ASSUME  ds:FLAT
    98149    sgdt    GDTR_limit                  ; Get the GDTR content.
     
    100151    mov     ebx, GDTR_base
    101152    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!)
    103154    cmp     cx, ax                      ; check limit. (paranoia!!!)
    104155    jl      ICG_limitok
     
    138189
    139190ICG_end:
     191    pop     es
    140192    pop     ds
    141     pop     es
    142193    pop     ebx
    143194    pop     esi
     
    159210; @author   knut st. osmundsen (knut.stange.osmundsen@mynd.no)
    160211; @remark
    161 ;   stack frame:
    162 ;       ---top of stack---
     212;   stack frame - before KMEnterKmodeSEF:
     213;       --bottom of stack---
    163214;       calling ss                                                1ch
    164215;       calling esp                                               18h
     
    170221;       flags               (pushf)                                4h
    171222;       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
    174247;
    175248Win32kCallGate proc near
    176     pushf                               ; Push all flags
     249    ASSUME  ds:nothing, ss:nothing
     250    pushfd                              ; Push all flags (eflags)
    177251    push    8h                          ; Size of parameters.
    178252
     
    180254                                        ; kernel entry housekeeping.
    181255
    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)
    184258    sub     esp, 8h                     ; (Even when using _Oplink we have to reserve space for parameters.)
    185259    call    Win32kAPIRouter             ; This is my Ring-0 api. (d32Win32kIOCtl.c)
     
    191265
    192266
     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)
     284Win32kAPIRouter 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
     295APIR_notnull:
     296    cmp     eax, K32_LASTIOCTLFUNCTION
     297    jle     APIR_ValidFunction
     298APIR_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    ;
     306APIR_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    ;
     331APIR_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    ;
     341APIR_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.
     348APIR_end:
     349    leave
     350    ret
     351Win32kAPIRouter endp
     352
     353
     354;;
     355; This is a stub function which does nothing but returning an error code.
     356; @return       ERROR_NOT_SUPPORTED
     357k32APIStub proc near
     358    mov     eax, ERROR_NOT_SUPPORTED
     359    ret
     360k32APIStub endp
     361
    193362CODE32 ends
    194363
     
    198367
    199368CODE16 segment
    200     assume cs:CODE16, ds:nothing, ss:nothing, es:nothing
     369    assume cs:CODE16, ds:FLAT
    201370
    202371;
Note: See TracChangeset for help on using the changeset viewer.