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

Last change on this file since 2832 was 2832, checked in by bird, 26 years ago

16-bit imports and import of global variables.
(But there are some problems left)

File size: 8.3 KB
Line 
1/* $Id: d16strat.c,v 1.5 2000-02-20 04:27:22 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/*******************************************************************************
19* Header Files *
20*******************************************************************************/
21#include <os2.h>
22#include <devhdr.h>
23#include <devcmd.h>
24#include <strat2.h>
25#include <reqpkt.h>
26#include <dhcalls.h>
27
28/* Note that C-library function are only allowed during init! */
29
30#include "dev1632.h"
31#include "dev16.h"
32#include "win32k.h"
33
34
35/*******************************************************************************
36* Global Variables *
37*******************************************************************************/
38DDHDR aDevHdrs[2] = /* This is the first piece data in the driver!!!!!!! */
39{
40 {
41 (unsigned long)(void _far *)(&aDevHdrs[1]), /* NextHeader */
42 DEVLEV_3 | DEV_30 | DEV_CHAR_DEV, /* SDevAtt */
43 (unsigned short)(void _near *)strategyAsm0, /* StrategyEP */
44 0, /* InterruptEP */
45 "elf$ ", /* DevName */
46 0, /* SDevProtCS */
47 0, /* SDevProtDS */
48 0, /* SDevRealCS */
49 0, /* SDevRealDS */
50 DEV_16MB | DEV_IOCTL2 /* SDevCaps */
51 },
52 {
53 ~0UL, /* NextHeader */
54 DEVLEV_3 | DEV_30 | DEV_CHAR_DEV, /* SDevAtt */
55 (unsigned short)(void _near *)strategyAsm1, /* StrategyEP */
56 0, /* InterruptEP */
57 "win32k$ ", /* DevName */
58 0, /* SDevProtCS */
59 0, /* SDevProtDS */
60 0, /* SDevRealCS */
61 0, /* SDevRealDS */
62 DEV_16MB | DEV_IOCTL2 /* SDevCaps */
63 }
64};
65
66/* Note: All global variables must be initialized! *
67 * Uninitialized variables ends up in DATA32. */
68PFN Device_Help = NULL;
69ULONG TKSSBase16 = 0;
70USHORT R0FlatCS16 = 0;
71USHORT R0FlatDS16 = 0;
72BOOL fInitTime = TRUE;
73
74
75/*******************************************************************************
76* Internal Functions *
77*******************************************************************************/
78USHORT NEAR dev0GenIOCtl(PRP_GENIOCTL pRp);
79USHORT NEAR dev1GenIOCtl(PRP_GENIOCTL pRp);
80
81
82/**
83 * Strategy routine.
84 * @returns Status word.
85 * @param pRpH Pointer to request packed header. (Do not change the pointer!)
86 * @parma usDev Device number.
87 * @remark This function is called from the entrypoint in dev1st.asm
88 */
89USHORT NEAR strategy(PRPH pRpH, unsigned short usDev)
90{
91 switch (pRpH->Cmd)
92 {
93 case CMDInit: /* INIT command */
94 if (fInitTime)
95 {
96 if (usDev == 0)
97 return dev0Init((PRPINITIN)pRpH, (PRPINITOUT)pRpH);
98 else
99 return dev1Init((PRPINITIN)pRpH, (PRPINITOUT)pRpH);
100 }
101 break;
102
103 case CMDGenIOCTL: /* Generic IOCTL */
104 if (usDev == 0)
105 return dev0GenIOCtl((PRP_GENIOCTL)pRpH);
106 else
107 return dev1GenIOCtl((PRP_GENIOCTL)pRpH);
108
109 case CMDOpen: /* device open */
110 case CMDClose: /* device close */
111 case CMDDeInstall: /* De-Install driver */
112 case CMDShutdown:
113 return STATUS_DONE;
114 }
115
116 return STATUS_DONE | STATUS_ERR_UNKCMD;
117}
118
119extern char end;
120
121
122/**
123 * Generic I/O Control - device 0.
124 * This will only handle the request for Ring-0 initiation.
125 * @returns Status word.
126 * @param pRp Request packet.
127 */
128USHORT dev0GenIOCtl(PRP_GENIOCTL pRp)
129{
130 USHORT rc;
131 if (pRp->Category == D16_IOCTL_CAT)
132 {
133 switch (pRp->Function)
134 {
135 case D16_IOCTL_RING0INIT:
136 if (fInitTime)
137 {
138 rc = R0Init16(pRp);
139 fInitTime = FALSE;
140 return rc;
141 }
142 break;
143
144 case D16_IOCTL_GETKRNLOTES:
145 {
146 ULONG ulLin;
147 if (DevHelp_VirtToLin(SELECTOROF(pRp->DataPacket), OFFSETOF(pRp->DataPacket),
148 &ulLin) != NO_ERROR)
149 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
150 return CallGetOTEs32(ulLin);
151 }
152
153 case D16_IOCTL_VERIFYPROCTAB:
154 if (fInitTime)
155 return CallVerifyImportTab32();
156 break;
157 }
158 }
159 else if (pRp->Category == IOCTL_W32K_K32 || pRp->Category == IOCTL_W32K_ELF)
160 {
161 RP32GENIOCTL rp32Init = {0};
162 rp32Init.rph.Len = pRp->rph.Len;
163 rp32Init.rph.Unit = pRp->rph.Unit;
164 rp32Init.rph.Cmd = pRp->rph.Cmd;
165 rp32Init.rph.Status = pRp->rph.Status;
166 rp32Init.rph.Flags = pRp->rph.Flags;
167 rp32Init.rph.Link = (ULONG)pRp->rph.Link;
168 rp32Init.Category = pRp->Category;
169 rp32Init.Function = pRp->Function;
170 rp32Init.sfn = pRp->sfn;
171 rp32Init.DataLen = pRp->DataLen;
172 rp32Init.ParmLen = pRp->ParmLen;
173
174 if (DevHelp_VirtToLin(SELECTOROF(pRp->DataPacket), OFFSETOF(pRp->DataPacket),
175 (PLIN)&rp32Init.DataPacket) != NO_ERROR)
176 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
177 if (DevHelp_VirtToLin(SELECTOROF(pRp->ParmPacket), OFFSETOF(pRp->ParmPacket),
178 (PLIN)&rp32Init.ParmPacket) != NO_ERROR)
179 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
180
181 if (pRp->Category == IOCTL_W32K_ELF)
182 rc = CallElfIOCtl(SSToDS_16a(&rp32Init));
183 else
184 rc = CallWin32kIOCtl(SSToDS_16a(&rp32Init));
185
186 return rc;
187 }
188
189
190 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
191}
192
193
194/**
195 * Generic I/O Control - device 0.
196 * This will forward requests to 32-bit counterpart.
197 * @returns Status word.
198 * @param pRp Request packet.
199 */
200USHORT dev1GenIOCtl(PRP_GENIOCTL pRp)
201{
202 if (pRp->Category == IOCTL_W32K_K32 || pRp->Category == IOCTL_W32K_ELF)
203 {
204 USHORT rc;
205 RP32GENIOCTL rp32Init = {0};
206 rp32Init.rph.Len = pRp->rph.Len;
207 rp32Init.rph.Unit = pRp->rph.Unit;
208 rp32Init.rph.Cmd = pRp->rph.Cmd;
209 rp32Init.rph.Status = pRp->rph.Status;
210 rp32Init.rph.Flags = pRp->rph.Flags;
211 rp32Init.rph.Link = (ULONG)pRp->rph.Link;
212 rp32Init.Category = pRp->Category;
213 rp32Init.Function = pRp->Function;
214 rp32Init.sfn = pRp->sfn;
215 rp32Init.DataLen = pRp->DataLen;
216 rp32Init.ParmLen = pRp->ParmLen;
217
218 if (DevHelp_VirtToLin(SELECTOROF(pRp->DataPacket), OFFSETOF(pRp->DataPacket),
219 (PLIN)&rp32Init.DataPacket) != NO_ERROR)
220 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
221 if (DevHelp_VirtToLin(SELECTOROF(pRp->ParmPacket), OFFSETOF(pRp->ParmPacket),
222 (PLIN)&rp32Init.ParmPacket) != NO_ERROR)
223 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
224
225 if (pRp->Category == IOCTL_W32K_ELF)
226 rc = CallElfIOCtl(SSToDS_16a(&rp32Init));
227 else
228 rc = CallWin32kIOCtl(SSToDS_16a(&rp32Init));
229
230 return rc;
231 }
232
233 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
234}
235
Note: See TracBrowser for help on using the repository browser.