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

📄 setup.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 4 页
字号:

        //080505,huangsl,需要对OFFSET进行统一的调整.
        //pRkwItemInfo->OffsetToData += rkwInHandle->RkwSetupBaseOffset;

        return RKW_OK;
    }

    //*pRkwItemInfo = NULL;
    return 1;
}

INT32U  RkwGetLastActionInfo(RKW_HANDLE   rkwHandle ,
                             OUT  PRK_SETUPITEM_STR *pRkwItemInfo)
{
    PRKW_HANDLE_INFO    rkwInHandle = (PRKW_HANDLE_INFO)rkwHandle;
    PRK_SETUPITEM_STR   pItem;

    pItem = rkwInHandle->pRkwFirstSetupItem;
    while (pItem->Size > 0)
    {
        pItem++;
    }

    if (pItem == rkwInHandle->pRkwFirstSetupItem)
    {
//        *pRkwItemInfo = NULL;
        return 1;
    }

    pItem--;
    *pRkwItemInfo = pItem;

    //080505,huangsl,需要对OFFSET进行统一的调整.
    //pRkwItemInfo->OffsetToData += rkwInHandle->RkwSetupBaseOffset;

    return RKW_OK;

}


// 返回 非 RKW_OK 表示 错误.
INT32U  RkwGetActionInfo(RKW_HANDLE   rkwHandle , INT32U rkwAction ,
                         OUT  PRK_SETUPITEM_STR   *pRkwItemInfo)
{
    PRKW_HANDLE_INFO    rkwInHandle = (PRKW_HANDLE_INFO)rkwHandle;
    PRK_SETUPITEM_STR   pItem = rkwInHandle->pRkwFirstSetupItem;

    while (pItem->Size > 0)
    {
        if (pItem->Option == rkwAction)
        {
            *pRkwItemInfo = pItem;

            //080505,huangsl,需要对OFFSET进行统一的调整.
            //pRkwItemInfo->OffsetToData += rkwInHandle->RkwSetupBaseOffset;

            return RKW_OK;
        }
        pItem++;
    }
//    *pRkwItemInfo = NULL;
    return 1;
}


//  返回值 RKW_OK 或者其他值.
INT32U  RkwGetNextActionInfo(RKW_HANDLE   rkwHandle ,
                             OUT  PRK_SETUPITEM_STR *pRkwItemInfo)
{
    PRKW_HANDLE_INFO    rkwInHandle = (PRKW_HANDLE_INFO)rkwHandle;
    PRK_SETUPITEM_STR   pItem = *pRkwItemInfo;

    pItem++;

    if (pItem->Size > 0)
    {
        *pRkwItemInfo = pItem;

        //080505,huangsl,需要对OFFSET进行统一的调整.
        //pRkwItemInfo->OffsetToData += rkwInHandle->RkwSetupBaseOffset;
        return RKW_OK;
    }
//    *pRkwItemInfo = NULL;
    return 1;
}


//读取内容,返回 读取的长度.
INT32U  RkwReadComment(RKW_HANDLE   rkwHandle , OUT INT8U *rkwBuffer,
                       INT32U rkwOffset , INT32U rkwLength)
{
    PRKW_HANDLE_INFO    rkwInHandle = (PRKW_HANDLE_INFO)rkwHandle;
    FSFileSeek(rkwInHandle->RkwFile, rkwOffset , 0);
    return FSFileRead(rkwBuffer , rkwLength , rkwInHandle->RkwFile);
}


/*****************************************************************************/
//合成功能.
/*****************************************************************************/
//解压 OUTPUT 目录到指定 目录.
//压缩可以通过 批处理命令来进行.
INT32U RkwDePackedOutput(RKW_HANDLE   rkwHandle , OUT char * destDir)
{
    PRK_SETUPITEM_STR   pItem;
    PRKW_HANDLE_INFO    rkwInHandle = (PRKW_HANDLE_INFO)rkwHandle;
    char                tDir[255];
    char                cmd[255];
    char*               pSlat;

    if (RkwGetActionInfo(rkwHandle , RKST_OPTION_FSOPER , &pItem) != RKW_OK)
        return 1;

    // ISetupFsOper 返回非0 表示失败.
    strcpy(cmd , "rmdir /S /Q ");
    strcpy(tDir, destDir);
    pSlat = strrchr(tDir, '\\');
    if (pSlat == NULL || pSlat[1] != 0)
    {
        strcat(tDir , "\\");
    }

    //_rmdir(tDir); //只有空的文件夹才能删除.
    strcat(cmd , tDir);
    system(cmd);
    if (FSMakeDir(tDir))
    {
        TR("Make Dir[%s] Error!" , tDir);
        return 2;
    }

    if (ISetupFsOper(pItem->OffsetToData + rkwInHandle->RkwSetupBaseOffset , rkwInHandle->RkwFile , tDir))
    {
        system(cmd);
        return 3;
    }

    return RKW_OK;
}


// 考虑到目前情况,把 PACKED OUTPUT 以后的数据根据大小往后移动即可.
// 直接定位到最后一个 ACTION,根据大小 OFFSET 依次往后移动.
INT32U RkwRePackedOutput(RKW_HANDLE   rkwHandle , IN char * destDirPackedFile)
{
    PRK_SETUPITEM_STR   pItem;
    PRK_SETUPITEM_STR   pItemNext;
    PRKW_HANDLE_INFO    rkwInHandle = (PRKW_HANDLE_INFO)rkwHandle;
    MY_FILE             *packedFile;
    INT32U              newFileSize;
    INT32U              fileSizeOffset;

    packedFile = FSFileOpen(destDirPackedFile , "rb");
    if (packedFile == NULL)
        return 100;
    newFileSize = FSFileGetSize(packedFile);

    if (RkwGetActionInfo(rkwHandle , RKST_OPTION_FSOPER , &pItem) != RKW_OK)
        return 1;

    pItemNext = pItem + 1;

    // 文件变大.为了支持多次修改,使用 OFFSET的差值来代替文件的大小.
    // 因为目前只向后移动,没有向前移动文件.
    if (newFileSize > pItemNext->OffsetToData - pItem->OffsetToData) ///pItem.SizeOfBytes;
    {
        fileSizeOffset = newFileSize - (pItemNext->OffsetToData - pItem->OffsetToData) ; ///pItem.SizeOfBytes;

        //get last pItem.
        while (pItemNext->Size > 0)
        {
            pItemNext++;
        }
        pItemNext--;

        //MOVE ALL ITEM AFTER RKST_OPTION_FSOPER.
        while (pItemNext->Option != RKST_OPTION_FSOPER)
        {
            if (IRkwMoveBackFile(rkwInHandle , fileSizeOffset , pItemNext) != RKW_OK)
                return 10;
            pItemNext--;
        }
    }
    else
    {
        //获取 指向 该 ITEM的指针,以便修改大小.
        pItemNext = pItem;
    }

    //拷贝新的打包文件到原来的位置.
    pItemNext->SizeOfBytes = newFileSize;
    if (IRkwCopyFile(rkwInHandle , packedFile , pItemNext) != newFileSize)
        return 20;

    return RKW_OK;
}

INT32U RkwRePackedOutputDir(RKW_HANDLE   rkwHandle , IN char * destDir)
{
    char                cmd[255];

    // ISetupFsOper 返回非0 表示失败.
    strcpy(cmd , "call rk27Tools.exe packDir.cfg");
    system(cmd);

    return RkwRePackedOutput(rkwHandle , "RockResPacked.BIN");
}


/*
    解压输出指定的文件.
*/
INT32U RkwExtractFile(RKW_HANDLE   rkwHandle , OUT char * destFileName)
{
    PRK_SETUPITEM_STR   pItem;
    PRKW_HANDLE_INFO    rkwInHandle = (PRKW_HANDLE_INFO)rkwHandle;
    char                fileName[255];
    BOOLEAN             fileFound = FALSE;

    if (RkwGetActionInfo(rkwHandle , RKST_OPTION_ADDFILE , &pItem) != RKW_OK)
        return 1;

    memset(fileName , 0 , 255);

    while (pItem->Size > 0)
    {
        if (RKST_OPTION_ADDFILE != pItem->Option)
            continue;

        // Param[0] = 文件名的长度.
        RkwReadComment(rkwHandle , (INT8U*)fileName ,
                       pItem->OffsetToData + rkwInHandle->RkwSetupBaseOffset , pItem->Param[0]);
#ifdef BOARD
        if (!strcmp(fileName , destFileName))
#else
        if (!stricmp(fileName , destFileName))
#endif
        {
            fileFound = TRUE ;
            break;
        }
        pItem++;
    }

    if (!fileFound)
        return 2;

    if (IRkwCopyFileOut(rkwInHandle , destFileName ,
                        pItem->OffsetToData + rkwInHandle->RkwSetupBaseOffset + pItem->Param[0],
                        pItem->SizeOfBytes - pItem->Param[0]) != pItem->SizeOfBytes - pItem->Param[0])
        return 3;

    return RKW_OK;
}


