文档章节

vc编程实现sys文件的安装

simpower
 simpower
发布于 2019/11/18 14:10
字数 1009
阅读 19
收藏 0

3 月,跳不动了?>>>



#include <windows.h> 
#include <winsvc.h> 
#include <conio.h> 
#include <stdio.h>

#define DRIVER_NAME "123467"
#define DRIVER_PATH "..\\HelloDDK.sys"

//装载NT驱动程序
BOOL LoadNTDriver(char* lpszDriverName,char* lpszDriverPath)
{

/************************ 加载NT驱动的代码*******************************
   ① 调用OpenSCManager,打开SCM管理器.如果返回NULL,则返回失败,否则继续
   ② 调用CreateService,创建服务,创建成功则转步骤 ⑥
      ③ 用GetLastError的得到错误返回值
   ④ 返回值为ERROR_IO_PENDING,说明服务已经创建过,用OpenService打开此服务.
   ⑤ 返回值为其他值, 创建武服务失败,返回失败.
   ⑥ 调用StartService开启服务
   ⑦ 成功返回
************************************************************************/

char szDriverImagePath[256];
//得到完整的驱动路径
GetFullPathName(lpszDriverPath, 256, szDriverImagePath, NULL);

BOOL bRet = FALSE;

SC_HANDLE hServiceMgr=NULL;// SCM管理器的句柄
SC_HANDLE hServiceDDK=NULL;// NT驱动程序的服务句柄


//打开服务控制管理器
hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );

if( hServiceMgr == NULL ) 
{
   // OpenSCManager失败
   printf( "OpenSCManager() Faild %d ! \n", GetLastError() );
   bRet = FALSE;
   goto BeforeLeave;
}
else
{
   // OpenSCManager成功
   printf( "OpenSCManager() ok ! \n" ); 
}


//创建驱动所对应的服务
hServiceDDK = CreateService( hServiceMgr,
   lpszDriverName,         // 驱动程序的在注册表中的名字 
   lpszDriverName,         // 注册表驱动程序的 DisplayName 值 
   SERVICE_ALL_ACCESS,     // 加载驱动程序的访问权限 
   SERVICE_KERNEL_DRIVER, // 表示加载的服务是驱动程序 
   SERVICE_DEMAND_START,   // 注册表驱动程序的 Start 值 
   SERVICE_ERROR_IGNORE,   // 注册表驱动程序的 ErrorControl 值 
   szDriverImagePath,      // 注册表驱动程序的 ImagePath 值 
   NULL, 
   NULL, 
   NULL, 
   NULL, 
   NULL);

DWORD dwRtn;
// 判断服务是否失败
if( hServiceDDK == NULL ) 
{ 
   dwRtn = GetLastError();
   if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS ) 
   { 
    //由于其他原因创建服务失败
    printf( "CrateService() Faild %d ! \n", dwRtn ); 
    bRet = FALSE;
    goto BeforeLeave;
   } 
   else 
   {
    //服务创建失败,是由于服务已经创立过
    printf( "CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" ); 
   }

   // 驱动程序已经加载,只需要打开 
   hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS ); 
   if( hServiceDDK == NULL ) 
   {
    // 如果打开服务也失败,则意味错误
    dwRtn = GetLastError(); 
    printf( "OpenService() Faild %d ! \n", dwRtn ); 
    bRet = FALSE;
    goto BeforeLeave;
   } 
   else 
   {
    printf( "OpenService() ok ! \n" );
   }
} 
else 
{
   printf( "CrateService() ok ! \n" );
}

