Changeset 5205 for trunk/src


Ignore:
Timestamp:
Feb 20, 2001, 6:02:40 AM (25 years ago)
Author:
bird
Message:

Separated IOCtl and API routing to support CallGate calling with the same code as IOCtl.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/win32k/dev32/d32Win32kIOCtl.c

    r5105 r5205  
    1 /* $Id: d32Win32kIOCtl.c,v 1.5 2001-02-11 15:19:47 bird Exp $
     1/* $Id: d32Win32kIOCtl.c,v 1.6 2001-02-20 05:02:40 bird Exp $
    22 *
    33 * Win32k driver IOCtl handler function.
     
    1111*   Defined Constants And Macros                                               *
    1212*******************************************************************************/
     13#define MAX_PARAMSIZE   64              /* Maximum size of a parameter structure. */
     14
    1315#define INCL_DOSERRORS
    1416#define INCL_NOPMAPI
     17#define INCL_OS2KRNL_TK
    1518
    1619#define NO_WIN32K_LIB_FUNCTIONS
     
    2831#include "Win32k.h"
    2932#include "k32.h"
     33#include "log.h"
     34#include "asmutils.h"
     35
     36
     37/*******************************************************************************
     38*   Internal Functions                                                         *
     39*******************************************************************************/
     40APIRET _Optlink Win32kAPIRouter(ULONG ulFunction, PVOID pvParam);  /* called from d32CallGate.asm too. */
    3041
    3142
     
    4051{
    4152    /* validate parameter pointer */
    42     if (pRpIOCtl == NULL || pRpIOCtl->ParmPacket == NULL)
     53    if (pRpIOCtl == NULL || pRpIOCtl->ParmPacket == NULL || pRpIOCtl->Function == 0 || pRpIOCtl->Function > K32_LASTIOCTLFUNCTION)
    4354        return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
    4455
     
    4657    {
    4758        case IOCTL_W32K_K32:
    48             switch (pRpIOCtl->Function)
    4959            {
    50                 case K32_ALLOCMEMEX:
    51                 {
    52                     PK32ALLOCMEMEX pParm = (PK32ALLOCMEMEX)pRpIOCtl->ParmPacket;
    53                     pParm->rc = k32AllocMemEx(&pParm->pv, pParm->cb, pParm->flFlags,
    54                                               pParm->ulCS, pParm->ulEIP);
    55                     return STATUS_DONE;
    56                 }
    57 
    58                 case K32_QUERYOTES:
    59                 {
    60                     PK32QUERYOTES pParm = (PK32QUERYOTES)pRpIOCtl->ParmPacket;
    61                     pParm->rc = k32QueryOTEs((HMTE)pParm->hMTE, pParm->pQOte, pParm->cbQOte);
    62                     return STATUS_DONE;
    63                 }
    64 
    65                 case K32_QUERYOPTIONSSTATUS:
    66                 {
    67                     PK32QUERYOPTIONSSTATUS pParm = (PK32QUERYOPTIONSSTATUS)pRpIOCtl->ParmPacket;
    68                     pParm->rc = k32QueryOptionsStatus(pParm->pOptions, pParm->pStatus);
    69                     return STATUS_DONE;
    70                 }
    71 
    72                 case K32_SETOPTIONS:
    73                 {
    74                     PK32SETOPTIONS pParm = (PK32SETOPTIONS)pRpIOCtl->ParmPacket;
    75                     pParm->rc = k32SetOptions(pParm->pOptions);
    76                     return STATUS_DONE;
    77                 }
    78 
    79                 case K32_PROCESSREADWRITE:
    80                 {
    81                     PK32PROCESSREADWRITE pParm = (PK32PROCESSREADWRITE)pRpIOCtl->ParmPacket;
    82                     pParm->rc = k32ProcessReadWrite(pParm->pid, pParm->cb, pParm->pvSource, pParm->pvTarget, pParm->fRead);
    83                     return STATUS_DONE;
    84                 }
    85 
    86                 case K32_HANDLESYSTEMEVENT:
    87                 {
    88                     PK32HANDLESYSTEMEVENT pParm = (PK32HANDLESYSTEMEVENT)pRpIOCtl->ParmPacket;
    89                     //pParm->rc = k32HandleSystemEvent(pParm->ulEvent, pParm->hev, pParm->fHandle);
    90                     pParm->rc = ERROR_NOT_SUPPORTED;
    91                     return STATUS_DONE;
    92                 }
    93 
    94                 case K32_QUERYSYSTEMMEMINFO:
    95                 {
    96                     PK32QUERYSYSTEMMEMINFO pParm = (PK32QUERYSYSTEMMEMINFO)pRpIOCtl->ParmPacket;
    97                     pParm->rc = k32QuerySystemMemInfo(pParm->pMemInfo);
    98                     return STATUS_DONE;
    99                 }
    100 
     60            APIRET rc = Win32kAPIRouter(pRpIOCtl->Function, pRpIOCtl->ParmPacket);
     61            if (    rc != 0xdeadbeefUL
     62                &&  TKSuULongNF(pRpIOCtl->ParmPacket, SSToDS(&rc)) == NO_ERROR)
     63                return STATUS_DONE;     /* Successfull return */
     64            break;
    10165            }
    102             break;
    10366    }
    10467
     
    10669}
    10770
     71
     72/**
     73 * Internal function router which calls the correct function.
     74 * Called from IOCtl worker and callgate in d32CallGate.asm.
     75 * @returns function return code.
     76 *          0xdeadbeef if invalid function number.
     77 * @param   ulFunction  Function number to call.
     78 * @param   pvParam     Parameter package for that function.
     79 * @sketch
     80 * @status  partially implemented.
     81 * @author  knut st. osmundsen (knut.stange.osmundsen@mynd.no)
     82 * @remark  This could be reimplemented in assembly.
     83 *          Make generic parameter layout to limit amount of memory copied back.
     84 */
     85APIRET _Optlink Win32kAPIRouter(ULONG ulFunction, PVOID pvParam)
     86{
     87    static ULONG acbParams[] =
     88    {
     89        0,                              /* Not used - ie. invalid */
     90        sizeof(K32ALLOCMEMEX),          /* K32_ALLOCMEMEX          0x01 */
     91        sizeof(K32QUERYOTES),           /* K32_QUERYOTES           0x02 */
     92        sizeof(K32QUERYOPTIONSSTATUS),  /* K32_QUERYOPTIONSSTATUS  0x03 */
     93        sizeof(K32SETOPTIONS),          /* K32_SETOPTIONS          0x04 */
     94        sizeof(K32PROCESSREADWRITE),    /* K32_PROCESSREADWRITE    0x05 */
     95        sizeof(K32HANDLESYSTEMEVENT),   /* K32_HANDLESYSTEMEVENT   0x06 */
     96        sizeof(K32QUERYSYSTEMMEMINFO)   /* K32_QUERYSYSTEMMEMINFO  0x07 */
     97    };
     98    APIRET  rc;
     99    char    achBuffer[MAX_PARAMSIZE];
     100    PVOID   pv = SSToDS(&achBuffer[0]);
     101
     102    /*
     103     * Validate the function number.
     104     * Fetch parameters from user buffer onto our Ring-0 stack.
     105     */
     106    if (ulFunction == 0 || ulFunction > sizeof(acbParams) / sizeof(acbParams[0]))
     107        return 0xdeadbeaf;
     108    rc = TKFuBuff(pv, pvParam, acbParams[ulFunction], TK_FUSU_NONFATAL);
     109    if (rc)
     110    {
     111        kprintf(("Win32kAPIRouter: Failed to fetch user parameters rc=%d.\n", rc));
     112        return rc;                      /* This can't happen when called from by IOCtl (I hope). */
     113    }
     114
     115
     116    /*
     117     * Call the actual function.
     118     */
     119    switch (ulFunction)
     120    {
     121        case K32_ALLOCMEMEX:
     122        {
     123            PK32ALLOCMEMEX pParm = (PK32ALLOCMEMEX)pv;
     124            return k32AllocMemEx(pParm->ppv, pParm->cb, pParm->flFlags, pParm->ulCS, pParm->ulEIP);
     125        }
     126
     127        case K32_QUERYOTES:
     128        {
     129            PK32QUERYOTES pParm = (PK32QUERYOTES)pv;
     130            return k32QueryOTEs((HMTE)pParm->hMTE, pParm->pQOte, pParm->cbQOte);
     131        }
     132
     133        case K32_QUERYOPTIONSSTATUS:
     134        {
     135            PK32QUERYOPTIONSSTATUS pParm = (PK32QUERYOPTIONSSTATUS)pv;
     136            return k32QueryOptionsStatus(pParm->pOptions, pParm->pStatus);
     137        }
     138
     139        case K32_SETOPTIONS:
     140        {
     141            PK32SETOPTIONS pParm = (PK32SETOPTIONS)pv;
     142            return k32SetOptions(pParm->pOptions);
     143        }
     144
     145        case K32_PROCESSREADWRITE:
     146        {
     147            PK32PROCESSREADWRITE pParm = (PK32PROCESSREADWRITE)pv;
     148            return k32ProcessReadWrite(pParm->pid, pParm->cb, pParm->pvSource, pParm->pvTarget, pParm->fRead);
     149        }
     150
     151        case K32_HANDLESYSTEMEVENT:
     152        {
     153            //PK32HANDLESYSTEMEVENT pParm = (PK32HANDLESYSTEMEVENT)pv;
     154            //return k32HandleSystemEvent(pParm->ulEvent, pParm->hev, pParm->fHandle);
     155            return ERROR_NOT_SUPPORTED;
     156        }
     157
     158        case K32_QUERYSYSTEMMEMINFO:
     159        {
     160            PK32QUERYSYSTEMMEMINFO pParm = (PK32QUERYSYSTEMMEMINFO)pv;
     161            return k32QuerySystemMemInfo(pParm->pMemInfo);
     162        }
     163    }
     164
     165
     166    /*
     167     * This will never happen.
     168     */
     169    kprintf(("Win32kAPIRouter: Internal processing error\n"));
     170    Int3();
     171
     172    return 0xdeadbeaf;
     173}
Note: See TracChangeset for help on using the changeset viewer.