⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jvm_file.c

📁 java 1.1 gemini 08_16
💻 C
📖 第 1 页 / 共 4 页
字号:
/*****************************************************************************
*  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 + -