控制台下修改系统驱动状态的代码
控制台下修改系统驱动状态的代码
最近在sinister大哥的指点下,学习一些驱动方面的东西。在调一个程序很头痛...于是写了这个东西,可以安装,卸载,启动和停止驱动,也可以查询当前系统加载驱动的状况。
没什么高深的东西,只是调用Advapi32.lib中API来实现的...代码有点乱...
VC 6.0 sp5 + win2k pro
---------
多谢sinister大哥的指点..
#include <stdio.h>
#include <windows.h>
#include <Winsvc.h>
LPENUM_SERVICE_STATUS EnumServices(SC_HANDLE, LPDWORD);
BOOL InstallService(SC_HANDLE hSCManager, LPCTSTR ServiceName, LPCTSTR ServiceExe);
BOOL RemoveService(SC_HANDLE hSCManager, LPCTSTR ServiceName);
BOOL StartService(SC_HANDLE hSCManager, LPCTSTR ServiceName);
BOOL StopService(SC_HANDLE hSCManager, LPCTSTR ServiceName);
BOOL IsAdmin(void);
void err_show(char*);
void Usage(char*);
int main(int argc, char* argv[])
{
SC_HANDLE hSCManager = NULL;
int nRet = 0;
nRet = IsAdmin();
if(!nRet)
{
printf("Must administrator privilege!/n");
}
//
// 打开服务控制管理器
//
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(hSCManager == NULL)
{
fprintf(stderr, "OpenSCManager() failed. --err: %d/n", GetLastError());
return -1;
}
//
// 调用EnumServices列举系统中的服务
//
LPENUM_SERVICE_STATUS lpServices = NULL;
DWORD dwServicesReturned = 0;
lpServices = EnumServices(hSCManager, &dwServicesReturned);
if(lpServices == 0)
{
free(lpServices);
CloseServiceHandle(hSCManager);
return -1;
}
//
// 显示服务信息
//
if(argc == 2)
{
//
// 显示帮助信息
//
if(!stricmp(argv[1], "-h") || !stricmp(argv[1], "-help"))
{
Usage(argv[0]);
return 0;
}
for(DWORD i = 0; i < dwServicesReturned; i++, lpServices++)
{
if(!stricmp(lpServices->lpServiceName, argv[1]))
break;
}
if(i == dwServicesReturned)
{
printf("Service not found!/n");
free(lpServices);
CloseServiceHandle(hSCManager);
return -1;
}
printf("[%s]/n", lpServices->lpDisplayName);
printf("/tService Name: %s/n", lpServices->lpServiceName);
printf("/tService Type: ");
switch(lpServices->ServiceStatus.dwServiceType)
{
case SERVICE_FILE_SYSTEM_DRIVER: printf("File System Driver/n");
break;
case SERVICE_KERNEL_DRIVER: printf("Device Driver/n");
break;
default: printf("User-Mode Service/n");
break;
}
printf("/tState: ");
switch(lpServices->ServiceStatus.dwCurrentState)
{
case SERVICE_PAUSED: printf("PAUSED/n");
break;
case SERVICE_RUNNING: printf("RUNNING/n");
break;
case SERVICE_STOPPED: printf("STOPPED/n");
break;
default: printf("PENDING/n");
break;
}
free(lpServices);
CloseServiceHandle(hSCManager);
return 0;
}
if(argc == 1)
{
for(DWORD i = 0; i < dwServicesReturned; i++, lpServices++)
printf("%s [%s]/n", lpServices->lpServiceName,
lpServices->lpDisplayName);
printf("/n/t/tTotal %d Service(s)./n/n", dwServicesReturned);
free(lpServices);
CloseServiceHandle(hSCManager);
return 0;
}
// ------------------------
// 分析命令行参数
// ------------------------
//
// 安装服务
//
if(!stricmp(argv[1], "-install"))
{
if(argc != 4)
{
Usage(argv[0]);
return 0;
}
nRet = InstallService(hSCManager, argv[2], argv[3]);
if(!nRet)
{
printf("Install service failed./n");
return -1;
}
}
//
// 卸载服务
//
if(!stricmp(argv[1], "-remove"))
{
if(argc != 3)
{
Usage(argv[0]);
return 0;
}
nRet = RemoveService(hSCManager, argv[2]);
if(!nRet)
{
printf("Remove service failed./n");
return -1;
}
}
//
// 启动服务
//
if(!stricmp(argv[1], "-start"))
{
if(argc != 3)
{
Usage(argv[0]);
return 0;
}
nRet = StartService(hSCManager, argv[2]);
if(!nRet)
{
printf("Start service failed./n");
return -1;
}
}
//
// 停止服务
//
if(!stricmp(argv[1], "-stop"))
{
if(argc != 3)
{
Usage(argv[0]);
return 0;
}
nRet = StopService(hSCManager, argv[2]);
if(!nRet)
{
printf("Stop service failed./n");
return -1;
}
}
// -----------------------------------------------------
CloseServiceHandle(hSCManager);
return 0;
}
//
// EnumServices
// 列举系统的驱动
// ----------------------
// 参数:
// [IN] SC_HANDLE hSCManager 服务管理器句柄
// [OUT] LPDWORD lpdwServices 系统中安装的驱动的数量
// 返回值:
// 成功返回ENUM_SERVICE_STATUS结构的指针,否则返回NULL
//
LPENUM_SERVICE_STATUS EnumServices(SC_HANDLE hSCManager, LPDWORD lpdwServices)
{
DWORD cbBytesNeeded = 0;
DWORD cbBufSize = 0;
DWORD dwServicesReturned = 0;
int nRet = 0;
//
// 首次调用EnumServicesStatus确定缓冲区的大小,由cbBytesNeeded返回
//
nRet = EnumServicesStatus(
hSCManager,
SERVICE_DRIVER,
SERVICE_STATE_ALL,
NULL,
0,
&cbBytesNeeded,
lpdwServices,
0);
LPENUM_SERVICE_STATUS lpServices = (LPENUM_SERVICE_STATUS) malloc(cbBytesNeeded);
cbBufSize = cbBytesNeeded;
nRet = EnumServicesStatus(
hSCManager,
SERVICE_DRIVER,
SERVICE_STATE_ALL,
lpServices,
cbBufSize,
&cbBytesNeeded,
lpdwServices,
0);
if(nRet == 0)
{
err_show("EnumServicesStatus()");
return NULL;
}
return lpServices;
}
//
// InstallService
// 安装服务
// 参数:
// [IN] SC_HANDLE hSCManager 服务管理器句柄
// [IN] LPCTSTR ServiceName 服务名称
// [IN] LPCTSTR ServiceExe 可执行文件(需全路径)
// 输出:
// 成功:返回TRUE,否则返回FALSE
//
BOOL InstallService(SC_HANDLE hSCManager, LPCTSTR ServiceName, LPCTSTR ServiceExe)
{
SC_HANDLE schService;
//
// so #$%@! ...:)
//
printf("Install %s... ", ServiceExe);
schService = CreateService( hSCManager, // SCManager database
ServiceName, // name of service
ServiceName, // name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_KERNEL_DRIVER, // service type
SERVICE_DEMAND_START, // start type
SERVICE_ERROR_NORMAL, // error control type
ServiceExe, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL // no password
);
if (schService == NULL)
{
if(GetLastError() == ERROR_SERVICE_EXISTS)
{
printf("Service has already installed!/n");
}
err_show("CreateService()");
return FALSE;
}
printf("Ok!/n");
CloseServiceHandle(schService);
return TRUE;
}
//
// StartService
// 启动服务
// ----------------
// 参数:
// [IN] SC_HANDLE hSCManager 服务管理器句柄
// [IN] LPCTSTR ServiceName 驱动名称
// 返回值:
// 成功返回TRUE,否则返回FALSE
//
BOOL StartService(SC_HANDLE hSCManager, LPCTSTR ServiceName)
{
SC_HANDLE schService = NULL;
int nRet = 0;
schService = OpenService(hSCManager, ServiceName, SERVICE_ALL_ACCESS);
if(schService == NULL)
{
if(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST)
{
printf("Service is not exist!/n");
return FALSE;
}
err_show("OpenService()");
return FALSE;
}
nRet = StartService(schService, 0, NULL);
if(!nRet)
{
if(GetLastError() == ERROR_SERVICE_ALREADY_RUNNING)
{
printf("Service is already running!/n");
return nRet;
}
err_show("StartService()");
}
CloseServiceHandle(schService);
return nRet;
}
//
// StopService
// 停止驱动
// ---------------
// 参数:
// [IN] SC_HANDLE hSCManager 服务管理器句柄
// [IN] LPCTSTR ServiceName 服务名称
// 返回值:
// 成功返回TRUE,否则返回FALSE
//
BOOL StopService(SC_HANDLE hSCManager, LPCTSTR ServiceName)
{
SC_HANDLE schService = NULL;
SERVICE_STATUS ServiceStatus;
int nRet = 0;
schService = OpenService(hSCManager, ServiceName, SERVICE_ALL_ACCESS);
if(schService == NULL)
return FALSE;
nRet = ControlService(schService, SERVICE_CONTROL_STOP, &ServiceStatus);
if(!nRet)
{
switch(GetLastError())
{
case ERROR_SERVICE_NOT_ACTIVE:
printf("Service has stopped!/n");
return nRet;
case ERROR_INVALID_SERVICE_CONTROL:
printf("The requested control code is not valid!/n");
return nRet;
}
err_show("ControlService()");
}
CloseServiceHandle(schService);
return nRet;
}
//
// RemoveService
// 卸载服务
// ------------
// 参数:
// [IN] SC_HANDLE hSCManager 服务管理器句柄
// [IN] LPCTSTR ServiceName 服务名称
// 返回值:
// 成功返回TRUE,否则返回FALSE
//
BOOL RemoveService(SC_HANDLE hSCManager, LPCTSTR ServiceName)
{
SC_HANDLE schService;
int nRet = 0;
schService = OpenService(hSCManager, ServiceName, SERVICE_ALL_ACCESS);
if(schService == NULL)
return FALSE;
nRet = DeleteService(schService);
if(!nRet)
{
err_show("DeleteService()");
}
CloseServiceHandle(schService);
return nRet;
}
//
// IsAdmin
// 判断当前用户是否有Administrator的权限
// -----------------------------------------
// 参数:
// N/A
// 返回值:
// 若具有权限返回TRUE,否则返回FALSE
//
BOOL IsAdmin(void)
{
HANDLE hAccessToken;
BYTE *InfoBuffer;
PTOKEN_GROUPS ptgGroups;
DWORD dwInfoBufferSize;
PSID psidAdministrators;
SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY;
UINT i;
BOOL bRet = FALSE;
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&hAccessToken))
goto cleanup;
InfoBuffer = new BYTE[1024];
if(!InfoBuffer)
goto cleanup;
bRet = GetTokenInformation(hAccessToken,
TokenGroups,
InfoBuffer,
1024,
&dwInfoBufferSize);
CloseHandle(hAccessToken);
if(!bRet)
goto cleanup;
if( !AllocateAndInitializeSid(&siaNtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0,0,0,0,0,0,
&psidAdministrators) )
goto cleanup;
bRet = FALSE;
ptgGroups = (PTOKEN_GROUPS)InfoBuffer;
for(i = 0; i < ptgGroups->GroupCount; i++)
{
if(EqualSid(psidAdministrators,ptgGroups->Groups[i].Sid))
{
bRet = TRUE;
break;
}
}
FreeSid(psidAdministrators);
cleanup:
if(InfoBuffer)
delete InfoBuffer;
return bRet;
}
void err_show(char* msg)
{
fprintf(stderr, "%s failed. --err: %d/n", msg, GetLastError());
}
void Usage(char* msg)
{
printf("+------------------------------+/n");
printf("| Services tool v0.1 |/n");
printf("| Write By CDrea |/n");
printf("| 2004-11-1 |/n");
printf("| thx to sinister |/n");
printf("| http://www.safechina.net |/n");
printf("+------------------------------+/n");
printf("USAGE:/n");
printf(" %s [[-install srv exe] | [-remove srv] | [-start srv] | [-stop srv]] [srv]/n/n", msg);
printf(" %s Show all service/n", msg);
printf(" %s srv Show status of srv_name/n", msg);
printf(" -install srv exe Install a service, and must full path of exe/n");
printf(" -remove srv Remove a service/n");
printf(" -start srv Start a service/n");
printf(" -stop srv Stop a service/n");
printf("eg./n");
printf(" %s -install fw c://fw.sys", msg);
}
控制台下修改系统驱动状态的代码相关推荐
- 在故障恢复控制台下修复系统
由于突然停电,一台机器出现了故障.自检完成后出现 "system32ntoskrnl.exe丢失无法启动" 懒的重新装系统,ghost安装偶不喜欢.难道没其他办法了么? 老是听说W ...
- 修改脚本、WSH 让系统不被恶意代码篡改
脚本是批处理文件的延伸,是一种纯文本保存的程序,一般来说的计算机脚本程序是确定的一系列控制计算机进行运算操作动作的组合,在其中可以实现一定的逻辑分支等. 脚本简单地说就是一条条的文字命令,这些文字命令 ...
- 第5章 - 二阶多智能体系统的协同控制 --> 离散时间系统一致性
第5章 - 二阶多智能体系统的协同控制 --> 连续时间系统一致性[程序代码] 回到目录 第5章 - 二阶多智能体系统的协同控制 --> 离散时间系统一致性[程序代码]
- Xcode 修改系统的代码块样式 Code Snippet
Xcode在编码的时候,系统代码块给我们提供了很大的便利.然而,有时候,也给我们带来很大的困扰. 例如,系统的 if 代码块,大括号是紧跟括号之后的. 但是现在呢,公司的代码规范是要求另起一行. ...
- 第5章 - 二阶多智能体系统的协同控制 --> 连续时间系统一致性【程序代码】
第5章 - 二阶多智能体系统的协同控制 --> 连续时间系统一致性 回到目录 第5章 - 二阶多智能体系统的协同控制 --> 离散时间系统一致性 文章目录 动态一致性 静态一致性 动态一致 ...
- java控制mac录音代码_操作详解丨如何用 Cybery 控制 mac OS系统下的录音软件(DAW)...
原标题:操作详解丨如何用 Cybery 控制 mac OS系统下的录音软件(DAW) Cybery可以在各主流平台/操作系统下实现MIDI控制功能:mac OS(可通过蓝牙.USB线或者借助其它硬件连 ...
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的I2C驱动架构分析
PowerPC + Linux2.6.25平台下的I2C驱动架构分析 Sailor_forever sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人b ...
- 系统重构的原则代码重构的原则
作者:[美]马丁•福勒(Martin Fowler) 译者:熊节, 林从羽 前一章所举的例子应该已经让你对重构有了一个良好的感觉.现在,我们应该回头看看重构的一些大原则. ##2.1 何谓重构 一线的 ...
- emmc驱动修改_eMMC驱动分析
基于ATMEL-sama5d3芯片与Linux-3.6.9内核. SD卡系列简介 这些都是网上找出来的,权当作为开场白了. MMC卡全称Multi Media Card,由西门子公司和SanDisk公 ...
最新文章
- 【怎样写代码】函数式编程 -- Lambda表达式(三):LINQ初步
- golang国际化站点
- HDU 2222 Keywords Search (AC自动机模板题)
- 一步一步教你在CentOS6.0下安装NS2(ns-allinone-2.34.tar.gz)模拟仿真工具
- java区块作用域_ES6-let、const和块级作用域
- HTML的基本知识(五)——无序列表、有序列表、自定义列表
- mysql数据库隔离级别 实现原理_MySQL事务及Spring隔离级别实现原理详解
- 【剑指offer】二进制中1的个数
- (转)Android开发书籍推荐:从入门到精通系列学习路线书籍介绍
- python脚本画pie饼图_小白学Python(11)——pyecharts,绘制饼图 Pie
- OpManager-企业网络问题分析及故障排除
- 无线电监测软件java_大牛干货:软件无线电的设计和测试
- 一篇搞懂Git 和 SVN 的区别
- 极客日报第 21 期:360 安全浏览器尝试收费;苹果macOS首次出现在云端
- 基于XC7K325T光纤传输的PCIE光纤卡、2路光纤的资料
- android es2 es3,Android模拟器和OpenGL ES3:EGL_BAD_CONFIG
- 别在让你的 await Streaking 了
- 三行代码将Excel转为任意格式的Word
- Linux常用命令——jwhois命令
- 马蜂窝 iOS App 启动治理:回归用户体验