⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unbar.c

📁 SEAL是DOS 下的32位保护模式的GUI程序
💻 C
字号:
/* Bad ARchive Unarchiver */

#include <stdio.h>
#include <dir.h>
#include <sys/stat.h>

#define CMD_INFO        0
#define CMD_COMMENT     1
#define CMD_STATUS      2
#define CMD_CREATEFILE  100
#define CMD_CREATEDIR   101
#define CMD_CLOSEDIR    102
#define CMD_FINISH      255

typedef struct t_barhead
{
  unsigned char ID[3];
  unsigned char version;
} t_barhead;

FILE            *f = NULL;
t_barhead       hd;

main()
{
  printf("UNBAR version 1.0 (C) 2001 Kostas Michalopoulos aka Bad Sector\n");
  f = fopen("output.bar", "rb+");
  if (fread(&hd, 1, sizeof(hd), f) != sizeof(hd)) {
    printf("Error opening output.bar\n");

    return 1;
  };

  #define READ_PARAMETER {                                      \
    unsigned short len;                                         \
    fread(&len, 1, 2, f);                                       \
    parameter = (char *) malloc(len+1);                         \
    fread(parameter, 1, len, f);                                \
    parameter[len] = 0;                                         \
  };

  mkdir("output", S_IWUSR);
  chdir("output");
  while (!feof(f)) {
    unsigned char cmd;
    char *parameter;
    fread(&cmd, 1, 1, f);

    if (cmd == CMD_FINISH) {
      printf("Finished.\n");
      break;
    };
    switch (cmd) {
      case CMD_INFO: {
        READ_PARAMETER;
        printf("INFO: %s\n", parameter);
        free(parameter);
      }; break;
      case CMD_COMMENT: {
        READ_PARAMETER;
        printf("-: %s\n", parameter);
        free(parameter);
      }; break;
      case CMD_STATUS: {
        READ_PARAMETER;
        printf("STATUS: %s\n", parameter);
        free(parameter);
      }; break;
      case CMD_CREATEFILE: {
        unsigned char attrib;
        unsigned short time, date;
        unsigned long size, toread, read = 0;
        FILE *ouf;

        READ_PARAMETER;
        fread(&attrib, 1, 1, f);
        fread(&time, 1, 2, f);
        fread(&date, 1, 2, f);
        fread(&size, 1, 4, f);

        ouf = fopen(parameter, "wb+");
        while (1) {
          char buff[16384];
          toread = 16384;
          if (read+toread > size) toread = size-read;
          fread(&buff, 1, toread, f);
          fwrite(&buff, 1, toread, ouf);
          read += toread;
          if (read == size) break;
        };
        fclose(ouf);

        free(parameter);
      }; break;
      case CMD_CREATEDIR: {
        READ_PARAMETER;
        mkdir(parameter, S_IWUSR);
        chdir(parameter);
        free(parameter);
      }; break;
      case CMD_CLOSEDIR: {
        chdir("..");
      }; break;
      default: {
        printf("WARNING: Unknown command in the file: %i\n", cmd);
      }; break;
    };
  };
  chdir("..");

  fclose(f);
  return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -