Dynamic loading driver

xiaoxiao2021-03-06  39

#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;

}

转载请注明原文地址:https://www.9cbs.com/read-65261.html

New Post(0)