Made by Bananen-Joe, written in C/C++.
Originally published as part of the RM Interna CUECards-database.
/*
Name: HarmonyPatcher
Version: 1.0
Autor: David Gausmann (alias Bananen-Joe)
Anmerkungen: Funktioniert mit 1.08 und 1.09
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool CheckFile_1_08(const char szDateiname[]);
void PatchFile_1_08(const char szDateiname[], long lSprache);
typedef FILE* LPFILE;
bool CheckStream(LPFILE hDatei, const char cCheck[], long lSize, long lAddress);
#define INITCODESIZE 740
char cInitCode[INITCODESIZE] =
{
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HARMONY.DLL" */
0xE8, 0, 0, 0, 0, /* CALL LoadLibraryA */
0x85, 0xC0, /* TEST EAX, EAX */
0x0F, 0x84, 0x4A, 0x01, 0x00, 0x00, /* JZ NEAR Fehlermeldung */
0xA3, 0, 0, 0, 0, /* MOV hHarmony, EAX */
0x8B, 0xD8, /* MOV EBX, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonyCreate" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonyCreate, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonyRelease" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonyRelease, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonyInitMidi" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonyInitMidi, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonyInitWave" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonyInitWave, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonyTermWave" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonyTermWave, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonyFadeInMusic" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonyFadeInMusic, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonyFadeOutMusic" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonyFadeOutMusic, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonySetMusicVolume" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonySetMusicVolume, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonySetMusicSpeed" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonySetMusicSpeed, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonySetMusicPanpot" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonySetMusicPanpot, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonyPlayMusic" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonyPlayMusic, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonyStopMusic" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonyStopMusic, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonyGetMusicPlaying" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonyGetMusicPlaying, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonyGetMusicLooping" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonyGetMusicLooping, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonyPlaySoundEx" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonyPlaySoundEx, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonyStopSound" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonyStopSound, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonyReserveSound" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonyReserveSound, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonyCancelSound" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonyCancelSound, EAX */
0x68, 0, 0, 0, 0, /* PUSH OFFSET "HarmonyGetMidiTick" */
0x53, /* PUSH EBX */
0xE8, 0, 0, 0, 0, /* CALL GetProcAddress */
0xA3, 0, 0, 0, 0, /* MOV lpHarmonyGetMidiTick, EAX */
0xE8, 0, 0, 0, 0, /* CALL RPG_RT */
0x50, /* PUSH EAX */
0xFF, 0x35, 0, 0, 0, 0, /* PUSH hHarmony */
0xE8, 0, 0, 0, 0, /* CALL FreeLibrary */
0x58, /* POP EAX */
0xC3, /* RET */
0x68, 0x30, 0, 0, 0, /* PUSH MB_ICONEXCLAMATION or MB_OK */
0x6A, 0x00, /* PUSH 0 */
0x68, 0, 0, 0, 0, /* PUSH OFFSET szFehlermeldung */
0x6A, 0x00, /* PUSH 0 */
0xE8, 0, 0, 0, 0, /* CALL MessageBoxA */
0xB8, 0x01, 0x00, 0x00, 0x00, /* MOV EAX, 1 */
0xC3, /* RET */
'H', 'A', 'R', 'M', 'O', 'N', 'Y', '.', 'D', 'L', 'L', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'C', 'r', 'e', 'a', 't', 'e', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'R', 'e', 'l', 'e', 'a', 's', 'e', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'I', 'n', 'i', 't', 'M', 'i', 'd', 'i', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'I', 'n', 'i', 't', 'W', 'a', 'v', 'e', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'T', 'e', 'r', 'm', 'W', 'a', 'v', 'e', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'F', 'a', 'd', 'e', 'I', 'n', 'M', 'u', 's', 'i', 'c', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'F', 'a', 'd', 'e', 'O', 'u', 't', 'M', 'u', 's', 'i', 'c', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'S', 'e', 't', 'M', 'u', 's', 'i', 'c', 'V', 'o', 'l', 'u', 'm', 'e', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'S', 'e', 't', 'M', 'u', 's', 'i', 'c', 'S', 'p', 'e', 'e', 'd', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'S', 'e', 't', 'M', 'u', 's', 'i', 'c', 'P', 'a', 'n', 'p', 'o', 't', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'P', 'l', 'a', 'y', 'M', 'u', 's', 'i', 'c', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'S', 't', 'o', 'p', 'M', 'u', 's', 'i', 'c', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'G', 'e', 't', 'M', 'u', 's', 'i', 'c', 'P', 'l', 'a', 'y', 'i', 'n', 'g', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'G', 'e', 't', 'M', 'u', 's', 'i', 'c', 'L', 'o', 'o', 'p', 'i', 'n', 'g', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'P', 'l', 'a', 'y', 'S', 'o', 'u', 'n', 'd', 'E', 'x', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'S', 't', 'o', 'p', 'S', 'o', 'u', 'n', 'd', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'R', 'e', 's', 'e', 'r', 'v', 'e', 'S', 'o', 'u', 'n', 'd', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'C', 'a', 'n', 'c', 'e', 'l', 'S', 'o', 'u', 'n', 'd', 0x00,
'H', 'a', 'r', 'm', 'o', 'n', 'y', 'G', 'e', 't', 'M', 'i', 'd', 'i', 'T', 'i', 'c', 'k', 0x00
};
#define JUMPCODESIZE 6
char cJumpCode[JUMPCODESIZE] =
{
0xFF, 0x25, 0, 0, 0, 0 /* JUMP NEAR XXXXXXXX */
};
#define FMD_LAENGE 41
const char szFehlermeldungDeutsch[FMD_LAENGE] = "Harmony.dll konnte nicht geladen werden!";
#define FME_LAENGE 27
const char szFehlermeldungEnglisch[FME_LAENGE] = "Couldn't load Harmony.dll!";
int main(int argc, char *argv[])
{
long lSprache;
if(argc != 3)
{
printf("Fehler: Keine Eingabe!\\r\\n");
return -1;
}
else
{
if(argv[2][0] == '0' && argv[2][1] == 0)
lSprache = 0;
else if(argv[2][0] == '1' && argv[2][1] == 0)
lSprache = 1;
else
{
printf("Fehler: Ungültige Eingabe!\\r\\n");
return -1;
}
if(CheckFile_1_08(argv[1]))
PatchFile_1_08(argv[1], lSprache);
else
{
printf("Unbekannte Datei!\\r\\n");
return 1;
}
}
printf("Patchen erfolgreich!\\r\\n");
system("pause");
return 0;
}
bool CheckStream(LPFILE hDatei, const char cCheck[], long lSize, long lAddress)
{
char cStream[8];
long I;
//Überflüssige Sicherheitsabfrage
if(lSize <= 0 || lSize > 8)
return false;
if(fseek(hDatei, lAddress, SEEK_SET))
return false;
if(fread(cStream, lSize, 1, hDatei) != 1)
return false;
for(I = 0; I < lSize; I++)
{
if(cStream[I] != cCheck[I])
return false;
}
//Eingelesene Daten sind ok
return true;
}
bool CheckFile_1_08(const char szDateiname[])
{
LPFILE hDatei;
char cStream[8];
if((hDatei = fopen(szDateiname, "r")) != NULL)
{
//Die MagicNumber überprüfen
if(!CheckStream(hDatei, "MZ", 2, 0))
goto Fehler_Close;
//Die Basis der Daten überprüfen
cStream[0] = 0x00; cStream[1] = 0xA0; cStream[2] = 0x0C; cStream[3] = 0x00;
if(!CheckStream(hDatei, cStream, sizeof(long), 0x130))
goto Fehler_Close;
//Entspricht: CMP DWORD PTR [004D1E08], 0
cStream[0] = 0x83; cStream[1] = 0x3D; cStream[2] = 0x08; cStream[3] = 0x1E;
cStream[4] = 0x4D; cStream[5] = 0x00; cStream[6] = 0x00;
//Die neue HarmonyCreate überprüfen
if(!CheckStream(hDatei, cStream, 7, 0x710E4))
goto Fehler_Close;
//Die neue HarmonyRelease überprüfen
if(!CheckStream(hDatei, cStream, 7, 0x71108))
goto Fehler_Close;
//Die neue HarmonyInitMidi überprüfen
if(!CheckStream(hDatei, cStream, 7, 0x7112C))
goto Fehler_Close;
//Die neue HarmonyInitWave überprüfen
if(!CheckStream(hDatei, cStream, 7, 0x71150))
goto Fehler_Close;
//Die neue HarmonyTermWave überprüfen
if(!CheckStream(hDatei, cStream, 7, 0x71174))
goto Fehler_Close;
//Die neue HarmonyStopMusic überprüfen
if(!CheckStream(hDatei, cStream, 7, 0x712DC))
goto Fehler_Close;
//Die neue HarmonyGetMusicPlaying überprüfen
if(!CheckStream(hDatei, cStream, 7, 0x71300))
goto Fehler_Close;
//Die neue HarmonyGetMusicLooping überprüfen
if(!CheckStream(hDatei, cStream, 7, 0x71324))
goto Fehler_Close;
//Die neue HarmonyStopSound überprüfen
if(!CheckStream(hDatei, cStream, 7, 0x713BC))
goto Fehler_Close;
//Die neue HarmonyGetMidiTick überprüfen
if(!CheckStream(hDatei, cStream, 7, 0x714B0))
goto Fehler_Close;
//Entspricht: PUSH EBP / MOV EBP, ESP
cStream[0] = 0x55; cStream[1] = 0x8B; cStream[2] = 0xEC;
//Die neue HarmonyPlayMusic überprüfen
if(!CheckStream(hDatei, cStream, 3, 0x71198))
goto Fehler_Close;
//Die neue HarmonyFadeInMusic überprüfen
if(!CheckStream(hDatei, cStream, 3, 0x71200))
goto Fehler_Close;
//Die neue HarmonyFadeOutMusic überprüfen
if(!CheckStream(hDatei, cStream, 3, 0x7122C))
goto Fehler_Close;
//Die neue HarmonySetMusicVolume überprüfen
if(!CheckStream(hDatei, cStream, 3, 0x71258))
goto Fehler_Close;
//Die neue HarmonySetMusicSpeed überprüfen
if(!CheckStream(hDatei, cStream, 3, 0x71284))
goto Fehler_Close;
//Die neue HarmonySetMusicPanpot überprüfen
if(!CheckStream(hDatei, cStream, 3, 0x712B0))
goto Fehler_Close;
//Die neue HarmonyPlaySoundEx überprüfen
if(!CheckStream(hDatei, cStream, 3, 0x71348))
goto Fehler_Close;
//Die neue HarmonyReserveSound überprüfen
if(!CheckStream(hDatei, cStream, 3, 0x713E0))
goto Fehler_Close;
//Die neue HarmonyCancelSound überprüfen
if(!CheckStream(hDatei, cStream, 3, 0x71448))
goto Fehler_Close;
//Die Klassendefinition überprüfen
cStream[0] = 0x68; cStream[1] = 0xD2; cStream[2] = 0x46; cStream[3] = 0x00;
if(!CheckStream(hDatei, cStream, 4, 0x6C61C))
goto Fehler_Close;
//Entspricht: JMP DWORD[004DXXXX]
cStream[0] = 0xFF; cStream[1] = 0x25; cStream[4] = 0x4D; cStream[5] = 0x00;
//LoadLibraryA überprüfen
cStream[2] = 0xDC; cStream[3] = 0x32;
if(!CheckStream(hDatei, cStream, 6, 0x6014))
goto Fehler_Close;
//GetProcAddress überprüfen
cStream[2] = 0x38; cStream[3] = 0x33;
if(!CheckStream(hDatei, cStream, 6, 0x5F5C))
goto Fehler_Close;
//FreeLibrary überprüfen
cStream[2] = 0x78; cStream[3] = 0x33;
if(!CheckStream(hDatei, cStream, 6, 0x5EDC))
goto Fehler_Close;
//MessageBoxA überprüfen
cStream[2] = 0x1C; cStream[3] = 0x32;
if(!CheckStream(hDatei, cStream, 6, 0x6DC))
goto Fehler_Close;
//BSS-Segment überprüfen
if(!CheckStream(hDatei, "BSS", 4, 0x248))
goto Fehler_Close;
/*
Die Datei scheint eine bisher ungepatchte
RPG_RT.exe (2003) Version 1.08 zu sein!
*/
fclose(hDatei);
return true;
Fehler_Close:
fclose(hDatei);
}
return false;
}
void PatchFile_1_08(const char szDateiname[], long lSprache)
{
LPFILE hDatei;
long lEntryPoint;
long lBSS;
long lTemp;
if((hDatei = fopen(szDateiname, "r+")) != NULL)
{
//Den bisherigen Programmstartpunkt einlesen
fseek(hDatei, 0x128, SEEK_SET);
fread(&lEntryPoint, sizeof(long), 1, hDatei);
//Die Größfe des BSS-Segments einlesen
fseek(hDatei, 0x250, SEEK_SET);
fread(&lBSS, sizeof(long), 1, hDatei);
//Die Größe des BSS-Segments anpassen
lTemp = lBSS + 80;
fseek(hDatei, 0x250, SEEK_SET);
fwrite(&lTemp, sizeof(long), 1, hDatei);
//Die Adresse des BSS-Segments einlesen
fread(&lTemp, sizeof(long), 1, hDatei);
lBSS += lTemp;
//Den neuen Programmstartpunkt schreiben
fseek(hDatei, 0x128, SEEK_SET);
lTemp = 0x6C61C + 0xC00;
fwrite(&lTemp, sizeof(long), 1, hDatei);
//Strings
*((long*) &cInitCode[1]) = (0x6C61C - 0x400 + 0x401000) + 373; //"HARMONY.DLL"
*((long*) &cInitCode[26]) = (0x6C61C - 0x400 + 0x401000) + 385; //"HarmonyCreate"
*((long*) &cInitCode[42]) = (0x6C61C - 0x400 + 0x401000) + 399; //"HarmonyRelease"
*((long*) &cInitCode[58]) = (0x6C61C - 0x400 + 0x401000) + 414; //"HarmonyInitMidi"
*((long*) &cInitCode[74]) = (0x6C61C - 0x400 + 0x401000) + 430; //"HarmonyInitWave"
*((long*) &cInitCode[90]) = (0x6C61C - 0x400 + 0x401000) + 446; //"HarmonyTermWave"
*((long*) &cInitCode[106]) = (0x6C61C - 0x400 + 0x401000) + 462; //"HarmonyFadeInMusic"
*((long*) &cInitCode[122]) = (0x6C61C - 0x400 + 0x401000) + 481; //"HarmonyFadeOutMusic"
*((long*) &cInitCode[138]) = (0x6C61C - 0x400 + 0x401000) + 501; //"HarmonySetMusicVolume"
*((long*) &cInitCode[154]) = (0x6C61C - 0x400 + 0x401000) + 523; //"HarmonySetMusicSpeed"
*((long*) &cInitCode[170]) = (0x6C61C - 0x400 + 0x401000) + 544; //"HarmonySetMusicPanpot"
*((long*) &cInitCode[186]) = (0x6C61C - 0x400 + 0x401000) + 566; //"HarmonyPlayMusic"
*((long*) &cInitCode[202]) = (0x6C61C - 0x400 + 0x401000) + 583; //"HarmonyStopMusic"
*((long*) &cInitCode[218]) = (0x6C61C - 0x400 + 0x401000) + 600; //"HarmonyGetMusicPlaying"
*((long*) &cInitCode[234]) = (0x6C61C - 0x400 + 0x401000) + 623; //"HarmonyGetMusicLooping"
*((long*) &cInitCode[250]) = (0x6C61C - 0x400 + 0x401000) + 646; //"HarmonyPlaySoundEx"
*((long*) &cInitCode[266]) = (0x6C61C - 0x400 + 0x401000) + 665; //"HarmonyStopSound"
*((long*) &cInitCode[282]) = (0x6C61C - 0x400 + 0x401000) + 682; //"HarmonyReserveSound"
*((long*) &cInitCode[298]) = (0x6C61C - 0x400 + 0x401000) + 702; //"HarmonyCancelSound"
*((long*) &cInitCode[314]) = (0x6C61C - 0x400 + 0x401000) + 721; //"HarmonyGetMidiTick"
*((long*) &cInitCode[356]) = (0x6C61C - 0x400 + 0x401000) + 740; //Fehler-String
//Funktionsaufrufe
*((long*) &cInitCode[6]) = 0x6014 - (0x6C61C + 10); //LoadLibraryA
for(lTemp = 0; lTemp < 19; lTemp++)
*((long*) &cInitCode[25+lTemp*16+7]) = 0x5F5C - (0x6C61C + 25+lTemp*16+11); //GetProcAddress
*((long*) &cInitCode[342]) = 0x5EDC - (0x6C61C + 346); //FreeLibrary
*((long*) &cInitCode[363]) = 0x6DC - (0x6C61C + 367); //MessageBoxA
*((long*) &cInitCode[330]) = (lEntryPoint - 0xC00) - (0x6C61C + 334); //RPG_RT
//Variablen
*((long*) &cInitCode[19]) = lBSS + 0x400000; //hHarmony
for(lTemp = 0; lTemp < 19; lTemp++)
*((long*) &cInitCode[25+lTemp*16+12]) = lBSS+lTemp*4+4 + 0x400000; //lpHarmony...
*((long*) &cInitCode[337]) = lBSS + 0x400000; //hHarmony
//Den Initialisierungscode schreiben
fseek(hDatei, 0x6C61C, SEEK_SET);
fwrite(cInitCode, INITCODESIZE, 1, hDatei);
if(lSprache == 0)
fwrite(szFehlermeldungDeutsch, FMD_LAENGE, 1, hDatei);
else
fwrite(szFehlermeldungEnglisch, FME_LAENGE, 1, hDatei);
//HarmonyCreate patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 4;
fseek(hDatei, 0x710E4, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonyRelease patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 8;
fseek(hDatei, 0x71108, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonyInitMidi patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 12;
fseek(hDatei, 0x7112C, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonyInitWave patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 16;
fseek(hDatei, 0x71150, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonyTermWave patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 20;
fseek(hDatei, 0x71174, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonyFadeInMusic patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 24;
fseek(hDatei, 0x71200, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonyFadeOutMusic patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 28;
fseek(hDatei, 0x7122C, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonySetMusicVolume patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 32;
fseek(hDatei, 0x71258, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonySetMusicSpeed patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 36;
fseek(hDatei, 0x71284, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonySetMusicPanpot patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 40;
fseek(hDatei, 0x712B0, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonyPlayMusic patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 44;
fseek(hDatei, 0x71198, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonyStopMusic patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 48;
fseek(hDatei, 0x712DC, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonyGetMusicPlaying patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 52;
fseek(hDatei, 0x71300, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonyGetMusicLooping patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 56;
fseek(hDatei, 0x71324, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonyPlaySoundEx patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 60;
fseek(hDatei, 0x71348, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonyStopSound patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 64;
fseek(hDatei, 0x713BC, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonyReserveSound patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 68;
fseek(hDatei, 0x713E0, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonyCancelSound patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 72;
fseek(hDatei, 0x71448, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
//HarmonyGetMidiTick patchen
*((long*) &cJumpCode[2]) = lBSS + 0x400000 + 76;
fseek(hDatei, 0x714B0, SEEK_SET);
fwrite(cJumpCode, JUMPCODESIZE, 1, hDatei);
fclose(hDatei);
}
}