source: trunk/src/win32k/dev32/d32Win32kIOCtl.c@ 5217

Last change on this file since 5217 was 5205, checked in by bird, 25 years ago

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

File size: 5.9 KB
Line 
1/* $Id: d32Win32kIOCtl.c,v 1.6 2001-02-20 05:02:40 bird Exp $
2 *
3 * Win32k driver IOCtl handler function.
4 *
5 * Copyright (c) 2000 knut st. osmundsen (knut.stange.osmundsen@mynd.no)
6 *
7 * Project Odin Software License can be found in LICENSE.TXT
8 *
9 */
10/*******************************************************************************
11* Defined Constants And Macros *
12*******************************************************************************/
13#define MAX_PARAMSIZE 64 /* Maximum size of a parameter structure. */
14
15#define INCL_DOSERRORS
16#define INCL_NOPMAPI
17#define INCL_OS2KRNL_TK
18
19#define NO_WIN32K_LIB_FUNCTIONS
20
21
22/*******************************************************************************
23* Header Files *
24*******************************************************************************/
25#include <os2.h>
26
27#include "devSegDf.h"
28#include "dev1632.h"
29#include "dev32.h"
30#include "OS2Krnl.h"
31#include "Win32k.h"
32#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. */
41
42
43
44/**
45 * IOCtl handler for the Win32k part of the driver.
46 * @returns Gen IOCtl return code.
47 * @param pRpIOCtl Pointer to 32-bit request packet. (not to the original packet)
48 * @author knut st. osmundsen (knut.stange.osmundsen@mynd.no)
49 */
50USHORT _loadds _Far32 _Pascal Win32kIOCtl(PRP32GENIOCTL pRpIOCtl)
51{
52 /* validate parameter pointer */
53 if (pRpIOCtl == NULL || pRpIOCtl->ParmPacket == NULL || pRpIOCtl->Function == 0 || pRpIOCtl->Function > K32_LASTIOCTLFUNCTION)
54 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
55
56 switch (pRpIOCtl->Category)
57 {
58 case IOCTL_W32K_K32:
59 {
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;
65 }
66 }
67
68 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
69}
70
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 TracBrowser for help on using the repository browser.