123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- #include "StdAfx.h"
- #include <Winsvc.h>
- #pragma comment(lib,"Advapi32.lib")
- #pragma comment(lib,"User32.lib")
- //装载NT驱动程序
- BOOL LoadNTDriver(wchar_t* lpszDriverName,wchar_t* lpszDriverPath)
- {
- wchar_t szDriverImagePath[MAX_PATH];
- //得到完整的驱动路径
- GetFullPathName(lpszDriverPath, MAX_PATH, szDriverImagePath, NULL);
- MessageBox(NULL,L"CreateService失败",L"CreateService失败",NULL);
- //myprint("loading Driver %s\r\n", lpszDriverPath);
- 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失败
- //myprint( "OpenSCManager() Faild %d ! \n", GetLastError() );
- bRet = FALSE;
- goto BeforeLeave;
- }
- else
- {
- ////OpenSCManager成功
- //myprint( "OpenSCManager() ok ! \n" );
- }
- //创建驱动所对应的服务
- hServiceDDK = CreateService( hServiceMgr,
- lpszDriverName, //驱动程序的在注册表中的名字
- lpszDriverName, // 注册表驱动程序的 DisplayName 值
- SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限
- SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序
- SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值
- SERVICE_ERROR_NORMAL, // 注册表驱动程序的 ErrorControl 值
- szDriverImagePath, // 注册表驱动程序的 ImagePath 值
- NULL,
- NULL,
- NULL,
- NULL,
- NULL);
- DWORD dwRtn;
- //判断服务是否失败
- if( hServiceDDK == NULL )
- {
- dwRtn = GetLastError();
- if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )
- {
- //由于其他原因创建服务失败
- //MessageBox(NULL,L"CreateService失败",L"CreateService失败",NULL);
- //myprint( "CreateService() Faild %d ! \n", dwRtn );
- bRet = FALSE;
- goto BeforeLeave;
- }
- else
- {
- //MessageBox(NULL,L"服务创建失败,是由于服务已经创立过",L"服务创建失败,是由于服务已经创立过",NULL);
- //服务创建失败,是由于服务已经创立过
- //myprint( "CreateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" );
- }
- // 驱动程序已经加载,只需要打开
- hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS );
- if( hServiceDDK == NULL )
- {
- //如果打开服务也失败,则意味错误
- dwRtn = GetLastError();
- //MessageBox(NULL,L"OpenService失败",L"OpenService失败",NULL);
- //myprint( "OpenService() Faild %d ! \n", dwRtn );
- bRet = FALSE;
- goto BeforeLeave;
- }
- else
- {
- //myprint( "OpenService() ok ! \n" );
- }
- }
- else
- {
- //myprint( "CreateService() ok ! \n" );
- }
- //开启此项服务
- bRet= StartService( hServiceDDK, NULL, NULL );
- if( !bRet )
- {
- DWORD dwRtn = GetLastError();
- if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING )
- {
- char sstr[20]={0};
- sprintf(sstr,"启动服务失败:%d",dwRtn);
- MessageBoxA(NULL,sstr,"StartService失败",NULL);
- //myprint( "StartService() Faild %d ! \n", dwRtn );
- bRet = FALSE;
- goto BeforeLeave;
- }
- else
- {
- if( dwRtn == ERROR_IO_PENDING )
- {
- //设备被挂住
- //MessageBox(NULL,L"设备被挂住失败",L"设备被挂住失败",NULL);
- //myprint( "StartService() Faild ERROR_IO_PENDING ! \n");
- bRet = FALSE;
- goto BeforeLeave;
- }
- else
- {
- //MessageBox(NULL,L"服务已经开启",L"服务已经开启",NULL);
- //服务已经开启
- //myprint( "StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! \n");
- bRet = TRUE;
- goto BeforeLeave;
- }
- }
- }
- bRet = TRUE;
- //离开前关闭句柄
- BeforeLeave:
- if(hServiceDDK)
- {
- CloseServiceHandle(hServiceDDK);
- }
- if(hServiceMgr)
- {
- CloseServiceHandle(hServiceMgr);
- }
- return bRet;
- }
- //////////////////////////////////////////////////////////////////////////
- BOOL UnloadNTDriver( wchar_t * szSvrName )
- {
- //OutputDebugString("unload\r\n");
- 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);
- }
- return bRet;
- }
|