C language function dynamic call (refer to UnderC implementation)

Source: Internet
Author: User

 

# Include "stdafx. h"

# Include <stdarg. h>

# Include <windows. h>

# Include <locale. h>

# Include <stdlib. h>

 

 

Const int DC_STADCALL = 0, DC_CDECL = 1, DC_QWORD = 2, DC_NOWORD = 4, DC_RET_OBJ = 8, DC_RET_VAL = 16 + 8;

Void * gObjectReturnPtr = NULL; // useless

 

Void callfn (void * fn, int args [], int argc, void * optr, int flags, void * buff)

{

Int sz = sizeof (int) * argc;

_ Asm {

Mov ecx, argc

Mov ebx, args

// Push the arguments onto the stack, backwards

A_loop:

Cmp ecx, 0

Jz a_out

Mov eax, [ebx + 4 * ecx]

Push eax

Dec ecx

Jmp a_loop

 

A_out:

Mov ecx, optr // thiscall calling convention (MS only)

Call fn

// Cleanup stack ptr if this was a cdecl call

Mov ecx, flags

Test ecx, DC_CDECL

Jz a_over

Add esp, sz

A_over:

Test ecx, DC_RET_OBJ

Jz a_again

// These cases are peculiar to GCC

Cmp ecx, DC_RET_VAL

Jl a_skip

Mov ebx, gObjectReturnPtr

Mov [ebx], eax

Mov [ebx + 4], edx

Jmp a_finish

A_skip:

Sub esp, 4

A_again:

Mov ebx, buff

Test ecx, DC_QWORD

Jnz a_dbl

Mov dword ptr [ebx], eax

Jmp a_finish

A_dbl:

Fstp qword ptr [ebx]

A_finish:

}

}

 

 

Class {

Public:

Void show (char * msg)

{

Printf ("msg: % s/n", msg );

}

};

 

 

Template <class T>

Void * addressof (T t)

{

Void * retValue;

_ Asm {

Mov eax, t

Mov retValue, eax

}

Return retValue;

}

 

Class DllModule;

 

Class Function {

Private:

Void * addr;

Int flags;

Void * thisPtr;

Union CalRet {

_ Int64 ll;

Struct {

Int lo;

Int hi;

} I2;

Char b8 [8];

} Ret;

Public:

Function (void * func, int flag)

{

This-> addr = func;

This-> flags = flag;

This-> thisPtr = NULL;

}

Function (HMODULE hmodule, const char * funcName, int flag)

{

This-> addr = (void *) GetProcAddress (hmodule, funcName );

This-> flags = flag;

This-> thisPtr = NULL;

}

// Function (DllModule & dll, const char * funcName, int flag)

//{

// This-> addr = dll. get (funcName );

// This-> flags = flag;

// This-> thisPtr = NULL;

//}

Function (void * func, void * thisPtr, int flag)

{

This-> addr = func;

This-> thisPtr = thisPtr;

This-> flags = flag;

}

Int operator () (int nargs ,...)

{

Callfn (addr, & nargs, nargs, thisPtr, flags, ret. b8 );

Return ret. i2.lo;

}

};

 

Class DllModule {

Private:

HMODULE hmodule;

Char dllName [128];

Public:

DllModule (const char * name)

{

Hmodule = LoadLibrary (name );

Strncpy (dllName, name, 127 );

Printf ("load library % s/n", name );

}

~ DllModule ()

{

FreeLibrary (hmodule );

Printf ("free library % s/n", dllName );

}

Void * get (const char * name)

{

Return GetProcAddress (hmodule, name );

}

Function cFunc (const char * name, void * thisPtr = NULL)

{

Return Function (get (name), thisPtr, DC_CDECL );

}

Function winFunc (const char * name, void * thisPtr = NULL)

{

Return Function (get (name), thisPtr, DC_STADCALL );

}

};

 

Int main (int argc, char * argv [])

{

Int ret;

DllModule cdll ("msvcrt. dll ");

Ret = cdll. cFunc ("printf") (2, "Hello, % s/n", "baby ");

Printf ("ret % d/n", ret );

DllModule user32 ("user32.dll ");

Ret = user32.winFunc ("MessageBoxW") (4, 0, L "Hello", L "OK", 0 );

Printf ("ret % d/n", ret );

Ret = cdll. cFunc ("strstr") (2, "Caller has already cleaned the stack", "has ");

Printf ("ret % s/n", ret );

A;

Ret = Function (addressof (A: show), & a, DC_STADCALL) (1, "Class function call ");

Printf ("ret % d/n", ret );

Ret = user32.winFunc ("FindWindowW") (2, NULL, L "Google-Google Browser ");

Printf ("ret % d/n", ret );

Srand (cdll. cFunc ("time") (1, NULL ));

Int r = rand ();

Ret = user32.winFunc ("ShowWindow") (2, ret, (r % 2) = 0 );

Printf ("r = % d, ret % d/n", r, ret );

Return 0;

}

From the lqefn Column
 

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.