filewatcherservice

来源:互联网 发布:真王精灵辅助淘宝 编辑:程序博客网 时间:2024/06/15 07:50

////filewatcherservice.h

#include <stdio.h>
#include <tchar.h>
#include <WinSvc.h>

typedef int(WINAPI*lpAddFun)(void); //宏定义函数指针类型
typedef void (__stdcall *pfnEnsureInit)(void);
typedef void (__stdcall *pfnForceTerm)(void);
static TCHAR szServiceName[] = _T("MyDllService_FileWatcher");//服务名称

//判断服务是否安装
BOOL IsInstalled();
//安装服务
BOOL Install();
//卸载服务
BOOL Uninstall();
//开启服务
void StartService();
//服务程序初始化
void Init();
//服务控制
void WINAPI ServiceCtrlHandler(DWORD opcode);
//服务主程序
void WINAPI ServiceMain(DWORD argc,LPTSTR *argv);
//服务调用的功能函数
void ServerProgram(DWORD, LPTSTR *);
void SvcDebugOut(LPSTR String,DWORD Status);

////filewatcherservice.cpp

#include "stdafx.h"
#include "filewatcherservice.h"

HINSTANCE hDll; //DLL句柄
SERVICE_STATUS testServiceStatus;//服务属性
SERVICE_STATUS_HANDLE testServiceStatusHandle;//服务句柄

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


void WINAPI ServiceMain(DWORD argc,LPTSTR *argv)
{
 DWORD status;
 DWORD specificError = 0;
 testServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
 testServiceStatus.dwCurrentState = SERVICE_START_PENDING;
 testServiceStatus.dwControlsAccepted
  = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE;

 testServiceStatusHandle = RegisterServiceCtrlHandler(
  szServiceName,
  ServiceCtrlHandler);
 if(testServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
 {
  SvcDebugOut("[TESTSRV_SERVICE]RegisterServiceCtrlHandler failed %d\n",GetLastError());
  return;
 }
 testServiceStatus.dwWin32ExitCode = S_OK;
 testServiceStatus.dwCheckPoint = 0; 
 testServiceStatus.dwWaitHint = 0; 
 testServiceStatus.dwCurrentState = SERVICE_RUNNING;
 if(!SetServiceStatus(testServiceStatusHandle, &testServiceStatus))
 {
  status = GetLastError();
  SvcDebugOut("[TESTSRV_SERVICE]SetServiceStatus error %ld\n",status);
 }
 SvcDebugOut("[TESTSRV_SERVICE]Returning the Main Thread \n",0);
 //运行的函数
 ServerProgram(argc,argv);
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 testServiceStatus.dwCurrentState = SERVICE_STOPPED; 
 SetServiceStatus(testServiceStatusHandle, &testServiceStatus);
 return;
}


void ServerProgram(DWORD argc, LPTSTR *argv)
{
 try
 {

  lpAddFun addFun; //函数指针
  hDll = LoadLibrary("FileWatcherDll.dll");

  DWORD dd = GetLastError(); 
  DWORD aa = GetLastError();

  if (hDll != NULL)
  {
   addFun = (lpAddFun)GetProcAddress(hDll, "StartFileWatcher");
   if (addFun != NULL)
   {
    int result = addFun();
    int a = 0;
   }
  }
  else if(hDll == NULL)
  {
   AfxMessageBox("hDll为空 DLL加载失败");
  }
 }
 catch (...)
 {
  int a = 0;
  AfxMessageBox("catch DLL加载失败");
 }
 Sleep(100000000);
}


void WINAPI ServiceCtrlHandler(DWORD opcode)
{
 DWORD status = 0;
 switch(opcode)
 {
 case SERVICE_CONTROL_STOP:        //停止服务
  testServiceStatus.dwCheckPoint = 0; 
  testServiceStatus.dwWaitHint = 0; 
  testServiceStatus.dwCurrentState = SERVICE_STOPPED;
  testServiceStatus.dwWin32ExitCode = 0;
  if(!SetServiceStatus(testServiceStatusHandle,&testServiceStatus))
  {
   SvcDebugOut("[TESTSRV_SERVICE]SetServiceStatus error %ld\n",status);
  }
  return ;
  break; 
 case SERVICE_CONTROL_PAUSE:        //暂停服务
  testServiceStatus.dwCurrentState = SERVICE_PAUSED;
  break; 
 case SERVICE_CONTROL_CONTINUE:       //继续服务
  testServiceStatus.dwCurrentState = SERVICE_RUNNING;
  break; 
 case SERVICE_CONTROL_INTERROGATE:
  MessageBeep(MB_OK);
  break; 
 default: 
  SvcDebugOut("[TESTSRV_SERVICE] Unrecognized opcode %ld\n",opcode);
 }
 if(!SetServiceStatus(testServiceStatusHandle,&testServiceStatus))
 {
  SvcDebugOut("[TESTSRV_SERVICE]SetServiceStatus error %ld\n",status);
 }
 return;
}


BOOL IsInstalled()
{
 BOOL bResult = FALSE;

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

 if (hSCM != NULL)
 {
  //打开服务
  SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG);
  if (hService != NULL)
  {
   bResult = TRUE;
   ::CloseServiceHandle(hService);
  }
  ::CloseServiceHandle(hSCM);
 }
 return bResult;
}


