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

Last change on this file since 5655 was 5283, checked in by bird, 24 years ago

Fixed CL compiler bugs.
And new toolkit boog.

File size: 9.3 KB
Line 
1/* $Id: d16strat.c,v 1.11 2001-03-02 12:48:41 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 else
96 return dev1Init((PRPINITIN)pRpH, (PRPINITOUT)pRpH);
97 }
98 break;
99
100 case CMDGenIOCTL: /* Generic IOCTL */
101 if (usDev == 0)
102 return dev0GenIOCtl((PRP_GENIOCTL)pRpH);
103 else
104 return dev1GenIOCtl((PRP_GENIOCTL)pRpH);
105
106 case CMDOpen: /* device open */
107 case CMDClose: /* device close */
108 case CMDDeInstall: /* De-Install driver */
109 case CMDShutdown:
110 return STATUS_DONE;
111 }
112
113 return STATUS_DONE | STATUS_ERR_UNKCMD;
114}
115
116extern char end;
117
118
119/**
120 * Generic I/O Control - device 0.
121 * This will only handle the request for Ring-0 initiation.
122 * @returns Status word.
123 * @param pRp Request packet.
124 */
125USHORT NEAR dev0GenIOCtl(PRP_GENIOCTL pRp)
126{
127 USHORT rc;
128
129 if (pRp->Category == D16_IOCTL_CAT)
130 {
131 switch (pRp->Function)
132 {
133 /*
134 * This is the IOCtl which does the R0-initiation of the device driver.
135 * Only available at init time...
136 */
137 case D16_IOCTL_RING0INIT:
138 if (fInitTime)
139 {
140 rc = R0Init16(pRp);
141 return rc;
142 }
143 break;
144
145 /*
146 * This is the IOCtl collects info of the running kernel.
147 * Only available at init time.
148 *
149 * Since this IOCtl is issued before R0-Init is done, we'll have to
150 * init TKSSBase for both 16-bit and 32-bit code and be a bit carefull.
151 */
152 case D16_IOCTL_GETKRNLINFO:
153 if (fInitTime)
154 {
155 ULONG ulLin;
156 if (fInitTime && TKSSBase16 == 0)
157 initGetDosTableData();
158 if (DevHelp_VirtToLin(SELECTOROF(pRp->DataPacket), OFFSETOF(pRp->DataPacket),
159 &ulLin) != NO_ERROR)
160 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
161 return CallGetKernelInfo32(ulLin);
162 }
163 break;
164
165 /*
166 * This is the IOCtl verifies the data in the ImportTab.
167 * Only available at init time.
168 *
169 * Since this IOCtl is issued before R0-Init is done, we'll have to
170 * init TKSSBase for both 16-bit and 32-bit code and be a bit carefull.
171 */
172 case D16_IOCTL_VERIFYIMPORTTAB:
173 if (fInitTime)
174 {
175 if (TKSSBase16 == 0)
176 initGetDosTableData();
177 rc = CallVerifyImportTab32();
178 if (pRp->DataPacket)
179 ((PD16VERIFYIMPORTTABDATA)pRp->DataPacket)->usRc = rc;
180 return STATUS_DONE;
181 }
182 break;
183 }
184 }
185 else if (pRp->Category == IOCTL_W32K_K32 || pRp->Category == IOCTL_W32K_ELF)
186 {
187 RP32GENIOCTL rp32Init = {0};
188 rp32Init.rph.Len = pRp->rph.Len;
189 rp32Init.rph.Unit = pRp->rph.Unit;
190 rp32Init.rph.Cmd = pRp->rph.Cmd;
191 rp32Init.rph.Status = pRp->rph.Status;
192 rp32Init.rph.Flags = pRp->rph.Flags;
193 rp32Init.rph.Link = (ULONG)pRp->rph.Link;
194 rp32Init.Category = pRp->Category;
195 rp32Init.Function = pRp->Function;
196 rp32Init.sfn = pRp->sfn;
197 rp32Init.DataLen = pRp->DataLen;
198 rp32Init.ParmLen = pRp->ParmLen;
199
200 if (DevHelp_VirtToLin(SELECTOROF(pRp->DataPacket), OFFSETOF(pRp->DataPacket),
201 (PLIN)&rp32Init.DataPacket) != NO_ERROR)
202 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
203 if (DevHelp_VirtToLin(SELECTOROF(pRp->ParmPacket), OFFSETOF(pRp->ParmPacket),
204 (PLIN)&rp32Init.ParmPacket) != NO_ERROR)
205 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
206
207 if (pRp->Category == IOCTL_W32K_ELF)
208 rc = CallElfIOCtl(SSToDS_16a(&rp32Init));
209 else
210 rc = CallWin32kIOCtl(SSToDS_16a(&rp32Init));
211
212 return rc;
213 }
214
215
216 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
217}
218
219
220/**
221 * Generic I/O Control - device 0.
222 * This will forward requests to 32-bit counterpart.
223 * @returns Status word.
224 * @param pRp Request packet.
225 */
226USHORT NEAR dev1GenIOCtl(PRP_GENIOCTL pRp)
227{
228 if (pRp->Category == IOCTL_W32K_K32 || pRp->Category == IOCTL_W32K_ELF)
229 {
230 USHORT rc;
231 RP32GENIOCTL rp32Init = {0};
232 rp32Init.rph.Len = pRp->rph.Len;
233 rp32Init.rph.Unit = pRp->rph.Unit;
234 rp32Init.rph.Cmd = pRp->rph.Cmd;
235 rp32Init.rph.Status = pRp->rph.Status;
236 rp32Init.rph.Flags = pRp->rph.Flags;
237 rp32Init.rph.Link = (ULONG)pRp->rph.Link;
238 rp32Init.Category = pRp->Category;
239 rp32Init.Function = pRp->Function;
240 rp32Init.sfn = pRp->sfn;
241 rp32Init.DataLen = pRp->DataLen;
242 rp32Init.ParmLen = pRp->ParmLen;
243
244 if (DevHelp_VirtToLin(SELECTOROF(pRp->DataPacket), OFFSETOF(pRp->DataPacket),
245 (PLIN)&rp32Init.DataPacket) != NO_ERROR)
246 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
247 if (DevHelp_VirtToLin(SELECTOROF(pRp->ParmPacket), OFFSETOF(pRp->ParmPacket),
248 (PLIN)&rp32Init.ParmPacket) != NO_ERROR)
249 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
250
251 if (pRp->Category == IOCTL_W32K_ELF)
252 rc = CallElfIOCtl(SSToDS_16a(&rp32Init));
253 else
254 rc = CallWin32kIOCtl(SSToDS_16a(&rp32Init));
255
256 return rc;
257 }
258
259 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
260}
261
Note: See TracBrowser for help on using the repository browser.