📄 jvm_file.c
字号:
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2001
*
*****************************************************************************/
/*****************************************************************************
*
* Filename:
* ---------
* jvm_file.c
*
* Project:
* --------
* Maui_Software
*
* Description:
* ------------
* This file implements file APIs which support both virtual file on flash and
* general file on storage device.
*
* Author:
* -------
* -------
*
*============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*============================================================================
****************************************************************************/
/*************************************************************************
* Include header files
*************************************************************************/
#include "jal.h"
#include "jvm_internal.h"
#include "stdio.h"
#include "app_buff_alloc.h"
#include "jvm_adaptor.h"
#include "jvm_internal.h"
#include "j2me_custom.h"
#include "jam_internal.h"
#include "jam_msg_util.h"
#include "jam_msg_handler.h"
#include "kni.h"
#include "drm_gprot.h"
#include "drm_def.h"
/*************************************************************************
* Global Definition
*************************************************************************/
kal_char *work_dir_path;
kal_char *work_sys_dir_path;
j2me_custom_file_info_struct* work_info_ptr;
/* Default Java database folder, which drive can ben changed in j2me_custom_resource.c */
kal_char j2me_sys_dir_path[] = "C:\\@Java";
#ifdef __SUPPORT_INFUSIO__
kal_char eureka_sys_dir_path[] = "C:\\@Eureka";
#endif /* __SUPPORT_INFUSIO__ */
#ifdef SUPPORT_SURFKITCHEN
kal_char surfkitchen_sys_dir_path[] = "C:\\@SurfKitchen";
#endif /* SUPPORT_SURFKITCHEN */
#ifdef SUPPORT_MUSICWAV
kal_char musicwav_sys_dir_path[] = "C:\\@MusicWav";
#endif /* SUPPORT_MUSICWAV */
WCHAR WCHARFilename[MAX_WCHAR_FILENAME_LEN];
char CHARFilename[MAX_WCHAR_FILENAME_LEN];
static int KVM_FindFilehandle;
static kal_bool find_file_is_java_dir = KAL_FALSE;
static kal_uint32 find_file_vitual_file_id = 0;
static kal_bool find_file_from_vitual_file = KAL_FALSE;
static char *findString;
static unsigned short disk_access_name[] = { 'A', ':', '\\', 0};
kal_int32 g_jvm_card_plugin_event = 0;
extern kal_bool disk_changed;
extern kal_uint32 java_total_used_space;
extern kal_bool jvm_vm_is_paused(void);
extern kal_char *_jvm_get_dir_path(game_type_enum type);
/*************************************************************************
* Function Definition
*************************************************************************/
#ifdef ENCRYPT_JAR_FILE
#include <reg_base.h>
#include <stdlib.h>
#define KEY_FILE_NAME "ENCRKEY"
#ifdef __MTK_TARGET__
#define TDMA_TQCNT (volatile kal_uint16 *)(TDMA_base+0x00)
#define TDMA_WRAP (volatile kal_uint16 *)(TDMA_base+0x04)
extern kal_uint32 L1I_GetTimeStamp(void);
#endif /* __MTK_TARGET__ */ /* ifdef __MTK_TARGET__ */
static kal_uint32 encrypt_table[256];
static kal_uint8 decrypt_table[256];
static kal_bool jvm_file_initailized = KAL_FALSE;
static kal_int32 encrypt_code;
#ifdef __MTK_TARGET__
static long64 multiplier = 0x5DEECE66DLL;
static long64 addend = 0xBL;
static long64 Random_mask = (1LL << 48) - 1;
#else /* __MTK_TARGET__ */
static long64 multiplier = 0x5DEECE66DL;
static long64 addend = 0xBL;
static long64 Random_mask = (1 << 48) - 1;
#endif /* __MTK_TARGET__ */
static long64 result_seed;
/*****************************************************************************
* FUNCTION
* setSeed
* DESCRIPTION
* , next_rand
* The two functions can be used to generate psudo-random number.
* PARAMETERS
* seed [IN] Random number seed
* RETURNS
* void
*****************************************************************************/
__inline static void setSeed(kal_int32 seed)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
result_seed = (result_seed ^ multiplier) & Random_mask;
}
/*****************************************************************************
* FUNCTION
* next_rand
* DESCRIPTION
*
* PARAMETERS
* void
* RETURNS
*
*****************************************************************************/
__inline static kal_int32 next_rand(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
long64 nextseed = (result_seed * multiplier + addend) & Random_mask;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
result_seed = nextseed;
return (kal_int32) (((ulong64) nextseed) >> (16));
}
/*****************************************************************************
* FUNCTION
* get_encryption_key
* DESCRIPTION
* This function is used to create
* PARAMETERS
* type [IN]
* RETURNS
*
*****************************************************************************/
kal_uint32 get_encryption_key(game_type_enum type)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_int32 handle;
kal_uint32 key;
kal_uint32 dummy;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_wsprintf(WCHARFilename, "%s\\%s", _jvm_get_dir_path(type), KEY_FILE_NAME);
handle = FS_Open(WCHARFilename, FS_OPEN_SHARED | FS_READ_ONLY);
if (handle < 0)
{
#ifdef __MTK_TARGET__
encrypt_code = (kal_uint32) (*TDMA_TQCNT) + (((kal_uint32) (*TDMA_WRAP)) << 16);
key = L1I_GetTimeStamp();
#else /* __MTK_TARGET__ */
encrypt_code = 0x12345678;
key = 0x4567890a;
#endif /* __MTK_TARGET__ */
handle = FS_Open(WCHARFilename, FS_OPEN_SHARED | FS_READ_WRITE | FS_CREATE);
FS_Write(handle, (kal_char*) & key, 4, &dummy);
FS_Write(handle, (kal_char*) & encrypt_code, 4, &dummy);
}
else
{
FS_Read(handle, (kal_char*) & key, 4, &dummy);
FS_Read(handle, (kal_char*) & encrypt_code, 4, &dummy);
}
FS_Close(handle);
return key;
}
/*****************************************************************************
* FUNCTION
* make_encrypt_table
* DESCRIPTION
*
* PARAMETERS
* type [IN]
* RETURNS
* void
*****************************************************************************/
void make_encrypt_table(game_type_enum type)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_uint32 count, key, random_num, temp_value;
kal_int32 offset;
kal_uint8 *encrypt_temp = (kal_uint8*) encrypt_table;
kal_uint8 *decrypt_temp = (kal_uint8*) decrypt_table;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
key = get_encryption_key(type);
setSeed(key);
memset(encrypt_table, 0, 255 * 4);
for (offset = 3; offset >= 0; offset--)
{
kal_uint8 *encrypt_temp_off = encrypt_temp + offset;
kal_uint8 *decrypt_temp_off = decrypt_temp;
memset(decrypt_table, 0, 255);
count = 0;
random_num = (((unsigned int)next_rand()) << 24) >> 24;
do
{
encrypt_temp_off[count << 2] = random_num;
decrypt_temp_off[random_num] = count;
count++;
do
{
random_num = (((unsigned int)next_rand()) << 24) >> 24;
temp_value = (unsigned int)decrypt_temp_off[random_num];
} while (encrypt_temp_off[temp_value << 2] == random_num);
} while (count < 255);
encrypt_temp_off[count << 2] = random_num;
decrypt_temp_off[random_num] = count;
}
}
/*****************************************************************************
* FUNCTION
* get_org_encrypt_value
* DESCRIPTION
*
* PARAMETERS
* pos [IN]
* value [IN]
* base_value [IN]
* RETURNS
*
*****************************************************************************/
__inline kal_uint32 get_org_encrypt_value(kal_uint32 pos, kal_uint32 value, kal_uint32 base_value)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_uint32 c;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
c = encrypt_table[(base_value ^ pos) >> 24] ^ (base_value >> 8);
c = encrypt_table[((c ^ pos) << 8) >> 24] ^ (c >> 8);
c = encrypt_table[((c ^ pos) << 16) >> 24] ^ (c >> 8);
c = encrypt_table[((c ^ pos) << 24) >> 24] ^ (c >> 8);
c = encrypt_table[((c ^ value) << 24) >> 24] ^ (c >> 8);
return c;
}
/*****************************************************************************
* FUNCTION
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -