| /**************************************************************************** |
| * |
| * SciTech Display Doctor |
| * |
| * Copyright (C) 1991-2001 SciTech Software, Inc. |
| * All rights reserved. |
| * |
| * ====================================================================== |
| * |REMOVAL OR MODIFICATION OF THIS HEADER IS STRICTLY PROHIBITED BY LAW| |
| * | | |
| * |This copyrighted computer code is a proprietary trade secret of | |
| * |SciTech Software, Inc., located at 505 Wall Street, Chico, CA 95928 | |
| * |USA (www.scitechsoft.com). ANY UNAUTHORIZED POSSESSION, USE, | |
| * |VIEWING, COPYING, MODIFICATION OR DISSEMINATION OF THIS CODE IS | |
| * |STRICTLY PROHIBITED BY LAW. Unless you have current, express | |
| * |written authorization from SciTech to possess or use this code, you | |
| * |may be subject to civil and/or criminal penalties. | |
| * | | |
| * |If you received this code in error or you would like to report | |
| * |improper use, please immediately contact SciTech Software, Inc. at | |
| * |530-894-8400. | |
| * | | |
| * |REMOVAL OR MODIFICATION OF THIS HEADER IS STRICTLY PROHIBITED BY LAW| |
| * ====================================================================== |
| * |
| * Language: ANSI C |
| * Environment: Windows NT, Windows 2K or Windows XP. |
| * |
| * Description: Main module to do the installation of the SDD and GLDirect |
| * device driver components under Windows NT/2K/XP. |
| * |
| ****************************************************************************/ |
| |
| #include "pmapi.h" |
| #include "win32/oshdr.h" |
| |
| /*----------------------------- Implementation ----------------------------*/ |
| |
| /**************************************************************************** |
| PARAMETERS: |
| szDriverName - Actual name of the driver to install in the system |
| szServiceName - Name of the service to create |
| szLoadGroup - Load group for the driver (NULL for normal drivers) |
| dwServiceType - Service type to create |
| |
| RETURNS: |
| True on success, false on failure. |
| |
| REMARKS: |
| This function does all the work to install the driver into the system. |
| The driver is not however activated; for that you must use the Start_SddFilt |
| function. |
| ****************************************************************************/ |
| ulong PMAPI PM_installService( |
| const char *szDriverName, |
| const char *szServiceName, |
| const char *szLoadGroup, |
| ulong dwServiceType) |
| { |
| SC_HANDLE scmHandle; |
| SC_HANDLE driverHandle; |
| char szDriverPath[MAX_PATH]; |
| HKEY key; |
| char keyPath[MAX_PATH]; |
| ulong status; |
| |
| // Obtain a handle to the service control manager requesting all access |
| if ((scmHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) |
| return GetLastError(); |
| |
| // Find the path to the driver in system directory |
| GetSystemDirectory(szDriverPath, sizeof(szDriverPath)); |
| strcat(szDriverPath, "\\drivers\\"); |
| strcat(szDriverPath, szDriverName); |
| |
| // Create the service with the Service Control Manager. |
| driverHandle = CreateService(scmHandle, |
| szServiceName, |
| szServiceName, |
| SERVICE_ALL_ACCESS, |
| dwServiceType, |
| SERVICE_BOOT_START, |
| SERVICE_ERROR_NORMAL, |
| szDriverPath, |
| szLoadGroup, |
| NULL, |
| NULL, |
| NULL, |
| NULL); |
| |
| // Check to see if the driver could actually be installed. |
| if (!driverHandle) { |
| status = GetLastError(); |
| CloseServiceHandle(scmHandle); |
| return status; |
| } |
| |
| // Get a handle to the key for driver so that it can be altered in the |
| // next step. |
| strcpy(keyPath, "SYSTEM\\CurrentControlSet\\Services\\"); |
| strcat(keyPath, szServiceName); |
| if ((status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyPath,0,KEY_ALL_ACCESS,&key)) != ERROR_SUCCESS) { |
| // A problem has occured. Delete the service so that it is not installed. |
| status = GetLastError(); |
| DeleteService(driverHandle); |
| CloseServiceHandle(driverHandle); |
| CloseServiceHandle(scmHandle); |
| return status; |
| } |
| |
| // Delete the ImagePath value in the newly created key so that the |
| // system looks for the driver in the normal location. |
| if ((status = RegDeleteValue(key, "ImagePath")) != ERROR_SUCCESS) { |
| // A problem has occurred. Delete the service so that it is not |
| // installed and will not try to start. |
| RegCloseKey(key); |
| DeleteService(driverHandle); |
| CloseServiceHandle(driverHandle); |
| CloseServiceHandle(scmHandle); |
| return status; |
| } |
| |
| // Clean up and exit |
| RegCloseKey(key); |
| CloseServiceHandle(driverHandle); |
| CloseServiceHandle(scmHandle); |
| return ERROR_SUCCESS; |
| } |
| |
| /**************************************************************************** |
| PARAMETERS: |
| szServiceName - Name of the service to start |
| |
| RETURNS: |
| True on success, false on failure. |
| |
| REMARKS: |
| This function is used to start the specified service and make it active. |
| ****************************************************************************/ |
| ulong PMAPI PM_startService( |
| const char *szServiceName) |
| { |
| SC_HANDLE scmHandle; |
| SC_HANDLE driverHandle; |
| SERVICE_STATUS serviceStatus; |
| ulong status; |
| |
| // Obtain a handle to the service control manager requesting all access |
| if ((scmHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) |
| return GetLastError(); |
| |
| // Open the service with the Service Control Manager. |
| if ((driverHandle = OpenService(scmHandle,szServiceName,SERVICE_ALL_ACCESS)) == NULL) { |
| status = GetLastError(); |
| CloseServiceHandle(scmHandle); |
| return status; |
| } |
| |
| // Start the service |
| if (!StartService(driverHandle,0,NULL)) { |
| status = GetLastError(); |
| CloseServiceHandle(driverHandle); |
| CloseServiceHandle(scmHandle); |
| return status; |
| } |
| |
| // Query the service to make sure it is there |
| if (!QueryServiceStatus(driverHandle,&serviceStatus)) { |
| status = GetLastError(); |
| CloseServiceHandle(driverHandle); |
| CloseServiceHandle(scmHandle); |
| return status; |
| } |
| CloseServiceHandle(driverHandle); |
| CloseServiceHandle(scmHandle); |
| return ERROR_SUCCESS; |
| } |
| |
| /**************************************************************************** |
| PARAMETERS: |
| szServiceName - Name of the service to stop |
| |
| RETURNS: |
| True on success, false on failure. |
| |
| REMARKS: |
| This function is used to stop the specified service and disable it. |
| ****************************************************************************/ |
| ulong PMAPI PM_stopService( |
| const char *szServiceName) |
| { |
| SC_HANDLE scmHandle; |
| SC_HANDLE driverHandle; |
| SERVICE_STATUS serviceStatus; |
| ulong status; |
| |
| // Obtain a handle to the service control manager requesting all access |
| if ((scmHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) |
| return GetLastError(); |
| |
| // Open the service with the Service Control Manager. |
| if ((driverHandle = OpenService(scmHandle,szServiceName,SERVICE_ALL_ACCESS)) == NULL) { |
| status = GetLastError(); |
| CloseServiceHandle(scmHandle); |
| return status; |
| } |
| |
| // Stop the service from running |
| if (!ControlService(driverHandle, SERVICE_CONTROL_STOP, &serviceStatus)) { |
| status = GetLastError(); |
| CloseServiceHandle(driverHandle); |
| CloseServiceHandle(scmHandle); |
| return status; |
| } |
| CloseServiceHandle(driverHandle); |
| CloseServiceHandle(scmHandle); |
| return ERROR_SUCCESS; |
| } |
| |
| /**************************************************************************** |
| PARAMETERS: |
| szServiceName - Name of the service to remove |
| |
| RETURNS: |
| True on success, false on failure. |
| |
| REMARKS: |
| This function is used to remove a service completely from the system. |
| ****************************************************************************/ |
| ulong PMAPI PM_removeService( |
| const char *szServiceName) |
| { |
| SC_HANDLE scmHandle; |
| SC_HANDLE driverHandle; |
| ulong status; |
| |
| // Obtain a handle to the service control manager requesting all access |
| if ((scmHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) |
| return GetLastError(); |
| |
| // Open the service with the Service Control Manager. |
| if ((driverHandle = OpenService(scmHandle,szServiceName,SERVICE_ALL_ACCESS)) == NULL) { |
| status = GetLastError(); |
| CloseServiceHandle(scmHandle); |
| return status; |
| } |
| |
| // Remove the service |
| if (!DeleteService(driverHandle)) { |
| status = GetLastError(); |
| CloseServiceHandle(driverHandle); |
| CloseServiceHandle(scmHandle); |
| return status; |
| } |
| CloseServiceHandle(driverHandle); |
| CloseServiceHandle(scmHandle); |
| return ERROR_SUCCESS; |
| } |
| |