source: trunk/src/win32k/dev16/d16strat.c@ 8266

Last change on this file since 8266 was 6220, checked in by bird, 24 years ago

Added Open and Close handling for Win32k.

File size: 10.0 KB
Line 
1/* $Id: d16strat.c,v 1.12 2001-07-08 02:57:42 bird Exp $
2 *
3 * d16strat.c - 16-bit strategy routine, device headers, device_helper (ptr)
4 * and 16-bit IOClts.
5 *
6 * Copyright (c) 1999 knut st. osmundsen
7 *
8 * Project Odin Software License can be found in LICENSE.TXT
9 *
10 */
11
12/*******************************************************************************
13* Defined Constants *
14*******************************************************************************/
15#define INCL_DOSERRORS
16#define INCL_NOPMAPI
17
18#define NO_WIN32K_LIB_FUNCTIONS
19
20/*******************************************************************************
21* Header Files *
22*******************************************************************************/
23#include <os2.h>
24#include <devhdr.h>
25#include <devcmd.h>
26#include <strat2.h>
27#include <reqpkt.h>
28#include <dhcalls.h>
29
30/* Note that C-library function are only allowed during init! */
31
32#include "devSegDf.h"
33#include "dev1632.h"
34#include "dev16.h"
35#include "win32k.h"
36
37
38/*******************************************************************************
39* Global Variables *
40*******************************************************************************/
41extern DDHDR _far aDevHdrs[2];
42DDHDR aDevHdrs[2] = /* This is the first piece data in the driver!!!!!!! */
43{
44 {
45 &aDevHdrs[1], /* NextHeader */
46 DEVLEV_3 | DEV_30 | DEV_CHAR_DEV, /* SDevAtt */
47 (unsigned short)(void _near *)strategyAsm0, /* StrategyEP */
48 0, /* InterruptEP */
49 "elf$ ", /* DevName */
50 0, /* SDevProtCS */
51 0, /* SDevProtDS */
52 0, /* SDevRealCS */
53 0, /* SDevRealDS */
54 DEV_16MB | DEV_IOCTL2 /* SDevCaps */
55 },
56 {
57 ~0UL, /* NextHeader */
58 DEVLEV_3 | DEV_30 | DEV_CHAR_DEV, /* SDevAtt */
59 (unsigned short)(void _near *)strategyAsm1, /* StrategyEP */
60 0, /* InterruptEP */
61 "win32k$ ", /* DevName */
62 0, /* SDevProtCS */
63 0, /* SDevProtDS */
64 0, /* SDevRealCS */
65 0, /* SDevRealDS */
66 DEV_16MB | DEV_IOCTL2 /* SDevCaps */
67 }
68};
69
70
71
72/*******************************************************************************
73* Internal Functions *
74*******************************************************************************/
75USHORT NEAR dev0GenIOCtl(PRP_GENIOCTL pRp);
76USHORT NEAR dev1GenIOCtl(PRP_GENIOCTL pRp);
77
78
79/**
80 * Strategy routine.
81 * @returns Status word.
82 * @param pRpH Pointer to request packed header. (Do not change the pointer!)
83 * @parma usDev Device number.
84 * @remark This function is called from the entrypoint in dev1st.asm
85 */
86USHORT NEAR strategy(PRPH pRpH, unsigned short usDev)
87{
88 switch (pRpH->Cmd)
89 {
90 case CMDInit: /* INIT command */
91 if (fInitTime)
92 {
93 if (usDev == 0)
94 return dev0Init((PRPINITIN)pRpH, (PRPINITOUT)pRpH);
95 return dev1Init((PRPINITIN)pRpH, (PRPINITOUT)pRpH);
96 }
97 break;
98
99 case CMDGenIOCTL: /* Generic IOCTL */
100 if (usDev == 0)
101 return dev0GenIOCtl((PRP_GENIOCTL)pRpH);
102 return dev1GenIOCtl((PRP_GENIOCTL)pRpH);
103
104 case CMDOpen: /* device open */
105 case CMDClose: /* device close */
106 if (usDev == 1)
107 {
108 RP32OPENCLOSE rp32OpenClose = {0};
109 rp32OpenClose.rph.Len = pRpH->Len;
110 rp32OpenClose.rph.Unit = pRpH->Unit;
111 rp32OpenClose.rph.Cmd = pRpH->Cmd;
112 rp32OpenClose.rph.Status = pRpH->Status;
113 rp32OpenClose.rph.Flags = pRpH->Flags;
114 rp32OpenClose.rph.Link = (ULONG)pRpH->Link;
115 rp32OpenClose.sfn = ((PRP_OPENCLOSE)pRpH)->sfn;
116 if (pRpH->Cmd == CMDOpen)
117 return CallWin32kOpen(SSToDS_16a(&rp32OpenClose));
118 return CallWin32kClose(SSToDS_16a(&rp32OpenClose));
119 }
120 return STATUS_DONE;
121
122 case CMDDeInstall: /* De-Install driver */
123 case CMDShutdown:
124 return STATUS_DONE;
125 }
126
127 return STATUS_DONE | STATUS_ERR_UNKCMD;
128}
129
130extern char end;
131
132
133/**
134 * Generic I/O Control - device 0.
135 * This will only handle the request for Ring-0 initiation.
136 * @returns Status word.
137 * @param pRp Request packet.
138 */
139USHORT NEAR dev0GenIOCtl(PRP_GENIOCTL pRp)
140{
141 USHORT rc;
142
143 if (pRp->Category == D16_IOCTL_CAT)
144 {
145 switch (pRp->Function)
146 {
147 /*
148 * This is the IOCtl which does the R0-initiation of the device driver.
149 * Only available at init time...
150 */
151 case D16_IOCTL_RING0INIT:
152 if (fInitTime)
153 {
154 rc = R0Init16(pRp);
155 return rc;
156 }
157 break;
158
159 /*
160 * This is the IOCtl collects info of the running kernel.
161 * Only available at init time.
162 *
163 * Since this IOCtl is issued before R0-Init is done, we'll have to
164 * init TKSSBase for both 16-bit and 32-bit code and be a bit carefull.
165 */
166 case D16_IOCTL_GETKRNLINFO:
167 if (fInitTime)
168 {
169 ULONG ulLin;
170 if (fInitTime && TKSSBase16 == 0)
171 initGetDosTableData();
172 if (DevHelp_VirtToLin(SELECTOROF(pRp->DataPacket), OFFSETOF(pRp->DataPacket),
173 &ulLin) != NO_ERROR)
174 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
175 return CallGetKernelInfo32(ulLin);
176 }
177 break;
178
179 /*
180 * This is the IOCtl verifies the data in the ImportTab.
181 * Only available at init time.
182 *
183 * Since this IOCtl is issued before R0-Init is done, we'll have to
184 * init TKSSBase for both 16-bit and 32-bit code and be a bit carefull.
185 */
186 case D16_IOCTL_VERIFYIMPORTTAB:
187 if (fInitTime)
188 {
189 if (TKSSBase16 == 0)
190 initGetDosTableData();
191 rc = CallVerifyImportTab32();
192 if (pRp->DataPacket)
193 ((PD16VERIFYIMPORTTABDATA)pRp->DataPacket)->usRc = rc;
194 return STATUS_DONE;
195 }
196 break;
197 }
198 }
199 else if (pRp->Category == IOCTL_W32K_K32 || pRp->Category == IOCTL_W32K_ELF)
200 {
201 RP32GENIOCTL rp32Init = {0};
202 rp32Init.rph.Len = pRp->rph.Len;
203 rp32Init.rph.Unit = pRp->rph.Unit;
204 rp32Init.rph.Cmd = pRp->rph.Cmd;
205 rp32Init.rph.Status = pRp->rph.Status;
206 rp32Init.rph.Flags = pRp->rph.Flags;
207 rp32Init.rph.Link = (ULONG)pRp->rph.Link;
208 rp32Init.Category = pRp->Category;
209 rp32Init.Function = pRp->Function;
210 rp32Init.sfn = pRp->sfn;
211 rp32Init.DataLen = pRp->DataLen;
212 rp32Init.ParmLen = pRp->ParmLen;
213
214 if (DevHelp_VirtToLin(SELECTOROF(pRp->DataPacket), OFFSETOF(pRp->DataPacket),
215 (PLIN)&rp32Init.DataPacket) != NO_ERROR)
216 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
217 if (DevHelp_VirtToLin(SELECTOROF(pRp->ParmPacket), OFFSETOF(pRp->ParmPacket),
218 (PLIN)&rp32Init.ParmPacket) != NO_ERROR)
219 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
220
221 if (pRp->Category == IOCTL_W32K_ELF)
222 rc = CallElfIOCtl(SSToDS_16a(&rp32Init));
223 else
224 rc = CallWin32kIOCtl(SSToDS_16a(&rp32Init));
225
226 return rc;
227 }
228
229
230 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
231}
232
233
234/**
235 * Generic I/O Control - device 0.
236 * This will forward requests to 32-bit counterpart.
237 * @returns Status word.
238 * @param pRp Request packet.
239 */
240USHORT NEAR dev1GenIOCtl(PRP_GENIOCTL pRp)
241{
242 if (pRp->Category == IOCTL_W32K_K32 || pRp->Category == IOCTL_W32K_ELF)
243 {
244 USHORT rc;
245 RP32GENIOCTL rp32Init = {0};
246 rp32Init.rph.Len = pRp->rph.Len;
247 rp32Init.rph.Unit = pRp->rph.Unit;
248 rp32Init.rph.Cmd = pRp->rph.Cmd;
249 rp32Init.rph.Status = pRp->rph.Status;
250 rp32Init.rph.Flags = pRp->rph.Flags;
251 rp32Init.rph.Link = (ULONG)pRp->rph.Link;
252 rp32Init.Category = pRp->Category;
253 rp32Init.Function = pRp->Function;
254 rp32Init.sfn = pRp->sfn;
255 rp32Init.DataLen = pRp->DataLen;
256 rp32Init.ParmLen = pRp->ParmLen;
257
258 if (DevHelp_VirtToLin(SELECTOROF(pRp->DataPacket), OFFSETOF(pRp->DataPacket),
259 (PLIN)&rp32Init.DataPacket) != NO_ERROR)
260 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
261 if (DevHelp_VirtToLin(SELECTOROF(pRp->ParmPacket), OFFSETOF(pRp->ParmPacket),
262 (PLIN)&rp32Init.ParmPacket) != NO_ERROR)
263 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
264
265 if (pRp->Category == IOCTL_W32K_ELF)
266 rc = CallElfIOCtl(SSToDS_16a(&rp32Init));
267 else
268 rc = CallWin32kIOCtl(SSToDS_16a(&rp32Init));
269
270 return rc;
271 }
272
273 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
274}
275
Note: See TracBrowser for help on using the repository browser.