Exemplo n.º 1
0
	void EnterJs(){
		HandleScope store;
		int rt = -1;
		if(_env!=0) return;
		_env = new JsEnv;
		_threadFlag = 1;
		*_env->cont = Context::New(NULL,ObjectTemplate::New());
		(*_env->cont)->Enter();
		Handle<Object> glb = GetGlobal();

		LoadBase();
		LoadConsole(glb);
		LoadAPICall(glb);
		//给全局添加stack只读变量.
		glb->Set(String::New("Stack"),Object::New(),ReadOnly);
		//加载基本的JS库文件
		cs::ResID rid(IDR_JS_BASE);
		LoadJsRes(rid,L"IDR_JS_BASE");
		//加载JS库里面的纯js类或函数, 供C++使用.
		LoadLibStruct(glb);
	}
Exemplo n.º 2
0
/*
    Función: LoadConsole
    Descripción: 
        Funcion encargada la crear la conexion por sockets y esperar llamadas 
        externas desde el "Netcat".
    Parametros: 
        -
    Retorno: 
        -
*/
void
LoadConsole( void )
{
   // Variables locales
    PCOMMAND        cmd;    
    WSABUF          DataBuf;
    char            buffer[SIZE_OF_BUFFER];
    int             i = 0;
    int             exit_sucess, rc;
    int             sock;
    int             recvbuflen, iSendResult;
    BOOL            cmd_ok;
    WSAOVERLAPPED   RecvOverlapped = {0};
    DWORD           iFlags, iResult;
        
    // Inicializacion de variables    
    cmd         = (PCOMMAND) calloc( 1              , sizeof(COMMAND) );    

    // Esperamos una conexion externa para la comunicacion        
    sock = WaitForConn();                    
    if 
    ( 
        (sock == SOCKET_ERROR) ||  (cmd == NULL)     
    )
    {
        MessageBoxA
        ( 
            NULL                                  , 
            "Can't start console."                , 
            "ERROR"                               , 
            MB_ICONERROR | MB_OK 
        );
        return;
    }
                
    // Creamos un evento para manejar la conexion Overlapped
    RecvOverlapped.hEvent = WSACreateEvent();
    if ( RecvOverlapped.hEvent  == NULL )   
    {        
        WSACloseEvent(RecvOverlapped.hEvent);
        closesocket(sock);
        
        free( cmd );
        
        // Volvemos a escuchar
        LoadConsole(); 
            
        return; 
    }
        
    // Seteamos los buffers            
    DataBuf.len = SIZE_OF_BUFFER;
    DataBuf.buf = buffer;                  
                
    // Enviamos la cabecera el cliente conectado            
    ShowConsoleHeader( sock );    
    
    exit_sucess = 0;
                
    // Ciclo principal de recepcion de datos y procesado
    do 
    {
        // Preparamos los buffers        
        memset( buffer, 0, SIZE_OF_BUFFER );        
        memset( cmd, 0, sizeof( COMMAND ) );
        cmd_ok = FALSE;
        iFlags = 0;
        
        // Enviamos el PROMPT del sistema
        RemotePrint( sock, PROMPT );    
        
        // Leemos el buffer del socket de forma asincrona        
        rc = WSARecv( sock, &DataBuf, 1, NULL, &iFlags, &RecvOverlapped, NULL );
        if ( ( rc == SOCKET_ERROR ) && ( WSA_IO_PENDING != WSAGetLastError() ) ) 
        {
            iResult = 0;
            exit_sucess == 1;
        }

        rc = \
            WSAWaitForMultipleEvents
                ( 1, &RecvOverlapped.hEvent, TRUE, INFINITE, TRUE );
        if ( rc == WSA_WAIT_FAILED ) 
        {
            iResult = 0;
            exit_sucess == 1;
        }

        rc = \
            WSAGetOverlappedResult
                ( sock, & RecvOverlapped, & iResult, FALSE, & iFlags );
        if ( rc == FALSE ) 
        {
            iResult = 0;
            exit_sucess == 1;
        }

        WSAResetEvent(RecvOverlapped.hEvent);                            
        
        // Procesamos los datos recibidos si hemos recibido algo
        if ( iResult > 0 ) 
        {                                                 
            // Eliminamos el salto de linea del Netcat
            buffer[ iResult - 1 ] = 0;
            
            // Parseamos el buffer de entrada                  
            Parser( buffer, cmd );    
                   
            // CONTROL DE COMANDOS
            exit_sucess = ConsoleAdmin( sock, cmd );
            
        }  
        
        // Controlamos si debemos salir
        if ( exit_sucess == 1 )
        {
            closesocket(sock);
        }
        
    } while ( ( iResult > 0) && (exit_sucess == 0) );
    
    // Cerramos el evento
    WSACloseEvent(RecvOverlapped.hEvent);
    
    // Liberamos la memoria pedida
    free( cmd );
        
    // Volvemos a escuchar
    LoadConsole();            
}