BOOL Install()
{
 if (IsInstalled())
  return TRUE;

 //打开服务控制管理器
 SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
 if (hSCM == NULL)
 {
  AfxMessageBox("Couldn't open service manager");
  return FALSE;
 }

 // 获取执行程序的路径
 TCHAR szFilePath[MAX_PATH];
 ::GetModuleFileName(NULL, szFilePath, MAX_PATH);

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

 if (hService == NULL)
 {
  ::CloseServiceHandle(hSCM);
  AfxMessageBox("Couldn't create service");
  return FALSE;
 }
 //启动服务
 StartService();
 ::CloseServiceHandle(hService);
 ::CloseServiceHandle(hSCM);
 return TRUE;
}


void StartService()
{
 SC_HANDLE hSCM;
 SC_HANDLE hService;
 hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
 if (hSCM != NULL)
 {
  //打开服务
  hService = ::OpenService(hSCM, szServiceName,SERVICE_ALL_ACCESS);
  if (hService != NULL)
  {
   //启动服务
   if(!StartService(hService,0,NULL))
   {
    AfxMessageBox("Service start error (%u)!\n",GetLastError());
    testServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
   }
   else
   {
    AfxMessageBox("service start pending");   
   }
  } 
  else
  {
   AfxMessageBox("open service error!");
  } 
 }
 else
 {
  AfxMessageBox("openSCmanager error!");
 }
 ::CloseServiceHandle(hService);
 ::CloseServiceHandle(hSCM);
}


BOOL Uninstall()
{
 if (!IsInstalled())
  return TRUE;

 SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

 if (hSCM == NULL)
 {
  AfxMessageBox("Couldn't open service manager");
  return FALSE;
 }

 SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);

 if (hService == NULL)
 {
  ::CloseServiceHandle(hSCM);
  AfxMessageBox("Couldn't open service");
  return FALSE;
 }
 
 //停止服务
 SERVICE_STATUS status; 
 ::ControlService(hService, SERVICE_CONTROL_STOP, &status);

 //删除服务
 BOOL bDelete = ::DeleteService(hService);
 ::CloseServiceHandle(hService);
 ::CloseServiceHandle(hSCM);
 FreeLibrary(hDll);
 if (bDelete)
  return TRUE;
 return FALSE;
}


void SvcDebugOut(LPSTR String,DWORD Status)
{
 char Buffer[1024];
 if(strlen(String) < 1000)
 {
  wsprintf(Buffer,String,Status);
  OutputDebugString(Buffer);
 }
}

// testfilewatcherDlg.h : 头文件
//

#pragma once


// CtestfilewatcherDlg 对话框
class CtestfilewatcherDlg : public CDialog
{
// 构造
public:
 CtestfilewatcherDlg(CWnd* pParent = NULL); // 标准构造函数

// 对话框数据
 enum { IDD = IDD_TESTFILEWATCHER_DIALOG };

 protected:
 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

 void GenerateDllToSystme32();

 void InstallFileWatcherDLL();

// 实现
protected:
 HICON m_hIcon;

 // 生成的消息映射函数
 virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 DECLARE_MESSAGE_MAP()
public:
 afx_msg void OnBnClickedButton1();
 afx_msg void OnBnClickedButton2();
 afx_msg void OnStatrService();
 afx_msg void OnDeleteService();
};

// testfilewatcherDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "testfilewatcher.h"
#include "testfilewatcherDlg.h"
#include "filewatcherservice.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#pragma comment(lib,"..\\Debug\\FileWatcherDll.lib")
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框


class CAboutDlg : public CDialog
{
public:
 CAboutDlg();

// 对话框数据
 enum { IDD = IDD_ABOUTBOX };

 protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
 DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CtestfilewatcherDlg 对话框

 


CtestfilewatcherDlg::CtestfilewatcherDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CtestfilewatcherDlg::IDD, pParent)
{
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CtestfilewatcherDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CtestfilewatcherDlg, CDialog)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 //}}AFX_MSG_MAP
 ON_BN_CLICKED(IDC_BUTTON1, &CtestfilewatcherDlg::OnBnClickedButton1)
 ON_BN_CLICKED(IDC_BUTTON2, &CtestfilewatcherDlg::OnBnClickedButton2)
 ON_COMMAND(ID_STATR_SERVICE, &CtestfilewatcherDlg::OnStatrService)
 ON_COMMAND(ID_DELETE_SERVICE, &CtestfilewatcherDlg::OnDeleteService)
END_MESSAGE_MAP()


// CtestfilewatcherDlg 消息处理程序

BOOL CtestfilewatcherDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // 将“关于...”菜单项添加到系统菜单中。

 // IDM_ABOUTBOX 必须在系统命令范围内。
 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu != NULL)
 {
  CString strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
 }

 // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
 //  执行此操作
 SetIcon(m_hIcon, TRUE);   // 设置大图标
 SetIcon(m_hIcon, FALSE);  // 设置小图标

 // TODO: 在此添加额外的初始化代码
 Init();
 SERVICE_TABLE_ENTRY DispatchTable[] =
 {
  {szServiceName,(LPSERVICE_MAIN_FUNCTION)ServiceMain},
  {NULL,NULL}
 };

 if(!StartServiceCtrlDispatcher(DispatchTable))
 {
  SvcDebugOut("[TESTSRV_SERVICE]StartServiceCtrlDispatcher %ld\n",GetLastError());
 }
 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CtestfilewatcherDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
 {
  CAboutDlg dlgAbout;
  dlgAbout.DoModal();
 }
 else
 {
  CDialog::OnSysCommand(nID, lParam);
 }
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CtestfilewatcherDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // 用于绘制的设备上下文

  SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

  // 使图标在工作区矩形中居中
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // 绘制图标
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CDialog::OnPaint();
 }
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CtestfilewatcherDlg::OnQueryDragIcon()
{
 return static_cast<HCURSOR>(m_hIcon);
}

//lpAddFun是个函数指针,返回值为int,参数为(int,int)。
typedef int(WINAPI*lpAddFun)(void); //宏定义函数指针类型

typedef void (__stdcall *pfnEnsureInit)(void);
typedef void (__stdcall *pfnForceTerm)(void);


//定义函数指针类型,指向LteLogLoaderInterFace.dll的Tran_Do函数
//typedef int(WINAPI*lp_Fun_Tran_do)(int uiType, const char *pParm,char *pRet,int uiLen);
//lp_Fun_Tran_do Fun_Tran_Do;
//HINSTANCE hDll; //DLL句柄
void CtestfilewatcherDlg::OnBnClickedButton1()
{
 // TODO: 在此添加控件通知处理程序代码
//  try
//  {
//   //HINSTANCE hDll; //DLL句柄
//   lpAddFun addFun; //函数指针
//   hDll = LoadLibrary("FileWatcherDll.dll");
//
//   DWORD dd = GetLastError();
//   //hDll = LoadLibrary("FileWatcherDll.dll");
//   DWORD aa = GetLastError();
//
//   if (hDll != NULL)
//   {
//    addFun = (lpAddFun)GetProcAddress(hDll, "StartFileWatcher");
//    if (addFun != NULL)
//    {
//     int result = addFun();
//     int a = 0;
//    }
//    pfnEnsureInit pfnDll=( pfnEnsureInit) ::GetProcAddress(hDll,
//    "DllEnsureInit");
//    if(!pfnDll)
//    {
//     return;
//    }
//    pfnDll();
//   }
//
//  }
//  catch (...)
//  {
//   int a = 0;
//  }
}

//extern "C" __declspec(dllimport) int  StartFileWatcher(void);
void CtestfilewatcherDlg::OnBnClickedButton2()
{
 // TODO: 在此添加控件通知处理程序代码
 //  StartFileWatcher();
 //  int a=100;
 //  int b =100;
 //  pfnForceTerm pfnDll=( pfnForceTerm) ::GetProcAddress(hDll,
 //   "DllForceTerm");
 //  if(!pfnDll)
 //  {
 //   return ;
 //  }
 //
 //  pfnDll();
 //
 //  bool bb = FreeLibrary(hDll);
}

 

