Advertisement
Guest User

Untitled

a guest
Oct 5th, 2016
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.50 KB | None | 0 0
  1.  
  2. #define GSH_BLOCK_MAGIC                         0x424C4B7B // BLK{
  3. #define BLOCK_TYPE_VERTEX_SHADER_STRUCT         3
  4. #define BLOCK_TYPE_VERTEX_SHADER_PROGRAM        5
  5. #define BLOCK_TYPE_PIXEL_SHADER_STRUCT          6
  6. #define BLOCK_TYPE_PIXEL_SHADER_PROGRAM         7
  7.  
  8. typedef unsigned int u32;
  9.  
  10. static inline u32 be32(u32 a)
  11. {
  12.     return ((a & 0xFF) << 24) | (((a >> 8) & 0xFF) << 16) | (((a >> 16) & 0xFF) << 8) | (((a >> 24) & 0xFF) << 0);
  13. }
  14.  
  15. typedef struct _gsh_header_t
  16. {
  17.     u32 magic;
  18.     u32 header_size;
  19.     u32 unk[6];
  20. } __attribute__((packed)) gsh_header_t;
  21.  
  22. typedef struct _gsh_blk_header_t
  23. {
  24.     u32 magic;
  25.     u32 header_size;
  26.     u32 unk[2];
  27.     u32 block_type;
  28.     u32 block_data_size;
  29.     u32 unk2[2];
  30. } __attribute__((packed)) gsh_blk_header_t;
  31.  
  32. int main(int argc, char *argv[])
  33. {
  34.     if(argc < 2)
  35.         return 1;
  36.  
  37.     FILE *f = fopen(argv[1], "rb");
  38.     if(!f)
  39.         return 0;
  40.  
  41.     fseek(f, 0, SEEK_END);
  42.     unsigned int size = ftell(f);
  43.     fseek(f, 0, SEEK_SET);
  44.     unsigned char *gshBuffer = (unsigned char *)malloc(size);
  45.     fread(gshBuffer, 1, size, f);
  46.     fclose(f);
  47.  
  48.  
  49.     gsh_header_t *header = (gsh_header_t *)gshBuffer;
  50.     unsigned char *ptr = gshBuffer + be32(header->header_size);
  51.     gsh_blk_header_t *block = (gsh_blk_header_t*) ptr;
  52.     while(be32(block->magic) == GSH_BLOCK_MAGIC)
  53.     {
  54.         ptr = (unsigned char *)(ptr + be32(block->header_size));
  55.  
  56.         switch(be32(block->block_type))
  57.         {
  58.             case BLOCK_TYPE_VERTEX_SHADER_STRUCT:
  59.                 printf("BLOCK_TYPE_VERTEX_SHADER_STRUCT\n");
  60.                 break;
  61.             case BLOCK_TYPE_PIXEL_SHADER_STRUCT:
  62.                 printf("BLOCK_TYPE_PIXEL_SHADER_STRUCT\n");
  63.                 break;
  64.             case BLOCK_TYPE_VERTEX_SHADER_PROGRAM:
  65.                 printf("BLOCK_TYPE_VERTEX_SHADER_PROGRAM\n");
  66.                 break;
  67.             case BLOCK_TYPE_PIXEL_SHADER_PROGRAM:
  68.                 printf("BLOCK_TYPE_PIXEL_SHADER_PROGRAM\n");
  69.                 break;
  70.             default:
  71.                 printf("Unknown block type %i\n", be32(block->block_type));
  72.                 break;
  73.         }
  74.         for(int i = 0; i < be32(block->block_data_size); i++)
  75.         {
  76.             if(i % 16 == 0)
  77.                 printf("\n");
  78.             printf("0x%02X, ", ptr[i]);
  79.         }
  80.         printf("\n\n");
  81.  
  82.         ptr = (unsigned char *)(ptr + be32(block->block_data_size));
  83.         block = (gsh_blk_header_t*) ptr;
  84.     }
  85.  
  86.     free(gshBuffer);
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement