Перейти к содержимому


Внимание!

Это форум по извлечению ресурсов из игр: музыки, звуков, текстур, 3D-моделей...
Перед поиском ответов на форуме, рекомендуется ознакомиться с основным сайтом EXTRACTOR.ru!
[ Прочтите внимательно - правила создания тем и ответа в них ]
Все вопросы по запуску игр задавайте в другом месте: Установка и запуск игр.


Фотография

Распаковщик ресурсов для The Kreed (исходник на С)


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 2

#1 PantheR

PantheR

    Рядовой

  • Пользователи
  • 1 сообщений

Отправлено 28 May 2004 - 12:04

Этот исходник использует стандартные библиотеки С, компиляется читай любым компилятором С. Если кому нада - пользуйте на здоровье. (под виндами =)

#include <windows.h>
#include <stdio.h>

typedef struct
{
DWORD size;
DWORD off;
DWORD name_len;
}
FileRecord_t;

typedef struct
{
DWORD size;
DWORD off;
char *name;
}
FileName_t;

HANDLE hFile,hFi;
#define BUFF_SIZE 8192
char buff[BUFF_SIZE];
FileRecord_t fr;
FileName_t *fnFiles, *lfnFiles;
HANDLE CreatFile(char *name);



int main(int argc, char **argv)
{
DWORD j, dwMax, dwCount, dwPos, i, dwPages, dwCut;
char *p;

if (argc<2)
{
printf("expect filenamen");
return -1;
}

fnFiles=NULL;
p=NULL;


printf("file:t%sn",argv[1]);
hFile=CreateFile(argv[1],GENERIC_READ,FILE_SHARE_READ,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile==INVALID_HANDLE_VALUE)
{
printf("open error %dn",GetLastError());
return -2;
}

if (!ReadFile(hFile,buff,4,&j,NULL))
{
printf("read error %dn",GetLastError());
goto EndProc;
}

j=0;
dwPos=SetFilePointer(hFile,0, &j, FILE_CURRENT);
buff[5]=0;
if (strcmp(buff,"PAK "))
{
printf("Not a Kreed PAK file !n");
goto EndProc;
}

Again:
j=0;
SetFilePointer(hFile,dwPos,&j,FILE_BEGIN);
dwMax=dwCount=0;
lfnFiles=fnFiles;

for (;;dwCount++)
{
if (!ReadFile(hFile,&fr,sizeof fr,&j,NULL))
{
printf("read error %dn",GetLastError());
goto EndProc;
}

if (lfnFiles)
if (dwCount)
{
lfnFiles--;
lfnFiles->size=fr.size;
lfnFiles->off=fr.off+4;
lfnFiles++;
}

if (!fr.name_len) break;
if (dwMax<fr.name_len) dwMax=fr.name_len;
ZeroMemory(buff,512);

if (!ReadFile(hFile,buff,fr.name_len,&j,NULL))
{
printf("read error %dn",GetLastError());
goto EndProc;
}

if (lfnFiles)
{
lfnFiles->name=p;
strcpy(p, buff);
p+=fr.name_len+1;
lfnFiles++;
}
}

if (!fnFiles)
{
printf("%d files. %d max name sizen",dwCount, dwMax);
j=(dwMax+5)*(dwCount+3)*sizeof(FileName_t);
j=((j>>2)+1)<<2;

if (!(fnFiles=(FileName_t *)HeapAlloc(GetProcessHeap(),0,j)))
{
printf("fail to alloc %d bytesn",j);
goto EndProc;
}

ZeroMemory(fnFiles, j);
p=((char *)fnFiles) + (dwCount+2)*sizeof(FileName_t);

goto Again;
}

lfnFiles=fnFiles;
for (j=0;j<dwCount;j++,lfnFiles++)
{
printf("0x%08X % 6d %s ",lfnFiles->off, lfnFiles->size, lfnFiles->name);
dwPos=0;
if (SetFilePointer(hFile, lfnFiles->off, &dwPos, FILE_BEGIN)==-1)
{
printf("lseek error %dn",GetLastError());
goto EndProc;
}

if ((hFi=CreatFile(lfnFiles->name))==INVALID_HANDLE_VALUE)
{
printf("creat error %dn",GetLastError());
goto EndProc;
}

dwPages=lfnFiles->size/BUFF_SIZE;
dwCut=lfnFiles->size - dwPages*BUFF_SIZE;

if (dwPages)
for (i=0;i<dwPages;i++)
{
ReadFile(hFile, buff, BUFF_SIZE, &dwPos, NULL);
WriteFile(hFi, buff, BUFF_SIZE, &dwPos, NULL);
}

if (dwCut)
{
ReadFile(hFile, buff, dwCut, &dwPos, NULL);
WriteFile(hFi, buff, dwCut, &dwPos, NULL);
}


CloseHandle(hFi);
printf("okn");
}



EndProc:
CloseHandle(hFile);
if (fnFiles) HeapFree(GetProcessHeap(),0,fnFiles);

return 0;
}




HANDLE CreatFile(char *name)
{
char *p=name,b;

for (;*p;p++)
if ((*p=='\')||(*p=='/'))
{
b=*p;
*p=0;
CreateDirectory(name,NULL);
*p=b;
}

return CreateFile(name, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
}

#2 Terminus

Terminus

    Генерал-майор

  • Администраторы
  • 1969 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 28 May 2004 - 13:47

Э-э-э Вообще то лучше было бы это кинуть мне, а не публиковать тут, но ладно... smile.gif

Если кто-то возмется откомпилить и скинет - будет куль. Думаю, тема эта после этого пойдет под нож smile.gif

#3 Katleta

Katleta

    Любит плагиат

  • Пользователи
  • 131 сообщений
  • Город:Москва

Отправлено 11 June 2004 - 21:34

Ну у меня есть не большой исходник тоже на C++ написан как РАСШИФРОВОВАТЬ *.DTA файлы игры Mafia !
Писать здесь не буду а пришлю МАХАИЛУ на мыло ! laugh.gif laugh.gif