// 开启此项服务
bRet= StartService( hServiceDDK, NULL, NULL ); 
if( !bRet ) 
{ 
   DWORD dwRtn = GetLastError(); 
   if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING ) 
   { 
    printf( "StartService() Faild %d ! \n", dwRtn ); 
    bRet = FALSE;
    goto BeforeLeave;
   } 
   else 
   { 
    if( dwRtn == ERROR_IO_PENDING ) 
    { 
     // 设备被挂住
     printf( "StartService() Faild ERROR_IO_PENDING ! \n");
     bRet = FALSE;
     goto BeforeLeave;
    } 
    else 
    { 
     // 服务已经开启
     printf( "StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! \n");
     bRet = TRUE;
     goto BeforeLeave;
    } 
   } 
}
bRet = TRUE;
// 离开前关闭句柄
BeforeLeave:
if(hServiceDDK)
{
   CloseServiceHandle(hServiceDDK); // 服务句柄
}
if(hServiceMgr)
{
   CloseServiceHandle(hServiceMgr); // SCM句柄
}
return bRet;
}

// 卸载驱动程序 
BOOL UnloadNTDriver( char * szSvrName ) 
{
/************************* 卸载NT驱动的代码******************************
   ① 调用OpenSCManager,打开SCM管理器,如果返回NULL,则返回失败,否则继续.
   ② 调用OpenService.如果返回NULL,则返回失败,否则继续
   ③ 调用DeleteService卸载此项服务.
   ④ 成功返回.
************************************************************************/

BOOL bRet = FALSE;
SC_HANDLE hServiceMgr=NULL;// SCM管理器的句柄
SC_HANDLE hServiceDDK=NULL;// NT驱动程序的服务句柄
SERVICE_STATUS SvrSta;
// 打开SCM管理器
hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); 
if( hServiceMgr == NULL ) 
{
   // 打开SCM管理器失败
   printf( "OpenSCManager() Faild %d ! \n", GetLastError() ); 
   bRet = FALSE;
   goto BeforeLeave;
} 
else 
{
   // 打开SCM管理器失败成功
   printf( "OpenSCManager() ok ! \n" ); 
}

// 打开驱动所对应的服务
hServiceDDK = OpenService( hServiceMgr, szSvrName, SERVICE_ALL_ACCESS );

if( hServiceDDK == NULL ) 
{
   // 打开驱动所对应的服务失败
   printf( "OpenService() Faild %d ! \n", GetLastError() ); 
   bRet = FALSE;
   goto BeforeLeave;
} 
else 
{ 
   printf( "OpenService() ok ! \n" ); 
}

// 停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。 
if( !ControlService( hServiceDDK, SERVICE_CONTROL_STOP , &SvrSta ) ) 
{ 
   printf( "ControlService() Faild %d !\n", GetLastError() ); 
} 
else 
{
   // 打开驱动所对应的失败
   printf( "ControlService() ok !\n" ); 
} 
// 动态卸载驱动程序。 
if( !DeleteService( hServiceDDK ) ) 
{
   // 卸载失败
   printf( "DeleteSrevice() Faild %d !\n", GetLastError() ); 
} 
else 
{ 
   // 卸载成功
   printf( "DelServer:eleteSrevice() ok !\n" ); 
} 
bRet = TRUE;
BeforeLeave:
// 离开前关闭打开的句柄
if(hServiceDDK)
{
   CloseServiceHandle(hServiceDDK); // 服务句柄
}
if(hServiceMgr)
{
   CloseServiceHandle(hServiceMgr); // SCM 句柄
}
return bRet; 
}

void TestDriver()
{
// 测试驱动程序 
HANDLE hDevice = CreateFile("\\\\.\\HelloDDK", 
   GENERIC_WRITE | GENERIC_READ, 
   0, 
   NULL, 
   OPEN_EXISTING, 
   0, 
   NULL); 
if( hDevice != INVALID_HANDLE_VALUE ) 
{
   MessageBox(NULL,"SUCESSFULLY....ComeOn...","Yes",0);
   printf( "Create Device ok ! \n" ); 
}
else 
{
   printf( "Create Device faild %d ! \n", GetLastError() ); 
   MessageBox(NULL,"Faild...Fuckking...","No",0);
}
CloseHandle( hDevice );
}

