如何安装.sys驱动文件??

lunar2008 2008-03-12 08:47:13
我用VC++和DDK编译了一个自制的驱动,生成了一个.sys驱动文件,跪求具体安装方法:
注:(因为我是个新的不能再新的新手,请大侠门站在我的立场查看下面的要求,谢谢!)
要具体方法,不要像下面这样回答,看不懂。。。
------------------------------------------
安装驱动程序流程:
1,调用OpenSCManager()打开服务控制管理器
2,调用CreateService()创建一个服务,服务类型为内核驱动
3,调用OpenService()取得服务句柄
启动服务
4,调用StartService()启动服务
停止服务
4,调用ControlService()停止服务
删除服务
4,调用DeleteService()删除服务
5,调用CloseServiceHandle()关闭服务句柄
------------------------------------------
(上面的说明可能对于一个初级者就会认为再简单不过了,像1+1一样,可是对于我这个超级新手来说可真是天文外星编码呀..)
能把他们组合起来来段代码么,我不知道上面是用什么软件写的。。我只想把这个.sys文件成生一个像.exe的文件,只要带着他,到任何一台电脑,一双击就自动在后台运行了我的驱动。。。
...全文
18399 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
BullWeiHaiDong 2011-12-10
  • 打赏
  • 举报
回复
marke
xiaoqs 2010-12-22
  • 打赏
  • 举报
回复
MARK
minmin0876 2009-02-12
  • 打赏
  • 举报
回复
驱动查看器 可以查看驱动是否在运行了
看到以前自己的提问
可能太弱智了
都没人回答阿
我自己答了吧
minmin0876 2008-07-25
  • 打赏
  • 举报
回复
安装以后怎么查看我的驱动有没有在运行阿?
BatiTan 2008-05-13
  • 打赏
  • 举报
回复
DDK的Tools里有个GenInf工具可以生成.inf文件的
lunar2008 2008-03-17
  • 打赏
  • 举报
回复
你的程序能改些再具体点么,我试了,哇哇报错。。
(我是个超新手,。。。跪求再细点的代码):

-------------
ServiceTest.cpp文件(我都放这里了..)
-------------
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
//定义全局函数变量

void Init();
BOOL IsInstalled();
BOOL Install();
BOOL Uninstall();
void LogEvent(LPCTSTR pszFormat, ...);
void WINAPI ServiceMain();
void WINAPI ServiceStrl(DWORD dwOpcode);

TCHAR szServiceName[] = _T("ServiceTest");
BOOL bInstall;
SERVICE_STATUS_HANDLE hServiceStatus;
SERVICE_STATUS status;
DWORD dwThreadID;

void Init()
{
hServiceStatus = NULL;
status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
status.dwCurrentState = SERVICE_STOPPED;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
status.dwWin32ExitCode = 0;
status.dwServiceSpecificExitCode = 0;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
}

BOOL Install()
{
OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
SC_HANDLE hService = ::CreateService(
hSCM, "szServiceName", "szServiceName",
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
"F:\\kbhook.sys", NULL, NULL, _T(""), NULL, NULL);

::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
}

BOOL Uninstall()
{
OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);
ControlService(hService, SERVICE_CONTROL_STOP, &status);
DeleteService(hService);
}

//---------------------
void WINAPI ServiceMain()
{
// Register the control request handler

status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;//这个要使用,否则你不能控制

//注册服务控制

hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);
if (hServiceStatus == NULL)
{
LogEvent(_T("Handler not installed"));
return;
}
SetServiceStatus(hServiceStatus, &status);
status.dwWin32ExitCode = S_OK;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
status.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hServiceStatus, &status);

//模拟服务的运行,10后自动退出。应用时将主要任务放于此即可

int i = 0;
while (i < 10)
{
Sleep(1000);
i++;
}
//

status.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hServiceStatus, &status);
LogEvent(_T("Service stopped"));
}

void WINAPI ServiceMain()
{
int i = 0;
while (i < 10)
{
Sleep(1000);
i++;
}
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
Init();
dwThreadID = ::GetCurrentThreadId();
SERVICE_TABLE_ENTRY st[] =
{
{ szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
};

if (stricmp(lpCmdLine, "/install") == 0)
{
Install();
}
else if (stricmp(lpCmdLine, "/uninstall") == 0)
{
Uninstall();
}
else
{
if (!::StartServiceCtrlDispatcher(st))
{
LogEvent(_T("Register Service Main Function Error!"));
}
}
return 0;
}
--------------
错误报告:
--------------------Configuration: ServiceTest - Win32 Debug--------------------
Compiling...
ServiceTest.cpp
F:\VC_Windows应用程序及其它\VC++6.0_Test\ServiceTest\ServiceTest.cpp(37) : error C2065: 'hSCM' : undeclared identifier
F:\VC_Windows应用程序及其它\VC++6.0_Test\ServiceTest\ServiceTest.cpp(50) : error C2065: 'hService' : undeclared identifier
F:\VC_Windows应用程序及其它\VC++6.0_Test\ServiceTest\ServiceTest.cpp(93) : error C2084: function 'void __stdcall ServiceMain(void)' already has a body
执行 cl.exe 时出错.

ServiceTest.exe - 1 error(s), 0 warning(s)

lunar2008 2008-03-16
  • 打赏
  • 举报
回复
太谢谢8楼的朋友了,知音,接分,啊哈哈哈~~~~~~~
scq2099yt 2008-03-13
  • 打赏
  • 举报
回复
一、建立Win32 Application应用程序(当然你也可以建立其它的应用程序,但服务一般是没有用户界面的),并命名为ServiceTest。

  二、定义全局函数变量



//定义全局函数变量

void Init();
BOOL IsInstalled();
BOOL Install();
BOOL Uninstall();
void LogEvent(LPCTSTR pszFormat, ...);
void WINAPI ServiceMain();
void WINAPI ServiceStrl(DWORD dwOpcode);

TCHAR szServiceName[] = _T("ServiceTest");
BOOL bInstall;
SERVICE_STATUS_HANDLE hServiceStatus;
SERVICE_STATUS status;
DWORD dwThreadID;

  三、添加Init初始化函数

  这里主要是设置服务句柄和状态。

hServiceStatus = NULL;
status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
status.dwCurrentState = SERVICE_STOPPED;
tatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
status.dwWin32ExitCode = 0;
status.dwServiceSpecificExitCode = 0;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;

  四、添加安装和删除服务函数

  这里主要是用到了五个函数OpenSCManager、CreateService、OpenService、ControlService、DeleteService。OpenSCManager用于打开服务控制管理器;CreateService用于创建服务;OpenService用于打开已有的服务,返回该服务的句柄;ControlService则用于控制已打开的服务状态,这里是让服务停止后才删除;DeleteService用于删除指定服务。

BOOL Install();
{
 //这里列出主要的两个函数,其它的可以在代码里找。
 //打开服务控制管理器

 OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

 //创建服务
 
 SC_HANDLE hService = ::CreateService(
  hSCM, szServiceName, szServiceName,
  SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
  SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
  szFilePath, NULL, NULL, _T(""), NULL, NULL);

 ::CloseServiceHandle(hService);
 ::CloseServiceHandle(hSCM);
}

BOOL Uninstall();
{
 //这里列出主要的两个函数,其它的可以在代码里找。
 //打开服务控制管理器

 OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

 //打开服务

 OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);

 //停止服务

 ControlService(hService, SERVICE_CONTROL_STOP, &status);

 //删除服务

 DeleteService(hService);

 …
}



五、添加服务主线程函数和控制函数

  这里调用RegisterServiceCtrlHandler来注册服务的控制函数,这里要设置status.dwControlsAccepted为SERVICE_ACCEPT_STOP,否则你不能控制这个服务的状态。

void WINAPI ServiceMain()
{
 // Register the control request handler

 status.dwCurrentState = SERVICE_START_PENDING;
 status.dwControlsAccepted = SERVICE_ACCEPT_STOP;//这个要使用,否则你不能控制

 //注册服务控制

 hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);
 if (hServiceStatus == NULL)
 {
  LogEvent(_T("Handler not installed"));
  return;
 }
 SetServiceStatus(hServiceStatus, &status);
 status.dwWin32ExitCode = S_OK;
 status.dwCheckPoint = 0;
 status.dwWaitHint = 0;
 status.dwCurrentState = SERVICE_RUNNING;
 SetServiceStatus(hServiceStatus, &status);

 //模拟服务的运行,10后自动退出。应用时将主要任务放于此即可

 int i = 0;
 while (i < 10)
 {
  Sleep(1000);
  i++;
 }
 //

 status.dwCurrentState = SERVICE_STOPPED;
 SetServiceStatus(hServiceStatus, &status);
 LogEvent(_T("Service stopped"));
}

  六、在主线程函数里注册控制函数和程序执行主体

