Archivy MPQ

Knihovna LMPQAPI



Knihovna LMPQAPI

Knihovnu LMPQAPI napsal ruský programátor Andrey Lelikov (uváděný jako Lelik). Jde o malou knihovnu DLL, která poskytuje rozhraní k funkcím knihovny Storm.dll a StarEdit.exe. Knihovnu je možné stáhnout se sekce Download.

Co má společného StarEdit.exe a MPQ ?

Každý, kdo někdy hrál hru StarCraft, vám řekne, že StarEdit.exe je editor map a kampaní do hry StarCraft. Tyto mapy jsou uloženy jako soubory SCM nebo SCX. Krátkým nahlédnutím do těchto souborů zjistíte, že na začátku každého souboru SCM nebo SCX jsou tři písmena MPQ. Znamená to, že každá mapa ve StarCraftu je vlastně MPQ archivem. A to také znamená, že program StarEdit.exe umí tyto archivy vytvářet a editovat. To, co neumí knihovna Storm.dll, umí program StarEdit.

Použití programu StarEdit

Než zkompilujeme první program, editující MPQ Archivy pomocí StarEditu, je potřeba vyřešit jeden problém. StarEdit není dynamická knihovna. To znamená, že není možné načíst StarEdit pomocí LoadLibrary a pomocí GetProcAddress zjistit adresu té-které funkce a jednoduše ji zavolat. Použití těchto funkcí vyžaduje tvrdou hackerskou metodu, která spočívá v:

K tomu, aby byla tato metoda úspěšná, je nutné, aby byly splněny tyto podmínky:


MpqInitialize

Funkce MpqInitialize připraví vše potřebné k tomu, aby bylo možné použít StarEdit.exe pro editaci MPQ archivů. Tato funkce musí být zavolána před použitím knihovny LMPQAPI ke čtení nebo zápisu do MPQ archivů.

BOOL WINAPI MpqInitialize();
Parametry

Žádné

Návratová hodnota

Pokud funkce skončí úspěšně, vrací nenulovou hodnotu. Pokud funkce selže, vrací FALSE a funkce GetLastError() vrací podrobný kód chyby. Kromě standardních chybových kódů Windows může funkce vrátit navíc tyto chyby:

Poznámky

Aby funkce proběhla úspěšně, je nutné, aby


MpqOpenArchiveForUpdate

Funkce MpqOpenArchiveForUpdate otevírá archiv MPQ za účelem jeho editace.

HANDLE WINAPI MpqOpenArchiveForUpdate(
  LPCSTR lpFileName,              // Jméno archivu
  DWORD dwCreationDisposition,    // Otevřít nebo vytvořit
  DWORD dwHashTableSize           // Velikost hashovací tabulky
);
Parametry
hFile
[in] Ukazatel na jméno souboru, který bude vytvořen/otevřen. Tento parametr nesmí být NULL, jinak funkce selže.
dwCreationDisposition
[in] Určuje, co funkce má s archivem udělat
dwHashTableSize
[in] Pokud bude funkce vytvářet nový soubor, tento parametr specifikuje velikost hashovací tabulky v archivu. Hodnota tohoto parametru musí být mezi 16 a 262 144. Pokud je otevírán existující archiv, je tento parametr ignorován.
Návratová hodnota

Pokud funkce skončí úspěšně, vrací handle na otevřený/vytvořený MPQ archiv. Pokud funkce selže, návratová hodnota je NULL nebo INVALID_HANDLE_VALUE. Podrobnější informace o chybě vrací funkce GetLastError().


MpqCloseUpdatedArchive

Funkce MpqCloseUpdatedArchive uzavře archivní soubor.

BOOL WINAPI MpqCloseUpdatedArchive(
  HANDLE hMPQ,            // Handle archivu
  DWORD dwUnknown         // Neznámý, musí být NULL
);
Parametry
hMPQ
[in] Handle archivu, který má být uzavřen. Toto handle musí být získáno funkcí MpqOpenArchiveForUpdate
dwUnknown
[in] Neznámý, musí být nula.
Návratová hodnota

Pokud funkce skončí úspěšně, vrací nenulovou hodnotu. Pokud funkce selže, vrací FALSE a funkce GetLastError() vrací podrobný kód chyby.


MpqAddFileToArchive

Funkce MpqAddFileToArchive přidává soubor do archivu.

BOOL WINAPI MpqAddFileToArchive(
  HANDLE hMPQ,            // Handle archivu
  LPCSTR lpSourceFileName,// Jméno přidávaného souboru
  LPCSTR lpDestFileName,  // Jméno archivovaného souboru
  DWORD dwFlags           // Způsob uložení
);
Parametry
hMPQ
[in] Handle archivu, kam má být soubor přidán. Toto handle musí být získáno funkcí MpqOpenArchiveForUpdate
lpSourceFileName
[in] Jméno souboru na disku, který má být přidán do archivu. Parametr nesmí být NULL.
lpDestFileName
[in] Jméno, pod kterým bude soubor archivován. Parametr nesmí být NULL.
dwFlags
[in] Bitová maska, která určuje způsob uložení souboru v archivu.
Návratová hodnota

