📄 controldriver.cpp
字号:
//ControlDriver.cpp
/////////////////////////////////////////////////////////////////////////////
// the file contains function that control drivers.
// interface with DriverFile.
/////////////////////////////////////////////////////////////////////////////
#include <afxwin.h>
//function pre declare.
BOOL UnloadDeviceDriver(LPCTSTR lpszDriverName);
BOOL LoadDeviceDriver( LPCTSTR lpszDriverName, LPCTSTR lpszFullFileName);
BOOL RemoveDriver(IN SC_HANDLE schSCManger, IN LPCTSTR lspzDriverName);
BOOL UnloadDeviceDriver(LPCTSTR lpszDriverName);
BOOL DeleteDriver( SC_HANDLE scHandle, LPCTSTR lpszDriverName);
BOOL StopDriver( SC_HANDLE scHandle, LPCTSTR lpszDriverName);
BOOL InstallDriver( IN SC_HANDLE schSCManger, IN LPCTSTR lpszDriverName, IN LPCTSTR lpszPathName);
BOOL StartDriver( IN SC_HANDLE schSCManger, IN LPCTSTR lpszDriverName);
BOOL InitializeMyDriver( LPCTSTR lpszDriverName, LPCTSTR lpszDriverFileName)
{
char szCurDir[MAX_PATH], szCurFileName[MAX_PATH],szWinDir[MAX_PATH], szSystemFileName[MAX_PATH];
CFile cfile;
char szError[1200];
szError[0] = 0;
//unload old driver.
UnloadDeviceDriver( lpszDriverName);
//copy driver file into System32's Drivers path.
GetCurrentDirectory( MAX_PATH, szCurDir);
wsprintf( szCurFileName,"%s\\%s", szCurDir, lpszDriverFileName);
if( !cfile.Open( szCurFileName, CFile::shareDenyNone)){
wsprintf( szError,"文件 %s 不存在", szCurFileName);
goto ErrorQuit;
}
cfile.Close();
GetWindowsDirectory( szWinDir, MAX_PATH);
wsprintf( szSystemFileName,"%s\\System32\\Drivers\\%s", szWinDir,lpszDriverFileName);
CopyFile( szCurFileName, szSystemFileName, FALSE); //copy & overwrite.
//load driver.
LoadDeviceDriver( lpszDriverName, szSystemFileName);
//delete the driver file name.
DeleteFile( szSystemFileName);
return TRUE;
ErrorQuit:
MessageBox(NULL, szError, "Error", MB_ICONHAND);
return FALSE;
}
//Load Driver & Start it.
BOOL LoadDeviceDriver( LPCTSTR lpszDriverName, LPCTSTR lpszFullFileName)
{
SC_HANDLE schSCManger;
schSCManger = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
if( !schSCManger)
return FALSE;
RemoveDriver( schSCManger, lpszDriverName);
InstallDriver( schSCManger, lpszDriverName, lpszFullFileName);
StartDriver( schSCManger, lpszDriverName);
CloseServiceHandle( schSCManger);
return TRUE;
}
//start the driver
BOOL StartDriver( IN SC_HANDLE schSCManger, IN LPCTSTR lpszDriverName)
{
SC_HANDLE schService;
BOOL bRetValue;
schService = OpenService( schSCManger, lpszDriverName, SERVICE_ALL_ACCESS);
if( !schService) return FALSE;
if( !StartService( schService, 0, NULL)){
switch( GetLastError()){
case ERROR_SERVICE_ALREADY_RUNNING:
case ERROR_SERVICE_DISABLED:
bRetValue = TRUE;
default:
bRetValue = FALSE;
}
}
else
bRetValue = TRUE;
CloseServiceHandle( schService);
return bRetValue;
}
//Install driver into memory.
BOOL InstallDriver( IN SC_HANDLE schSCManger, IN LPCTSTR lpszDriverName, IN LPCTSTR lpszPathName)
{
SC_HANDLE schService;
schService = CreateService( schSCManger,
lpszDriverName,
lpszDriverName,
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
lpszPathName,
NULL,
NULL,
NULL,
NULL,
NULL);
if( !schService) return FALSE;
CloseServiceHandle( schService);
return TRUE;
}
//remove driver from system drivers
BOOL RemoveDriver(IN SC_HANDLE schSCManger, IN LPCTSTR lpszDriverName)
{
SC_HANDLE schService;
BOOL bRetValue;
schService = OpenService(schSCManger, lpszDriverName, SERVICE_ALL_ACCESS);
if( !schService) return FALSE;
bRetValue = DeleteService( schService);
CloseServiceHandle( schService);
return bRetValue;
}
//unload Driver that have already started.
BOOL UnloadDeviceDriver(LPCTSTR lpszDriverName)
{
SC_HANDLE scHandle;
scHandle = OpenSCManager(
NULL, // pointer to machine name string
NULL, // pointer to database name string
SC_MANAGER_ALL_ACCESS // type of access
);
if( !scHandle)
return FALSE; //cannot open.
StopDriver( scHandle, lpszDriverName); //stop & remove
DeleteDriver( scHandle, lpszDriverName);
CloseServiceHandle( scHandle);
return TRUE;
}
//Delete the Driver
BOOL DeleteDriver( IN SC_HANDLE scHandle, IN LPCTSTR lpszDriverName)
{
SC_HANDLE schService;
BOOL bRetValue;
schService = OpenService( scHandle, lpszDriverName, SERVICE_ALL_ACCESS);
if( !schService)
return FALSE;
bRetValue = DeleteService( schService);
CloseServiceHandle( schService);
return bRetValue;
}
//Stop the Driver.
BOOL StopDriver( IN SC_HANDLE scHandle, IN LPCTSTR lpszDriverName)
{
SC_HANDLE schService;
BOOL bRetValue;
SERVICE_STATUS serviceStatus;
schService = OpenService( scHandle, lpszDriverName, SERVICE_ALL_ACCESS);
if( !schService)
return FALSE;
bRetValue = ControlService( schService, SERVICE_CONTROL_STOP, &serviceStatus);
CloseServiceHandle( schService);
return bRetValue;
}
//use CreateFile to open a Device Control Handle.
HANDLE CreateDriverFileHandle(IN LPCTSTR lpszDriverName)
{
char szDriverName[MAX_PATH];
BOOL b2000;
b2000 = ( GetVersion() & 0xff >= 5)?TRUE:FALSE; //is win2000?
wsprintf( szDriverName,"\\\\.%s\\%s", b2000?"\\Global":"", lpszDriverName);
return CreateFile( szDriverName,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -