#include #include #include #include #pragma warning(disable:4996) #pragma comment(lib,"shlwapi.lib") //SKI Header struct SKInfo { DWORD SKHeader; DWORD FileCount; DWORD Unknow1; }; //SKI Content //Must be array from FileCount struct SKFileInfo { DWORD SKSize; DWORD SKSize2; DWORD Unknow1; DWORD Unknow2; DWORD EndOffset; }; void ShowUsage() { printf("SuperStar Online - SKP Extractor v1.2\n"); printf("Created by nProtect @ TAH-Club\n"); printf("Copyright (C) 2012 TAH-Club\n\n"); printf("Usage:\n"); printf("skpextract -e Extract SKP file to folder.\n"); printf("skpextract -c Show SKP file count.\n\n"); printf("Example:\n"); printf("skpextract -e SOUND.SKP Sound_extract\n"); printf("skpextract -c EFFECT.SKP\n"); } DWORD GetExtractFileType(char *FileHeader) { if (memcmp(FileHeader,"OggS",4) == 0) return 0; //ogg file if (memcmp(FileHeader,"DDS",3) == 0) return 1; //dds file if (memcmp(FileHeader,"\x89\x50\x4E\x47",4) == 0) return 2; //png file if (memcmp(FileHeader,"XAC",3) == 0) return 3; //xac file if (memcmp(FileHeader,"CWS",3) == 0) return 4; //cws file if (memcmp(FileHeader,"\xFF\xD8\xFF\xE0\x00\x10\x4A\x46\x49\x46",10) == 0) return 5; //jpg file if (memcmp(FileHeader,"XSMW",4) == 0) return 6; //xsm file if (memcmp(FileHeader,"\x42\x4D\xB8\x53",4) == 0) return 7; //bmp file if (memcmp(FileHeader,"\x42\x4D\x38\xE1",4) == 0) return 7; //bmp file if (memcmp(FileHeader,"RIFF",4) == 0) return 8; //wav file //not found return 255; } void ShowFileCount(char *SKP_File) { //printf("ShowFileCount() File: %s\n",SKP_File); char tmp_skp[255]; char tmp_ski[255]; SKInfo *SkFileRead; lstrcpy(tmp_skp,SKP_File); PathStripPath(tmp_skp); PathRemoveExtension(tmp_skp); sprintf(tmp_ski,"%s.SKI",tmp_skp); SkFileRead = (SKInfo *)malloc(sizeof(SKInfo)); FILE *fp = fopen(tmp_ski,"rb"); if(fp == NULL) { printf("Error loading file: %s\n",tmp_ski); return; } fread(SkFileRead,sizeof(SKInfo),1,fp); fclose(fp); printf("SKP Information: %s\n",tmp_ski); printf("FileHeader: 0x%08X\n",SkFileRead[0].SKHeader); printf("FileCount: %d\n",SkFileRead[0].FileCount); free((SKInfo *)SkFileRead); } void ExtractSKP(char *SKP_File,char *ExtractPath) { //printf("ExtractSKP() File: %s , Directory: %s\n",SKP_File,ExtractPath); char tmp_skp[255]; char tmp_ski[255]; char tmp_ExtPath[MAX_PATH]; SKInfo *SkFileRead; SKFileInfo * SkpFileInfo; lstrcpy(tmp_skp,SKP_File); lstrcpy(tmp_ExtPath,ExtractPath); PathStripPath(tmp_skp); PathRemoveExtension(tmp_skp); sprintf(tmp_ski,"%s.SKI",tmp_skp); sprintf(tmp_skp,"%s.SKP",tmp_skp); SkFileRead = (SKInfo *)malloc(sizeof(SKInfo)); FILE *fp = fopen(tmp_ski,"rb"); if(fp == NULL) { printf("Error loading file: %s\n",tmp_ski); fclose(fp); return; } fread(SkFileRead,sizeof(SKInfo),1,fp); //Allocate memory for file structure SkpFileInfo = (SKFileInfo *)malloc(sizeof(SKFileInfo) * SkFileRead[0].FileCount); printf("Archive file: %s\n",tmp_skp); printf("Allocated %d byte(s) memory\n",(sizeof(SKFileInfo) * SkFileRead[0].FileCount)); printf("File inside archive: %d files\n\n",SkFileRead[0].FileCount); fread(SkpFileInfo,sizeof(SKFileInfo) * SkFileRead[0].FileCount,1,fp); DWORD i = 0; //read .skp file content FILE *skpfile = fopen(tmp_skp,"rb"); if(skpfile == NULL) { printf("Error loading file: %s\n",tmp_skp); fclose(skpfile); return; } //Create extract directory if(GetFileAttributes(ExtractPath) == -1) { CreateDirectory(ExtractPath,NULL); } //Extract file for(i=0;i