Remove hacky way of injecting PS2 matfx on RW 3.3, remove static patcher
This commit is contained in:
parent
d596f979aa
commit
7d51995640
@ -2538,7 +2538,7 @@ cAudioManager::ProcessBoatMovingOverWater(cVehicleParams *params)
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
velocityChange = Min(0.75f, velocityChange);
|
velocityChange = Min(0.75f, velocityChange);
|
||||||
multiplier = (velocityChange - 0.0005f) * 1.3342229f;
|
multiplier = (velocityChange - 0.0005f) / (1499.0f / 2000.0f);
|
||||||
CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
|
CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
|
||||||
vol = (30.f * multiplier);
|
vol = (30.f * multiplier);
|
||||||
m_sQueueSample.m_nVolume = ComputeVolume(vol, 50.f, m_sQueueSample.m_fDistance);
|
m_sQueueSample.m_nVolume = ComputeVolume(vol, 50.f, m_sQueueSample.m_fDistance);
|
||||||
|
@ -149,6 +149,10 @@ CGame::InitialiseOnceBeforeRW(void)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(LIBRW) && defined(PS2_MATFX)
|
||||||
|
void ReplaceMatFxCallback();
|
||||||
|
#endif
|
||||||
|
|
||||||
bool
|
bool
|
||||||
CGame::InitialiseRenderWare(void)
|
CGame::InitialiseRenderWare(void)
|
||||||
{
|
{
|
||||||
@ -199,6 +203,8 @@ CGame::InitialiseRenderWare(void)
|
|||||||
#else
|
#else
|
||||||
rw::MatFX::modulateEnvMap = false;
|
rw::MatFX::modulateEnvMap = false;
|
||||||
#endif
|
#endif
|
||||||
|
#elif defined(PS2_MATFX)
|
||||||
|
ReplaceMatFxCallback();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CFont::Initialise();
|
CFont::Initialise();
|
||||||
|
@ -1,94 +0,0 @@
|
|||||||
#define WITHWINDOWS
|
|
||||||
#include "common.h"
|
|
||||||
#include "patcher.h"
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
StaticPatcher *StaticPatcher::ms_head;
|
|
||||||
|
|
||||||
StaticPatcher::StaticPatcher(Patcher func)
|
|
||||||
: m_func(func)
|
|
||||||
{
|
|
||||||
m_next = ms_head;
|
|
||||||
ms_head = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
StaticPatcher::Apply()
|
|
||||||
{
|
|
||||||
StaticPatcher *current = ms_head;
|
|
||||||
while(current){
|
|
||||||
current->Run();
|
|
||||||
current = current->m_next;
|
|
||||||
}
|
|
||||||
ms_head = nil;
|
|
||||||
}
|
|
||||||
#ifdef _WIN32
|
|
||||||
std::vector<uint32> usedAddresses;
|
|
||||||
|
|
||||||
static DWORD protect[2];
|
|
||||||
static uint32 protect_address;
|
|
||||||
static uint32 protect_size;
|
|
||||||
|
|
||||||
void
|
|
||||||
Protect_internal(uint32 address, uint32 size)
|
|
||||||
{
|
|
||||||
protect_address = address;
|
|
||||||
protect_size = size;
|
|
||||||
VirtualProtect((void*)address, size, PAGE_EXECUTE_READWRITE, &protect[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Unprotect_internal(void)
|
|
||||||
{
|
|
||||||
VirtualProtect((void*)protect_address, protect_size, protect[0], &protect[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
InjectHook_internal(uint32 address, uint32 hook, int type)
|
|
||||||
{
|
|
||||||
if(std::any_of(usedAddresses.begin(), usedAddresses.end(),
|
|
||||||
[address](uint32 value) { return value == address; })) {
|
|
||||||
debug("Used address %#06x twice when injecting hook\n", address);
|
|
||||||
}
|
|
||||||
|
|
||||||
usedAddresses.push_back(address);
|
|
||||||
|
|
||||||
|
|
||||||
switch(type){
|
|
||||||
case PATCH_JUMP:
|
|
||||||
VirtualProtect((void*)address, 5, PAGE_EXECUTE_READWRITE, &protect[0]);
|
|
||||||
*(uint8*)address = 0xE9;
|
|
||||||
break;
|
|
||||||
case PATCH_CALL:
|
|
||||||
VirtualProtect((void*)address, 5, PAGE_EXECUTE_READWRITE, &protect[0]);
|
|
||||||
*(uint8*)address = 0xE8;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
VirtualProtect((void*)(address + 1), 4, PAGE_EXECUTE_READWRITE, &protect[0]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
*(ptrdiff_t*)(address + 1) = hook - address - 5;
|
|
||||||
if(type == PATCH_NOTHING)
|
|
||||||
VirtualProtect((void*)(address + 1), 4, protect[0], &protect[1]);
|
|
||||||
else
|
|
||||||
VirtualProtect((void*)address, 5, protect[0], &protect[1]);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
void
|
|
||||||
Protect_internal(uint32 address, uint32 size)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Unprotect_internal(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
InjectHook_internal(uint32 address, uint32 hook, int type)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#endif
|
|
@ -1,144 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#define WRAPPER __declspec(naked)
|
|
||||||
#define DEPRECATED __declspec(deprecated)
|
|
||||||
#define EAXJMP(a) { _asm mov eax, a _asm jmp eax }
|
|
||||||
#define VARJMP(a) { _asm jmp a }
|
|
||||||
#define WRAPARG(a) UNREFERENCED_PARAMETER(a)
|
|
||||||
|
|
||||||
#include <string.h> //memset
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
PATCH_CALL,
|
|
||||||
PATCH_JUMP,
|
|
||||||
PATCH_NOTHING,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
III_10 = 1,
|
|
||||||
III_11,
|
|
||||||
III_STEAM,
|
|
||||||
VC_10,
|
|
||||||
VC_11,
|
|
||||||
VC_STEAM
|
|
||||||
};
|
|
||||||
|
|
||||||
extern int gtaversion;
|
|
||||||
|
|
||||||
class StaticPatcher
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
using Patcher = void(*)();
|
|
||||||
|
|
||||||
Patcher m_func;
|
|
||||||
StaticPatcher *m_next;
|
|
||||||
static StaticPatcher *ms_head;
|
|
||||||
|
|
||||||
void Run() { m_func(); }
|
|
||||||
public:
|
|
||||||
StaticPatcher(Patcher func);
|
|
||||||
static void Apply();
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
inline T AddressByVersion(uint32_t addressIII10, uint32_t addressIII11, uint32_t addressIIISteam, uint32_t addressvc10, uint32_t addressvc11, uint32_t addressvcSteam)
|
|
||||||
{
|
|
||||||
if(gtaversion == -1){
|
|
||||||
if(*(uint32_t*)0x5C1E75 == 0xB85548EC) gtaversion = III_10;
|
|
||||||
else if(*(uint32_t*)0x5C2135 == 0xB85548EC) gtaversion = III_11;
|
|
||||||
else if(*(uint32_t*)0x5C6FD5 == 0xB85548EC) gtaversion = III_STEAM;
|
|
||||||
else if(*(uint32_t*)0x667BF5 == 0xB85548EC) gtaversion = VC_10;
|
|
||||||
else if(*(uint32_t*)0x667C45 == 0xB85548EC) gtaversion = VC_11;
|
|
||||||
else if(*(uint32_t*)0x666BA5 == 0xB85548EC) gtaversion = VC_STEAM;
|
|
||||||
else gtaversion = 0;
|
|
||||||
}
|
|
||||||
switch(gtaversion){
|
|
||||||
case III_10:
|
|
||||||
return (T)addressIII10;
|
|
||||||
case III_11:
|
|
||||||
return (T)addressIII11;
|
|
||||||
case III_STEAM:
|
|
||||||
return (T)addressIIISteam;
|
|
||||||
case VC_10:
|
|
||||||
return (T)addressvc10;
|
|
||||||
case VC_11:
|
|
||||||
return (T)addressvc11;
|
|
||||||
case VC_STEAM:
|
|
||||||
return (T)addressvcSteam;
|
|
||||||
default:
|
|
||||||
return (T)0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool
|
|
||||||
is10(void)
|
|
||||||
{
|
|
||||||
return gtaversion == III_10 || gtaversion == VC_10;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool
|
|
||||||
isIII(void)
|
|
||||||
{
|
|
||||||
return gtaversion >= III_10 && gtaversion <= III_STEAM;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool
|
|
||||||
isVC(void)
|
|
||||||
{
|
|
||||||
return gtaversion >= VC_10 && gtaversion <= VC_STEAM;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define PTRFROMCALL(addr) (uint32_t)(*(uint32_t*)((uint32_t)addr+1) + (uint32_t)addr + 5)
|
|
||||||
#define INTERCEPT(saved, func, a) \
|
|
||||||
{ \
|
|
||||||
saved = PTRFROMCALL(a); \
|
|
||||||
InjectHook(a, func); \
|
|
||||||
}
|
|
||||||
|
|
||||||
void InjectHook_internal(uint32 address, uint32 hook, int type);
|
|
||||||
void Protect_internal(uint32 address, uint32 size);
|
|
||||||
void Unprotect_internal(void);
|
|
||||||
|
|
||||||
template<typename T, typename AT> inline void
|
|
||||||
Patch(AT address, T value)
|
|
||||||
{
|
|
||||||
Protect_internal((uint32)address, sizeof(T));
|
|
||||||
*(T*)address = value;
|
|
||||||
Unprotect_internal();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename AT> inline void
|
|
||||||
Nop(AT address, unsigned int nCount)
|
|
||||||
{
|
|
||||||
Protect_internal((uint32)address, nCount);
|
|
||||||
memset((void*)address, 0x90, nCount);
|
|
||||||
Unprotect_internal();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T> inline void
|
|
||||||
InjectHook(uintptr_t address, T hook, unsigned int nType = PATCH_NOTHING)
|
|
||||||
{
|
|
||||||
InjectHook_internal(address, reinterpret_cast<uintptr_t>((void *&)hook), nType);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void ExtractCall(void *dst, uint32_t a)
|
|
||||||
{
|
|
||||||
*(uint32_t*)dst = (uint32_t)(*(uint32_t*)(a+1) + a + 5);
|
|
||||||
}
|
|
||||||
template<typename T>
|
|
||||||
inline void InterceptCall(void *dst, T func, uint32_t a)
|
|
||||||
{
|
|
||||||
ExtractCall(dst, a);
|
|
||||||
InjectHook(a, func);
|
|
||||||
}
|
|
||||||
template<typename T>
|
|
||||||
inline void InterceptVmethod(void *dst, T func, uint32_t a)
|
|
||||||
{
|
|
||||||
*(uint32_t*)dst = *(uint32_t*)a;
|
|
||||||
Patch(a, func);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define STARTPATCHES static StaticPatcher Patcher([](){
|
|
||||||
#define ENDPATCHES });
|
|
@ -2,7 +2,6 @@
|
|||||||
#define WITHWINDOWS
|
#define WITHWINDOWS
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "crossplatform.h"
|
#include "crossplatform.h"
|
||||||
#include "patcher.h"
|
|
||||||
#include "Renderer.h"
|
#include "Renderer.h"
|
||||||
#include "Credits.h"
|
#include "Credits.h"
|
||||||
#include "Camera.h"
|
#include "Camera.h"
|
||||||
|
@ -2,9 +2,8 @@
|
|||||||
|
|
||||||
#define WITHD3D
|
#define WITHD3D
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#ifdef RWLIBS
|
#include "rwcore.h"
|
||||||
#include "patcher.h"
|
#include "rpmatfx.h"
|
||||||
#endif
|
|
||||||
|
|
||||||
struct MatFXNothing { int pad[5]; int effect; };
|
struct MatFXNothing { int pad[5]; int effect; };
|
||||||
|
|
||||||
@ -47,16 +46,16 @@ struct MatFX
|
|||||||
int effects;
|
int effects;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef RWLIBS
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
extern int MatFXMaterialDataOffset;
|
extern int MatFXMaterialDataOffset;
|
||||||
extern int MatFXAtomicDataOffset;
|
extern int MatFXAtomicDataOffset;
|
||||||
|
|
||||||
void _rpMatFXD3D8AtomicMatFXEnvRender(RxD3D8InstanceData* inst, int flags, int sel, RwTexture* texture, RwTexture* envMap);
|
void _rpMatFXD3D8AtomicMatFXEnvRender(RxD3D8InstanceData* inst, int flags, int sel, RwTexture* texture, RwTexture* envMap);
|
||||||
|
void _rpMatFXD3D8AtomicMatFXRenderBlack(RxD3D8InstanceData *inst);
|
||||||
|
void _rpMatFXD3D8AtomicMatFXBumpMapRender(RxD3D8InstanceData *inst, int flags, RwTexture *texture, RwTexture *bumpMap, RwTexture *envMap);
|
||||||
|
void _rpMatFXD3D8AtomicMatFXDualPassRender(RxD3D8InstanceData *inst, int flags, RwTexture *texture, RwTexture *dualTexture);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
int &MatFXMaterialDataOffset = *(int*)0x66188C;
|
|
||||||
int &MatFXAtomicDataOffset = *(int*)0x66189C;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PS2_MATFX
|
#ifdef PS2_MATFX
|
||||||
|
|
||||||
@ -218,12 +217,96 @@ _rpMatFXD3D8AtomicMatFXEnvRender_ps2(RxD3D8InstanceData *inst, int flags, int se
|
|||||||
RwD3D8SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
|
RwD3D8SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef RWLIBS
|
void
|
||||||
STARTPATCHES
|
_rwD3D8EnableClippingIfNeeded(void *object, RwUInt8 type)
|
||||||
InjectHook((uintptr)&_rpMatFXD3D8AtomicMatFXEnvRender, _rpMatFXD3D8AtomicMatFXEnvRender_ps2, PATCH_JUMP);
|
{
|
||||||
ENDPATCHES
|
int clip;
|
||||||
#endif
|
if (type == rpATOMIC)
|
||||||
|
clip = !RwD3D8CameraIsSphereFullyInsideFrustum(RwCameraGetCurrentCameraMacro(), RpAtomicGetWorldBoundingSphere((RpAtomic *)object));
|
||||||
|
else
|
||||||
|
clip = !RwD3D8CameraIsBBoxFullyInsideFrustum(RwCameraGetCurrentCameraMacro(), &((RpWorldSector *)object)->tightBoundingBox);
|
||||||
|
RwD3D8SetRenderState(D3DRS_CLIPPING, clip);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
void
|
||||||
|
_rwD3D8AtomicMatFXRenderCallback(RwResEntry *repEntry, void *object, RwUInt8 type, RwUInt32 flags)
|
||||||
|
{
|
||||||
|
RwBool lighting;
|
||||||
|
RwBool forceBlack;
|
||||||
|
RxD3D8ResEntryHeader *header;
|
||||||
|
RxD3D8InstanceData *inst;
|
||||||
|
RwInt32 i;
|
||||||
|
|
||||||
#endif
|
if (flags & rpGEOMETRYPRELIT) {
|
||||||
|
RwD3D8SetRenderState(D3DRS_COLORVERTEX, 1);
|
||||||
|
RwD3D8SetRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_COLOR1);
|
||||||
|
} else {
|
||||||
|
RwD3D8SetRenderState(D3DRS_COLORVERTEX, 0);
|
||||||
|
RwD3D8SetRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
_rwD3D8EnableClippingIfNeeded(object, type);
|
||||||
|
|
||||||
|
RwD3D8GetRenderState(D3DRS_LIGHTING, &lighting);
|
||||||
|
if (lighting || flags & rpGEOMETRYPRELIT) {
|
||||||
|
forceBlack = FALSE;
|
||||||
|
} else {
|
||||||
|
forceBlack = TRUE;
|
||||||
|
RwD3D8SetTexture(nil, 0);
|
||||||
|
RwD3D8SetRenderState(D3DRS_TEXTUREFACTOR, D3DCOLOR_RGBA(0, 0, 0, 255));
|
||||||
|
RwD3D8SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
|
||||||
|
RwD3D8SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TFACTOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
header = (RxD3D8ResEntryHeader *)(repEntry + 1);
|
||||||
|
inst = (RxD3D8InstanceData *)(header + 1);
|
||||||
|
for (i = 0; i < header->numMeshes; i++) {
|
||||||
|
if (forceBlack)
|
||||||
|
_rpMatFXD3D8AtomicMatFXRenderBlack(inst);
|
||||||
|
else {
|
||||||
|
if (lighting)
|
||||||
|
RwD3D8SetSurfaceProperties(&inst->material->color, &inst->material->surfaceProps, flags & rpGEOMETRYMODULATEMATERIALCOLOR);
|
||||||
|
MatFX *matfx = *RWPLUGINOFFSET(MatFX *, inst->material, MatFXMaterialDataOffset);
|
||||||
|
int effect = matfx ? matfx->effects : rpMATFXEFFECTNULL;
|
||||||
|
switch (effect) {
|
||||||
|
case rpMATFXEFFECTNULL:
|
||||||
|
default:
|
||||||
|
_rpMatFXD3D8AtomicMatFXDefaultRender(inst, flags, inst->material->texture);
|
||||||
|
break;
|
||||||
|
case rpMATFXEFFECTBUMPMAP:
|
||||||
|
_rpMatFXD3D8AtomicMatFXBumpMapRender(inst, flags, inst->material->texture, matfx->fx[0].b.bumpedTex, nil);
|
||||||
|
break;
|
||||||
|
case rpMATFXEFFECTENVMAP:
|
||||||
|
{
|
||||||
|
// TODO: matfx switch in the settings
|
||||||
|
//_rpMatFXD3D8AtomicMatFXEnvRender(inst, flags, 0, inst->material->texture, matfx->fx[0].e.envTex);
|
||||||
|
_rpMatFXD3D8AtomicMatFXEnvRender_ps2(inst, flags, 0, inst->material->texture, matfx->fx[0].e.envTex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case rpMATFXEFFECTBUMPENVMAP:
|
||||||
|
_rpMatFXD3D8AtomicMatFXBumpMapRender(inst, flags, inst->material->texture, matfx->fx[0].b.bumpedTex, matfx->fx[1].e.envTex);
|
||||||
|
break;
|
||||||
|
case rpMATFXEFFECTDUAL:
|
||||||
|
_rpMatFXD3D8AtomicMatFXDualPassRender(inst, flags, inst->material->texture, matfx->fx[0].d.dualTex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inst++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (forceBlack) {
|
||||||
|
RwD3D8SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
|
||||||
|
RwD3D8SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ReplaceMatFxCallback()
|
||||||
|
{
|
||||||
|
RxD3D8AllInOneSetRenderCallBack(
|
||||||
|
RxPipelineFindNodeByName(RpMatFXGetD3D8Pipeline(rpMATFXD3D8ATOMICPIPELINE), RxNodeDefinitionGetD3D8AtomicAllInOne()->name, nil, nil),
|
||||||
|
_rwD3D8AtomicMatFXRenderCallback);
|
||||||
|
}
|
||||||
|
#endif // PS2_MATFX
|
||||||
|
|
||||||
|
#endif // !LIBRW
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
#include "crossplatform.h"
|
#include "crossplatform.h"
|
||||||
|
|
||||||
#include "patcher.h"
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "FileMgr.h"
|
#include "FileMgr.h"
|
||||||
#include "Text.h"
|
#include "Text.h"
|
||||||
@ -1378,7 +1377,6 @@ main(int argc, char *argv[])
|
|||||||
#endif
|
#endif
|
||||||
RwV2d pos;
|
RwV2d pos;
|
||||||
RwInt32 i;
|
RwInt32 i;
|
||||||
// StaticPatcher::Apply();
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
struct sigaction act;
|
struct sigaction act;
|
||||||
|
@ -76,7 +76,6 @@ static psGlobalType PsGlobal;
|
|||||||
{debug(TEXT("FAILED(hr=0x%x) in ") TEXT(#x) TEXT("\n"), hr); return;}
|
{debug(TEXT("FAILED(hr=0x%x) in ") TEXT(#x) TEXT("\n"), hr); return;}
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "patcher.h"
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "FileMgr.h"
|
#include "FileMgr.h"
|
||||||
#include "Text.h"
|
#include "Text.h"
|
||||||
@ -1926,7 +1925,6 @@ WinMain(HINSTANCE instance,
|
|||||||
RwV2d pos;
|
RwV2d pos;
|
||||||
RwInt32 argc, i;
|
RwInt32 argc, i;
|
||||||
RwChar **argv;
|
RwChar **argv;
|
||||||
StaticPatcher::Apply();
|
|
||||||
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, nil, SPIF_SENDCHANGE);
|
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, nil, SPIF_SENDCHANGE);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
Loading…
Reference in New Issue
Block a user