写这个工具到是没花多少时间,倒是模仿InstDrv.exe 的界面花了不少时间...模仿也是需要花时间的,没有什么技术含量,权当是学习驱动留下的纪念! 高手无视!~~
驱动加载工具(InstDrv - 中文版)链接
http://bbs.pediy.com/showthread.php?t=63374&highlight=驱动+动加+加载+载工+
算是补coderui 写加载工具没给源码的一个缺吧! 呵呵!
简介:
1.置顶功能
void WINAPI AlwaysTop(BOOL yes)
{
if (yes)
{
::SetWindowPos(g_hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE |
SWP_NOSIZE);
}
else
{
::SetWindowPos(g_hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE |
SWP_NOSIZE);
}
2.支持拖拽:
MFC框架里 要支持接收文件,也就是 右键->属性->风格 接收文件的勾勾上,然后添加WM_DROPFILES消息,下面
看代码:
void CLoadSysDlg::OnDropFiles(HDROP hDropInfo)
{
// TODO: Add your message handler code here and/or call default
m_Path = ""; //类变量,保存我的文件路径
m_Name = ""; //类变量,保存我的文件名
char szFile[MAX_PATH] = {0};
DragQueryFile(hDropInfo,0,szFile,254);
if (strcmpi(&szFile[strlen(szFile)-4],".sys")!=0)
{
MessageBox("请选择驱动文件拖入!");
return ;
}
strcpy(m_Path.GetBuffer(0),szFile);
UpdateData(FALSE);//更新文件名到窗口
UpdateData(TRUE);
int index = m_Path.GetLength()-m_Path.ReverseFind('\\')-1; //获取文件全名例driver.sys
//获取文件名
m_Name = m_Path.Right(index);
m_Name = m_Name.Left(m_Name.Find('.')); //获取文件Title 例如driver
DragFinish(hDropInfo);
}
3.接下来就是加载驱动等操作了
这是套路,也就是用下面的几个函数来操作,学过驱动的人就应该是很熟悉了吧!
加载驱动函数
OpenSCManager //打开SCM管理器
CreateService //创建服务
OpenService //打开服务
StartService //开启服务
卸载驱动
ControlService //停止驱动服务
DeleteService //动态卸载驱动程序
这几个函数不懂的就要参看MSDN了,或者Baidu,Google搜索一下
注意:定义如下变量的时候要包含头文件 #include <winsvc.h>
SC_HANDLE hServiceMgr;//SCM管理器的句柄
SC_HANDLE hServiceDDK;//NT驱动程序的服务句柄
下面给出几个关键代码:
void CLoadSysDlg::OnBtnLoad() [COLOR="Red"] //安装服务[/COLOR]
{
// TODO: Add your control notification handler code here
hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if (hServiceMgr ==NULL)
{
SetDlgItemText(IDC_STATIC_disp,"状态 :打开服务失败!");
CleanFile();
return;
}
hServiceDDK = CreateService( hServiceMgr,
m_Name.GetBuffer(0), //驱动程序的在注册表中的名字
m_Name.GetBuffer(0), // 注册表驱动程序的 DisplayName 值
SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限
SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序
SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值
SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值
m_Path.GetBuffer(0), // 注册表驱动程序的 ImagePath 值
NULL,
NULL,
NULL,
NULL,
NULL);
if( hServiceDDK == NULL )
{
m_Path.ReleaseBuffer();
m_Name.ReleaseBuffer();
SetDlgItemText(IDC_STATIC_disp,"状态:驱动服务安装失败!");
CleanFile();
return;
}
else
{
SetDlgItemText(IDC_STATIC_disp,"状态:驱动服务安装成功!");
return;//安装成功就直接返回!
}
}
void CLoadSysDlg::OnBtnStart() [COLOR="red"]//开启服务[/COLOR]
{
// TODO: Add your control notification handler code here
BOOL bret= StartService( hServiceDDK, NULL, NULL );
if (bret)
{
SetDlgItemText(IDC_STATIC_disp,"状态:驱动服务启动成功!");
return;
}
else
{
SetDlgItemText(IDC_STATIC_disp,"状态:驱动服务启动失败!");
if(hServiceDDK)
{
CloseServiceHandle(hServiceDDK);
}
if(hServiceMgr)
{
CloseServiceHandle(hServiceMgr);
}
}
}
void CLoadSysDlg::OnBtnStop() [COLOR="red"]//停止服务[/COLOR]
{
SERVICE_STATUS ServStatus;
// TODO: Add your control notification handler code here
succ = ControlService( hServiceDDK, SERVICE_CONTROL_STOP , &ServStatus );
if( !succ ) [COLOR="red"]//succ 是类变量,保存这个成功与失败[/COLOR]
{
SetDlgItemText(IDC_STATIC_disp,"状态:驱动服务控制失败!");
CleanFile();
}
else //TRUE//FALSE
{
SetDlgItemText(IDC_STATIC_disp,"状态:驱动服务控制成功!");
}
}
void CLoadSysDlg::OnBtnUnload() [COLOR="red"] //卸载服务[/COLOR]
{
// TODO: Add your control notification handler code here
if (succ) [COLOR="red"]//succ 是类变量,保存这个成功与失败[/COLOR]
{
if( !DeleteService( hServiceDDK ) )
{
SetDlgItemText(IDC_STATIC_disp,"状态:驱动服务卸载失败!");
CleanFile();
}
else
{
SetDlgItemText(IDC_STATIC_disp,"状态:驱动服务卸载成功!");
}
}
}
具体的就参见后面的源码吧! 考试刚考完,写个软件放松放松! 没有别的,主要是模仿InstDrv.exe,看雪上面有他的帖子,没有给源码,我这次就把源码补上吧,希望大家不要笑话!呵呵
算是学习驱动的一个纪念品嘛.毕竟学习驱动都是要走这一步的!!!新手可以看看!
放个图片: 大家比较比较!
驱动加载源码.zip
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)