我是靠谱客的博主 阔达往事,最近开发中收集的这篇文章主要介绍Windows api安装驱动,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

安装驱动实际上是CreateService

命令行安装驱动可以参考

​​​​​​sc.exe create | Microsoft Docs
 

安装
sc create mydriver binpath= D:mydriver.sys type= kernel start= demand error= ignore
启动
如果是start参数是demand也就是需要手动启动
sc start mydriver
关闭
sc stop mydriver
删除
sc delete mydriver

bat安装驱动

@echo off
::注意不要用path变量,如果把path给改了,运行命令会提示找不到命令
set /p filePath=please input sys file path:

if %filePath:~-4% == .sys (
echo file match
) else (
echo file not match
goto quit
)

::getFileName是个函数,这个函数设置一个名为return的变量
set return=
call :getFileName %filePath%
::名为return的变量被getFileName设置过了
set name=%return%

echo name=====%name:~0,-4%

@echo on
sc stop %name:~0,-4%
sc delete %name:~0,-4%
::filePath是输入的路径,如果想放到c:windowssystem32drivers可以自行加复制命令
::copy %filePath% c:windowssystem32drivers
::set filePath=c:windowssystem32drivers%name%
sc create %name:~0,-4% binpath= "%filePath%" type= kernel start= demand error= ignore

::查询安装状态
::sc query %name:~0,-4%
c:windowssystem32reg query hklmsystemcurrentcontrolsetservices%name:~0,-4%

:quit
pause
exit

:getFileName
set return=%~nx1
goto:eof

注意,不要把filePath改程path,不然执行sc命令的时候会提示sc不是内部或外部命令,因为path是内置环境变量,重新设置path会导致查找文件失败

代码安装驱动如下:

BOOL InstallDriver(IN LPCTSTR DriverName, IN LPCTSTR sysFileName)
{
	CHAR szTargetPath[MAX_PATH];

    // 目的地地址
    // C:WindowsSystem32dirversabc.sys
    // abc.sys就是sysFileName
	GetWindowsDirectoryA(szTargetPath, MAX_PATH);
	StringCchCatA(szTargetPath, MAX_PATH, "\system32\drivers\");
	StringCchCatA(szTargetPath, MAX_PATH, (char*)sysFileName);


    // 获取当前目录,方便安装
    // 假定驱动就在当前目录
	char szTemp[MAX_PATH];
	GetModuleFileName(NULL, szTemp, MAX_PATH);

	CString filePath;
    // 初始化为当前程序路径
	filePath.Format("%s", szTemp);
    // 定位到当前程序所属目录
	filePath.Format("%s", filePath.Left(filePath.ReverseFind('\') + 1));
    // 拼接成驱动文件的路径
	filePath += sysFileName;


	BOOL ret = CopyFile( filePath, szFullName, FALSE);
	_tprintf(_T("load driver copy %s=>%s return bool:%d n"), filePath, szFullName, ret);

	if ( FALSE == ret)
	{
		printf("copy file failed, please check path or privilege");
		return FALSE;
	}

    SC_HANDLE  schService;
	SC_HANDLE SchSCManager;
   
	SchSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
	if(SchSCManager == NULL)
	{
		PrintLastError("SchSCManager:");
		return FALSE;
	}

    schService = CreateServiceA( SchSCManager,          // SCManager database
                                (char*)DriverName,           // name of service
                                (char*)DriverName,           // name to display
                                SERVICE_ALL_ACCESS,    // desired access
                                SERVICE_KERNEL_DRIVER, // service type
                                SERVICE_SYSTEM_START ,// start type /*SERVICE_BOOT_START*/  /*SERVICE_AUTO_START*/
                                SERVICE_ERROR_NORMAL,  // error control type
                                szFullName,            // service's binary
                                NULL,                  // no load ordering group
                                NULL,                  // no tag identifier
                                NULL,                  // no dependencies
                                NULL,                  // LocalSystem account
                                NULL                   // no password
                                );
	if ( schService == NULL && ERROR_SERVICE_EXISTS != GetLastError() )
	{
		TCHAR szTips[512] = { 0 };
		StringCchPrintf(szTips, 512, _T("failed to install %s driver"), DriverName);

		MessageBox(NULL, szTips, _T("Install Driver"), MB_OK);
		PrintLastError("schService:");
		CloseServiceHandle(SchSCManager);
        return FALSE;
	}
	else
	{
	}

    CloseServiceHandle( schService );

    return TRUE;
}

注意安装64位驱动时,程序也需要是64位的,不然CopyFile就复制到SysWOW64目录去了, 除非关闭syswow64,Wow64DisableWow64FsRedirection,参考

文件系统重定向程序 - Win32 apps | Microsoft Docs

本次安装之后驱动不会执行,重启后会执行,当前只是创建了一个服务

C:UsersAdministrator>sc query abc

SERVICE_NAME: abc
        TYPE               : 1  KERNEL_DRIVER
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

sc query abc查询名为abc的服务状态

手动启动服务,也就是执行驱动,如果执行驱动没有发生系统错误,重启之后会驱动正常运行

C:UsersAdministrator>net start abc
发生系统错误 577。

Windows 无法验证此文件的数字签名。某软件或硬件最近有所更改,可能安装了签名错误或损毁的文件,或者安装的文件可能是来路不明
的恶意软件。

如果提示数字签名的问题,Windows7可以开机后按F8进入安全模式,禁用驱动程序签名强制,仅对本次启动有效

如果设置完成

C:UsersAdministrator>net start abc
请求的服务已经启动。

请键入 NET HELPMSG 2182 以获得更多的帮助。

如果驱动是开机启动,驱动开始阶段的打印可能看不到,可以借用DebugView打印开机阶段的输出,当然也可以写日志文件

 下次开机后,打开debugview,就能看到系统从开机到现在的打印,这个设置也是针对下次生效,下次又会自动取消log boot,其实也不是一定有用,还是写日志靠谱些

还可以通过inf安装,安装日志在c:windowsinfsetupapi.app.log或者c:windowsinfsetupapi.dev.log,inf格式参考

Overview of INF Files - Windows drivers | Microsoft Docs

通过命令行安装inf可以查阅rundll.exe的使用方法

最后

以上就是阔达往事为你收集整理的Windows api安装驱动的全部内容,希望文章能够帮你解决Windows api安装驱动所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部