Advertisement
Guest User

sinsdk

a guest
Jun 14th, 2017
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.14 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <map>
  4. #include <iostream>
  5.  
  6. typedef unsigned char byte;
  7. typedef unsigned int uint;
  8.  
  9. char* LoadFileToBuffer(char* filename, long& filelen)
  10. {
  11.     FILE *fileptr;
  12.     char *buffer;
  13.  
  14.     fopen_s(&fileptr, filename, "rb");
  15.     if (fileptr == 0)
  16.     {
  17.         return 0;
  18.     }
  19.     fseek(fileptr, 0, SEEK_END);
  20.     filelen = ftell(fileptr);
  21.     rewind(fileptr);
  22.  
  23.     buffer = (char *)malloc((filelen + 1)*sizeof(char));
  24.     fread(buffer, filelen, 1, fileptr);
  25.     fclose(fileptr);
  26.  
  27.     return buffer;
  28. }
  29.  
  30. void DumpHex(byte* pc, long len)
  31. {
  32.     unsigned char buff[17];
  33.     for (int i = 0; i < len; ++i)
  34.     {
  35.         if ((i % 16) == 0)
  36.         {
  37.             if (i != 0)
  38.             {
  39.                 printf("  %s\n", buff);
  40.             }
  41.             printf("  %04x ", i);
  42.         }
  43.  
  44.         printf(" %02x", pc[i]);
  45.  
  46.         if ((pc[i] < 0x20) || (pc[i] > 0x7e))
  47.         {
  48.             buff[i % 16] = '.';
  49.         }
  50.         else
  51.         {
  52.             buff[i % 16] = pc[i];
  53.         }
  54.            
  55.         buff[(i % 16) + 1] = '\0';
  56.     }
  57. }
  58.  
  59. inline uint fromLilEndian(byte* offb)
  60. {
  61.     return offb[0] | (offb[1] << 8) | (offb[2] << 16) | (offb[3] << 24);
  62. }
  63.  
  64. void Usage()
  65. {
  66.     std::cout << "***** sinESEDEKA v0.001 alfaromeo *****" << std::endl
  67.         << "!!! IMPORTANT: Put \"sc2000.dat\" in this very folder" << std::endl
  68.         << std::endl
  69.         << "Commands:" << std::endl
  70.         << "h - notHing" << std::endl
  71.         << "x - eXtract" << std::endl
  72.         << "c - Compose" << std::endl
  73.         << "d - Dump hex file" << std::endl
  74.         << std::endl;
  75. }
  76.  
  77.  
  78.  
  79. struct FileInfo
  80. {
  81.     long len;
  82.     byte* dat;
  83.     std::map<std::string, FileInfo> fmap;
  84. };
  85. typedef std::map<std::string, FileInfo> Filemap;
  86.  
  87. FileInfo ParseFile(const char* filename)
  88. {
  89.     FileInfo sc2000;
  90.     sc2000.dat = (byte*)LoadFileToBuffer("sc2000.dat", sc2000.len);
  91.  
  92.     if (sc2000.dat == 0)
  93.     {
  94.         std::cout << "> You really have to put \"sc2000.dat\" in this very folder" << std::endl;
  95.         exit(0);
  96.     }
  97.  
  98.     const int NUM_FILES = 398;
  99.     uint offset_before = 0;
  100.     std::string prev_file;
  101.     for (int i = 0; i < NUM_FILES; ++i)
  102.     {
  103.         byte* p = (sc2000.dat + i * 16);
  104.  
  105.         char filename[13];
  106.         strncpy_s(filename, (const char *)p, 12);
  107.         std::string file(filename);
  108.  
  109.         uint offset = fromLilEndian(p + 12);
  110.         sc2000.fmap[file].dat = (sc2000.dat + offset);
  111.  
  112.         if (i >= 1)
  113.         {
  114.             sc2000.fmap[prev_file].len = (offset - offset_before);
  115.         }
  116.         offset_before = offset;
  117.         prev_file = file;
  118.     }
  119.  
  120.     //Last file
  121.     sc2000.fmap[prev_file].len = sc2000.len - offset_before;
  122.  
  123.     return sc2000;
  124. }
  125.  
  126. void Extract(FileInfo sc2000)
  127. {
  128.  
  129.     Filemap::iterator it = sc2000.fmap.begin();
  130.     for (; it != sc2000.fmap.end(); it++)
  131.     {
  132.         FILE* dumpFile;
  133.         fopen_s(&dumpFile, it->first.c_str(), "wb");
  134.         fwrite(it->second.dat, sizeof(byte), it->second.len, dumpFile);
  135.     }
  136.  
  137. }
  138.  
  139. int main(int argc, char* argv[])
  140. {
  141.  
  142.     if (argc == 1 || argc > 2)
  143.     {
  144.         Usage();
  145.         exit(0);
  146.     }
  147.  
  148.     {
  149.         switch (argv[1][0])
  150.         {
  151.             case 'd':
  152.             {
  153.                 FileInfo sc2000 = ParseFile("sc2000.dat");
  154.                 DumpHex(sc2000.dat, sc2000.len);
  155.             } break;
  156.             case 'x':
  157.             {
  158.                 FileInfo sc2000 = ParseFile("sc2000.dat");
  159.                 Extract(sc2000);
  160.             } break;
  161.             case 'c':
  162.             {
  163.                 std::cout << "Not yet implemented" << std::endl;
  164.                 exit(0);
  165.             } break;
  166.             default:
  167.             {
  168.                 Usage();
  169.             } break;
  170.            
  171.         }
  172.     }
  173.  
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement