仙人指路的编程乐园
留言簿 主人介绍 返回主页
Windows驱动 毕设 电子电路 电脑 PE外壳 心情 Windows应用程序 随笔 Web技术 加密算法 古老的DOS编程 杂项
服务程序(参考)
类别: Windows应用程序  上传时间: 2010-1-14 11:19:58  浏览(103)  留言(0) 
2008年的时候用VC6.0编译的一个简单的Windows服务程序,能接收加密锁的插拔事件。当插上加密锁的时候,服务程序就运行一个记事本程序。在命令行窗口中执行sc命令可以安装和卸载服务,sc.exe是强大的windows服务管理工具,它在C:\Windows\System32目录下。

安装服务
--------------------------
sc create _TEST type= interact type= own start= auto binpath= E:\qqq\CheckDog.exe

在服务管理器中的名字是“_Test”,和桌面交互,开机自启动,服务程序的路径是E:\qqq\CheckDog.exe,需要注意“=”号后面有一个空格。

卸载服务
-------------------------
sc delete _TEST

运行服务
------------------------
sc start _TEST

下面是全部源代码,基本上没有多余的逻辑:
#include <windows.h>
#include "Ry4S.h"

SERVICE_STATUS      g_ss = {0};
SERVICE_STATUS_HANDLE g_ssh;
bool DogExistFlag =  false;

//接收启动停止的命令
VOID WINAPI  ControlHandler(DWORD fdwControl)
{
  DbgPrintf("ControlHandler(%d)",  fdwControl);
  if(fdwControl == SERVICE_CONTROL_STOP)
  {
    DbgPrintf("服务程序结束");
    g_ss.dwCurrentState  = SERVICE_STOPPED;
  }
  SetServiceStatus(g_ssh,  &g_ss);
}

//消息处理,  接收插拔锁的消息
LRESULT  CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  DbgPrintf("接收消息(%X,  %X,  %X,  %X)", hwnd,  message, wParam, lParam);

  //加密锁需要的参数
  WORD  retcode, handle;
  DWORD lp1, lp2; 
  WORD  p1, p2, p3, p4;
  BYTE  buffer[1024]; 

  if(message == WM_DEVICECHANGE)
  {
    //检查加密锁是不是准备好
    p1 = 0xc44c;
    p2 = 0xc8f8; 
    p3 = 0; 
    p4 = 0;
    retcode  = Rockey(RY_FIND, &handle, &lp1, &lp2, &p1,  &p2, &p3, &p4, buffer); 
    if(retcode == 0) //找到锁
    {
      if(! DogExistFlag)
      {
        DbgPrintf("找到Rockey4Smart加密锁,打开一个记事本程序吧");
        ShellExecute(0,  0, "c:\\windows\\notepad.exe", 0, 0, SW_NORMAL);
        DogExistFlag = true;
      }
    }
    else
    {
      DogExistFlag = false; //加密锁不存在
    }
  }
  return DefWindowProc(hwnd, message,  wParam,  lParam);
}


//创建一个隐藏的窗口接受消息
void CreateReceiveMsgWnd()
{
  DbgPrintf("创建窗口");
  WNDCLASS wc  = {0};
  HWND hwnd;
  MSG  msg;
 
  //注册窗口
  wc.lpfnWndProc = (WNDPROC) WndProc;        // Window procedure  address
  wc.hInstance = GetModuleHandle(0);;        // Instance  handle
  wc.lpszClassName = "MyWndClass";        // WNDCLASS  name 
  RegisterClass(&wc); 
 
  //创建窗口
  hwnd = CreateWindow(
    "MyWndClass",        // WNDCLASS  name
    "SDK Application",      // Window title
    WS_OVERLAPPEDWINDOW,    // Window style
    CW_USEDEFAULT,        // Horizontal position
    CW_USEDEFAULT,        // Vertical  position   
    CW_USEDEFAULT,        // Initial width
    CW_USEDEFAULT,        // Initial height
    HWND_DESKTOP,        // Handle of parent  window
    NULL,            // Menu  handle
    GetModuleHandle(0),      // Application's instance handle
    NULL            // Window-creation data
    );

  while(GetMessage(&msg, NULL, 0,  0)) 
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
}

//服务的主程序
VOID WINAPI  ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) 
{

  DbgPrintf("进入服务主程序");
  g_ssh =  RegisterServiceCtrlHandler("My_Test_Service", ControlHandler);
  if(g_ssh ==  0)
    return; 

  //将服务置为启动状态
  g_ss.dwServiceType = SERVICE_WIN32; 
  g_ss.dwCurrentState  = SERVICE_RUNNING;
  g_ss.dwControlsAccepted  = SERVICE_ACCEPT_STOP;
  SetServiceStatus(g_ssh,  &g_ss);

  //创建窗口并处理消息
  CreateReceiveMsgWnd();
}

//程序的入口点
void main()
{
  DbgPrintf("入口函数");
 
  //程序中只包含一个服务
  SERVICE_TABLE_ENTRY  ste[2];
  ste[0].lpServiceName = "My_Test_Service";
  ste[0].lpServiceProc = ServiceMain;
  ste[1].lpServiceName = 0;
  ste[1].lpServiceProc = 0;
  StartServiceCtrlDispatcher(ste);
}
上一篇: EXE文件执行后删除自己(Delphi)  下一篇: VC++写的TCP协议聊天室程序(示例)


留言
 
查看全部留言



Copyright © 2009 BY MISSSIR,网站版权所有。 京ICP备09095257号

花褪残红青青杏小。燕子飞时,绿水人家绕。枝上柳绵吹又少。天涯何处无芳草。
墙里秋千墙外道。墙外行人,墙里佳人笑。笑渐不闻声渐悄。多情总被无情恼。

今年访问量 24077  今月访问量 637  今日访问量 40 

关于 您的地址
您的大名 您的邮箱
QQ/MSN/Tel 是否保密
留言内容