void app_log_file(char *fmt, ...) { va_list args; VMINT drv, hdl; VMUINT written; VMINT ret; vm_time_t time = {0}; char buf[LOG_BUF_SIZE] = {0}; VMWCHAR wpath[FILE_PATH_SIZE] = {0}; VMCHAR path[FILE_PATH_SIZE] = {0}; buf[LOG_BUF_SIZE - 2] = '\r'; buf[LOG_BUF_SIZE - 1] = '\n'; va_start( args, fmt ); vm_get_time(&time); vm_sprintf(buf+strlen(buf), "[%02d:%02d:%02d]", time.hour, time.min, time.sec); vm_vsprintf(buf+strlen(buf), fmt, args); drv = vm_get_removable_driver() > 0 ? vm_get_removeable_driver() : vm_get_system_driver(); vm_sprintf(path, "%c:\\%s", drv, BT_NAME".log"); vm_gb2312_to_ucs2(wpath, sizeof(wpath), path); hdl = vm_file_open(wpath, MODE_APPEND, 0); if (hdl < 0) hdl = vm_file_open(wpath, MODE_CREATE_ALWAYS_WRITE, 0); else { if (!flag_delete_log) { vm_file_close(hdl); vm_file_delete(wpath); flag_delete_log = 1; hdl = vm_file_open(wpath, MODE_CREATE_ALWAYS_WRITE, 0); } } vm_file_write(hdl, buf, LOG_BUF_SIZE, &written); vm_file_close(hdl); va_end( args ); }
/***************************************************************************** * FUNCTION * vm_so_load_file * DESCRIPTION * load so file * PARAMETERS * filename : [IN] so file name encoding with UCS format. * RETURNS * load so result. *****************************************************************************/ VMINT vm_so_load_file(VMWSTR fileName,_vm_pcb_t* father_pcb) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ vm_so_node_t* node; VMINT bufSize, ret = -1; #ifdef __MRE_CORE_SAFETY__ VMINT certres = -1; VMUCHAR* cert_buff; VMINT buflen = 3072; #endif VMCHAR tmp_buf[24]; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ node = (vm_so_node_t*)_vm_kernel_calloc(sizeof(vm_so_node_t)); if( node == NULL ) { MMI_TRACE(MMI_MRE_TRC_MOD_VMSO, TRC_MRE_VMSO_02); return VM_PMNG_NO_MEM; } if (kal_wstrchr(fileName, '\\') == NULL) { if (!vm_so_get_path(vm_get_removeable_driver(), fileName, node->soname) ) { MMI_TRACE(MMI_MRE_TRC_MOD_VMSO, TRC_MRE_VMSO_03); if (!vm_so_get_path(vm_get_system_driver(), fileName, node->soname) ) { VMUINT i,appcount,smcount,socount; VMWCHAR tempName[64]; VMCHAR tempName1[64]; MMI_TRACE(MMI_MRE_TRC_MOD_VMSO, TRC_MRE_VMSO_04); vm_init_default_game(&appcount, &smcount, &socount); for(i = 0; i < socount; i++) { vm_ascii_to_ucs2((VMWSTR)tempName, 64, (VMSTR)mre_buildin_vso_array[i].file_name); if(kal_wstrcmp(tempName, fileName) == 0) { sprintf(tempName1, "%c:\\%u.rom", 64, mre_buildin_vso_array[i].address); vm_ascii_to_ucs2((VMWSTR)node->soname, 64, (VMSTR) tempName1); return VM_SO_SUCCESS; } } MMI_TRACE(MMI_MRE_TRC_MOD_VMSO, TRC_MRE_VMSO_05); return VM_SO_FILE_NOT_FOUND; } } } else { vm_wstrcpy(node->soname, fileName); } #ifdef __MRE_CORE_SAFETY__ if ((cert_buff = (VMUCHAR* )_vm_kernel_malloc(buflen)) == NULL) { MMI_TRACE(MMI_MRE_TRC_MOD_VMSO, TRC_MRE_VMSO_06); return -1; } certres = vm_ce_auth_app_ex(node->soname, cert_buff, buflen, VERIFY_FULL); _vm_kernel_free(cert_buff); if (certres < VM_CE_VERIFY_OK ) { MMI_TRACE(MMI_MRE_TRC_MOD_VMSO, TRC_MRE_VMSO_07, certres); return certres; } #endif #ifndef MRE_ON_MODIS ret = vm_so_read_file( node ); if( ret < 0) { MMI_TRACE(MMI_MRE_TRC_MOD_VMSO, TRC_MRE_VMSO_08, ret); return ret; } #else node->memIndex = vm_alloc_memory(1024*500); node->heapBase = g_vsm_mem_info[node->memIndex].mem_base; node->heapSize = 1024*500; #endif node->pcb = father_pcb; _vm_so_list_insert(node); node->base_name = (VMWSTR)wcsrchr((wchar_t *)node->soname, L'\\'); if (node->base_name != NULL) { node->base_name++; } else { node->base_name = node->soname; } bufSize = 24; if (vm_get_vm_tag(node->soname, VM_CE_INFO_ISSUE, (void *)tmp_buf, &bufSize) == GET_TAG_TRUE) { node->build_id = (tmp_buf[4] << 24) + (tmp_buf[8] << 16) + (tmp_buf[12] << 8) + tmp_buf[16]; } else { node->build_id = 0; } node->dtype = DEBUG_SHARED_OBJECT; #ifndef MRE_ON_MODIS if(node->file_type == VM_VSO_RVCT) { typedef VMINT (*vm_rvct_so_entry_fp)(VMUINT symtab); vm_rvct_so_entry_fp so_entry; so_entry = (vm_rvct_so_entry_fp)(node->entry); so_entry((VMUINT)vm_get_sym_entry); } else if(node->file_type == VM_VSO_GCC) { typedef VMINT (*vm_gcc_so_entry_fp)(VMUINT symtab, VMUINT address, VMUINT count); vm_gcc_so_entry_fp so_entry; so_entry = (vm_gcc_so_entry_fp)(node->entry); so_entry((VMUINT)vm_get_sym_entry, (VMUINT)node->sysv_node.sysv_init_array, node->sysv_node.sysv_init_count); } else { MMI_TRACE(MMI_MRE_TRC_MOD_VMSO, TRC_MRE_VMSO_09); } #else node->memIndex = vm_entry_vso(node->soname, (unsigned int)vm_get_sym_entry); #endif if (node->sysEventHandler) { node->sysEventHandler(VM_SO_MSG_LOAD, 0); } return node->memIndex; }