mirror of
https://gitlab.com/hashborgir/plugy.git
synced 2025-09-18 17:42:08 +00:00
added original source from http://plugy.free.fr
This commit is contained in:
BIN
PlugYInstall/PlugYInstall.aps
Normal file
BIN
PlugYInstall/PlugYInstall.aps
Normal file
Binary file not shown.
456
PlugYInstall/PlugYInstall.cpp
Normal file
456
PlugYInstall/PlugYInstall.cpp
Normal file
@@ -0,0 +1,456 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
|
||||
Patch D2gfx.dll to install PlugY.
|
||||
|
||||
=================================================================*/
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
|
||||
const char* boxNameInstall = "Installation of PlugY, The Survival Kit Installation";
|
||||
const char* boxNameUnInstall = "Uninstall PlugY, The Survival Kit ";
|
||||
|
||||
int CALL_LOAD[7] = {0x389B,0x389B,0x3870,0x8B23,0xB423,0x8F63,0xB423};
|
||||
BYTE callNewLoad[7][6]={{0xE8,0x60,0x85,0x00,0x00,0x90},// JMP 6FA7BE00-6FA738A0 ;install loadlibrary
|
||||
{0xE8,0x60,0x85,0x00,0x00,0x90},// JMP 6FA7BE00-6FA738A0 ;install loadlibrary
|
||||
{0xE8,0x8B,0x85,0x00,0x00,0x90},// JMP 6FA7BE00-6FA73875 ;install loadlibrary
|
||||
{0xE8,0xD8,0x42,0x00,0x00,0x90},// JMP 6FA8CE00-6FA88B28 ;install loadlibrary
|
||||
{0xE8,0xD8,0x19,0x00,0x00,0x90},// JMP 6FA8CE00-6FA8B428 ;install loadlibrary
|
||||
{0xE8,0x98,0x3E,0x00,0x00,0x90},// JMP 6FA8CE00-6FA88F68 ;install loadlibrary
|
||||
{0xE8,0xD8,0x19,0x00,0x00,0x90}};// JMP 6FA8CE00-6FA8B428 ;install loadlibrary
|
||||
BYTE callOldLoad[7][6]={{0xFF,0x15,0x3C,0xC0,0xA7,0x6F},
|
||||
{0xFF,0x15,0x3C,0xC0,0xA7,0x6F},
|
||||
{0xFF,0x15,0x40,0xC0,0xA7,0x6F},
|
||||
{0xFF,0x15,0x1C,0xD1,0xA8,0x6F},
|
||||
{0xFF,0x15,0x1C,0xD1,0xA8,0x6F},
|
||||
{0xFF,0x15,0x1C,0xD1,0xA8,0x6F},
|
||||
{0xFF,0x15,0x1C,0xD1,0xA8,0x6F}};
|
||||
|
||||
int CALL_FREE[7] = {0x3A8C,0x3A8C,0x3A6D,0x8ACA,0xB3CA,0x8F0A,0xB3CA};
|
||||
BYTE callNewFree[7][6]={{0xE8,0xAF,0x83,0x00,0x00,0x90}, // JMP 6FA7BE40-6FA73A91 ;install freelibrary
|
||||
{0xE8,0xAF,0x83,0x00,0x00,0x90}, // JMP 6FA7BE40-6FA73A91 ;install freelibrary
|
||||
{0xE8,0xD2,0x83,0x00,0x00,0x90}, // JMP 6FA7BE44-6FA73A72 ;install freelibrary
|
||||
{0xE8,0x75,0x43,0x00,0x00,0x90}, // JMP 6FA8CE44-6FA88ACF ;install freelibrary
|
||||
{0xE8,0x75,0x1A,0x00,0x00,0x90}, // JMP 6FA8CE44-6FA8B3CF ;install freelibrary
|
||||
{0xE8,0x35,0x3F,0x00,0x00,0x90}, // JMP 6FA8CE44-6FA88F0F ;install freelibrary
|
||||
{0xE8,0x75,0x1A,0x00,0x00,0x90}};// JMP 6FA8CE44-6FA8B3CF ;install freelibrary
|
||||
BYTE callOldFree[7][6]={{0xFF,0x15,0x44,0xC0,0xA7,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
|
||||
{0xFF,0x15,0x44,0xC0,0xA7,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
|
||||
{0xFF,0x15,0x48,0xC0,0xA7,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
|
||||
{0xFF,0x15,0x2C,0xD1,0xA8,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
|
||||
{0xFF,0x15,0x2C,0xD1,0xA8,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
|
||||
{0xFF,0x15,0x2C,0xD1,0xA8,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
|
||||
{0xFF,0x15,0x2C,0xD1,0xA8,0x6F}};// CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
|
||||
|
||||
int CALLER_LOADPLUGY = 0xBE00;//6FA7BE00-6FA70000
|
||||
BYTE caller_LoadPlugY[]={
|
||||
0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4]
|
||||
0xFF,0x15,0x40,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA
|
||||
0x50, //PUSH EAX
|
||||
0x68,0x80,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE80 ; ASCII "PlugY.dll"
|
||||
0xFF,0x15,0x40,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA
|
||||
0xA3,0xFC,0xEF,0xA8,0x6F, //MOV DWORD PTR DS:[6FA8EFFC],EAX
|
||||
0x85,0xC0, //TEST EAX,EAX
|
||||
0x74,0x18, //JE SHORT d2gfx.6FA7BE37
|
||||
0x68,0x90,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE10 ;Init ID
|
||||
0x50, //PUSH EAX
|
||||
0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAddress>] ; kernel32.GetProcAddress
|
||||
0x85,0xC0, //TEST EAX,EAX
|
||||
0x74,0x04, //JE SHORT d2gfx.6FA7BDC1
|
||||
0x6A,0x00, //PUSH 0
|
||||
0xFF,0xD0, //CALL EAX
|
||||
0x58, //POP EAX
|
||||
0xC2,0x04,0x00, //RETN 4
|
||||
0x59, //POP ECX
|
||||
0xB9,0x80,0xBE,0xA7,0x6F, //MOV ECX,d2gfx.6FA7BE80 ; ASCII "PlugY.dll"
|
||||
0x83,0x04,0x24,0x11, //ADD DWORD PTR SS:[ESP],11
|
||||
0xC2,0x04,0x00}; //RETN 4
|
||||
|
||||
|
||||
int CALLER_FREEPLUGY = 0xBE44;//6FA7BE44-6FA70000
|
||||
BYTE caller_FreePlugY[]={
|
||||
0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4]
|
||||
0xFF,0x15,0x48,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] ; kernel32.FreeLibrary
|
||||
0x50, //PUSH EAX
|
||||
0xA1,0xFC,0xEF,0xA8,0x6F, //MOV EAX,DWORD PTR DS:[6FA8EFFC]
|
||||
0x85,0xC0, //TEST EAX,EAX
|
||||
0x74,0x20, //JE SHORT d2gfx.6FA7BE74
|
||||
0x50, //PUSH EAX
|
||||
0x68,0xA0,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE20 ;release
|
||||
0x50, //PUSH EAX
|
||||
0x33,0xC0, //XOR EAX,EAX
|
||||
0xA3,0xFC,0xEF,0xA8,0x6F, //MOV DWORD PTR DS:[6FA8EFFC],EAX
|
||||
0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress
|
||||
0x85,0xC0, //TEST EAX,EAX
|
||||
0x74,0x02, //JE SHORT d2gfx.6FA7BDEF
|
||||
0xFF,0xD0, //CALL EAX
|
||||
0xFF,0x15,0x48,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.FreeLibrar>; kernel32.FreeLibrary
|
||||
0x58, //POP EAX
|
||||
0xC2,0x04,0x00}; //RETN 4
|
||||
|
||||
|
||||
int S_DLLNAME = 0xBE80;//6FA7BE30-6FA70000
|
||||
BYTE sDllName[]={'P','l','u','g','Y','.','d','l','l',0};// Dll filename to load.
|
||||
|
||||
int S_INIT = 0xBE90;//6FA7BE10-6FA70000
|
||||
BYTE sInit[]={'_','I','n','i','t','@','4',0};
|
||||
|
||||
int S_RELEASE = 0xBEA0;//6FA7BE20-6FA70000
|
||||
BYTE sRelease[]={'_','R','e','l','e','a','s','e','@','0',0};
|
||||
|
||||
enum eFileVersion
|
||||
{
|
||||
V109b=0,
|
||||
V109d,
|
||||
V110,
|
||||
V111,
|
||||
V111b,
|
||||
V112,
|
||||
V113c,
|
||||
UNKNOW
|
||||
};
|
||||
|
||||
int getVersion(FILE *dll)
|
||||
{
|
||||
int ver;
|
||||
//GET_VERSION(D2gfx, 80, 110, 0x00949FA8, 0x018866A8, 0x401526B2, 0x575C8A5E, 0x42E6C22A, 0x43028B19, 0xACBE1B9E, 0x00000000);
|
||||
int addr;
|
||||
fseek(dll,0x80,SEEK_SET);
|
||||
fread(&addr,sizeof(addr),1,dll);
|
||||
if (addr == 0x00949FA8)
|
||||
ver = V109b;
|
||||
else if (addr == 0x018866A8)
|
||||
ver = V109d;
|
||||
else if (addr == 0x401526B2)
|
||||
ver = V110;
|
||||
else if (addr == 0x575C8A5E)
|
||||
{
|
||||
fseek(dll,0x110,SEEK_SET);
|
||||
fread(&addr,sizeof(addr),1,dll);
|
||||
if (addr == 0x42E6C22A)
|
||||
ver = V111;
|
||||
else if (addr == 0x43028B19)
|
||||
ver = V111b;
|
||||
else
|
||||
ver = UNKNOW;
|
||||
}
|
||||
else if (addr == 0xACBE1B9E)
|
||||
ver = V112;
|
||||
else if (addr == 0xACBE1BB6)
|
||||
ver = V113c;
|
||||
else
|
||||
ver = UNKNOW;
|
||||
return ver;
|
||||
}
|
||||
|
||||
|
||||
void updateData(int version)
|
||||
{
|
||||
switch(version)
|
||||
{
|
||||
case V109b:
|
||||
case V109d:
|
||||
caller_LoadPlugY[6] -= 4;
|
||||
caller_LoadPlugY[18] -= 4;
|
||||
caller_LoadPlugY[39] -= 4;
|
||||
caller_FreePlugY[6] -= 4;
|
||||
caller_FreePlugY[36] -= 4;
|
||||
caller_FreePlugY[48] -= 4;
|
||||
break;
|
||||
case V110:
|
||||
break;
|
||||
case V111:
|
||||
case V111b:
|
||||
case V112:
|
||||
case V113c:
|
||||
CALLER_LOADPLUGY += 0x1000;
|
||||
CALLER_FREEPLUGY += 0x1000;
|
||||
S_INIT += 0x1000;
|
||||
S_RELEASE += 0x1000;
|
||||
S_DLLNAME += 0x1000;
|
||||
*(DWORD*)(&caller_LoadPlugY[6]) = 0x6FA8D11C;
|
||||
*(DWORD*)(&caller_LoadPlugY[18]) = 0x6FA8D11C;
|
||||
*(DWORD*)(&caller_LoadPlugY[39]) = 0x6FA8D120;
|
||||
*(DWORD*)(&caller_FreePlugY[6]) = 0x6FA8D12C;
|
||||
*(DWORD*)(&caller_FreePlugY[36]) = 0x6FA8D120;
|
||||
*(DWORD*)(&caller_FreePlugY[48]) = 0x6FA8D12C;
|
||||
caller_LoadPlugY[13] += 0x10;
|
||||
caller_LoadPlugY[14]++;
|
||||
caller_LoadPlugY[25]++;
|
||||
caller_LoadPlugY[33] += 0x10;
|
||||
caller_LoadPlugY[34]++;
|
||||
caller_LoadPlugY[58] += 0x10;
|
||||
caller_LoadPlugY[59]++;
|
||||
caller_FreePlugY[23] += 0x10;
|
||||
caller_FreePlugY[24]++;
|
||||
caller_FreePlugY[14]++;
|
||||
caller_FreePlugY[32]++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////// EXPORTED FUNCTIONS //////////////////////////////
|
||||
|
||||
void Patch()
|
||||
{
|
||||
if (MessageBox(0,"This programm will modify the D2gfx.dll file of the current directory.\n"
|
||||
"Before continue, don't forgot to backup D2gfx.dll if you want\n"
|
||||
"Do you want patch D2gfx.dll for the launch of PlugY ?",
|
||||
boxNameInstall, MB_YESNO|MB_ICONQUESTION) == IDNO)
|
||||
{
|
||||
MessageBox(0,"D2gfx.dll isn't patched.\n",
|
||||
boxNameInstall, MB_OK|MB_ICONASTERISK);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
FILE *dll=fopen("d2gfx.dll","rb+");
|
||||
|
||||
if(!dll)
|
||||
{
|
||||
MessageBox(0,"Can't open D2gfx.dll in read/write mode\n"
|
||||
"If Diablo II is running you can\'t install PlugY, The Survival Kit.\n"
|
||||
"Quit Diablo II and try again.",
|
||||
boxNameInstall, MB_OK|MB_ICONEXCLAMATION);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
int version = getVersion(dll);
|
||||
|
||||
if (version == UNKNOW)
|
||||
{
|
||||
MessageBox(0,"Bad version of D2gfx.dll.\n"
|
||||
"You can try to uninstall any previous version of PlugY, The Survival Kit then retry.\n"
|
||||
"Or re-install a clean version (between 1.09 and 1.12) of LOD.",
|
||||
boxNameInstall, MB_OK|MB_ICONEXCLAMATION);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
updateData(version);
|
||||
|
||||
bool error = false;
|
||||
int ident = 0;
|
||||
BYTE buffer[100];
|
||||
BYTE zeros[100];
|
||||
memset(zeros,0,sizeof(zeros));
|
||||
|
||||
fseek(dll,CALL_LOAD[version],SEEK_SET);
|
||||
fread(buffer,6,1,dll);
|
||||
if(memcmp(buffer, callOldLoad[version], 6) !=0 ) error = true;
|
||||
if(memcmp(buffer, callNewLoad[version], 6) ==0 ) ident++;
|
||||
|
||||
fseek(dll,CALL_FREE[version],SEEK_SET);
|
||||
fread(buffer,6,1,dll);
|
||||
if(memcmp(buffer, callOldFree[version], 6) !=0 ) error = true;
|
||||
if(memcmp(buffer, callNewFree[version], 6) ==0 ) ident++;
|
||||
|
||||
fseek(dll,CALLER_LOADPLUGY,SEEK_SET);
|
||||
fread(buffer,sizeof(caller_LoadPlugY),1,dll);
|
||||
if(memcmp(buffer, zeros, sizeof(caller_LoadPlugY)) !=0 ) error = true;
|
||||
if(memcmp(buffer, caller_LoadPlugY, sizeof(caller_LoadPlugY)) ==0 ) ident++;
|
||||
|
||||
fseek(dll,CALLER_FREEPLUGY,SEEK_SET);
|
||||
fread(buffer,sizeof(caller_FreePlugY),1,dll);
|
||||
if(memcmp(buffer, zeros, sizeof(caller_FreePlugY)) !=0 ) error = true;
|
||||
if(memcmp(buffer, caller_FreePlugY, sizeof(caller_FreePlugY)) ==0 ) ident++;
|
||||
|
||||
fseek(dll,S_INIT,SEEK_SET);
|
||||
fread(buffer,sizeof(sInit),1,dll);
|
||||
if(memcmp(buffer, zeros, sizeof(sInit)) !=0 ) error = true;
|
||||
if(memcmp(buffer, sInit, sizeof(sInit)) ==0 ) ident++;
|
||||
|
||||
fseek(dll,S_RELEASE,SEEK_SET);
|
||||
fread(buffer,sizeof(sRelease),1,dll);
|
||||
if(memcmp(buffer, zeros, sizeof(sRelease)) !=0 ) error = true;
|
||||
if(memcmp(buffer, sRelease, sizeof(sRelease)) ==0 ) ident++;
|
||||
|
||||
fseek(dll,S_DLLNAME,SEEK_SET);
|
||||
fread(buffer,sizeof(sDllName),1,dll);
|
||||
if(memcmp(buffer, zeros, sizeof(sDllName)) !=0 ) error = true;
|
||||
if(memcmp(buffer, sDllName, sizeof(sDllName)) ==0 ) ident++;
|
||||
|
||||
if (error)
|
||||
{
|
||||
if (ident==7)
|
||||
{
|
||||
MessageBox(0, "PlugY, The Survival Kit already installed.",
|
||||
boxNameInstall, MB_OK|MB_ICONASTERISK);
|
||||
exit(0);
|
||||
} else
|
||||
{
|
||||
MessageBox(0,"Bad version of D2gfx.dll.\n"
|
||||
"You can try to uninstall any previous version of PlugY, The Survival Kit then retry.\n"
|
||||
"Or re-install a clean version (between 1.09 and 1.11b) of LOD.",
|
||||
boxNameInstall, MB_OK|MB_ICONEXCLAMATION);
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
fseek(dll,CALL_LOAD[version],SEEK_SET);
|
||||
fwrite(callNewLoad[version], 6, 1, dll);
|
||||
|
||||
fseek(dll,CALL_FREE[version],SEEK_SET);
|
||||
fwrite(callNewFree[version], 6, 1, dll);
|
||||
|
||||
fseek(dll,CALLER_LOADPLUGY,SEEK_SET);
|
||||
fwrite(caller_LoadPlugY, sizeof(caller_LoadPlugY), 1, dll);
|
||||
|
||||
fseek(dll,CALLER_FREEPLUGY,SEEK_SET);
|
||||
fwrite(caller_FreePlugY, sizeof(caller_FreePlugY), 1, dll);
|
||||
|
||||
fseek(dll,S_INIT,SEEK_SET);
|
||||
fwrite(sInit, sizeof(sInit), 1, dll);
|
||||
|
||||
fseek(dll,S_RELEASE,SEEK_SET);
|
||||
fwrite(sRelease, sizeof(sRelease), 1, dll);
|
||||
|
||||
fseek(dll,S_DLLNAME,SEEK_SET);
|
||||
fwrite(sDllName, sizeof(sDllName), 1, dll);
|
||||
|
||||
fclose(dll);
|
||||
|
||||
MessageBox(0,"D2gfx.dll patched successfully.\n"
|
||||
"PlugY, The Survival Kit installed successfully.",
|
||||
boxNameInstall, MB_OK|MB_ICONASTERISK);
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void Unpatch()
|
||||
{
|
||||
if (MessageBox(0,"This programm will modify the D2gfx.dll file of the current directory.\n"
|
||||
"Before continue, don't forgot to backup D2gfx.dll if you want\n"
|
||||
"Do you want patch D2gfx.dll for remove the launch of PlugY ?",
|
||||
boxNameUnInstall, MB_YESNO|MB_ICONQUESTION) == IDNO)
|
||||
{
|
||||
MessageBox(0,"D2gfx.dll isn't patched.\n",
|
||||
boxNameUnInstall, MB_OK|MB_ICONASTERISK);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
FILE *dll=fopen("d2gfx.dll","rb+");
|
||||
|
||||
if(!dll)
|
||||
{
|
||||
MessageBox(0,"Can't open D2gfx.dll in read/write mode.\n"
|
||||
"If Diablo II is running you can\'t install PlugY, The Survival Kit.\n"
|
||||
"Quit Diablo and try again.",
|
||||
boxNameUnInstall, MB_OK|MB_ICONEXCLAMATION);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
int version = getVersion(dll);
|
||||
|
||||
if (version == UNKNOW)
|
||||
{
|
||||
MessageBox(0,"Bad version of D2gfx.dll.\n"
|
||||
"You can try to uninstall any previous version of PlugY, The Survival Kit then retry.\n"
|
||||
"Or re-install a clean version (between 1.09 and 1.12) of LOD.",
|
||||
boxNameUnInstall, MB_OK|MB_ICONEXCLAMATION);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
updateData(version);
|
||||
|
||||
bool error = false;
|
||||
int ident = 0;
|
||||
BYTE buffer[100];
|
||||
BYTE zeros[100];
|
||||
memset(zeros,0,sizeof(zeros));
|
||||
|
||||
fseek(dll,CALL_LOAD[version],SEEK_SET);
|
||||
fread(buffer,6,1,dll);
|
||||
if(memcmp(buffer, callNewLoad[version], 6) !=0 ) error = true;
|
||||
if(memcmp(buffer, callOldLoad[version], 6) ==0 ) ident++;
|
||||
|
||||
fseek(dll,CALL_FREE[version],SEEK_SET);
|
||||
fread(buffer,6,1,dll);
|
||||
if(memcmp(buffer, callNewFree[version], 6) !=0 ) error = true;
|
||||
if(memcmp(buffer, callOldFree[version], 6) ==0 ) ident++;
|
||||
|
||||
fseek(dll,CALLER_LOADPLUGY,SEEK_SET);
|
||||
fread(buffer,sizeof(caller_LoadPlugY),1,dll);
|
||||
if(memcmp(buffer, caller_LoadPlugY, sizeof(caller_LoadPlugY)) !=0 ) error = true;
|
||||
if(memcmp(buffer, zeros, sizeof(caller_LoadPlugY)) ==0 ) ident++;
|
||||
|
||||
fseek(dll,CALLER_FREEPLUGY,SEEK_SET);
|
||||
fread(buffer,sizeof(caller_FreePlugY),1,dll);
|
||||
if(memcmp(buffer, caller_FreePlugY, sizeof(caller_FreePlugY)) !=0 ) error = true;
|
||||
if(memcmp(buffer, zeros, sizeof(caller_FreePlugY)) ==0 ) ident++;
|
||||
|
||||
fseek(dll,S_INIT,SEEK_SET);
|
||||
fread(buffer,sizeof(sInit),1,dll);
|
||||
if(memcmp(buffer, sInit, sizeof(sInit)) !=0 ) error = true;
|
||||
if(memcmp(buffer, zeros, sizeof(sInit)) ==0 ) ident++;
|
||||
|
||||
fseek(dll,S_RELEASE,SEEK_SET);
|
||||
fread(buffer,sizeof(sRelease),1,dll);
|
||||
if(memcmp(buffer, sRelease, sizeof(sRelease)) !=0 ) error = true;
|
||||
if(memcmp(buffer, zeros, sizeof(sRelease)) ==0 ) ident++;
|
||||
|
||||
fseek(dll,S_DLLNAME,SEEK_SET);
|
||||
fread(buffer,sizeof(sDllName),1,dll);
|
||||
if(memcmp(buffer, sDllName, sizeof(sDllName)) !=0 ) error = true;
|
||||
if(memcmp(buffer, zeros, sizeof(sDllName)) ==0 ) ident++;
|
||||
|
||||
if (error)
|
||||
{
|
||||
if (ident==7)
|
||||
{
|
||||
MessageBox(0,"PlugY, The Survival Kit already uninstalled.",
|
||||
boxNameUnInstall, MB_OK|MB_ICONASTERISK);
|
||||
exit(0);
|
||||
} else {
|
||||
MessageBox(0,"Bad version of D2gfx.dll.\n"
|
||||
"Unable to uninstall PlugY, The Survival Kit.",
|
||||
boxNameUnInstall, MB_OK|MB_ICONEXCLAMATION);
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
fseek(dll,CALL_LOAD[version],SEEK_SET);
|
||||
fwrite(callOldLoad[version], 6, 1, dll);
|
||||
|
||||
fseek(dll,CALL_FREE[version],SEEK_SET);
|
||||
fwrite(callOldFree[version], 6, 1, dll);
|
||||
|
||||
fseek(dll,CALLER_LOADPLUGY,SEEK_SET);
|
||||
fwrite(zeros, sizeof(caller_LoadPlugY), 1, dll);
|
||||
|
||||
fseek(dll,CALLER_FREEPLUGY,SEEK_SET);
|
||||
fwrite(zeros, sizeof(caller_FreePlugY), 1, dll);
|
||||
|
||||
fseek(dll,S_INIT,SEEK_SET);
|
||||
fwrite(zeros, sizeof(sInit), 1, dll);
|
||||
|
||||
fseek(dll,S_RELEASE,SEEK_SET);
|
||||
fwrite(zeros, sizeof(sRelease), 1, dll);
|
||||
|
||||
fseek(dll,S_DLLNAME,SEEK_SET);
|
||||
fwrite(zeros, sizeof(sDllName), 1, dll);
|
||||
|
||||
fclose(dll);
|
||||
|
||||
MessageBox(0,"D2gfx.dll patched successfully.\n"
|
||||
"PlugY, The Survival Kit uninstalled successfully.",
|
||||
boxNameUnInstall, MB_OK|MB_ICONASTERISK);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
int main(int argc, char * argv[])
|
||||
{
|
||||
// if ((argc>1) && !strcmp(argv[1],"-u"))
|
||||
#ifdef RESTORE
|
||||
Unpatch();
|
||||
#else
|
||||
if ((argc>1) && !strcmp(argv[1],"-u"))
|
||||
Unpatch();
|
||||
else
|
||||
Patch();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*================================= END OF FILE =================================*/
|
110
PlugYInstall/PlugYInstall.rc
Normal file
110
PlugYInstall/PlugYInstall.rc
Normal file
@@ -0,0 +1,110 @@
|
||||
// Microsoft Visual C++ generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// French (France) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_FRENCH, SUBLANG_FRENCH
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,0,4,0
|
||||
PRODUCTVERSION 1,0,4,0
|
||||
FILEFLAGSMASK 0x17L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS 0x4L
|
||||
FILETYPE 0x1L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040c04b0"
|
||||
BEGIN
|
||||
VALUE "FileVersion", "1.04"
|
||||
VALUE "OriginalFilename", "PlugY_Install.exe"
|
||||
VALUE "ProductName", "PlugY Installation"
|
||||
VALUE "ProductVersion", "1.04"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x40c, 1200
|
||||
END
|
||||
END
|
||||
|
||||
#endif // French (France) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
22
PlugYInstall/PlugYInstall.sln
Normal file
22
PlugYInstall/PlugYInstall.sln
Normal file
@@ -0,0 +1,22 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# Visual Studio 2005
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlugYInstall", "PlugYInstall.vcproj", "{F7666190-876A-4D43-BA04-82F8F3F986DC}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Release|Win32 = Release|Win32
|
||||
Restore|Win32 = Restore|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{F7666190-876A-4D43-BA04-82F8F3F986DC}.Debug|Win32.ActiveCfg = Release|Win32
|
||||
{F7666190-876A-4D43-BA04-82F8F3F986DC}.Debug|Win32.Build.0 = Release|Win32
|
||||
{F7666190-876A-4D43-BA04-82F8F3F986DC}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{F7666190-876A-4D43-BA04-82F8F3F986DC}.Release|Win32.Build.0 = Release|Win32
|
||||
{F7666190-876A-4D43-BA04-82F8F3F986DC}.Restore|Win32.ActiveCfg = Restore|Win32
|
||||
{F7666190-876A-4D43-BA04-82F8F3F986DC}.Restore|Win32.Build.0 = Restore|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
BIN
PlugYInstall/PlugYInstall.suo
Normal file
BIN
PlugYInstall/PlugYInstall.suo
Normal file
Binary file not shown.
294
PlugYInstall/PlugYInstall.vcproj
Normal file
294
PlugYInstall/PlugYInstall.vcproj
Normal file
@@ -0,0 +1,294 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="8,00"
|
||||
Name="PlugYInstall"
|
||||
ProjectGUID="{F7666190-876A-4D43-BA04-82F8F3F986DC}"
|
||||
RootNamespace="PlugYInstall"
|
||||
Keyword="Win32Proj"
|
||||
>
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"
|
||||
/>
|
||||
</Platforms>
|
||||
<ToolFiles>
|
||||
</ToolFiles>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="Debug"
|
||||
IntermediateDirectory="Debug"
|
||||
ConfigurationType="1"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC70.vsprops"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="true"
|
||||
DebugInformationFormat="4"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/PlugYInstall.exe"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="true"
|
||||
ProgramDatabaseFile="$(OutDir)/PlugYInstall.pdb"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="1"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC70.vsprops"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
OmitFramePointers="true"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
StringPooling="true"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="true"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="false"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/PatchD2gfxDll.exe"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
CommandLine="copy $(TargetPath) "..\PlugYInstaller\PatchD2gfxDll.exe""
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Restore|Win32"
|
||||
OutputDirectory="$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC70.vsprops"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
OmitFramePointers="true"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;RESTORE"
|
||||
StringPooling="true"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="true"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="false"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/RestoreD2gfxDll.exe"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
CommandLine="copy $(TargetPath) "..\PlugYInstaller\RestoreD2gfxDll.exe""
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm"
|
||||
>
|
||||
<File
|
||||
RelativePath="PlugYInstall.cpp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc"
|
||||
>
|
||||
<File
|
||||
RelativePath="resource.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
>
|
||||
<File
|
||||
RelativePath="PlugYInstall.rc"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
93
PlugYInstall/PlugYInstall.vcproj.ATHLON64.Yohann.user
Normal file
93
PlugYInstall/PlugYInstall.vcproj.ATHLON64.Yohann.user
Normal file
@@ -0,0 +1,93 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioUserFile
|
||||
ProjectType="Visual C++"
|
||||
Version="8,00"
|
||||
ShowAllFiles="true"
|
||||
>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<DebugSettings
|
||||
Command="$(TargetPath)"
|
||||
WorkingDirectory=""
|
||||
CommandArguments=""
|
||||
Attach="false"
|
||||
DebuggerType="3"
|
||||
Remote="1"
|
||||
RemoteMachine="ATHLON64"
|
||||
RemoteCommand=""
|
||||
HttpUrl=""
|
||||
PDBPath=""
|
||||
SQLDebugging=""
|
||||
Environment=""
|
||||
EnvironmentMerge="true"
|
||||
DebuggerFlavor=""
|
||||
MPIRunCommand=""
|
||||
MPIRunArguments=""
|
||||
MPIRunWorkingDirectory=""
|
||||
ApplicationCommand=""
|
||||
ApplicationArguments=""
|
||||
ShimCommand=""
|
||||
MPIAcceptMode=""
|
||||
MPIAcceptFilter=""
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<DebugSettings
|
||||
Command="$(TargetPath)"
|
||||
WorkingDirectory=""
|
||||
CommandArguments=""
|
||||
Attach="false"
|
||||
DebuggerType="3"
|
||||
Remote="1"
|
||||
RemoteMachine="ATHLON64"
|
||||
RemoteCommand=""
|
||||
HttpUrl=""
|
||||
PDBPath=""
|
||||
SQLDebugging=""
|
||||
Environment=""
|
||||
EnvironmentMerge="true"
|
||||
DebuggerFlavor=""
|
||||
MPIRunCommand=""
|
||||
MPIRunArguments=""
|
||||
MPIRunWorkingDirectory=""
|
||||
ApplicationCommand=""
|
||||
ApplicationArguments=""
|
||||
ShimCommand=""
|
||||
MPIAcceptMode=""
|
||||
MPIAcceptFilter=""
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Restore|Win32"
|
||||
>
|
||||
<DebugSettings
|
||||
Command="$(TargetPath)"
|
||||
WorkingDirectory=""
|
||||
CommandArguments=""
|
||||
Attach="false"
|
||||
DebuggerType="3"
|
||||
Remote="1"
|
||||
RemoteMachine="ATHLON64"
|
||||
RemoteCommand=""
|
||||
HttpUrl=""
|
||||
PDBPath=""
|
||||
SQLDebugging=""
|
||||
Environment=""
|
||||
EnvironmentMerge="true"
|
||||
DebuggerFlavor=""
|
||||
MPIRunCommand=""
|
||||
MPIRunArguments=""
|
||||
MPIRunWorkingDirectory=""
|
||||
ApplicationCommand=""
|
||||
ApplicationArguments=""
|
||||
ShimCommand=""
|
||||
MPIAcceptMode=""
|
||||
MPIAcceptFilter=""
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
</VisualStudioUserFile>
|
14
PlugYInstall/resource.h
Normal file
14
PlugYInstall/resource.h
Normal file
@@ -0,0 +1,14 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by PlugYInstall.rc
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 101
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1001
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
Reference in New Issue
Block a user