|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1991, Microsoft Corporation
4:
5: Module Name:
6:
7: ioctlvdd.c
8:
9: Abstract:
10:
11: Virtual Device Driver for DOSIOCTL sample
12:
13: Environment:
14:
15: NT-MVDM (User Mode VDD)
16:
17: Notes:
18:
19: This VDD presents a private interface for the DOSDRVR component
20: of the DOSIOCTL sample. The three functions (OPEN, CLOSE, INFO)
21: correspond to calls that the DOSAPP in the sample makes. To show
22: how nicely symetrical a VDD can be architected, this VDD simply
23: converts each of these calls made by the DOS device driver into
24: NT-kernel device driver calls using WIN32 functions.
25:
26: Thus, when the DOS application of the sample issues a DOS OPEN,
27: the DOS driver gets the request and calls our entry point with
28: the VDD's VDDOPEN call. The VDD then calls the Win32 function
29: CreateFile() to get a handle to the NT driver in the sample.
30:
31: When the DOS application does an IOCTL read, the DOS driver
32: calls VDDINFO, which issues a Win32 DeviceIOControl() to the
33: NT driver, after getting a flat address for the application's
34: buffer.
35:
36: Finally, the DOSAPP's CLOSE is translated similarly to a WIN32
37: CloseHandle().
38:
39: Note that the functions VDDOPEN, VDDCLOSE and VDDINFO are not
40: architected in the NT VDD interface, and were invented just for
41: this sample. The interface between the DOS driver and the VDD
42: could have been defined completely differently. This VDD was
43: coded only to show one possibility for designing a VDD interface.
44:
45:
46: --*/
47:
48:
49: #include "ioctlvdd.h"
50: #include "devioctl.h"
51:
52:
53: BOOL
54: VDDInitialize(
55: HANDLE hVdd,
56: DWORD dwReason,
57: LPVOID lpReserved
58: )
59:
60: /*++
61:
62: Routine Description:
63:
64: The entry point for the Vdd which handles intialization and termination.
65:
66: Arguments:
67:
68: hVdd - The handle to the VDD
69:
70: Reason - flag word that indicates why Dll Entry Point was invoked
71:
72: lpReserved - Unused
73:
74: Return Value:
75: BOOL bRet - if (dwReason == DLL_PROCESS_ATTACH)
76: TRUE - Dll Intialization successful
77: FALSE - Dll Intialization failed
78: else
79: always returns TRUE
80: --*/
81:
82: {
83: HANDLE hDriver;
84:
85: switch ( dwReason ) {
86:
87: case DLL_PROCESS_ATTACH:
88:
89:
90: //
91: // The following call is here only to test the existence of
92: // the KRNLDRVR component. If it isn't there, then there is
93: // no reason to load.
94: //
95:
96: hDriver = CreateFile("\\\\.\\krnldrvr", /* open KRNLDRVR */
97: GENERIC_READ | GENERIC_WRITE, /* open for r/w */
98: 0, /* can't share */
99: (LPSECURITY_ATTRIBUTES) NULL, /* no security */
100: OPEN_EXISTING, /* existing file only */
101: FILE_FLAG_OVERLAPPED, /* overlapped I/O */
102: (HANDLE) NULL); /* no attr template */
103:
104: if (hDriver == INVALID_HANDLE_VALUE) {
105: MessageBox (NULL, "Unable to locate Kernel driver",
106: "Sample VDD", MB_OK | MB_ICONEXCLAMATION);
107: return FALSE; /* Abort load */
108: }
109:
110: //
111: // The call to CreateFile succeeded, close the handle again
112: //
113:
114: CloseHandle (hDriver);
115:
116: break;
117:
118: default:
119:
120: break;
121:
122: }
123:
124: return TRUE;
125:
126: }
127:
128:
129:
130: VOID
131: VDDRegisterInit(
132: VOID
133: )
134: /*++
135:
136: Arguments:
137:
138: Return Value:
139:
140: SUCCESS - Client Carry Clear
141: FAILURE - Client Carry Set
142:
143: --*/
144:
145:
146: {
147: // This routine is called when the DOSDRVR issues the RegisterModule
148: // call.
149:
150: setCF(0);
151: return;
152: }
153:
154:
155:
156: VOID
157: VDDDispatch(
158: VOID
159: )
160: /*++
161:
162: Routine Description:
163:
164: This subroutine implements the funcionality of the VDD. It handles
165: client VDM calls from the DOS driver. The operation is as follows:
166:
167: VDDOPEN - Issue Win32 CreateFile() to "krnldrvr"
168: VDDINFO - Issue Win32 DeviceIoControl() to "krnldrvr"
169: VDDCLOSE - Issue Win32 CloseHandle()
170:
171: Arguments:
172:
173: Client (DX) = Command code (VDDOPEN, VDDCLOSE, VDDINFO)
174:
175: For VDDINFO:
176: Client (ES:DI) = IOCTL Read Buffer address
177: Client (CX) = Buffer Size
178:
179: Return Value:
180:
181: SUCCESS - Client Carry Clear
182: FAILURE - Client Carry Set
183:
184: --*/
185:
186:
187: {
188: LPVOID Buffer;
189: ULONG VDMAddress;
190: DWORD dwCount;
191: BOOL Success = TRUE;
192: DWORD BytesReturned;
193: static HANDLE hDriver = INVALID_HANDLE_VALUE;
194:
195: switch (getDX()) {
196:
197: case VDDOPEN:
198:
199: hDriver = CreateFile("\\\\.\\krnldrvr", /* open KRNLDRVR */
200: GENERIC_READ | GENERIC_WRITE, /* open for r/w */
201: 0, /* can't share */
202: (LPSECURITY_ATTRIBUTES) NULL, /* no security */
203: OPEN_EXISTING, /* existing file only */
204: 0, /* flags */
205: (HANDLE) NULL); /* no attr template */
206:
207: if (hDriver == INVALID_HANDLE_VALUE) {
208: setCF(1);
209: } else
210: setCF(0);
211:
212: break;
213:
214: case VDDCLOSE:
215:
216: if (hDriver != INVALID_HANDLE_VALUE) {
217: CloseHandle (hDriver);
218: hDriver = INVALID_HANDLE_VALUE;
219: }
220:
221: break;
222:
223: case VDDINFO:
224:
225: dwCount = (DWORD) getCX();
226:
227: VDMAddress = (ULONG) (getES()<<16 | getDI());
228:
229: Buffer = (LPVOID) GetVDMPointer (VDMAddress, dwCount, FALSE);
230:
231: Success = DeviceIoControl (hDriver,
232: (DWORD) IOCTL_KRNLDRVR_GET_INFORMATION,
233: (LPVOID) NULL, 0,
234: Buffer, dwCount,
235: &BytesReturned, (LPVOID) NULL);
236:
237: if (Success) {
238: setCF(0);
239: setCX((WORD)BytesReturned);
240: } else
241: setCF(1);
242:
243: FreeVDMPointer (VDMAddress, dwCount, Buffer, FALSE);
244:
245: break;
246:
247: default:
248: setCF(1);
249: }
250: return;
251: }
252:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.