1.
SCM管理简介 下面的函数都是Windows API 函数
A service object represents an installed service. The CreateService and OpenService functions return handles to installed services
The OpenSCManager, CreateService, and OpenService functions can request different types of access to SCManager and service objects. The requested access is granted or denied depending on the access token of the calling process and the security descriptor associated with the SCManager or service object.
The CloseServiceHandle function closes handles to SCManager and service objects. When you no longer need these handles, be sure to close them.
在SCM NT式驱动是当作服务加载的。
SC_HANDLE WINAPI OpenSCManager //打开服务管理器 若成功返回其句柄 若失败返回NULL
(
__in_opt LPCTSTR lpMachineName, //机器名字 一般是 NULL 表示本机
__in_opt LPCTSTR lpDatabaseName, //服务控制管理数据库名字 一般是NULL 表示默认的数据库
__in DWORD dwDesiredAccess //设置使用权限 一般用SC_MANAGER_ALL_ACCESS所有权限。
);
BOOL WINAPI CloseServiceHandle //关闭服务控制管理器对象 或者 关闭服务对象 若成功返回非零 失败返回 零
(
__in SC_HANDLE hSCObject // OpenSCManager 、OpenService 、 CreateService 创建的句柄
);
SC_HANDLE WINAPI OpenService( //打开一个存在的服务 若成功返回句柄 若失败返回NULL
__in SC_HANDLE hSCManager, //OpenSCManager所打开的管理器句柄
__in LPCTSTR lpServiceName, //想要打开服务的名字 是被CreateService创建的lpServiceName 而不是用户层暴露的服务名
__in DWORD dwDesiredAccess //打开权限 一般用SC_MANAGER_ALL_ACCESS 所有权限
);
SC_HANDLE WINAPI CreateService( //创建一个服务对象并把它加载到指定的服务管理器中
__in SC_HANDLE hSCManager, //指定的服务管理器的句柄 OpenSCManager 返回的句柄
__in LPCTSTR lpServiceName, //要创建的 服务名
__in_opt LPCTSTR lpDisplayName, //显示给用户的服务名。
__in DWORD dwDesiredAccess, //打开权限
__in DWORD dwServiceType, //服务类型 一般用SERVICE_KERNEL_DRIVER 表示驱动服务
__in DWORD dwStartType, //打开服务的时间 一般用SERVICE_DEMAND_START表示按需要启动
__in DWORD dwErrorControl, //加载服务出现错误的处理 SERVICE_ERROR_IGNORE 表示忽略错误
__in_opt LPCTSTR lpBinaryPathName, //驱动文件的完整路径
__in_opt LPCTSTR lpLoadOrderGroup, //要加载的驱动属于那个组 一般为NULL 表示该驱动不属于任何组
__out_opt LPDWORD lpdwTagId, // 上面是NULL 这个一般也为NULL lpdwTagId A 指向接收 lpLoadOrderGroup 参数中指定的组中唯一的标记值的变量 没搞明白啥意思 具体请看
__in_opt LPCTSTR lpDependencies, //依赖服务 一般也是NULL
__in_opt LPCTSTR lpServiceStartName,//服务运行的帐号名 NULL 用本地帐户 LocalSystem
__in_opt LPCTSTR lpPassword // 上面指定帐号名的密码 上面是NULL 这里也是NULL 就行
);
BOOL WINAPI StartService( //启动一个服务
__in SC_HANDLE hService, //服务的句柄 被OpenService or CreateService 返回的
__in DWORD dwNumServiceArgs, //下面是NULL 这个也是NULL
__in_opt LPCTSTR *lpServiceArgVectors//驱动一般设置NULL
);
BOOL WINAPI DeleteService( //删除指定的服务 成功非零 失败 零
__in SC_HANDLE hService //服务的句柄 被OpenService or CreateService 打开的
);
BOOL WINAPI ControlService( //控制服务
__in SC_HANDLE hService, //服务的句柄 被OpenService or CreateService 打开的
__in DWORD dwControl, //控制方式 例如 SERVICE_CONTROL_CONTINUE 启动暂停服务
__out LPSERVICE_STATUS lpServiceStatus //返回状态码
);
Control code
SERVICE_CONTROL_CONTINUE
SERVICE_CONTROL_INTERROGATE
SERVICE_CONTROL_PAUSE
SERVICE_CONTROL_STOP
2. ddk.sys 放在D盘根目录下,VC++6.0 mfc 测试代码如下 乱码的都是汉字。。。。 不看也没关系。仅仅是调试信息和注释 呵呵
BUTTON1 加载驱动 BUTTON2 卸载驱动
void CTestDDKDlg::OnButton1()
{
SC_HANDLE CSMHandle;
SC_HANDLE SerHandle;
char DDK[200]="DDK";
char path[200]="d:/ddk.sys";
CSMHandle=OpenSCManager(NULL, NULL,SC_MANAGER_ALL_ACCESS);
if(!CSMHandle)
{
MessageBox("¼ÓÔØ·þÎñ¿ØÖƹÜÀíÆ÷ʧ°Ü",NULL,MB_ICONEXCLAMATION);
CloseServiceHandle(CSMHandle);
return ;
}
SerHandle=OpenService(CSMHandle,DDK,//ÏëÒª´ò¿ª·þÎñµÄÃû×Ö ÊDZ»CreateService´´½¨µÄlpServiceName ¶ø²»ÊÇÓû§²ã±©Â¶µÄ·þÎñÃû
SC_MANAGER_ALL_ACCESS);
if(!SerHandle)
{
if(ERROR_SERVICE_DOES_NOT_EXIST==GetLastError())
{
SerHandle=CreateService( //´´½¨Ò»¸ö·þÎñ¶ÔÏó²¢°ÑËü¼ÓÔص½Ö¸¶¨µÄ·þÎñ¹ÜÀíÆ÷ÖÐ
CSMHandle, //Ö¸¶¨µÄ·þÎñ¹ÜÀíÆ÷µÄ¾ä±ú OpenSCManager ·µ»ØµÄ¾ä±ú
DDK, //Òª´´½¨µÄ ·þÎñÃû
DDK, //ÏÔʾ¸øÓû§µÄ·þÎñÃû¡£
SC_MANAGER_ALL_ACCESS, //´ò¿ªÈ¨ÏÞ
SERVICE_KERNEL_DRIVER, //·þÎñÀàÐÍ Ò»°ãÓÃSERVICE_KERNEL_DRIVER ±íʾÇý¶¯·þÎñ
SERVICE_DEMAND_START, //´ò¿ª·þÎñµÄʱ¼ä Ò»°ãÓÃSERVICE_DEMAND_START±íʾ°´ÐèÒªÆô¶¯
SERVICE_ERROR_IGNORE, //¼ÓÔØ·þÎñ³öÏÖ´íÎóµÄ´¦Àí SERVICE_ERROR_IGNORE ±íʾºöÂÔ´íÎó
path, //Çý¶¯ÎļþµÄÍêÕû·¾¶
NULL, //Òª¼ÓÔصÄÇý¶¯ÊôÓÚÄǸö×é Ò»°ãΪNULL ±íʾ¸ÃÇý¶¯²»ÊôÓÚÈκÎ×é
NULL, // ÉÏÃæÊÇNULL Õâ¸öÒ»°ãҲΪNULL lpdwTagId A Ö¸Ïò½ÓÊÕ lpLoadOrderGroup ²ÎÊýÖÐÖ¸¶¨µÄ×éÖÐΨһµÄ±ê¼ÇÖµµÄ±äÁ¿ û¸ãÃ÷°×ɶÒâ˼ ¾ßÌåÇë¿´
NULL, //ÒÀÀµ·þÎñ Ò»°ãÒ²ÊÇNULL
NULL,//·þÎñÔËÐеÄÕʺÅÃû NULL Óñ¾µØÕÊ»§ LocalSystem
NULL // ÉÏÃæÖ¸¶¨ÕʺÅÃûµÄÃÜÂë ÉÏÃæÊÇNULL ÕâÀïÒ²ÊÇNULL ¾ÍÐÐ
);
if(!SerHandle)
{
MessageBox("´´½¨·þÎñʧ°Ü",NULL,MB_ICONEXCLAMATION);
CloseServiceHandle(CSMHandle);
return ;
}
else
{
MessageBox("´´½¨·þÎñ³É¹¦",NULL,MB_ICONEXCLAMATION);
}
}
else
{
MessageBox("´ò¿ª·þÎñʧ°Ü",NULL,MB_ICONEXCLAMATION);
CloseServiceHandle(CSMHandle);
return ;
}
}
else
{
MessageBox("´ò¿ª·þÎñ³É¹¦",NULL,MB_ICONEXCLAMATION);
}
if(StartService(
SerHandle, //·þÎñµÄ¾ä±ú ±»OpenService or CreateService ·µ»ØµÄ
NULL, //ÏÂÃæÊÇNULL Õâ¸öÒ²ÊÇNULL
NULL//Çý¶¯Ò»°ãÉèÖÃNULL
))
{
MessageBox("Çý¶¯Æô¶¯³É¹¦",NULL,MB_ICONEXCLAMATION);
}
else
{
MessageBox("Çý¶¯Æô¶¯Ê§°Ü",NULL,MB_ICONEXCLAMATION);
}
CloseServiceHandle(SerHandle);
CloseServiceHandle(CSMHandle);
}
void CTestDDKDlg::OnButton2()
{
SC_HANDLE CSMHandle;
SC_HANDLE SerHandle;
char DDK[200]="DDK";
SERVICE_STATUS key;
CSMHandle=OpenSCManager(NULL, NULL,SC_MANAGER_ALL_ACCESS);
if(!CSMHandle)
{
MessageBox("¼ÓÔØ·þÎñ¿ØÖƹÜÀíÆ÷ʧ°Ü",NULL,MB_ICONEXCLAMATION);
CloseServiceHandle(CSMHandle);
return ;
}
SerHandle=OpenService(CSMHandle,DDK,//ÏëÒª´ò¿ª·þÎñµÄÃû×Ö ÊDZ»CreateService´´½¨µÄlpServiceName ¶ø²»ÊÇÓû§²ã±©Â¶µÄ·þÎñÃû
SC_MANAGER_ALL_ACCESS);
if(!SerHandle)
{
MessageBox("´ò¿ª·þÎñʧ°Ü",NULL,MB_ICONEXCLAMATION);
MessageBox("жÔØÇý¶¯Ê§°Ü",NULL,MB_ICONEXCLAMATION);
CloseServiceHandle(CSMHandle);
return ;
}
else
{
MessageBox("´ò¿ª·þÎñ³É¹¦",NULL,MB_ICONEXCLAMATION);
}
if(ControlService(
SerHandle, //·þÎñµÄ¾ä±ú ±»OpenService or CreateService ´ò¿ªµÄ
SERVICE_CONTROL_STOP, //¿ØÖÆ·½Ê½ ÀýÈç SERVICE_CONTROL_CONTINUE Æô¶¯ÔÝÍ£·þÎñ
&key//·µ»Ø״̬Âë
))
{
MessageBox("·þÎñÍ£Ö¹³É¹¦",NULL,MB_ICONEXCLAMATION);
}
else
{
MessageBox("·þÎñֹͣʧ°Ü",NULL,MB_ICONEXCLAMATION);
return ;
}
if(DeleteService(SerHandle))
{
MessageBox("жÔØÇý¶¯³É¹¦",NULL,MB_ICONEXCLAMATION);
}
else
{
MessageBox("жÔØÇý¶¯Ê§°Ü",NULL,MB_ICONEXCLAMATION);
}
CloseServiceHandle(SerHandle);
CloseServiceHandle(CSMHandle);
}
参考《Windows 驱动开放技术详解》和 MSDN