以下3种方式,一步一步来,方式一操作一遍后还不行,就继续操作方式二,还不行的话继续方式三。
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。
(1)管理员权限运行cmd,输入bcdedit /set testsigning on和bcdedit /Debug on,开启测试模式和调试模式。
输入bcdedit /dbgsettings查看设置情况。
(2)驱动程序项目的配置属性,Driver Signing里的Sign Mode改为Test Sign。
(3)运行,gpedit.msc,用户配置,管理模板,系统,驱动程序安装,鼠标右击"设备驱动程序的代码签名"图标,选择"编辑"项,勾选"已启用"单选框,选择"选项→忽略"项。
先把虚拟机中的操作系统切换到测试模式,具体步骤如下:
① 在虚拟机中以管理员身份通过【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工具,如果运行提示“C:\Windows\system32\Drivers\Dbgv.sys: 拒绝访问”。
这是由于操作系统目录权限的问题,因为DebugView这个程序它对系统目录没有写入的权限,所以它在第一次运行解压Dbg.sys的时候解压不进去;
以管理员的身份来运行也不行。
解决方法:
将DebugView这个exe复制到"C:\Windows\system32\Drivers"这个系统目录下,并发送一个该exe应用程序的快捷方式到桌面上运行就行了,这个时候它就能够运行起来,捕捉到我们的内核信息了。
如果平时不使用windbg双机调试的话,虚拟机开机后在启动菜单那里选择普通启动即可(只要打开了测试模式),不需要进入调试模式就可以加载我们编写的驱动。
参考:
http://www.manongjc.com/detail/56-jhctcpdeofdpczh.html
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));
例如:警告 C4100 “RegistryPath”: 未引用的形参 MyDriver001 C:\Users\Administrator\source\repos\MyDriver001\Driver.c。
解决方法:
给每个未使用的形参使用宏UNREFERENCED_PARAMETER。
UNREFERENCED_PARAMETER(RegistryPath);
或者使用一下即可(占位):
RegistryPath;
你可以在引起警告的代码段前后如下所示设置编译器警告状态:
#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
如果我们项目属性的警告等级为最高级4,将警告是为错误的话,那么有些隐式转换会导致warning C4047,即不能将UINT32类型的值分配到HANDLE类型的实体,导致编译错误。
解决办法:通过(PVOID)(size_t)
强制转换类型,size_t是关键。
如果我们项目属性的警告等级为最高级4,将警告是为错误的话,那么有些隐式转换会导致warning C4042,导致编译错误。
解决办法:通过(UINT32)(size_t)
强制转换类型,size_t是关键。
在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);
当我们编写的MFC程序要在虚拟机中运行的时候,报上述错误,这是由于虚拟机中没有安装vc2015、vc2017运行库(支持库),甚至某些开发库导致的错误。
解决方法:
不要用Debug编译,要用Release编译,并且要在项目属性配置中,设置成在静态库中使用MFC。
勾选将事件写入系统日志,写入调试信息这个组框里我们一般选择核心内存转储就可以了:
dump文件在虚拟机操作系统中的:
C:\Windows\
当然,你也可以创建一个dump目录,在写入调试信息组框里设置该目录。
设置虚拟内存分页文件的大小
如果设置完dump选项后,点击确定出现下图提示的话:
我们回调高级标签页中,点击性能组框中的设置:
如上图所示,修改虚拟内存分页文件的自定义大小,给它调整大一些就可以了,然后点击设置、确定按钮,重新启动虚拟机。
原有的默认设置是CPU数量和每个处理的的内核数量都是1,这样由于占用的CPU资源比较低,会造成速度比较慢,所以要根据你本机实际CPU数量、核心数来设置虚拟机的CPU(可以打开任务管理器、性能,可以通过CPU使用记录组框得到CPU核心数),只要保证处理器内核总数没有警告就行;
虚拟机的内存设置为4096MB,也可以根据你本机实际内存来设置;
重新安装vmtools,点击修改,把SVGA驱动程序给禁掉,然后一路确定,这个时候系统用的就是标准的VGA了,现在它虽然不会花屏,但是性能不好,我们可以在虚拟机中安装驱动大师或者驱动精灵,先做一个硬件检测,把显卡驱动升级一下,然后重新启动系统,调整分辨率即可。
当我们打开虚拟机时候,报上述错误,这是由于虚拟机中的系统可能由某些死机、无响应的错误导致的。
解决方法:
找到该虚拟机系统所在的目录:
将目录中的*.vmx~后缀名改为vmx,然后删除上图中的3个目录(尤其是*.vmx.lcx这个锁定文件)和第4个一长串数字字母组成的文件名这个临时文件。
链接: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)
1、串行端口
如果有打印机,建议删除,这样虚拟机占用的是串行端口1,即com1;
2、使用命名的管道为\\.\pipe\com1
虚拟机这里填入的命名管道名称随便填,只是一个别名(代表串行端口),所以说可以为\\.\pipe\abc123,只要在下面windbg快捷方式中和这个abc123别名一致就可以了;
3、进入虚拟机系统桌面后,运行msconfig.exe,如下设置:
如果虚拟机设置中没有打印机,新增的就是串行端口1,那么这里就选择COM1即可;
如果虚拟机有打印机,新增的就是串行端口2,那么这里就要选择COM2了。
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
如果虚拟机中设置的命名端口别名是\.\pipe\abc123的话,这里windbg菜单Kernel Debugging(如上图所示)中的Port就要设置为\.\pipe\abc123才可以。