概述
安装驱动实际上是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安装驱动所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复