|
|
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.