VS
将vs安装在c盘默认目录program files(x86)
,组件勾选sdk,选最新版即可。
然后去微软官网下载WDK,安装程序会自动下载对应版本,一直点击“下一步”即可,不要点否!!!
项目设置,Driver setting,确保系统匹配,平台一般为Desktop。如果一加载就蓝屏,通常是忘了设置这一步。
vs远程调试
对于目标主机上的用户层程序,需要远程调试。
vs安装目录\Community\Common7\IDE\Remote Debugger
拷贝到目标主机上,运行msvsmon.exe。
若目标主机没有密码,则配置本地安全策略-本地策略-安全选项-账户:使用空密码的账户...
,禁用。
本机上vs,调试-附加到进程
,
连接目标输入IP,查找到端口或直接输入IP:端口
。选择目标进程附加即可。
卸载
如果所安装的WDK,SDK或者VS错误了,可以使用卸载工具将它们全部卸载干净再配置。
普通的卸载工具是卸载不干净的,但以下工具可以卸天卸地卸空气: Total Uninstall(旗舰版)
虚拟机
vm配置
虚拟机配置为1个核心。 每个核都有一个GDTR。windbg调试时命令提示符kd前面会有核的标号。当然也有切换的方法。
注册表
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]
"DEFAULT"=dword:0000000f
保存到.reg文件中,双击运行, 重启即可.
驱动加载器
void CDriverLoaderDlg::OnDropFiles(HDROP hDropInfo)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDialogEx::OnDropFiles(hDropInfo);
TCHAR filePath[MAX_PATH] = { 0 };
//单文件操作,第二参数置0,第三个参数返回文件路径
DragQueryFile(hDropInfo, 0, filePath, MAX_PATH - 1);
SetDlgItemText(IDC_PATH, filePath);
m_strPath.Format(filePath);
UpdateData(FALSE);
DragFinish(hDropInfo); //释放拖放占用内存,必须!
}
void CDriverLoaderDlg::OnBnClickedBtnload()
{
// 1. 打开服务管理器
m_hServiceManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
// 2. 创建服务
m_hService = CreateService(m_hServiceManager,
L"ServiceName",
L"ServceDisplayName",
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER, //Service Type: Driver
SERVICE_DEMAND_START,
SERVICE_ERROR_IGNORE,
m_strPath,
NULL,
NULL,
NULL,
NULL,
NULL);
// 2.1 若服务存在,直接打开
if (ERROR_SERVICE_EXISTS == GetLastError())
{
m_hService = OpenService(m_hServiceManager, L"ServiceName", SERVICE_ALL_ACCESS);
}
// 2.2 判断是否成功
if (!m_hService)
{
CString cs;
cs.Format(_T("%d"), GetLastError());
MessageBox(L"CreateService Failed", cs);
CloseServiceHandle(m_hServiceManager);
return;
}
// 3. 查询服务状态,若服务暂停,则启动服务
SERVICE_STATUS status;
QueryServiceStatus(m_hService, &status);
if (SERVICE_STOPPED == status.dwCurrentState)
{
StartService(m_hService, NULL, NULL);
Sleep(1000);
// check again
QueryServiceStatus(m_hService, &status);
if (status.dwCurrentState != SERVICE_RUNNING)
{
MessageBoxA(0, 0, 0, 0);
CloseServiceHandle(m_hServiceManager);
CloseServiceHandle(m_hService);
}
else
{
m_strStatus = L"Running";
UpdateData(FALSE);
}
}
}
void CDriverLoaderDlg::OnBnClickedBtnunload()
{
// 若服务不是停止状态,则停止
SERVICE_STATUS status;
CloseHandle(m_hDev);
QueryServiceStatus(m_hService, &status);
if (SERVICE_STOPPED != status.dwCurrentState)
{
ControlService(m_hService, SERVICE_CONTROL_STOP, &status);
while(QueryServiceStatus(m_hService, &status))
{
Sleep(status.dwWaitHint);
if (SERVICE_STOPPED == status.dwCurrentState)
{
m_strStatus = L"Stopped";
UpdateData(FALSE);
}
else
{
m_strStatus = L"Can't stop";
UpdateData(FALSE);
}
break;
}
}
// 删除服务(卸载驱动)
if (!DeleteService(m_hService))
{
CString cs;
cs.Format(_T("%d"), GetLastError());
MessageBox(L"DeleteService Failed", cs);
//m_State = L"卸载失败";
}
else
{
Sleep(1000);
m_strStatus = L"DeleteService Successfully";
UpdateData(FALSE);
}
CloseServiceHandle(m_hService);
CloseServiceHandle(m_hServiceManager);
}
双机调试
VirtualKD target放进虚拟机,windbg连接后
,在调试状态下保存快照。
保存快照这一步当然要放在最后。