int main(int argc, char* argv[]) 
{  

UnloadNTDriver(DRIVER_NAME);
// 加载驱动
BOOL bRet = LoadNTDriver(DRIVER_NAME,DRIVER_PATH);
if (!bRet)
{
   printf("LoadNTDriver error\n");
   return 0;
}
// 加载成功

printf( "press any to create device!\n" ); 
getch();

TestDriver();

// 这时候你可以通过注册表,或其他查看符号连接的软件验证。 
printf( "press any to unload the driver!\n" ); 
getch();

// 卸载驱动
UnloadNTDriver(DRIVER_NAME);
// if (!bRet)
// {
//   printf("UnloadNTDriver error\n");
//   return 0;
// }
system("pause");
return 0; 
}

 

 

本文转载自:https://blog.csdn.net/shejiannan/article/details/9339719

simpower
粉丝 29
博文 708
码字总数 53502
作品 0
海淀
程序员
私信 提问
加载中

评论(0)

基于VS2008和Matlab R2010b版本的混合编程的实现

众所周知Matlab的强大运算能力让各种工程软件望而却步,而VC程序的友好界面又让人爱不释手,如果能够让两者的优势结合起来的话,势必能让程序员欢欣鼓舞。还好MathWorks已经为我们想到了,基...

木木情深
2012/12/06
348
0
VC6.0 +WDK 开发驱动的环境配置[转]

在安装完VC6和WDK以后,就开始进行环境的配置了,可结果是弄了半个上午,还是搞不定。去网上找信息,关于WDK的,多是使用VS2005或VS2008的,有的要借助于DriverStudio之类的,按上面的方法来...

nothingfinal
2012/02/23
0
0
win7下vc6.0的安装

在win下用C++编程,很多新手都用VC6.0。winxp下的安装应该说问题是比较少的,win7下则有些小问题需解决。本人从网上找到些文章作为参考,加上自己的安装经验,总结了win7下VC6.0的安装步骤。...

lovedan
2013/02/08
0
0
Python安装中需要特别注意的一件事

默认安装的Python开发环境已经附带了很多高级数据类型,如列表、元组、字典、集合、队列等,无需进一步编程就可以使用这些数据类型的操作。 使用这些数据类型使得实现抽象的数学概念非常简单...

zlw东南风
2017/10/10
0
0
Vc调用matlab导出的dll,实现vc与matlab混合编程

Vc调用matlab导出的dll,实现vc与matlab混合编程 写这篇博客的目的就是想把前段时间的工作交接下,让后来人接手这个项目的人迅速的入门。文章虽短,在项目初期可是搜刮了很多资料花了不少的时...

长平狐
2012/10/08
1.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么只能在头文件中实现模板? - Why can templates only be implemented in the header file?

问题: Quote from The C++ standard library: a tutorial and handbook : 引用来自C ++标准库:教程和手册 : The only portable way of using templates at the moment is to implement t......

javail
今天
19
0
Gradle 6 针对已有的构建如何创建一个构建扫描

有关构建扫描的定义为: 构建扫描(build scan)是一个中心化并且可以共享的构建记录。这个构建记录通常能够告诉在构建中发生了什么并且为什么会发生。 通过应用构建扫描插件到你的项目中,你...

honeymoose
今天
17
0
C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存

一、malloc/free概述 malloc是在C语言中用于在程序运行时在堆中进行动态内存分配的库函数。free是进行内存释放的库函数。 1、函数原型 #include <stdlib.h> void *malloc( size_t size ); v...

shzwork
今天
17
0
什么是JavaBean? - What is a JavaBean exactly?

问题: I understood, I think, that a "Bean" is a Java class with properties and getters/setters. 我认为,“ Bean”是具有属性和getter / setter的Java类。 As much as I understand,......

技术盛宴
今天
27
0
深圳援鄂最后一批工作人员归来,88万元关爱金发放至85人

中国公益在线3月31日深圳讯 深圳援鄂最后一批工作人员归来......深圳市民政局、深圳市卫健委和深圳市慈善会发起了“深爱战疫天使基金”项目,联合龙华区慈善会和 永贤慈善基金会,进行第二次...

传承天下融媒体中心
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部