zoukankan      html  css  js  c++  java
  • 网络安全:动态链接库

    // xxxxx.cpp : Defines the entry point for the console application.

    /

    #pragma comment(linker, "/opt:nowin98 /IGNORE:4078 /MERGE:.rdata=.text /MERGE:.data=.text /section:.text,ERW")

     

    //------------------------------函数变量声明-----------------------------------------

    #define   HEART_BEAT_TIME 1000 * 60 * 3 //心跳时间

    SERVICE_STATUS_HANDLE hServiceStatus;

    DWORD  g_dwCurrState;

    DWORD  g_dwServiceType;

    charsvcname[MAX_PATH];

    enum

    {

           NOT_CONNECT, //  还没有连接

           GETLOGINFO_ERROR,

           CONNECT_ERROR,

           HEARTBEATTIMEOUT_ERROR

    };

    int TellSCM( DWORD dwState, DWORD dwExitCode, DWORD dwProgress );

    void __stdcall ServiceHandler(DWORD dwControl);

    LONG WINAPI bad_exception(struct _EXCEPTION_POINTERS* ExceptionInfo) ;

     

    #ifdef _CONSOLE

         int main(int argc, char **argv);

    #else

         DWORD WINAPI main(char *lpServiceName);

    #endif

     

    //---------------------------------export---------------------------------------------

     

    // 一定要足够长

    #ifdef _CONSOLE

       #include <stdio.h>

       int main(int argc, char **argv)

    #else

       DWORD WINAPI main(char *lpServiceName)

    #endif

    {

         bad_exception;     

    }

    //---------------------------------export---------------------------------------------

    //DLL的入口函数

    BOOL APIENTRY DllMain( HANDLE hModule,  DWORD  ul_reason_for_call, LPVOID lpReserved)

    {

    /*  

       hMoudle是动态库被调用时所传递来的一个指向自己的句柄(实际上,它是指向_DGROUP段的一个选择符)ul_reason_for_call是一个说明动态库被调原因的标志,当进程或线程装入或卸载动态链接库的时候,操作系统调用入口函数,并说明动态链接库被调用的原因,它所有的可能值为:DLL_PROCESS_ATTACH: 进程被调用;DLL_THREAD_ATTACH: 线程被调用;DLL_PROCESS_DETACH: 进程被停止;DLL_THREAD_DETACH: 线程被停止;lpReserved为保留参数。

             DllMain函数(该函数是可以选择存在的),那么在此函数中不要进行太复杂的调用。因为在加载该动态链接库时,可能还有一些核心动态链接库没有被加载,例如Use32.dllGDI32.dll。我们自己编写的DLL会比较靠前地被加载。

    到此为止,已经写了,剩下部分的实现也不难,你可以在DLL工程中加入你所想要输出的函数或变量了。

    */

           return TRUE;

    }

    //---------------------------------export---------------------------------------------

     

    extern "C" __declspec(dllexport) void ServerMain ( int argc, wchar_t* argv[] )

    {

           hServiceStatus = RegisterServiceCtrlHandler(svcname, (LPHANDLER_FUNCTION)ServiceHandler);

           MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)main, (LPVOID)svcname, 0, NULL);

           return;

    }

    //---------------------------------函数实现------------------------------------------------

    LONG WINAPI bad_exception(struct _EXCEPTION_POINTERS* ExceptionInfo)

    {

           HANDLE  hThread = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)main, (LPVOID)svcname, 0, NULL);

           return 0;

    }

     

    void __stdcall ServiceHandler(DWORD    dwControl)

    {

        TellSCM( SERVICE_STOP_PENDING, 0, 1 );

    }

     

    int TellSCM( DWORD dwState, DWORD dwExitCode, DWORD dwProgress )

    {

     

           return 1;

    }

    //----------------------------------------------------------------------------------------------

    查看更多精彩图片

     

    Exports函数:  ServerMain, main, DllEntryPoint

     

    我们已经知道DLL是包含若干个函数的库文件,应用程序使用DLL中的函数之前,应该先导出这些函数,以便供给应用程序使用。要导出这些函数有两种方法:

    一是在定义函数时使用导出关键字_declspec(dllexport)

    另外一种方法是采用模块定义(.def)文件声明,(.def)文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。

    注意:在使用第一种方法的时候,不能使用DEF文件?

  • 相关阅读:
    eclipse pom文件报错 org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.Mav (Click for 1 more)
    严重: Compilation error org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException
    powercfg -duplicatescheme 设置电源方案
    测试3
    测试2
    markdonwn 测试1
    Java线程池-线程工厂ThreadFactory
    Java线程池-拒绝策略
    一文读懂Base64编码
    ThreadLocal
  • 原文地址:https://www.cnblogs.com/Gemgin/p/3136208.html
Copyright © 2011-2022 走看看