📄 setup.c
字号:
//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 + -