#include <malloc.h>
#include <string.h>
//entorno
extern "C" int vars = 0;
extern "C" char** _environ = 0;
extern "C" char* __stdcall GetEnvironmentStrings(void);
extern "C" bool __stdcall FreeEnvironmentStringsA(char *block);
void __cdecl _envinit(void);
//parametros
extern "C" int __argc = 1;
extern "C" char** __argv = 0;
extern "C" void __stdcall ExitProcess(unsigned long uExitCode);
extern "C" char* __stdcall GetCommandLineA(void);
extern int main(int argc, char *argv[],char *env[]);
extern "C" int __stdcall MessageBoxA(int a,char *b,char *c,unsigned int p);
typedef void (__cdecl *_PVFV)(void);
#pragma data_seg(".CRT$XIA")
_PVFV __xi_a[] = { 0 };
#pragma data_seg(".CRT$XIZ")
_PVFV __xi_z[] = { 0 };
#pragma data_seg(".CRT$XCA")
_PVFV __xc_a[] = { 0 };
#pragma data_seg(".CRT$XCZ")
_PVFV __xc_z[] = { 0 };
typedef void (* PFV)(void);
#pragma data_seg(".CRT$XPA")
PFV __xp_a = 0; /* C pre-terminators */
#pragma data_seg(".CRT$XPZ")
PFV __xp_z = 0;
#pragma data_seg(".CRT$XTA")
PFV __xt_a = 0; /* C terminators */
#pragma data_seg(".CRT$XTZ")
PFV __xt_z = 0;
extern "C" void __cdecl _initterm(_PVFV *, _PVFV *);
//__xi_a[], __xi_z[]; /* C initializers */
//__xc_a[], __xc_z[]; /* C++ initializers */
//__xp_a[], __xp_z[]; /* C pre-terminators */
//__xt_a[], __xt_z[]; /* C terminators */
extern "C" void destructores();
#define FALSE 0
#define TRUE 1
extern "C" void mainCRTStartup()
{
char *parametros = GetCommandLineA();
char *temp = (char*)malloc(2048);
memset(temp,0,2048);
__argc = 0;
__argv = (char**)malloc(4);
char Except = FALSE;
while(*parametros)
{
if (*parametros == 34)
{
if (Except == FALSE)
{
Except = TRUE;
}
else
{
Except = FALSE;
if (strlen(temp) > 0)
{
__argv = (char**)realloc(__argv,4 * (__argc+1));
__argv[__argc] = (char*)malloc(strlen(temp) + 1);
memset(__argv[__argc],0,strlen(temp) + 1);
strcpy(__argv[__argc],temp);
strcpy(temp,"");
__argc++;
}
}
parametros++;
continue;
}
if ( (*parametros == 32) && (Except == FALSE) )
{
if (strlen(temp) > 0)
{
__argv = (char**)realloc(__argv,4 * (__argc+1));
__argv[__argc] = (char*)malloc(strlen(temp) + 1);
memset(__argv[__argc],0,strlen(temp) + 1);
strcpy(__argv[__argc],temp);
strcpy(temp,"");
__argc++;
}
}
else
{
unsigned long pos = strlen(temp);
temp[pos] = *parametros;
temp[pos+1] = 0;
}
parametros++;
}
if (strlen(temp) > 0)
{
__argv = (char**)realloc(__argv,4 * (__argc+1));
__argv[__argc] = (char*)malloc(strlen(temp) + 1);
memset(__argv[__argc],0,strlen(temp) + 1);
strcpy(__argv[__argc],temp);
strcpy(temp,"");
__argc++;
}
free(temp);
_initterm(__xi_a,__xi_z);
_initterm(__xc_a,__xc_z);
_envinit();
main(__argc,__argv,_environ);
_initterm(&__xp_a,&__xp_z);
_initterm(&__xt_a,&__xt_z);
destructores();
for (int y = 0;y < __argc;y++) { free(__argv[y]); }
free(__argv);
for (int z = 0;z < vars;z++)
{
if (_environ[z]) { free(_environ[z]); }
}
free(_environ);
ExitProcess(0);
}
static void __cdecl _initterm(_PVFV *pfbegin,_PVFV *pfend)
{
while (pfbegin < pfend)
{
if (*pfbegin) { (**pfbegin)(); }
++pfbegin;
}
}
void __cdecl _envinit(void)
{
char *var = GetEnvironmentStrings();
_environ = (char**)malloc(4);
while(*var)
{
_environ = (char**)realloc(_environ,(vars + 1) * 4);
_environ[vars] = (char*)malloc(strlen(var) + 1);
memset(_environ[vars],0,strlen(var) + 1);
strcpy(_environ[vars],var);
(char*)var += strlen((char*)var);
(char*)var +=1;
vars++;
}
FreeEnvironmentStringsA(var);
}