如何快速新建一个网站,重庆建设工程信息网官网成绩,网站分站代理加盟,通州网站开发公司驱动程序加载工具有许多#xff0c;最常用的当属KmdManager工具#xff0c;如果驱动程序需要对外发布那我们必须自己编写实现一个驱动加载工具#xff0c;当需要使用驱动时可以拉起自己的驱动#xff0c;如下将实现一个简单的驱动加载工具#xff0c;该工具可以实现基本的…驱动程序加载工具有许多最常用的当属KmdManager工具如果驱动程序需要对外发布那我们必须自己编写实现一个驱动加载工具当需要使用驱动时可以拉起自己的驱动如下将实现一个简单的驱动加载工具该工具可以实现基本的安装加载关闭卸载等操作日常使用完全没问题。
installDvr 驱动安装
#include iostream
#include Windows.husing namespace std;// 安装驱动
BOOL installDvr(CONST WCHAR drvPath[50], CONST WCHAR serviceName[20])
{// 打开服务控制管理器数据库SC_HANDLE schSCManager OpenSCManager(NULL, // 目标计算机的名称,NULL连接本地计算机上的服务控制管理器NULL, // 服务控制管理器数据库的名称NULL打开 SERVICES_ACTIVE_DATABASE 数据库SC_MANAGER_ALL_ACCESS // 所有权限);if (schSCManager NULL){CloseServiceHandle(schSCManager);return FALSE;}// 创建服务对象添加至服务控制管理器数据库SC_HANDLE schService CreateService(schSCManager, // 服务控件管理器数据库的句柄serviceName, // 要安装的服务的名称serviceName, // 用户界面程序用来标识服务的显示名称SERVICE_ALL_ACCESS, // 对服务的访问权限所有全权限SERVICE_KERNEL_DRIVER, // 服务类型驱动服务SERVICE_DEMAND_START, // 服务启动选项进程调用 StartService 时启动SERVICE_ERROR_IGNORE, // 如果无法启动忽略错误继续运行drvPath, // 驱动文件绝对路径如果包含空格需要多加双引号NULL, // 服务所属的负载订购组服务不属于某个组NULL, // 接收订购组唯一标记值不接收NULL, // 服务加载顺序数组服务没有依赖项NULL, // 运行服务的账户名使用 LocalSystem 账户NULL // LocalSystem 账户密码);if (schService NULL){CloseServiceHandle(schService);CloseServiceHandle(schSCManager);return FALSE;}CloseServiceHandle(schService);CloseServiceHandle(schSCManager);return TRUE;
}int main(int argc, char *argv[])
{if (installDvr(LC:\\WinDDK.sys, Lservice) TRUE){cout 驱动已安装 endl;}getchar();return 0;
}startDvr 启动驱动
#include iostream
#include Windows.husing namespace std;// 启动服务
BOOL startDvr(CONST WCHAR serviceName[20])
{// 打开服务控制管理器数据库SC_HANDLE schSCManager OpenSCManager(NULL, // 目标计算机的名称,NULL连接本地计算机上的服务控制管理器NULL, // 服务控制管理器数据库的名称NULL打开 SERVICES_ACTIVE_DATABASE 数据库SC_MANAGER_ALL_ACCESS // 所有权限);if (schSCManager NULL){CloseServiceHandle(schSCManager);return FALSE;}// 打开服务SC_HANDLE hs OpenService(schSCManager, // 服务控件管理器数据库的句柄serviceName, // 要打开的服务名SERVICE_ALL_ACCESS // 服务访问权限所有权限);if (hs NULL){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}if (StartService(hs, 0, 0) 0){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return TRUE;
}int main(int argc, char *argv[])
{if (startDvr(Lservice) TRUE){cout 驱动服务 endl;}getchar();return 0;
}stopDvr 停止驱动
#include iostream
#include Windows.husing namespace std;// 停止服务
BOOL stopDvr(CONST WCHAR serviceName[20])
{// 打开服务控制管理器数据库SC_HANDLE schSCManager OpenSCManager(NULL, // 目标计算机的名称,NULL连接本地计算机上的服务控制管理器NULL, // 服务控制管理器数据库的名称NULL打开 SERVICES_ACTIVE_DATABASE 数据库SC_MANAGER_ALL_ACCESS // 所有权限);if (schSCManager NULL){CloseServiceHandle(schSCManager);return FALSE;}// 打开服务SC_HANDLE hs OpenService(schSCManager, // 服务控件管理器数据库的句柄serviceName, // 要打开的服务名SERVICE_ALL_ACCESS // 服务访问权限所有权限);if (hs NULL){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}// 如果服务正在运行SERVICE_STATUS status;if (QueryServiceStatus(hs, status) 0){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}if (status.dwCurrentState ! SERVICE_STOPPED status.dwCurrentState ! SERVICE_STOP_PENDING){// 发送关闭服务请求if (ControlService(hs, // 服务句柄SERVICE_CONTROL_STOP, // 控制码通知服务应该停止status // 接收最新的服务状态信息) 0) {CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}// 判断超时INT timeOut 0;while (status.dwCurrentState ! SERVICE_STOPPED){timeOut;QueryServiceStatus(hs, status);Sleep(50);}if (timeOut 80){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}}CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return TRUE;
}int main(int argc, char *argv[])
{if (stopDvr(Lservice) TRUE){cout 停止驱动服务 endl;}getchar();return 0;
}unloadDvr 卸载驱动
#include iostream
#include Windows.husing namespace std;// 卸载驱动
BOOL unloadDvr(CONST WCHAR serviceName[20])
{// 打开服务控制管理器数据库SC_HANDLE schSCManager OpenSCManager(NULL, // 目标计算机的名称,NULL连接本地计算机上的服务控制管理器NULL, // 服务控制管理器数据库的名称NULL打开 SERVICES_ACTIVE_DATABASE 数据库SC_MANAGER_ALL_ACCESS // 所有权限);if (schSCManager NULL){CloseServiceHandle(schSCManager);return FALSE;}// 打开服务SC_HANDLE hs OpenService(schSCManager, // 服务控件管理器数据库的句柄serviceName, // 要打开的服务名SERVICE_ALL_ACCESS // 服务访问权限所有权限);if (hs NULL){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}// 删除服务if (DeleteService(hs) 0){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return TRUE;
}int main(int argc, char *argv[])
{if (unloadDvr(Lservice) TRUE){cout 卸载驱动服务 endl;}getchar();return 0;
}封装cDrvCtrl通信类
#define _CRT_SECURE_NO_WARNINGS
#include iostream
#include Windows.h#pragma comment(lib,user32.lib)
#pragma comment(lib,advapi32.lib)// ------------------------------------------------------------------------------
// 驱动控制类
// ------------------------------------------------------------------------------class cDrvCtrl
{
public:cDrvCtrl(){m_pSysPath NULL;m_pServiceName NULL;m_pDisplayName NULL;m_hSCManager NULL;m_hService NULL;m_hDriver INVALID_HANDLE_VALUE;}~cDrvCtrl(){CloseServiceHandle(m_hService);CloseServiceHandle(m_hSCManager);CloseHandle(m_hDriver);}// 安装驱动BOOL Install(PCHAR pSysPath, PCHAR pServiceName, PCHAR pDisplayName){m_pSysPath pSysPath;m_pServiceName pServiceName;m_pDisplayName pDisplayName;m_hSCManager OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (NULL m_hSCManager){m_dwLastError GetLastError();return FALSE;}m_hService CreateServiceA(m_hSCManager, m_pServiceName, m_pDisplayName,SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,m_pSysPath, NULL, NULL, NULL, NULL, NULL);if (NULL m_hService){m_dwLastError GetLastError();if (ERROR_SERVICE_EXISTS m_dwLastError){m_hService OpenServiceA(m_hSCManager, m_pServiceName, SERVICE_ALL_ACCESS);if (NULL m_hService){CloseServiceHandle(m_hSCManager);return FALSE;}}else{CloseServiceHandle(m_hSCManager);return FALSE;}}return TRUE;}// 启动驱动BOOL Start(){if (!StartServiceA(m_hService, NULL, NULL)){m_dwLastError GetLastError();return FALSE;}return TRUE;}// 关闭驱动BOOL Stop(){SERVICE_STATUS ss;GetSvcHandle(m_pServiceName);if (!ControlService(m_hService, SERVICE_CONTROL_STOP, ss)){m_dwLastError GetLastError();return FALSE;}return TRUE;}// 移除驱动BOOL Remove(){GetSvcHandle(m_pServiceName);if (!DeleteService(m_hService)){m_dwLastError GetLastError();return FALSE;}return TRUE;}// 打开驱动BOOL Open(PCHAR pLinkName){if (m_hDriver ! INVALID_HANDLE_VALUE)return TRUE;m_hDriver CreateFileA(pLinkName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);if (m_hDriver ! INVALID_HANDLE_VALUE)return TRUE;elsereturn FALSE;}// 安装并运行驱动VOID InstallAndRun(){char szSysFile[MAX_PATH] { 0 };char szSvcLnkName[] LyInject;;GetAppPath(szSysFile);strcat(szSysFile, LyInject.sys);Install(szSysFile, szSvcLnkName, szSvcLnkName);Start();Open(\\\\.\\LyInject);}// 移除并关闭驱动VOID RemoveAndStop(){Stop();Remove();CloseHandle(m_hDriver);}// 发送控制信号BOOL IoControl(DWORD dwIoCode, PVOID InBuff, DWORD InBuffLen, PVOID OutBuff, DWORD OutBuffLen, DWORD *RealRetBytes){DWORD dw;BOOL b DeviceIoControl(m_hDriver, CTL_CODE_GEN(dwIoCode), InBuff, InBuffLen, OutBuff, OutBuffLen, dw, NULL);if (RealRetBytes)*RealRetBytes dw;return b;}
private:// 获取服务句柄BOOL GetSvcHandle(PCHAR pServiceName){m_pServiceName pServiceName;m_hSCManager OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (NULL m_hSCManager){m_dwLastError GetLastError();return FALSE;}m_hService OpenServiceA(m_hSCManager, m_pServiceName, SERVICE_ALL_ACCESS);if (NULL m_hService){CloseServiceHandle(m_hSCManager);return FALSE;}else{return TRUE;}}// 获取控制信号对应字符串DWORD CTL_CODE_GEN(DWORD lngFunction){return (FILE_DEVICE_UNKNOWN * 65536) | (FILE_ANY_ACCESS * 16384) | (lngFunction * 4) | METHOD_BUFFERED;}// 获取完整路径void GetAppPath(char *szCurFile){GetModuleFileNameA(0, szCurFile, MAX_PATH);for (SIZE_T i strlen(szCurFile) - 1; i 0; i--){if (szCurFile[i] \\){szCurFile[i 1] \0;break;}}}public:DWORD m_dwLastError;PCHAR m_pSysPath;PCHAR m_pServiceName;PCHAR m_pDisplayName;HANDLE m_hDriver;SC_HANDLE m_hSCManager;SC_HANDLE m_hService;
};int main(int argc, char *argv[])
{cDrvCtrl DriveControl;DriveControl.InstallAndRun();DriveControl.RemoveAndStop();system(pause);return 0;
}文章出处https://www.cnblogs.com/LyShark/p/15019049.html 本博客所有文章除特别声明外均采用 BY-NC-SA 许可协议。转载请注明出处