|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1993 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: Instdrv.c ! 8: ! 9: Abstract: ! 10: ! 11: A simple Win32 app that installs a device driver ! 12: ! 13: Environment: ! 14: ! 15: user mode only ! 16: ! 17: Notes: ! 18: ! 19: See readme.txt ! 20: ! 21: Revision History: ! 22: ! 23: 06-25-93 : created ! 24: --*/ ! 25: ! 26: ! 27: ! 28: #include <windows.h> ! 29: #include <stdio.h> ! 30: #include <stdlib.h> ! 31: #include <string.h> ! 32: ! 33: ! 34: ! 35: BOOL ! 36: InstallDriver( ! 37: IN SC_HANDLE SchSCManager, ! 38: IN LPCTSTR DriverName, ! 39: IN LPCTSTR ServiceExe ! 40: ); ! 41: ! 42: BOOL ! 43: RemoveDriver( ! 44: IN SC_HANDLE SchSCManager, ! 45: IN LPCTSTR DriverName ! 46: ); ! 47: ! 48: BOOL ! 49: StartDriver( ! 50: IN SC_HANDLE SchSCManager, ! 51: IN LPCTSTR DriverName ! 52: ); ! 53: ! 54: BOOL ! 55: StopDriver( ! 56: IN SC_HANDLE SchSCManager, ! 57: IN LPCTSTR DriverName ! 58: ); ! 59: ! 60: BOOL ! 61: OpenDevice( ! 62: IN LPCTSTR DriverName ! 63: ); ! 64: ! 65: ! 66: ! 67: VOID ! 68: main( ! 69: IN int argc, ! 70: IN char *argv[] ! 71: ) ! 72: /*++ ! 73: ! 74: Routine Description: ! 75: ! 76: Arguments: ! 77: ! 78: Return Value: ! 79: ! 80: --*/ ! 81: { ! 82: SC_HANDLE schSCManager; ! 83: ! 84: if (argc != 3) ! 85: { ! 86: char currentDirectory[128]; ! 87: ! 88: printf ("usage: instdrv <driver name> <.sys location>\n"); ! 89: printf (" to install a kernel-mode device driver, or:\n"); ! 90: printf (" instdrv <driver name> remove\n"); ! 91: printf (" to remove a kernel-mode device driver\n\n"); ! 92: ! 93: GetCurrentDirectory (128, ! 94: currentDirectory ! 95: ); ! 96: ! 97: printf (" Example: instdrv simpldrv %s\\obj\\i386\\simpldrv.sys\n", ! 98: currentDirectory ! 99: ); ! 100: ! 101: exit (1); ! 102: } ! 103: ! 104: schSCManager = OpenSCManager (NULL, // machine (NULL == local) ! 105: NULL, // database (NULL == default) ! 106: SC_MANAGER_ALL_ACCESS // access required ! 107: ); ! 108: ! 109: if (!stricmp (argv[2], ! 110: "remove" ! 111: )) ! 112: { ! 113: StopDriver (schSCManager, ! 114: argv[1] ! 115: ); ! 116: ! 117: RemoveDriver (schSCManager, ! 118: argv[1] ! 119: ); ! 120: } ! 121: else ! 122: { ! 123: InstallDriver (schSCManager, ! 124: argv[1], ! 125: argv[2] ! 126: ); ! 127: ! 128: StartDriver (schSCManager, ! 129: argv[1] ! 130: ); ! 131: ! 132: OpenDevice (argv[1]); ! 133: ! 134: } ! 135: ! 136: CloseServiceHandle (schSCManager); ! 137: } ! 138: ! 139: ! 140: ! 141: BOOL ! 142: InstallDriver( ! 143: IN SC_HANDLE SchSCManager, ! 144: IN LPCTSTR DriverName, ! 145: IN LPCTSTR ServiceExe ! 146: ) ! 147: /*++ ! 148: ! 149: Routine Description: ! 150: ! 151: Arguments: ! 152: ! 153: Return Value: ! 154: ! 155: --*/ ! 156: { ! 157: SC_HANDLE schService; ! 158: DWORD err; ! 159: ! 160: ! 161: ! 162: // ! 163: // NOTE: This creates an entry for a standalone driver. If this ! 164: // is modified for use with a driver that requires a Tag, ! 165: // Group, and/or Dependencies, it may be necessary to ! 166: // query the registry for existing driver information ! 167: // (in order to determine a unique Tag, etc.). ! 168: // ! 169: ! 170: schService = CreateService (SchSCManager, // SCManager database ! 171: DriverName, // name of service ! 172: DriverName, // name to display ! 173: SERVICE_ALL_ACCESS, // desired access ! 174: SERVICE_KERNEL_DRIVER, // service type ! 175: SERVICE_DEMAND_START, // start type ! 176: SERVICE_ERROR_NORMAL, // error control type ! 177: ServiceExe, // service's binary ! 178: NULL, // no load ordering group ! 179: NULL, // no tag identifier ! 180: NULL, // no dependencies ! 181: NULL, // LocalSystem account ! 182: NULL // no password ! 183: ); ! 184: ! 185: if (schService == NULL) ! 186: { ! 187: err = GetLastError(); ! 188: ! 189: if (err == ERROR_SERVICE_EXISTS) ! 190: { ! 191: // ! 192: // A common cause of failure (easier to read than an error code) ! 193: // ! 194: ! 195: printf ("failure: CreateService, ERROR_SERVICE_EXISTS\n"); ! 196: } ! 197: else ! 198: { ! 199: printf ("failure: CreateService (0x%02x)\n", ! 200: err ! 201: ); ! 202: } ! 203: ! 204: return FALSE; ! 205: } ! 206: else ! 207: { ! 208: printf ("CreateService SUCCESS\n"); ! 209: } ! 210: ! 211: CloseServiceHandle (schService); ! 212: ! 213: return TRUE; ! 214: } ! 215: ! 216: ! 217: ! 218: BOOL ! 219: RemoveDriver( ! 220: IN SC_HANDLE SchSCManager, ! 221: IN LPCTSTR DriverName ! 222: ) ! 223: /*++ ! 224: ! 225: Routine Description: ! 226: ! 227: Arguments: ! 228: ! 229: Return Value: ! 230: ! 231: --*/ ! 232: { ! 233: SC_HANDLE schService; ! 234: BOOL ret; ! 235: ! 236: schService = OpenService (SchSCManager, ! 237: DriverName, ! 238: SERVICE_ALL_ACCESS ! 239: ); ! 240: ! 241: if (schService == NULL) ! 242: { ! 243: printf ("failure: OpenService (0x%02x)\n", GetLastError()); ! 244: return FALSE; ! 245: } ! 246: ! 247: ret = DeleteService (schService); ! 248: ! 249: if (ret) ! 250: { ! 251: printf ("DeleteService SUCCESS\n"); ! 252: } ! 253: else ! 254: { ! 255: printf ("failure: DeleteService (0x%02x)\n", ! 256: GetLastError() ! 257: ); ! 258: } ! 259: ! 260: CloseServiceHandle (schService); ! 261: ! 262: return ret; ! 263: } ! 264: ! 265: ! 266: ! 267: BOOL ! 268: StartDriver( ! 269: IN SC_HANDLE SchSCManager, ! 270: IN LPCTSTR DriverName ! 271: ) ! 272: { ! 273: SC_HANDLE schService; ! 274: BOOL ret; ! 275: DWORD err; ! 276: ! 277: schService = OpenService (SchSCManager, ! 278: DriverName, ! 279: SERVICE_ALL_ACCESS ! 280: ); ! 281: ! 282: if (schService == NULL) ! 283: { ! 284: printf ("failure: OpenService (0x%02x)\n", GetLastError()); ! 285: return FALSE; ! 286: } ! 287: ! 288: ret = StartService (schService, // service identifier ! 289: 0, // number of arguments ! 290: NULL // pointer to arguments ! 291: ); ! 292: if (ret) ! 293: { ! 294: printf ("StartService SUCCESS\n"); ! 295: } ! 296: else ! 297: { ! 298: err = GetLastError(); ! 299: ! 300: if (err == ERROR_SERVICE_ALREADY_RUNNING) ! 301: { ! 302: // ! 303: // A common cause of failure (easier to read than an error code) ! 304: // ! 305: ! 306: printf ("failure: StartService, ERROR_SERVICE_ALREADY_RUNNING\n"); ! 307: } ! 308: else ! 309: { ! 310: printf ("failure: StartService (0x%02x)\n", ! 311: err ! 312: ); ! 313: } ! 314: } ! 315: ! 316: CloseServiceHandle (schService); ! 317: ! 318: return ret; ! 319: } ! 320: ! 321: ! 322: ! 323: BOOL ! 324: StopDriver( ! 325: IN SC_HANDLE SchSCManager, ! 326: IN LPCTSTR DriverName ! 327: ) ! 328: { ! 329: SC_HANDLE schService; ! 330: BOOL ret; ! 331: SERVICE_STATUS serviceStatus; ! 332: ! 333: schService = OpenService (SchSCManager, ! 334: DriverName, ! 335: SERVICE_ALL_ACCESS ! 336: ); ! 337: ! 338: if (schService == NULL) ! 339: { ! 340: printf ("failure: OpenService (0x%02x)\n", GetLastError()); ! 341: return FALSE; ! 342: } ! 343: ! 344: ret = ControlService (schService, ! 345: SERVICE_CONTROL_STOP, ! 346: &serviceStatus ! 347: ); ! 348: if (ret) ! 349: { ! 350: printf ("ControlService SUCCESS\n"); ! 351: } ! 352: else ! 353: { ! 354: printf ("failure: ControlService (0x%02x)\n", ! 355: GetLastError() ! 356: ); ! 357: } ! 358: ! 359: CloseServiceHandle (schService); ! 360: ! 361: return ret; ! 362: } ! 363: ! 364: ! 365: ! 366: BOOL ! 367: OpenDevice( ! 368: IN LPCTSTR DriverName ! 369: ) ! 370: { ! 371: char completeDeviceName[64] = ""; ! 372: LPCTSTR dosDeviceName = DriverName; ! 373: HANDLE hDevice; ! 374: BOOL ret; ! 375: ! 376: ! 377: ! 378: // ! 379: // Create a \\.\XXX device name that CreateFile can use ! 380: // ! 381: // NOTE: We're making an assumption here that the driver ! 382: // has created a symbolic link using it's own name ! 383: // (i.e. if the driver has the name "XXX" we assume ! 384: // that it used IoCreateSymbolicLink to create a ! 385: // symbolic link "\DosDevices\XXX". Usually, there ! 386: // is this understanding between related apps/drivers. ! 387: // ! 388: // An application might also peruse the DEVICEMAP ! 389: // section of the registry, or use the QueryDosDevice ! 390: // API to enumerate the existing symbolic links in the ! 391: // system. ! 392: // ! 393: ! 394: strcat (completeDeviceName, ! 395: "\\\\.\\" ! 396: ); ! 397: ! 398: strcat (completeDeviceName, ! 399: dosDeviceName ! 400: ); ! 401: ! 402: hDevice = CreateFile (completeDeviceName, ! 403: GENERIC_READ | GENERIC_WRITE, ! 404: 0, ! 405: NULL, ! 406: OPEN_EXISTING, ! 407: FILE_ATTRIBUTE_NORMAL, ! 408: NULL ! 409: ); ! 410: ! 411: if (hDevice == ((HANDLE)-1)) ! 412: { ! 413: printf ("Can't get a handle to %s\n", ! 414: completeDeviceName ! 415: ); ! 416: ! 417: ret = FALSE; ! 418: } ! 419: else ! 420: { ! 421: printf ("CreateFile SUCCESS\n"); ! 422: ! 423: CloseHandle (hDevice); ! 424: ! 425: ret = TRUE; ! 426: } ! 427: ! 428: return ret; ! 429: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.