Этот исходник использует стандартные библиотеки С, компиляется читай любым компилятором С. Если кому нада - пользуйте на здоровье. (под виндами =)
#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);
}
Распаковщик ресурсов для The Kreed (исходник на С)
Автор
PantheR
, May 28 2004 12:04
Сообщений в теме: 2
#1
Отправлено 28 May 2004 - 12:04
#2
Отправлено 28 May 2004 - 13:47
Э-э-э Вообще то лучше было бы это кинуть мне, а не публиковать тут, но ладно...
Если кто-то возмется откомпилить и скинет - будет куль. Думаю, тема эта после этого пойдет под нож
Если кто-то возмется откомпилить и скинет - будет куль. Думаю, тема эта после этого пойдет под нож
#3
Отправлено 11 June 2004 - 21:34
Ну у меня есть не большой исходник тоже на C++ написан как РАСШИФРОВОВАТЬ *.DTA файлы игры Mafia !
Писать здесь не буду а пришлю МАХАИЛУ на мыло !
Писать здесь не буду а пришлю МАХАИЛУ на мыло !