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

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

Added Open and Close handling for Win32k.

File size: 10.0 KB
RevLine 
[6220]1/* $Id: d16strat.c,v 1.12 2001-07-08 02:57:42 bird Exp $
[847]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 *
[1678]8 * Project Odin Software License can be found in LICENSE.TXT
9 *
[847]10 */
11
12/*******************************************************************************
13* Defined Constants *
14*******************************************************************************/
15#define INCL_DOSERRORS
16#define INCL_NOPMAPI
17
[4164]18#define NO_WIN32K_LIB_FUNCTIONS
19
[847]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
[4164]32#include "devSegDf.h"
[847]33#include "dev1632.h"
34#include "dev16.h"
[2799]35#include "win32k.h"
[847]36
37
38/*******************************************************************************
39* Global Variables *
40*******************************************************************************/
[6220]41extern DDHDR _far aDevHdrs[2];
[847]42DDHDR aDevHdrs[2] = /* This is the first piece data in the driver!!!!!!! */
43{
44 {
[5283]45 &aDevHdrs[1], /* NextHeader */
[847]46 DEVLEV_3 | DEV_30 | DEV_CHAR_DEV, /* SDevAtt */
47 (unsigned short)(void _near *)strategyAsm0, /* StrategyEP */
48 0, /* InterruptEP */
[1467]49 "elf$ ", /* DevName */
[847]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.
[1467]82 * @param pRpH Pointer to request packed header. (Do not change the pointer!)
[847]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 */
[1467]91 if (fInitTime)
92 {
93 if (usDev == 0)
94 return dev0Init((PRPINITIN)pRpH, (PRPINITOUT)pRpH);
[6220]95 return dev1Init((PRPINITIN)pRpH, (PRPINITOUT)pRpH);
[1467]96 }
97 break;
[847]98
99 case CMDGenIOCTL: /* Generic IOCTL */
100 if (usDev == 0)
101 return dev0GenIOCtl((PRP_GENIOCTL)pRpH);
[6220]102 return dev1GenIOCtl((PRP_GENIOCTL)pRpH);
[847]103
104 case CMDOpen: /* device open */
105 case CMDClose: /* device close */
[6220]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
[847]122 case CMDDeInstall: /* De-Install driver */
123 case CMDShutdown:
124 return STATUS_DONE;
[1467]125 }
[847]126
[1467]127 return STATUS_DONE | STATUS_ERR_UNKCMD;
[847]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 */
[4164]139USHORT NEAR dev0GenIOCtl(PRP_GENIOCTL pRp)
[847]140{
[1467]141 USHORT rc;
[2898]142
[1467]143 if (pRp->Category == D16_IOCTL_CAT)
144 {
145 switch (pRp->Function)
146 {
[2898]147 /*
148 * This is the IOCtl which does the R0-initiation of the device driver.
149 * Only available at init time...
150 */
[1467]151 case D16_IOCTL_RING0INIT:
152 if (fInitTime)
153 {
154 rc = R0Init16(pRp);
155 return rc;
156 }
157 break;
[847]158
[2898]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:
[2877]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;
[2898]175 return CallGetKernelInfo32(ulLin);
[2877]176 }
177 break;
[1467]178
[2898]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:
[1467]187 if (fInitTime)
[2836]188 {
189 if (TKSSBase16 == 0)
190 initGetDosTableData();
[4185]191 rc = CallVerifyImportTab32();
192 if (pRp->DataPacket)
193 ((PD16VERIFYIMPORTTABDATA)pRp->DataPacket)->usRc = rc;
194 return STATUS_DONE;
[2836]195 }
[1467]196 break;
197 }
198 }
[2799]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;
[1467]213
[2799]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
[847]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 */
[4164]240USHORT NEAR dev1GenIOCtl(PRP_GENIOCTL pRp)
[847]241{
[2799]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
[847]273 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
274}
275
Note: See TracBrowser for help on using the repository browser.