Merge branch 'master' of somewhatlurker/PD-Loader into master

This commit is contained in:
nastys
2020-11-15 16:38:04 +00:00
committed by Gogs
117 changed files with 46782 additions and 111 deletions
+87 -26
View File
@@ -118,36 +118,97 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="textBox1.Text" xml:space="preserve">
<value>Contributors: akasaka, Brolijah, crash5b, Jay39w, korenkonder, Kyberal, lybxlpsv, nastys, Nezarn, samyuu, Skyth, somewhatlurker, Stewie1.0, SwigS-27, zsccat.
Libraries: Microsoft, FreeGLUT Team, ThirteenAG.
<value>PD Loader is intended for educational purposes only; not for piracy.
Users should possess a legally-obtained dump of the game to use this software.
Please check your local laws/regulataions to verify the legality of tampering
with and dumping data from protected arcade machine hardware.
PD Loader is intended for educational purposes, and not for piracy. Based on your current jurisdiction, it may be illegal to tamper with an arcade cabinet or its hardware and so it would be the usage of this software. You must have your own legal dump of the game to use this software.
Project Contributors:
akasaka, Brolijah, crash5b, Jay39w, korenkonder, Kyberal, lybxlpsv, nastys,
Nezarn, samyuu, Skyth, somewhatlurker, Stewie1.0, SwigS-27, zsccat
MIT License
Copyright (c) Project DIVA Modding 2nd Community
Copyright (c) samyuu (nop)
Copyright (c) ThirteenAG
Copyright (c) Microsoft Corporation
Copyright (c) FreeGLUT team
PD Loader and the included plugins are distributed under MIT License:
Copyright (c) Project DIVA Modding 2nd Community
Copyright (c) samyuu (nop) (original TLAC code)
Copyright (c) ThirteenAG (original Ultimate ASI Loader code)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
Microsoft Detours, utilized by many plugins, is licensed under MIT License:
# Copyright (c) Microsoft Corporation
All rights reserved.
# MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.</value>
Launcher, Patches, Render and TLAC plugins utilize files from FreeGLUT:
Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies or substantial portions of the Software.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of Pawel W. Olszta shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Pawel W. Olszta.
DivaSound uses miniaudio (public domain or MIT-0) and BASSASIO (free for
non-commercial use only)
AMD compatibilty pack dependencies have additional licenses, detailed in the AMD</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="button_Discord.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -209,9 +270,9 @@ SOFTWARE.</value>
ZSNnuf0xq38QLKYcn/7WyZSb81ROzr/0gUC6FNUQmwAAAABJRU5ErkJggg==
</value>
</data>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<data name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>17, 17</value>
</metadata>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@@ -57,7 +57,7 @@
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>..\..\..\dependencies\PluginConfigApi;..\..\..\dependencies\detours\include;</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\dependencies\xdelta3;..\..\..\dependencies\PluginConfigApi;..\..\..\dependencies\detours\include;</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
@@ -74,7 +74,7 @@
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>..\..\..\dependencies\PluginConfigApi;..\..\..\dependencies\detours\include;</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\dependencies\xdelta3;..\..\..\dependencies\PluginConfigApi;..\..\..\dependencies\detours\include;</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
@@ -86,9 +86,12 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="src\crc\crc_32.c" />
<ClCompile Include="src\dllmain.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\crc\crc.h" />
<ClInclude Include="src\crc\sniptype.h" />
<ClInclude Include="src\framework.h" />
<ClInclude Include="src\glStuff.h" />
</ItemGroup>
@@ -18,6 +18,9 @@
<ClCompile Include="src\dllmain.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\crc\crc_32.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\framework.h">
@@ -26,5 +29,11 @@
<ClInclude Include="src\glStuff.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\crc\sniptype.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\crc\crc.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>
@@ -0,0 +1,56 @@
/*
** CRC.H - header file for SNIPPETS CRC and checksum functions
*/
#ifndef CRC__H
#define CRC__H
#include <stdlib.h> /* For size_t */
#include "sniptype.h" /* For BYTE, WORD, DWORD */
/*
** File: ARCCRC16.C
*/
void init_crc_table(void);
WORD crc_calc(WORD crc, char *buf, unsigned nbytes);
void do_file(char *fn);
/*
** File: CRC-16.C
*/
WORD crc16(char *data_p, WORD length);
/*
** File: CRC-16F.C
*/
WORD updcrc(WORD icrc, BYTE *icp, size_t icnt);
/*
** File: CRC_32.C
*/
#define UPDC32(octet,crc) (crc_32_tab[((crc)\
^ ((BYTE)octet)) & 0xff] ^ ((crc) >> 8))
DWORD updateCRC32(unsigned char ch, DWORD crc);
Boolean_T crc32file(char *name, DWORD *crc, long *charcnt);
DWORD crc32buf(char *buf, size_t len);
/*
** File: CHECKSUM.C
*/
unsigned checksum(void *buffer, size_t len, unsigned int seed);
/*
** File: CHECKEXE.C
*/
void checkexe(char *fname);
#endif /* CRC__H */
@@ -0,0 +1,188 @@
/* Crc - 32 BIT ANSI X3.66 CRC checksum files */
#include <stdio.h>
#include "crc.h"
#ifdef __TURBOC__
#pragma warn -cln
#endif
/**********************************************************************\
|* Demonstration program to compute the 32-bit CRC used as the frame *|
|* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 *|
|* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level *|
|* protocol). The 32-bit FCS was added via the Federal Register, *|
|* 1 June 1982, p.23798. I presume but don't know for certain that *|
|* this polynomial is or will be included in CCITT V.41, which *|
|* defines the 16-bit CRC (often called CRC-CCITT) polynomial. FIPS *|
|* PUB 78 says that the 32-bit FCS reduces otherwise undetected *|
|* errors by a factor of 10^-5 over 16-bit FCS. *|
\**********************************************************************/
/* Need an unsigned type capable of holding 32 bits; */
typedef DWORD UNS_32_BITS;
/* Copyright (C) 1986 Gary S. Brown. You may use this program, or
code or tables extracted from it, as desired without restriction.*/
/* First, the polynomial itself and its table of feedback terms. The */
/* polynomial is */
/* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */
/* Note that we take it "backwards" and put the highest-order term in */
/* the lowest-order bit. The X^32 term is "implied"; the LSB is the */
/* X^31 term, etc. The X^0 term (usually shown as "+1") results in */
/* the MSB being 1. */
/* Note that the usual hardware shift register implementation, which */
/* is what we're using (we're merely optimizing it by doing eight-bit */
/* chunks at a time) shifts bits into the lowest-order term. In our */
/* implementation, that means shifting towards the right. Why do we */
/* do it this way? Because the calculated CRC must be transmitted in */
/* order from highest-order term to lowest-order term. UARTs transmit */
/* characters in order from LSB to MSB. By storing the CRC this way, */
/* we hand it to the UART in the order low-byte to high-byte; the UART */
/* sends each low-bit to hight-bit; and the result is transmission bit */
/* by bit from highest- to lowest-order term without requiring any bit */
/* shuffling on our part. Reception works similarly. */
/* The feedback terms table consists of 256, 32-bit entries. Notes: */
/* */
/* 1. The table can be generated at runtime if desired; code to do so */
/* is shown later. It might not be obvious, but the feedback */
/* terms simply represent the results of eight shift/xor opera- */
/* tions for all combinations of data and CRC register values. */
/* */
/* 2. The CRC accumulation logic is the same for all CRC polynomials, */
/* be they sixteen or thirty-two bits wide. You simply choose the */
/* appropriate table. Alternatively, because the table can be */
/* generated at runtime, you can start by generating the table for */
/* the polynomial in question and use exactly the same "updcrc", */
/* if your application needn't simultaneously handle two CRC */
/* polynomials. (Note, however, that XMODEM is strange.) */
/* */
/* 3. For 16-bit CRCs, the table entries need be only 16 bits wide; */
/* of course, 32-bit entries work OK if the high 16 bits are zero. */
/* */
/* 4. The values must be right-shifted by eight bits by the "updcrc" */
/* logic; the shift must be unsigned (bring in zeroes). On some */
/* hardware you could probably optimize the shift in assembler by */
/* using byte-swap instructions. */
static UNS_32_BITS crc_32_tab[] = { /* CRC polynomial 0xedb88320 */
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};
DWORD updateCRC32(unsigned char ch, DWORD crc)
{
return UPDC32(ch, crc);
}
Boolean_T crc32file(char *name, DWORD *crc, long *charcnt)
{
FILE *fin;
register DWORD oldcrc32;
register int c;
oldcrc32 = 0xFFFFFFFF; *charcnt = 0;
#ifdef MSDOS
if ((fin=fopen(name, "rb"))==NULL)
#else
if ((fopen_s(&fin, name, "rb"))!=0) // modded for fopen_s to avoid enabling unsafe fopen
#endif
{
perror(name);
return Error_;
}
while ((c=getc(fin))!=EOF)
{
++*charcnt;
oldcrc32 = UPDC32(c, oldcrc32);
}
if (ferror(fin))
{
perror(name);
*charcnt = -1;
}
fclose(fin);
*crc = oldcrc32 = ~oldcrc32;
return Success_;
}
DWORD crc32buf(char *buf, size_t len)
{
register DWORD oldcrc32;
oldcrc32 = 0xFFFFFFFF;
for ( ; len; --len, ++buf)
{
oldcrc32 = UPDC32(*buf, oldcrc32);
}
return ~oldcrc32;
}
#ifdef TEST
main(int argc, char *argv[])
{
DWORD crc;
long charcnt;
register errors = 0;
while(--argc > 0)
{
errors |= crc32file(*++argv, &crc, &charcnt);
printf("%08lX %7ld %s\n", crc, charcnt, *argv);
}
return(errors != 0);
}
#endif /* TEST */
@@ -0,0 +1,81 @@
/*
** SNIPTYPE.H - Include file for SNIPPETS data types and commonly used macros
*/
#ifndef SNIPTYPE__H
#define SNIPTYPE__H
#include <stdlib.h> /* For free() */
#include <string.h> /* For NULL & strlen() */
typedef enum {Error_ = -1, Success_, False_ = 0, True_} Boolean_T;
#if defined(__unix__)
typedef unsigned char BYTE;
typedef unsigned long DWORD;
typedef unsigned short WORD;
#if !defined(FAR)
#define FAR
#endif
#if !defined(NEAR)
#define NEAR
#endif
#if !defined(HUGE)
#define HUGE
#endif
#if !defined(PASCAL)
#define PASCAL
#endif
#if !defined(CDECL)
#define CDECL
#endif
#if !defined(INTERRUPT)
#define INTERRUPT
#endif
#elif !defined(WIN32) && !defined(_WIN32) && !defined(__NT__) \
&& !defined(_WINDOWS)
#if !defined(OS2)
typedef unsigned char BYTE;
typedef unsigned long DWORD;
#endif
typedef unsigned short WORD;
#else
#define WIN32_LEAN_AND_MEAN
#define NOGDI
#define NOSERVICE
#undef INC_OLE1
#undef INC_OLE2
#include <windows.h>
#define HUGE
#endif
typedef union {
signed char c;
BYTE b;
} VAR8_;
typedef union {
VAR8_ v8[2];
signed short s;
WORD w;
} VAR16_;
typedef union {
VAR16_ v16[2];
signed long l;
DWORD dw;
float f;
void *p;
} VAR32_;
typedef union {
VAR32_ v32[2];
double d;
} VAR64_;
#define NUL '\0'
#define LAST_CHAR(s) (((char *)s)[strlen(s) - 1])
#define TOBOOL(x) (!(!(x)))
#define FREE(p) (free(p),(p)=NULL)
#endif /* SNIPTYPE__H */
@@ -2,6 +2,15 @@
#include "glStuff.h"
#include <PluginConfigApi.h>
extern "C" {
// well, only good for 64 bit now, ont that is matters lol
#define SIZEOF_SIZE_T 8
#define SIZEOF_UNSIGNED_LONG_LONG 8
#include <xdelta3.h>
#include <xdelta3.c>
#include "crc/crc.h"
}
// upload to the SSBO instead after processing
// two versions because apparently TexSubImage can cause major stuttering
@@ -185,6 +194,185 @@ void h_glutSetCursor(int cursor)
glutSetCursor(cursor);
}
int64_t hookedGetFileSize(MsString* path) {
// store original size for use later or to return in case of error
int64_t ogsize = divaGetFileSize(path);
std::string pathStr = std::string(path->GetCharBuf());
static std::string shdfarc = "shader.farc";
// identify whether current file is shader or not
bool fileIsShader = false;
if (pathStr.length() >= shdfarc.length())
{
fileIsShader = (0 == pathStr.compare(pathStr.length() - shdfarc.length(), shdfarc.length(), shdfarc));
}
if (!fileIsShader)
{
return ogsize;
}
// reset some stuff when reprocessing shader farc (should never happen)
if (shader_farc_data) {
free(shader_farc_data);
shader_farc_data = NULL;
shader_farc_data_size = 0;
shader_farc_path = "";
shader_file_handle = NULL;
}
// local vars declared early to allow use of goto
FILE* ogfile;
void* ogdata = NULL;
DWORD crc;
wchar_t crcstr[9];
std::wstring vcd_path;
DWORD dwAttrib;
FILE* vcdfile;
long vcdsize;
void* vcddata = NULL;
void* outbuf = NULL;
usize_t outbuf_size;
usize_t outbuf_data_size;
int xd3err;
// if shader, open it and read data
//if (fopen_s(&ogfile, path->GetCharBuf(), "rb") != 0)
ogfile = divaFsopen(path->GetCharBuf(), "rb", _SH_DENYNO);
if (ogfile == nullptr)
{
MessageBoxW(NULL, L"Error opening shader.farc.", L"Novidia", NULL);
goto fail;
}
ogdata = malloc(ogsize);
//if (fread(ogdata, 1, ogsize, ogfile) != ogsize)
if (divaFread(ogdata, 1, ogsize, ogfile) != ogsize)
{
MessageBoxW(NULL, L"Error reading shader.farc.", L"Novidia", NULL);
goto fail;
}
//fclose(ogfile);
divaFclose(ogfile); // need to use diva's fclose if using diva's fsopen and fread
// crc32 the shader data to find a vcdiff patch file
crc = crc32buf((char*)ogdata, ogsize);
swprintf_s(crcstr, L"%08x", crc);
//MessageBoxW(NULL, crcstr, L"Novidia", NULL);
vcd_path = DirPath() + L"\\plugins\\Novidia Shaders\\" + crcstr + L".vcdiff";
dwAttrib = GetFileAttributesW(vcd_path.c_str());
if (dwAttrib == INVALID_FILE_ATTRIBUTES || (dwAttrib & FILE_ATTRIBUTE_DIRECTORY))
{
MessageBoxW(NULL, L"Unable to find shader vcdiff file.", L"Novidia", NULL);
MessageBoxW(NULL, vcd_path.c_str(), L"Novidia", NULL);
goto fail;
}
// try opening and reading said vcdiff patch
if (_wfopen_s(&vcdfile, vcd_path.c_str(), L"rb") != 0)
{
MessageBoxW(NULL, L"Error opening shader vcdiff file.", L"Novidia", NULL);
MessageBoxW(NULL, vcd_path.c_str(), L"Novidia", NULL);
goto fail;
}
// get size of the file from having already opened it, skipping whatever the game does
fseek(vcdfile, 0, SEEK_END); // seek to end of file
vcdsize = ftell(vcdfile); // get current file pointer
fseek(vcdfile, 0, SEEK_SET); // seek back to beginning of file
vcddata = malloc(vcdsize);
if (fread(vcddata, 1, vcdsize, vcdfile) != vcdsize)
{
MessageBoxW(NULL, L"Error reading shader vcdiff file.", L"Novidia", NULL);
MessageBoxW(NULL, vcd_path.c_str(), L"Novidia", NULL);
goto fail;
}
fclose(vcdfile);
// allocate an output buffer and patch shader into it (needs to be done now to know correct size)
outbuf_size = 64 * 1024 * 1024; // 64M should be enough
outbuf = malloc(outbuf_size);
outbuf_data_size;
xd3err = xd3_decode_memory((uint8_t*)vcddata, vcdsize, (uint8_t*)ogdata, ogsize, (uint8_t*)outbuf, &outbuf_data_size, outbuf_size, 0);
if (xd3err != 0)
{
MessageBoxW(NULL, L"Error applying shader vcdiff file.", L"Novidia", NULL);
MessageBoxA(NULL, xd3_strerror(xd3err), "Novidia", NULL);
goto fail;
}
wprintf(L"[Novidia] Patched shader.farc using %s.vcdiff\n", crcstr);
// done successfully! cleanup and save results
free(ogdata);
free(vcddata);
shader_farc_data = outbuf;
shader_farc_data_size = outbuf_data_size;
shader_farc_path = pathStr;
return outbuf_data_size;
fail:
if (ogdata) free(ogdata);
if (vcddata) free(vcddata);
if (outbuf) free(outbuf);
return ogsize;
}
FILE* hookedFsopen(const char* path, const char* mode, int shflag)
{
FILE* res = divaFsopen(path, mode, shflag);
if (strcmp(path, shader_farc_path.c_str()) == 0)
{
shader_file_handle = res;
}
return res;
}
int64_t hookedFread(void* dst, int64_t size, int64_t count, FILE* file)
{
if (file != shader_file_handle)
{
return divaFread(dst, size, count, file);
}
size_t size_bytes = size * count;
if ((size_bytes > shader_farc_data_size) || !shader_farc_data)
{
return divaFread(dst, size, count, file); // this is an error -- the game wants more data than we have for some reason, or size has a value but not our buffer
}
memcpy(dst, shader_farc_data, size_bytes);
shader_file_handle = NULL; // easy way to avoid risk of unexpected reuse
// optionally, could free the stored farc data here, but it only uses 64MB so why bother?
/*
free(shader_farc_data); // no longer need to keep this around so free it and save the RAM
shader_farc_data = NULL; // clear associated data too, because there's no longer a processed shader
shader_farc_data_size = 0;
shader_farc_path = "";
*/
printf("[Novidia] Shader patch applied\n");
return size_bytes;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
@@ -215,13 +403,25 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv
DetourAttach(&(PVOID&)uploadModelTransformBuf, h_uploadModelTransformBuf_NoUpload);
}
if (enable_shader_deltas)
{
printf("[Novidia] Hooking divaGetFileSize\n");
DetourAttach(&(PVOID&)divaGetFileSize, hookedGetFileSize);
printf("[Novidia] Hooking divaFsopen\n");
DetourAttach(&(PVOID&)divaFsopen, hookedFsopen);
printf("[Novidia] Hooking divaFread\n");
DetourAttach(&(PVOID&)divaFread, hookedFread);
}
DetourTransactionCommit();
/*
if (shader_amd_farc)
{
const char* shaderpath = "./rom/shader_amd.farc";
InjectCode((void*)0x140a41018, std::vector<uint8_t>(shaderpath, shaderpath + strlen(shaderpath)));
}
*/
}
return TRUE;
@@ -235,7 +435,7 @@ PluginConfigOption config[] = {
{ CONFIG_BOOLEAN, new PluginConfigBooleanData{ L"enable_chara_skinning", L"general", CONFIG_FILE, L"Enable Chara Skinning", L"If you really need to get extra performance, you can disable uploading skinning data. (character models will disappear)", true, false } },
{ CONFIG_BOOLEAN, new PluginConfigBooleanData{ L"use_TexSubImage", L"general", CONFIG_FILE, L"Use glTexSubImage", L"glTexSubImage should offer higher performance, but stuttering has been reported when it is used.\nTry disabling this if you have issues.", true, false } },
{ CONFIG_BOOLEAN, new PluginConfigBooleanData{ L"force_BGRA_upload", L"general", CONFIG_FILE, L"Force BGRA Texture Uploads", L"BGRA format uploads seem to run faster (on some hardware), but drivers may suggest RGBA instead.\nUsing this forces uploads to use the BGRA format.\n\nDisabling this may decrease or improve performance.", true, false } },
{ CONFIG_BOOLEAN, new PluginConfigBooleanData{ L"shader_amd_farc", L"general", CONFIG_FILE, L"Load shader_amd.farc", L"Novidia can manage loading of alternate shaders automatically.\nLeave this enabled for current and future versions of AMDPack.", true, false } },
{ CONFIG_BOOLEAN, new PluginConfigBooleanData{ L"shader_delta_patches", L"general", CONFIG_FILE, L"Apply shader vcdiff patches", L"Novidia can automatically apply pre-generated delta patch files to shaders.\nLeave this enabled for current and future versions of AMDPack.", true, false } },
};
extern "C" __declspec(dllexport) LPCWSTR GetPluginName(void)
@@ -28,7 +28,48 @@ bool enable_chara_skinning;
bool use_TexSubImage;
bool force_BGRA_upload;
GLint tex_upload_format;
bool shader_amd_farc;
struct MsString {
union {
char* string_ptr;
char string_buf[16];
};
uint64_t len;
uint64_t bufsize;
char* GetCharBuf()
{
if (bufsize > 0xf && string_ptr != nullptr)
return string_ptr;
else
return string_buf;
};
void SetCharBuf(char* newcontent)
{
len = strlen(newcontent);
bufsize = len;
if (len > 0xf)
{
string_ptr = _strdup(newcontent);
}
else
{
strcpy_s(string_buf, newcontent);
}
}
};
std::string shader_farc_path = "";
void* shader_farc_data = NULL;
int64_t shader_farc_data_size;
FILE* shader_file_handle = NULL;
bool enable_shader_deltas;
int64_t(*divaGetFileSize)(MsString* path) = (int64_t(*)(MsString* path))0x1400abb20;
FILE* (*divaFsopen)(const char* path, const char* mode, int shflag) = (FILE* (*)(const char* path, const char* mode, int shflag))0x14085a17c;
int64_t(*divaFread)(void* dst, int64_t size, int64_t count, FILE* file) = (int64_t(*)(void* dst, int64_t size, int64_t count, FILE* file))0x14085a6c4;
int(*divaFclose)(FILE* file) = (int(*)(FILE* file))0x140846e9c; // not hooked, just so it can be called
std::wstring ExePath() {
WCHAR buffer[MAX_PATH];
@@ -51,7 +92,13 @@ void loadConfig()
enable_chara_skinning = GetPrivateProfileIntW(L"general", L"enable_chara_skinning", 1, CONFIG_FILE) > 0 ? true : false;
use_TexSubImage = GetPrivateProfileIntW(L"general", L"use_TexSubImage", 1, CONFIG_FILE) > 0 ? true : false;
force_BGRA_upload = GetPrivateProfileIntW(L"general", L"force_BGRA_upload", 1, CONFIG_FILE) > 0 ? true : false;
shader_amd_farc = GetPrivateProfileIntW(L"general", L"shader_amd_farc", 1, CONFIG_FILE) > 0 ? true : false;
enable_shader_deltas = GetPrivateProfileIntW(L"general", L"shader_delta_patches", 1, CONFIG_FILE) > 0 ? true : false;
if (GetPrivateProfileIntW(L"general", L"shader_amd_farc", 0, CONFIG_FILE) > 0)
{
MessageBoxA(NULL, "Attention: Use of shader_amd.farc has been discontinued and will no longer work. MAMD mdata is not required and can be deleted.\n\nIf you use modded shaders, amd-tools has been updated so it can generate new patches. Please check the readme for more information.", "Novidia", 0);
WritePrivateProfileStringW(L"general", L"shader_amd_farc", L"0", CONFIG_FILE);
}
}