#include "stdafx.h"
#include "winsvc.h"
Bool
INSTALLDRIVER
In SC_Handle Schscmanager,
In LPCTSTR Drivername,
In LPCTSTR Serviceexe
);
Bool
StartDriver
In SC_Handle Schscmanager,
In LPCTSTR Drivername
);
Bool
OpenDevice
In lpctstr Drivername, Handle * LPHDEVICE
);
Bool
STOPDRIVER
In SC_Handle Schscmanager,
In LPCTSTR Drivername
);
Bool
RemoveDriver
In SC_Handle Schscmanager,
In LPCTSTR Drivername
);
/ ************************************************** ***********************************
*
* Function: loadingDevicedriver (const tchar, const tchar, handle *)
*
* Purpose: Registers a Driver with the system configuration manager
* And the loads it.
*
*********************************************************** ********************************** /
Bool LoadDevicedriver (const tchar * name, const tchar * path, handle * lphdevice)
{
SC_HANDLE SCHSCMANAGER;
BOOL OKAY;
Schscmanager = OpenScManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);
// Ignore Success of Installation: IT May Already Be Installed.
InstallDriver (SchscManager, Name, Path);
// Ignore Success of Start: IT May Already Be Started.
STARTDRIVER (SCHSCMANAGER, NAME);
// Do make Sure We can open it.
Okay = OpenDevice (name, lphdevice);
ClosESERVICEHANDE (SCHSCMANAGER);
Return okay;
}
/ ************************************************** ***********************************
*
* Function: InstallDriver (in sc_handle, in lpctstr, in lpctstr)
*
* Purpose: Creates A Driver Service.
*
*********************************************************** ********************************** /
Bool InstallDriver (in SC_Handle Schscmanager, in LPCTSTR Drivername, in LPCTSTR Serviceexe)
{
SC_HANDLE SCHSERVICE;
//
// Note: This Creates An entry for a standalone driver. If this // is modified for use with a driver tria request a tag,
// group, and / or dependencies, it may be necessary to
// query the registry for existing driver information
// (in Order to Determine a Unique Tag, ETC.).
//
SCHSERVICE = CreateService (SCHSCMANAGER, / / SCMANAGER DATABASE
Drivername, // name of service
Drivername, // name to display
Service_all_access, // desired access
Service_kernel_driver, // service type
Service_demand_start, // start type
Service_ERROR_NORMAL, // Error Control Type
Serviceexe, // Service's Binary
Null, // no loading Ordering Group
Null, // no tag identifier
Null, // no dependency
Null, // localsystem account
Null // no password
);
IF (SCHSERVICE == NULL)
Return False;
ClosESERVICEHANDE (SCHSERVICE);
Return True;
}
/ ************************************************** ***********************************
*
* Function: STARTDRIVER (in sc_handle, in lpctstr)
*
* Purpose: Starts The Driver Service.
*
*********************************************************** ********************************** /
Bool StartDriver (in sc_handle schscmanager, in lpctstr drivername)
{
SC_HANDLE SCHSERVICE;
Bool ret;
SCHSERVICE = OpenService (SCHSCManager,
Drivername,
SERVICE_ALL_ACCESS
);
IF (SCHSERVICE == NULL)
Return False;
Ret = StartService (SCHSERVICE, 0, NULL)
|| getLastError () == Error_Service_Already_running
ClosESERVICEHANDE (SCHSERVICE);
Return Ret;
}
/ ************************************************** *****************************
* Function: OpenDevice (in LPCTSTR, HANDLE *)
*
* Purpose: Opens The Device and Returns A Handle if Desired.
*
*********************************************************** ********************************** /
Bool OpenDevice (in lpctstr drivername, handle * lphdevice)
{
Tchar CompleteDevicename [64];
Handle HDevice;
//
// Create a //./xxx device name That CreateFile CAN USE
//
// NOTE: We're Making An Assumption Here That The Driver
// Has created a Symbolic Link Using It's OWN NAME
// (i.e. if the driver has the name "xxx" We Assume
// That It Used IocreateSymbolicLink to create a
// Symbolic link "/ dosdevices / xxx". Usually, There
// is this Understanding Between Related Apps / Drivers.
//
// an Application Might Also Peruse The DeviceMap
// section of the registry, or use the querydosdevice
// Api to enumerate the EXISTING SYMBOLIC LINKS in the EXISTIN
// system.
//
WSPrintf (CompleteDevicename, Text (". / /% S"), DRIVERNAME);
HDevice = CREATEFILE (CompleteDevicename,
Generic_read | generic_write,
0,
NULL,
Open_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
IF (HDEVICE == ((Handle) -1))
Return False;
// if User Wants Handle, Give It To Them. OtherWise, Just Close IT.
IF (LPHDEVICE)
* lphdevice = HDEvice;
Else
CloseHandle (HDEvice);
Return True;
}
/ ************************************************** ***********************************
*
* Function: unloadDevicedriver (const tchar *)
*
* Purpose: Stops The Driver And Has The Configuration Manager Unload It.
*
*********************************************************** *********************************** / BOOL unloadDevicedriver (const tchar * name)
{
SC_HANDLE SCHSCMANAGER;
SCHSCMANAGER = OpenScManager (null, // machine (null == local)
Null, // Database (null == default)
SC_Manager_All_Access // Access Required
);
STOPDRIVER (SCHSCMANAGER, NAME);
RemoveDriver (SchscManager, Name);
ClosESERVICEHANDE (SCHSCMANAGER);
Return True;
}
/ ************************************************** ***********************************
*
* Function: Stopdriver (in sc_handle, in lpctstr)
*
* Purpose: Has The Configuration Manager Stop The Driver (Unload IT)
*
*********************************************************** ********************************** /
Bool Stopdriver (in sc_handle schscmanager, in lpctstr drivername)
{
SC_HANDLE SCHSERVICE;
Bool ret;
Service_status serviceArstatus;
SCHSERVICE = OpenService (SchscManager, Drivername, Service_all_Access);
IF (SCHSERVICE == NULL)
Return False;
Ret = ControlService (SCHSERVICE, Service_Control_stop, & service);
ClosESERVICEHANDE (SCHSERVICE);
Return Ret;
}
/ ************************************************** ***********************************
*
* Function: RemoveDriver (in sc_handle, in lpctstr)
*
* Purpose: deletes the driver service.
*
*********************************************************** ********************************** /
Bool Removedriver (in SC_Handle Schscmanager, In LPCTSTR Drivername)
{
SC_HANDLE SCHSERVICE;
Bool ret;
SCHSERVICE = OpenService (SCHSCManager,
Drivername,
SERVICE_ALL_ACCESS
);
IF (SCHSERVICE == NULL)
Return False;
RET = deleteService (SCHSERVICE);
ClosESERVICEHANDE (SCHSERVICE); RETURN RET;
}