void CtestfilewatcherDlg::OnStatrService()
{
 // TODO: 在此添加命令处理程序代码
 GenerateDllToSystme32();
 InstallFileWatcherDLL();
 MessageBox("启动服务");
  /*Install();*/


 //typedef int(*lpAddFun)(void); //宏定义函数指针类型
 //HINSTANCE hDll; //DLL句柄
 //lpAddFun addFun; //函数指针
 //char chTempPath[MAX_PATH] = {0};
 //BOOL b= SHGetSpecialFolderPath(NULL,chTempPath, CSIDL_SYSTEM,0);//获取特殊路径

 //CString sysPath;
 //sysPath.Format("%s\\KRecorder.dll",chTempPath);

 //hDll = LoadLibrary(sysPath);

 ////hDll = LoadLibrary("FileWatcherDll.dll");
 //if (hDll != NULL)
 //{
 // addFun = (lpAddFun)GetProcAddress(hDll, "Installer");
 // if (addFun != NULL)
 // {
 //  int result = addFun();
 // }  
 //}
 //FreeLibrary(hDll);
}

void CtestfilewatcherDlg::OnDeleteService()
{
 // TODO: 在此添加命令处理程序代码
 MessageBox("删除服务");
 Uninstall();
 
}

void CtestfilewatcherDlg::GenerateDllToSystme32()
{

 HRSRC hResInfo;
 HGLOBAL hResData;
 DWORD dwSize, dwWritten;
 LPBYTE p;
 HANDLE hFile;
 //char szTitle[50] = {"this is title"};
 //char  szText[20] = {"Content"};
 // 查找所需的资源
 hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDR_DLL3), "DLL");
 if (hResInfo == NULL)
 {
  AfxMessageBox("查找资源失败!");
 }
 // 获得资源尺寸
 dwSize = SizeofResource(NULL, hResInfo);
 // 装载资源
 hResData = LoadResource(NULL, hResInfo);
 if (hResData == NULL)
 {
  AfxMessageBox("装载资源失败!");
 }
 // 为数据分配空间
 p = (LPBYTE)GlobalAlloc(GPTR, dwSize);
 if (p == NULL)
 {
  AfxMessageBox("分配内存失败!");
 }
 // 复制资源数据
 CopyMemory((LPVOID)p, (LPCVOID)LockResource(hResData), dwSize);
 // 获取标题和文本,并复制数据
 //GetDlgItemText(NULL, IDC_EDT_TITLE, szTitle, 50);
 //GetDlgItemText(NULL, IDC_EDT_TEXT, szText, 20);
 //CopyMemory((LPVOID)(p + 0x7604), (LPCVOID)szTitle, 50);
 //CopyMemory((LPVOID)(p + 0x7638), (LPCVOID)szText, 20);
 // 创建文件,写数据
 char chTempPath[MAX_PATH] = {0};
 BOOL b= SHGetSpecialFolderPath(NULL,chTempPath, CSIDL_SYSTEM,0);//获取特殊路径

 CString sysPath;
 sysPath.Format("%s\\FileWatcherDll.dll",chTempPath);

 hFile = CreateFile(sysPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
 if (hFile != NULL)
 {
  WriteFile(hFile, (LPCVOID)p, dwSize, &dwWritten, NULL);
 }  
 else
 {
  AfxMessageBox("创建文件失败!");
  GlobalFree((HGLOBAL)p);
 }
 // 收尾工作,释放资源
 CloseHandle(hFile);
 GlobalFree((HGLOBAL)p);

}

void CtestfilewatcherDlg::InstallFileWatcherDLL()
{

 typedef int(*lpAddFun)(void); //宏定义函数指针类型
 HINSTANCE hDll; //DLL句柄
 lpAddFun addFun; //函数指针
 char chTempPath[MAX_PATH] = {0};
 BOOL b= SHGetSpecialFolderPath(NULL,chTempPath, CSIDL_SYSTEM,0);//获取特殊路径

 CString sysPath;
 sysPath.Format("%s\\FileWatcherDll.dll",chTempPath);

 hDll = LoadLibrary(sysPath);

 //hDll = LoadLibrary("FileWatcherDll.dll");
 if (hDll != NULL)
 {
  addFun = (lpAddFun)GetProcAddress(hDll, "Installer");
  if (addFun != NULL)
  {
   int result = addFun();
  }  
 }
 FreeLibrary(hDll);
}

 

原创粉丝点击