Pokud funkce skončí úspěšně, vrací nenulovou hodnotu. Pokud funkce selže, vrací FALSE a funkce GetLastError() vrací podrobný kód chyby.


MpqAddWAVToArchive

Funkce MpqAddWAVToArchive přidává soubor do archivu. Na rozdíl od funkce MpqAddFileToArchive, tato funkce je určena k archivování zvukovýh souborů (WAV)

BOOL WINAPI MpqAddWAVToArchive(
  HANDLE hMPQ,            // Handle archivu
  LPCSTR lpSourceFileName,// Jméno přidávaného souboru
  LPCSTR lpDestFileName,  // Jméno archivovaného souboru
  DWORD dwFlags,          // Způsob uložení
  DWORD dwQuality         // Kvalita uložení souboru
);
Parametry
hMPQ
[in] Handle archivu, kam má být soubor přidán. Toto handle musí být získáno funkcí MpqOpenArchiveForUpdate
lpSourceFileName
[in] Jméno souboru na disku, který má být přidán do archivu. Parametr nesmí být NULL.
lpDestFileName
[in] Jméno, pod kterým bude soubor archivován. Parametr nesmí být NULL.
dwFlags
[in] Bitová maska, která určuje způsob uložení souboru v archivu.
dwQuality
[in] Hodnota, která určuje kvalitu a intenzitu komprese souboru v archivu.
Návratová hodnota

Pokud funkce skončí úspěšně, vrací nenulovou hodnotu. Pokud funkce selže, vrací FALSE a funkce GetLastError() vrací podrobný kód chyby.


MpqDeleteFile

Funkce MpqDeleteFile odstraňuje soubor z archivu.

BOOL WINAPI MpqDeleteFile(
  HANDLE hMPQ,            // Handle archivu
  LPCSTR lpFileName       // Jméno mazaného souboru
);
Parametry
hMPQ
[in] Handle archivu, ze kterého má být soubor odstraněn. Toto handle musí být získáno funkcí MpqOpenArchiveForUpdate
lpFileName
[in] Jméno souboru, který má být odstraněn z archivu. Parametr nesmí být NULL.
Návratová hodnota

Pokud funkce skončí úspěšně, vrací nenulovou hodnotu. Pokud funkce selže, vrací FALSE a funkce GetLastError() vrací podrobný kód chyby.


MpqRenameFile

Funkce MpqRenameFile přejmenuje soubor v archivu.

BOOL WINAPI MpqRenameFile(
  HANDLE hMPQ,            // Handle archivu
  LPCSTR lpOldFileName,   // Původní jméno souboru
  LPCSTR lpNewFileName    // Nové jméno souboru
);
Parametry
hMPQ
[in] Handle archivu, ve kterém bude soubor přejmenován. Toto handle musí být získáno funkcí MpqOpenArchiveForUpdate
lpOldFileName
[in] Jméno souboru, který má být v archivu přejmenován. Parametr nesmí být NULL.
lpNewFileName
[in] Nové jméno souboru v archivu. Parametr nesmí být NULL.
Návratová hodnota

Pokud funkce skončí úspěšně, vrací nenulovou hodnotu. Pokud funkce selže, vrací FALSE a funkce GetLastError() vrací podrobný kód chyby.


MpqCompactArchive

Funkce MpqCompactArchive je užitečná, pokud bylo z archivu smazáno nebo do archivu přidáno velké množství souborů. Funkce přeuspořádá archiv a odstraní prázdná místa po smazaných souborech (podobně jako defragmentace disku).

BOOL WINAPI MpqCompactArchive(
  HANDLE hMPQ,            // Handle archivu
  BOOL bFailOnBadFile     // Nastavte na FALSE
);
Parametry
hMPQ
[in] Handle archivu, kam má být soubor přidán. Toto handle musí být získáno funkcí MpqOpenArchiveForUpdate
bFailOnBadFile
[in] ???
Návratová hodnota

Pokud funkce skončí úspěšně, vrací nenulovou hodnotu. Pokud funkce selže, vrací FALSE a funkce GetLastError() vrací podrobný kód chyby.


SFileGetFileInfo

Funkce SFileGetFileInfo vrací informace o archivu nebo o souboru uloženém v archivu MPQ. Tato funkce není obsažena v knihovně Storm.dll ani v programu StarEdit.exe.

DWORD WINAPI SFileGetFileInfo(
  HANDLE hMPQorFile,      // Handle archivu nebo souboru v archivu
  DWORD dwInfoType        // Typ informace
);
Parametry
hMPQorFile
[in] Handle archivu/souboru. Toto handle musí být získáno funkcí SFileOpenArchive nebo SFileOpenFileEx.
dwInfoType
[in] Požadovaná informace, kterou má funkce zjistit.
Návratová hodnota

Pokud funkce skončí úspěšně, vrací hodnotu požadované informace. V případě chyby funkce vrací 0xFFFFFFFF a funkce GetLastError() vrací podrobný kód chyby.


Copyright (c) Ladislav Zezula 2003 - 2006