win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决

win7关闭驱动签名,进入驱动测试模式

      • win7、win10关闭驱动签名、进入驱动测试模式
        • 方式一:批处理文件实现:管理员权限打开win7-win10驱动测试模式
        • 方式二:运行gpedit.msc
        • 方式三:在虚拟机打开DOS控制台输入命令
      • DebugView工具运行提示"Dbgv.sys: 拒绝访问"
      • 驱动项目配置属性常用设置
      • 驱动中KdPrint打印UNICODE_STRING字符串常用方法
      • 没使用的变量在编译时报警告:未引用的形参
      • warning C4201: 使用了非标准扩展 : 无名称的结构/联合
      • warning C4047: “=”:“HANDLE”与“UINT32”的间接级别不同
      • warning C4242: “函数”: 从“UINT_PTR”转换到“UINT32”,可能丢失数据
      • printf输出64位整数
      • 错误:无法启动此程序,因为计算机中丢失mfc140ud.dll。
      • 虚拟机蓝屏后的dump文件生成设置
      • 虚拟机优化提速
      • 虚拟机花屏问题
      • 错误:无法打开虚拟机\Virtual Machines\某目录\某文件名.vmx
      • 错误 MSB8040缓解Spectre 漏洞的库以及输出SXS.DLL的垃圾信息
      • 驱动开发配置项目属性
      • windbg双机调试
        • 一、虚拟机设置
        • 一、windbg双机调试设置


win7、win10关闭驱动签名、进入驱动测试模式

以下3种方式,一步一步来,方式一操作一遍后还不行,就继续操作方式二,还不行的话继续方式三。

方式一:批处理文件实现:管理员权限打开win7-win10驱动测试模式

REM 复制Boot菜单
bcdedit /copy {current} /d "win7 x64 debug for windbg"
pause
REM 打开测试模式
bcdedit /set nointegritychecks on #禁用掉驱动签名检测
bcdedit /set testsigning on #打开测试模式
pause
shutdown -r -t 1000

以上这段命令可以保存到一个.bat或.cmd格式文件里方便执行;
然后win+R打开运行,输入msconfig,引导,选择新增的"win7 x64 debug for windbg",点击高级选项,勾选调试,打开调试模式,为windbg双机调试做好设置。
最后,别忘了驱动程序项目的配置属性,Driver Signing里的Sign Mode改为Test Sign

方式二:运行gpedit.msc

(1)管理员权限运行cmd,输入bcdedit /set testsigning on和bcdedit /Debug on,开启测试模式和调试模式。
输入bcdedit /dbgsettings查看设置情况。
(2)驱动程序项目的配置属性,Driver Signing里的Sign Mode改为Test Sign
(3)运行,gpedit.msc,用户配置,管理模板,系统,驱动程序安装,鼠标右击"设备驱动程序的代码签名"图标,选择"编辑"项,勾选"已启用"单选框,选择"选项→忽略"项。

方式三:在虚拟机打开DOS控制台输入命令

先把虚拟机中的操作系统切换到测试模式,具体步骤如下:
  ① 在虚拟机中以管理员身份通过【win+R】 --> 【cmd】 打开DOS控制台。
  ② 输入命令【bcdedit /set testsigning on】 开启系统测试模式。
  ③ 输入命令【bcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKS】,关闭系统的强制校验驱动签名功能,这样就可以安装运行没有数字签名的64位驱动了。
  ④ 重启系统使得②③设置生效。若设置成功,重启后在桌面右下角会出现当前系统为测试模式的水印;某些系统会屏蔽这个水印,此时可以通过命令【bcdedit /enum】确认testsigning的值是否为Yes以判断系统当前是否处于测试模式。

参考:
http://www.ujiaoshou.com/xtjc/094420355.html

https://ask.zol.com.cn/x/8598130.html


DebugView工具运行提示"Dbgv.sys: 拒绝访问"

问题:虚拟机中观察调试信息的DebugView工具,如果运行提示“C:\Windows\system32\Drivers\Dbgv.sys: 拒绝访问”。

win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决_第1张图片
这是由于操作系统目录权限的问题,因为DebugView这个程序它对系统目录没有写入的权限,所以它在第一次运行解压Dbg.sys的时候解压不进去;
以管理员的身份来运行也不行。