void WINAPI ServiceMain()
{
 …

 //如上,这里主要是说明这就是程序的执行体
 //模拟服务的运行,10后自动退出。应用时将主要任务放于此即可

 int i = 0;
 while (i < 10)
 {
  Sleep(1000);
  i++;
 }
 …
}

  七、在main函数里注册添加安装、删除、注册主函数

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,

int nCmdShow)
{
 Init();
 dwThreadID = ::GetCurrentThreadId();
 SERVICE_TABLE_ENTRY st[] =
 {
  { szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
  { NULL, NULL }
 };

 if (stricmp(lpCmdLine, "/install") == 0)
 {
  Install();
 }
 else if (stricmp(lpCmdLine, "/uninstall") == 0)
 {
  Uninstall();
 }
 else
 {
  if (!::StartServiceCtrlDispatcher(st))
  {
   LogEvent(_T("Register Service Main Function Error!"));
  }
 }
 return 0;
}

scq2099yt 2008-03-13
  • 打赏
  • 举报
回复
用vc写
cofanz 2008-03-13
  • 打赏
  • 举报
回复
INF很好写的,简单说就是定义了一些常量和依赖关系。
lunar2008 2008-03-12
  • 打赏
  • 举报
回复
听说用那种方法也得需要.inf文件啊,inf文件可不可能自动生成,怎么做.inf文件啊..
lunar2008 2008-03-12
  • 打赏
  • 举报
回复
晕,说错了,是直接进入我的工程目录下输入
nmake..
lunar2008 2008-03-12
  • 打赏
  • 举报
回复
谢谢2楼的朋友,你说的方法好像很诱人,我也看到那个文件了!我以前在编译.sys文件时是这样操作的:
打开DDK的WinXP Free Bulid Environment窗口,然后在下面输入:
D:\WINDDK\2600~1.110> nmake
这样就在我的工程目录生成了.sys

那么你说的直接编译成.exe应该在具体怎么输入......
对不起,我是太新的手了,望指点一二..
cofanz 2008-03-12
  • 打赏
  • 举报
回复
在DDK的安装目录中有个例子src\setup\install,直接用它编译完的EXE来安装就可以
lunar2008 2008-03-12
  • 打赏
  • 举报
回复
我想这段代码实现应该不长,请大侠么帮我写下这段代码:
都要用到什么软件(VC++么),把你们写的代码放在(什么名.c,什么名.h一类的文件里)..
本PDF电子书包含上下两册,共1576页,带目录,高清非扫描版本。 作者: 毛德操 胡希明 丛书名: Linux内核源代码情景分析 出版社:浙江大学出版社 目录 第1章 预备知识 1.1 Linux内核简介. 1.2 Intel X86 CPU系列的寻址方式 1.3 i386的页式内存管理机制 1.4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2.9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射 2.12 系统调用brk() 2.13 系统调用mmap() 第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3.2 中断向量表IDT的初始化 3.3 中断请求队列的初始化 3.4 中断的响应和服务 3.5 软中断与Bottom Half 3.6 页面异常的进入和返回 3.7 时钟中断 3.8 系统调用 3.9 系统调用号与跳转表 第4章 进程与进程调度 4.1 进程四要素 4.2 进程三部曲:创建、执行与消亡 4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 文件系统 5.1 概述 5.2 从路径名到目标节点 5.3 访问权限与文件安全性 5.4 文件系统的安装和拆卸 5.5 文件的打开与关闭 5.6 文件的写与读 5.7 其他文件操作 5.8 特殊文件系统/proc 第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1系统调用socket() 7.2函数sys—socket()——创建插口 7.3函数sys—bind()——指定插口地址 7.4函数sys—listen()——设定server插口 7.5函数sys—accept()——接受连接请求 7.6函数sys—connect()——请求连接 7.7报文的接收与发送 7.8插口的关闭 7.9其他 第8章设备驱动 8.1概述 8.2系统调用mknod() 8.3可安装模块 8.4PCI总线 8.5块设备的驱动 8.6字符设备驱动概述 8.7终端设备与汉字信息处理 8.8控制台的驱动 8.9通用串行外部总线USB 8.10系统调用select()以及异步输入/输出 8.11设备文件系统devfs 第9章多处理器SMP系统结构 9.1概述 9.2SMP结构中的互斥问题 9.3高速缓存与内存的一致性 9.4SMP结构中的中断机制 9.5SMP结构中的进程调度 9.6SMP系统的引导 第10章系统引导和初始化 10.1系统引导过程概述 10.2系统初始化(第一阶段) 10.3系统初始化(第二阶段) 10.4系统初始化(第三阶段) 10.5系统的关闭和重引导

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