// -*- mode: c++; mode: abbrev; -*- #include typedef unsigned int dword; #define KIF0 0x0046494b struct KIFHEADER { dword dwKIF0; // 0x0046494b ("KIF\0") dword dwFilesCount; }; struct KIFENTRY { char szFileName[32]; dword dwOffset; dword dwSize; }; int usage() { printf("unkif -- Windmill KIF archive extractor\n" "Usage: unkif *.int\n"); return 1; } int main(int ac, char** av) { if(!*++av) return usage(); FILE* fi = fopen(*av, "rb"); if(!fi) return usage(); KIFHEADER header; fread(&header, sizeof header, 1, fi); if(header.dwKIF0 != KIF0) return usage(); for(int i = 0; i < header.dwFilesCount; i++) { KIFENTRY entry; fread(&entry, sizeof entry, 1, fi); int entrypos = ftell(fi); printf("%-32s offset: 0x%08x size: 0x%08x\n", entry.szFileName, entry.dwOffset, entry.dwSize); fseek(fi, entry.dwOffset, SEEK_SET); FILE* fo = fopen(entry.szFileName, "wb"); unsigned char buffer[1 << 16]; int nBytesToCopy = entry.dwSize, nBytesRead, nBytesToWrite; while(nBytesToCopy > 0) { nBytesRead = fread(buffer, 1, 1 << 16, fi); if(nBytesToCopy < nBytesRead) { nBytesToWrite = nBytesToCopy; nBytesToCopy = 0; } else { nBytesToWrite = nBytesRead; nBytesToCopy -= nBytesRead; } fwrite(buffer, 1, nBytesToWrite, fo); putchar('o'); } putchar('\n'); fclose(fo); fseek(fi, entrypos, SEEK_SET); } fclose(fi); }