解决方法:
将DebugView这个exe复制到"C:\Windows\system32\Drivers"这个系统目录下,并发送一个该exe应用程序的快捷方式到桌面上运行就行了,这个时候它就能够运行起来,捕捉到我们的内核信息了。

win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决_第2张图片

驱动项目配置属性常用设置

  • 调整属性 - C/C++ - 常规,警告等级 4,将警告视为错误 否;
  • 链接器 - 常规,警告视为错误 否;
  • Driver Settings - General,Target OS Version改成Windows 7,Target Platform改为Desktop;Target Platform一般设置为Desktop,而_NT_TARGET_VERSION要设置为跟Target OS Version一致的操作系统版本;
  • Stampinf里所有 是 的地方改成 否;
  • Inf2Cat里所有 是 的地方改成 否;
  • Driver Signing - General中的Sign Mode改为 Test Sign

win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决_第3张图片

如果平时不使用windbg双机调试的话,虚拟机开机后在启动菜单那里选择普通启动即可(只要打开了测试模式),不需要进入调试模式就可以加载我们编写的驱动。

参考:
http://www.manongjc.com/detail/56-jhctcpdeofdpczh.html


驱动中KdPrint打印UNICODE_STRING字符串常用方法

	KdPrint(("zp:RegistryPath=%wZ\n", RegistryPath));
	KdPrint(("zp:RegistryPath=%ws\n", RegistryPath->Buffer));
	KdPrint(("zp:RegistryPath=%s\n", RegistryPath->Buffer));	//输出不了,%s是输出多字节的,内核中都是宽字符
	KdPrint(("zp:RegistryPath=%S\n", RegistryPath->Buffer));

win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决_第4张图片


没使用的变量在编译时报警告:未引用的形参

例如:警告 C4100 “RegistryPath”: 未引用的形参 MyDriver001 C:\Users\Administrator\source\repos\MyDriver001\Driver.c。
解决方法:
给每个未使用的形参使用宏UNREFERENCED_PARAMETER。

UNREFERENCED_PARAMETER(RegistryPath);

或者使用一下即可(占位):

RegistryPath;

warning C4201: 使用了非标准扩展 : 无名称的结构/联合

你可以在引起警告的代码段前后如下所示设置编译器警告状态:

#pragma warning(push)
#pragma warning(disable: 4201)
//#pragma warning(disable: 4201 4200)
//   Some   code
//   Some   code
//   Some   code
#pragma warning(pop) 
//#pragma warning (default)

参考:
https://www.thinbug.com/q/1723572
https://www.coder.work/article/1563334


warning C4047: “=”:“HANDLE”与“UINT32”的间接级别不同

如果我们项目属性的警告等级为最高级4,将警告是为错误的话,那么有些隐式转换会导致warning C4047,即不能将UINT32类型的值分配到HANDLE类型的实体,导致编译错误。
解决办法:通过(PVOID)(size_t)强制转换类型,size_t是关键。


warning C4242: “函数”: 从“UINT_PTR”转换到“UINT32”,可能丢失数据

如果我们项目属性的警告等级为最高级4,将警告是为错误的话,那么有些隐式转换会导致warning C4042,导致编译错误。
解决办法:通过(UINT32)(size_t)强制转换类型,size_t是关键。


printf输出64位整数

在windows下,printf、sprintf_s之类的格式化输出函数,打印输出64位数据时,使用的格式化字符串为:

printf("%I64d/n",a);

printf("%I64u/n",a);

代码如下:

DWORD tmpData = 0;	//存放读取的数据
char bufOutput[512] = {0};
sprintf_s(bufOutput, "R3 ZP:EXE 返回数据地址=0x%p 返回数据地址=0x%16X 返回数据地址=0x%llX R0写入R3的返回数据:%I64d R0写入R3的返回数据:%lld 返回数据长度=%d 实际返回长度=%d 行号=%d\n", &tmpData, &tmpData, &tmpData, tmpData, tmpData, sizeof(tmpData), dwRetSize, __LINE__);
	OutputDebugStringA(bufOutput);

错误:无法启动此程序,因为计算机中丢失mfc140ud.dll。

当我们编写的MFC程序要在虚拟机中运行的时候,报上述错误,这是由于虚拟机中没有安装vc2015、vc2017运行库(支持库),甚至某些开发库导致的错误。
解决方法:
不要用Debug编译,要用Release编译,并且要在项目属性配置中,设置成在静态库中使用MFC。


虚拟机蓝屏后的dump文件生成设置

  • 鼠标右击我的电脑,属性,高级系统设置,会打开系统属性对话框,点击高级,点击启动和故障恢复这个组框里的设置:

win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决_第5张图片
勾选将事件写入系统日志,写入调试信息这个组框里我们一般选择核心内存转储就可以了:

win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决_第6张图片

  • dump文件在虚拟机操作系统中的:
    C:\Windows\
    当然,你也可以创建一个dump目录,在写入调试信息组框里设置该目录。

  • 设置虚拟内存分页文件的大小
    如果设置完dump选项后,点击确定出现下图提示的话:
    win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决_第7张图片
    我们回调高级标签页中,点击性能组框中的设置:

win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决_第8张图片
打开性能选项对话框,点击高级,点击虚拟内存组框中的更改:

win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决_第9张图片
win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决_第10张图片
如上图所示,修改虚拟内存分页文件的自定义大小,给它调整大一些就可以了,然后点击设置、确定按钮,重新启动虚拟机。


虚拟机优化提速

原有的默认设置是CPU数量和每个处理的的内核数量都是1,这样由于占用的CPU资源比较低,会造成速度比较慢,所以要根据你本机实际CPU数量、核心数来设置虚拟机的CPU(可以打开任务管理器、性能,可以通过CPU使用记录组框得到CPU核心数),只要保证处理器内核总数没有警告就行;
虚拟机的内存设置为4096MB,也可以根据你本机实际内存来设置;


虚拟机花屏问题

重新安装vmtools,点击修改,把SVGA驱动程序给禁掉,然后一路确定,这个时候系统用的就是标准的VGA了,现在它虽然不会花屏,但是性能不好,我们可以在虚拟机中安装驱动大师或者驱动精灵,先做一个硬件检测,把显卡驱动升级一下,然后重新启动系统,调整分辨率即可。


错误:无法打开虚拟机\Virtual Machines\某目录\某文件名.vmx

当我们打开虚拟机时候,报上述错误,这是由于虚拟机中的系统可能由某些死机、无响应的错误导致的。
解决方法:
找到该虚拟机系统所在的目录:

win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决_第11张图片
win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决_第12张图片
将目录中的*.vmx~后缀名改为vmx,然后删除上图中的3个目录(尤其是*.vmx.lcx这个锁定文件)和第4个一长串数字字母组成的文件名这个临时文件。


错误 MSB8040缓解Spectre 漏洞的库以及输出SXS.DLL的垃圾信息

链接:https://blog.csdn.net/zhaopeng01zp/article/details/128222988


驱动开发配置项目属性

//VS2010+WDK7.1,编译32位和64位的驱动配置

//到微软官网下载WDK7.1,安装到默认的C盘根目录即可

//编译出32位驱动
VS2010里新建一个空项目,新建一个配置名:DriverWDK32 	//自行定义名字
VS++目录-》可执行文件目录:C:\WinDDK\7600.16385.1\bin\x86;$(ExecutablePath)   //其实这里都是32位的编译器,链接器,只是通过传参,调用X86或者AMD64的编译连接器,生成32位或者64位的驱动
常规-》目标文件扩展名:.sys
C/C++-》常规-》附加包含目录:C:\WinDDK\7600.16385.1\inc\ddk;C:\WinDDK\7600.16385.1\inc;C:\WinDDK\7600.16385.1\inc\crt;C:\WinDDK\7600.16385.1\inc\api;%(AdditionalIncludeDirectories)
C/C++-》常规-》调试信息格式:C7 兼容 (/Z7)
C/C++-》优化-》优化:已禁用 (/Od)
C/C++-》预处理器-》预处理器定义:WIN32=100;_X86_=1;WINVER=0x500;DBG=1;%(PreprocessorDefinitions)
C/C++-》代码生成-》运行库:多线程调试 (/MTd)
C/C++-》代码生成-》缓冲区安全检查:否 (/GS-)
C/C++-》高级-》调用约定:__stdcall (/Gz)
C/C++-》高级-》编译为:编译为 C++ 代码 (/TP)

链接器-》常规-》启用增量链接:否 (/INCREMENTAL:NO)
链接器-》常规-》附加库目录:C:\WinDDK\7600.16385.1\lib\win7\i386;%(AdditionalLibraryDirectories)
链接器-》输入-》附加依赖项:ntoskrnl.lib;Hal.lib;wdm.lib;wdmsec.lib;wmilib.lib;ndis.lib;MSVCRT.LIB;LIBCMT.LIB;%(AdditionalDependencies)
链接器-》输入-》忽略所有默认库:是 (/NODEFAULTLIB)
链接器-》清单文件-》启用用户账户控制(UAC):否 (/MANIFESTUAC:NO)
链接器-》调试-》生成调试信息:是 (/DEBUG)
链接器-》调试-》生成映射文件名:是 (/MAP)
链接器-》系统-》子系统:控制台 (/SUBSYSTEM:CONSOLE)
链接器-》系统-》堆栈保留大小:4194304
链接器-》系统-》堆栈提交大小:4096
链接器-》系统-》驱动程序:驱动程序 (/Driver)
链接器-》高级-》入口点:DriverEntry
链接器-》高级-》设置校验和:是 (/RELEASE)
链接器-》高级-》基址:0x10000
链接器-》高级-》随机地址:空
链接器-》高级-》数据执行保护(EDP):空
链接器-》高级-》目标计算机:MachineX86 (/MACHINE:X86)

//编译64位驱动,稍微改动下边的几个,其他跟上边相同即可:
VS2010里新建一个空项目,新建一个配置名:DriverWDK64	//自行定义名字
链接器-》常规-》附加库目录:C:\WinDDK\7600.16385.1\lib\win7\amd64;$(LibraryPath)
C/C++-》预处理器-》预处理器定义:WIN32=100;_AMD64_=1;WINVER=0x501;DBG=1;%(PreprocessorDefinitions)   //这里用到的估计也就只有_AMD64_,DBG,因为剩下的都不是64位的定义,没用到也就能编译过去了
链接器-》高级-》目标计算机:MachineX64 (/MACHINE:X64)

windbg双机调试

一、虚拟机设置

	 1、串行端口
	 如果有打印机,建议删除,这样虚拟机占用的是串行端口1,即com1;
	 2、使用命名的管道为\\.\pipe\com1
	 虚拟机这里填入的命名管道名称随便填,只是一个别名(代表串行端口),所以说可以为\\.\pipe\abc123,只要在下面windbg快捷方式中和这个abc123别名一致就可以了;
	 3、进入虚拟机系统桌面后,运行msconfig.exe,如下设置:

win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决_第13张图片
如果虚拟机设置中没有打印机,新增的就是串行端口1,那么这里就选择COM1即可;
如果虚拟机有打印机,新增的就是串行端口2,那么这里就要选择COM2了。

一、windbg双机调试设置

  • windbg双机调试 方式1:
    -b -k com:pipe,port=\.\pipe\abc123,resets=0,reconnect -y

      "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe"  -b -k com:pipe,port=\\.\pipe\abc123,resets=0,reconnect -y
      
       设置符号,添加系统环境变量_NT_SYMBOL_PATH 的值为:
       srv*c:\symbols*http://msdl.microsoft.com/download/symbols
       符号根据你所在目录进行设置,例如 srv\*dsymbols_xpsp3之类;
       也可以不设置系统环境变量,直接在快捷方式里添加:
       -y SRV*D:\Symbols*http://msdl.microsoft.com/download/symbols
       完整的快捷方式为:
      "C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x86\windbg.exe" -y SRV*D:\symbols_win732*http://msdl.microsoft.com/download/symbols -b -k com:port=\\.\pipe\com_4,baud=115200,pipe
      或者:
      "C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x64\windbg.exe" -y SRV*D:\XPSP3_Symbols*http://msdl.microsoft.com/download/symbols -b -k com:pipe,port=\\.\pipe\com_1,baud=115200,reconnect
    
  • windbg双机调试 方式2
    不用快捷方式打开内核调试连接:
    ctrl+K Kernel Debug
    打开Kernel Debugging 选COM选项卡
    勾选pipe,
    勾选Reconnect
    Resets置0
    Baud Rate 115200
    Port \.\pipe\com1

win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决_第14张图片
如果虚拟机中设置的命名端口别名是\.\pipe\abc123的话,这里windbg菜单Kernel Debugging(如上图所示)中的Port就要设置为\.\pipe\abc123才可以。

你可能感兴趣的:(Windows驱动编程基础,关闭驱动签名,驱动测试模式)