// 获取LOADER 的版本号,高16 为 主版本号,低 16 位为 次版本号.
INT32U RkwGetLoaderVersion(RKW_HANDLE   rkwHandle , OUT INT32U * rkwLoaderVersion)
{
    PRK_SETUPITEM_STR   pItem;
    PRKW_HANDLE_INFO    rkwInHandle = (PRKW_HANDLE_INFO)rkwHandle;
    INT32U              version;
    if (RkwGetActionInfo(rkwHandle , RKST_OPTION_LOADER , &pItem) != RKW_OK)
        return 1;

    // ISetupFsOper 返回非0 表示失败.
    version = ((pItem->Param[3] << 8) & 0x00ff0000)
              | (pItem->Param[3] & 0x000000ff);

    *rkwLoaderVersion = version;
    return RKW_OK;

}


// 获取 系统平台 和开发商自定义的版本号,高16 为 主版本号,低 16 位为 次版本号.
// 为了统一,判断依据的 版本号需要和 系统信息显示的版本号 一致.
INT32U RkwGetSystemVersion(RKW_HANDLE   rkwHandle ,
                           OUT INT32U * prkwRkVersion , OUT INT32U * prkwDvlpVersion)
{
    PRK_SETUPITEM_STR   pItem;
    PRKW_HANDLE_INFO    rkwInHandle = (PRKW_HANDLE_INFO)rkwHandle;

    if (RkwGetActionInfo(rkwHandle , RKST_OPTION_VERSION , &pItem) != RKW_OK)
        return 1;

    if (IRkwGetVersion(rkwInHandle , pItem , prkwRkVersion , prkwDvlpVersion))
        return 10;

    return RKW_OK;

}

/****************************************************************/
//测试代码.
/****************************************************************/
#if 1
void PCRkwTestMain(void)
{
    INT32U          ver1, ver2;
    char            *pRkwFilePath = "..\\..\\..\\Resource\\RK27SDK.RKW";
    char            *pRkwOutPutPath = "..\\..\\..\\Resource\\TestOutput";
    char            *pRkwPackedFilePath = "..\\..\\..\\Resource\\RK27SDK11.RKW";

    RKW_HANDLE      pHandle = RkwInitialise(pRkwFilePath);
    if (pHandle == NULL)
    {
        TR("Rkw Init Error,file=%s", pRkwFilePath);
        return ;
    }
    if (RkwGetLoaderVersion(pHandle , &ver1) != RKW_OK)
    {
        TR("RkwGetLoaderVersion Error,file=%s", pRkwFilePath);
    }
    else
    {
        TR("RkwGetLoaderVersion =0X%08x", ver1);
    }

    if (RkwGetSystemVersion(pHandle , &ver1 , &ver2) != RKW_OK)
    {
        TR("RkwGetLoaderVersion Error,file=%s", pRkwFilePath);
    }
    else
    {
        TR("RkwGetSystemVersion, rkver =0X%08x,dvlpver=0X%08x", ver1 , ver2);
    }

    if (RkwDePackedOutput(pHandle , pRkwOutPutPath) != RKW_OK)
    {
        TR("RkwDePackedOutput Error,dstDir=%s", pRkwOutPutPath);
    }
    else
    {
        TR("RkwDePackedOutput OK,dstDir=%s", pRkwOutPutPath);
    }

    if (RkwExtractFile(pHandle , "Rock27Boot.bin") != RKW_OK)
    {
        TR("RkwExtractFile Error,dstFile=%s", "Rock27Boot.bin");
    }
    else
    {
        TR("RkwExtractFile OK,dstFile=%s", "Rock27Boot.bin");
    }

#if 0
    if (RkwRePackedOutput(pHandle , pRkwPackedFilePath) != RKW_OK)
    {
        TR("RkwRePackedOutput Error,packedFile=%s", pRkwPackedFilePath);
    }
    else
    {
        TR("RkwRePackedOutput OK,packedFile=%s", pRkwPackedFilePath);
    }
#endif

    RkwDeInitialise(pHandle);
}
#endif

/*****************************************************************************/
#endif // #if defined(SETUP) || defined(_MSC_VER) 

/****************************************************************/
//---------END OF FILE---------//
/****************************************************************/



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -