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

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

Corrections to make win32k work.
(And now it does work, at least at my test machine...)

File size: 5.7 KB
Line 
1/* $Id: d16strat.c,v 1.2 1999-10-27 02:02:53 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 */
9
10/*******************************************************************************
11* Defined Constants *
12*******************************************************************************/
13#define INCL_DOSERRORS
14#define INCL_NOPMAPI
15
16/*******************************************************************************
17* Header Files *
18*******************************************************************************/
19#include <os2.h>
20#include <devhdr.h>
21#include <devcmd.h>
22#include <strat2.h>
23#include <reqpkt.h>
24#include <dhcalls.h>
25
26/* Note that C-library function are only allowed during init! */
27
28#include "dev1632.h"
29#include "dev16.h"
30
31
32/*******************************************************************************
33* Global Variables *
34*******************************************************************************/
35DDHDR aDevHdrs[2] = /* This is the first piece data in the driver!!!!!!! */
36{
37 {
38 (unsigned long)(void _far *)(&aDevHdrs[1]), /* NextHeader */
39 DEVLEV_3 | DEV_30 | DEV_CHAR_DEV, /* SDevAtt */
40 (unsigned short)(void _near *)strategyAsm0, /* StrategyEP */
41 0, /* InterruptEP */
42 "elf$ ", /* DevName */
43 0, /* SDevProtCS */
44 0, /* SDevProtDS */
45 0, /* SDevRealCS */
46 0, /* SDevRealDS */
47 DEV_16MB | DEV_IOCTL2 /* SDevCaps */
48 },
49 {
50 ~0UL, /* NextHeader */
51 DEVLEV_3 | DEV_30 | DEV_CHAR_DEV, /* SDevAtt */
52 (unsigned short)(void _near *)strategyAsm1, /* StrategyEP */
53 0, /* InterruptEP */
54 "win32k$ ", /* DevName */
55 0, /* SDevProtCS */
56 0, /* SDevProtDS */
57 0, /* SDevRealCS */
58 0, /* SDevRealDS */
59 DEV_16MB | DEV_IOCTL2 /* SDevCaps */
60 }
61};
62
63/* Note: All global variables must be initialized! *
64 * Uninitialized variables ends up in DATA32. */
65PFN Device_Help = NULL;
66ULONG TKSSBase16 = 0;
67USHORT R0FlatCS16 = 0;
68USHORT R0FlatDS16 = 0;
69BOOL fInitTime = TRUE;
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
89 switch (pRpH->Cmd)
90 {
91 case CMDInit: /* INIT command */
92 if (fInitTime)
93 {
94 if (usDev == 0)
95 return dev0Init((PRPINITIN)pRpH, (PRPINITOUT)pRpH);
96 else
97 return dev1Init((PRPINITIN)pRpH, (PRPINITOUT)pRpH);
98 }
99 break;
100
101 case CMDGenIOCTL: /* Generic IOCTL */
102 if (usDev == 0)
103 return dev0GenIOCtl((PRP_GENIOCTL)pRpH);
104 else
105 return dev1GenIOCtl((PRP_GENIOCTL)pRpH);
106
107 case CMDOpen: /* device open */
108 case CMDClose: /* device close */
109 case CMDDeInstall: /* De-Install driver */
110 case CMDShutdown:
111 return STATUS_DONE;
112 }
113
114 return STATUS_DONE | STATUS_ERR_UNKCMD;
115}
116
117extern char end;
118
119
120/**
121 * Generic I/O Control - device 0.
122 * This will only handle the request for Ring-0 initiation.
123 * @returns Status word.
124 * @param pRp Request packet.
125 */
126USHORT dev0GenIOCtl(PRP_GENIOCTL pRp)
127{
128 USHORT rc;
129 if (pRp->Category == D16_IOCTL_CAT)
130 {
131 switch (pRp->Function)
132 {
133 case D16_IOCTL_RING0INIT:
134 if (fInitTime)
135 {
136 rc = R0Init16(pRp);
137 fInitTime = FALSE;
138 return rc;
139 }
140 break;
141
142 case D16_IOCTL_GETKRNLOTES:
143 {
144 ULONG ulLin;
145 if (DevHelp_VirtToLin(SELECTOROF(pRp->DataPacket), OFFSETOF(pRp->DataPacket), &ulLin) != NO_ERROR)
146 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
147 return CallGetOTEs32(ulLin);
148 }
149
150 case D16_IOCTL_VERIFYPROCTAB:
151 if (fInitTime)
152 return CallVerifyProcTab32();
153 break;
154 }
155 }
156
157 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
158}
159
160
161/**
162 * Generic I/O Control - device 0.
163 * This will forward requests to 32-bit counterpart.
164 * @returns Status word.
165 * @param pRp Request packet.
166 */
167USHORT dev1GenIOCtl(PRP_GENIOCTL pRp)
168{
169 pRp = pRp;
170 return STATUS_DONE | STERR | ERROR_I24_INVALID_PARAMETER;
171}
172
Note: See TracBrowser for help on using the repository browser.