unsigned char *CYmMusic::depackFile(void) { lzhHeader_t *pHeader; ymu8 *pNew; ymu8 *pSrc; pHeader = (lzhHeader_t*)pBigMalloc; if ((pHeader->size==0) || // NOTE: Endianness works because value is 0 (strncmp(pHeader->id,"-lh5-",5))) { // Le fichier n'est pas compresse, on retourne l'original. return pBigMalloc; } fileSize = (ymu32)-1; if (pHeader->level != 0) // NOTE: Endianness works because value is 0 { // Compression LH5, header !=0 : Error. free(pBigMalloc); pBigMalloc = NULL; setLastError("LHARC Header must be 0 !"); return NULL; } fileSize = ReadLittleEndian32((ymu8*)&pHeader->original); pNew = (ymu8*)malloc(fileSize); if (!pNew) { setLastError("MALLOC Failed !"); free(pBigMalloc); pBigMalloc = NULL; return NULL; } pSrc = pBigMalloc+sizeof(lzhHeader_t)+pHeader->name_lenght; // NOTE: Endianness works because name_lenght is a byte pSrc += 2; // skip CRC16 const int packedSize = ReadLittleEndian32((ymu8*)&pHeader->packed); // alloc space for depacker and depack data CLzhDepacker *pDepacker = new CLzhDepacker; const bool bRet = pDepacker->LzUnpack(pSrc,packedSize,pNew,fileSize); delete pDepacker; if (!bRet) { // depacking error setLastError("LH5 Depacking Error !"); free(pNew); free(pBigMalloc); pNew = NULL; } else free(pBigMalloc); // @ALEX: depacking success, release packed return pNew; }
unsigned char *CYmMusic::depackFile(ymu32 checkOriginalSize) { lzhHeader_t *pHeader; ymu8 *pNew; ymu8 *pSrc; pHeader = (lzhHeader_t*)pBigMalloc; if ((pHeader->size==0) || // NOTE: Endianness works because value is 0 (strncmp(pHeader->id,"-lh5-",5))) { // Le fichier n'est pas compresse, on retourne l'original. return pBigMalloc; } fileSize = (ymu32)-1; if (pHeader->level != 0) // NOTE: Endianness works because value is 0 { // Compression LH5, header !=0 : Error. free(pBigMalloc); pBigMalloc = NULL; setLastError((char*)"LHARC Header must be 0 !"); return NULL; } fileSize = ReadLittleEndian32((ymu8*)&pHeader->original); pNew = (ymu8*)malloc(fileSize); if (!pNew) { setLastError((char*)"MALLOC Failed !"); free(pBigMalloc); pBigMalloc = NULL; return NULL; } pSrc = pBigMalloc+sizeof(lzhHeader_t)+pHeader->name_lenght; // NOTE: Endianness works because name_lenght is a byte pSrc += 2; // skip CRC16 ymu32 packedSize = ReadLittleEndian32((ymu8*)&pHeader->packed); checkOriginalSize -= (ymu32(*pSrc) - ymu32(*pBigMalloc)); if (packedSize > checkOriginalSize) packedSize = checkOriginalSize; // Check for corrupted archive if (packedSize <= checkOriginalSize) { // alloc space for depacker and depack data CLzhDepacker *pDepacker = new CLzhDepacker; const bool bRet = pDepacker->LzUnpack(pSrc,packedSize,pNew,fileSize); delete pDepacker; if (!bRet) { // depacking error setLastError((char*)"LH5 Depacking Error !"); free(pNew); pNew = NULL; } } else { setLastError((char*)"LH5 Depacking Error !"); free(pNew); pNew = NULL; } // Free up source buffer, whatever depacking fail or success free(pBigMalloc); return pNew; }