Added missing functions from the source library ddraw.dll to export from sfall (from Mr.Stalin)

Simplified the code in ExtraSaveSlots.cpp.
This commit is contained in:
NovaRain
2018-10-23 11:45:38 +08:00
parent 134dc03dc9
commit 3203152ca4
7 changed files with 195 additions and 36 deletions
+8 -15
View File
@@ -125,11 +125,8 @@ void SetPageNum() {
unsigned int TxtWidth = 0;
DWORD NewTick = 0, OldTick = 0;
int button = 0;
int exitFlag = 0;
char blip = '_';
char Number[5];
int numpos = 0;
int button = 0, exitFlag = 0, numpos = 0;
char Number[5], blip = '_';
DWORD tempPageOffset = -1;
@@ -349,13 +346,11 @@ static void __declspec(naked) AddPageOffset01(void) {
// getting info for the 10 currently displayed save slots from save.dats
static void __declspec(naked) AddPageOffset02(void) {
__asm {
pop edx // pop ret addr
mov eax, 0x50A514 // ASCII "SAVE.DAT"
push eax
lea eax, dword ptr ds:[ebx+1]
add eax, LSPageOffset // add page num offset
push edx // push ret addr
ret
push 0x50A514; // ASCII "SAVE.DAT"
lea eax, [ebx + 1];
add eax, LSPageOffset; // add page num offset
mov edx, 0x47E5E9; // ret addr
jmp edx;
}
}
@@ -397,9 +392,7 @@ void EnableSuperSaving() {
0x4808D3
});
MakeCalls(AddPageOffset02, {0x47E5E1});
SafeWrite16(0x47E5E6, 0x9090);
SafeWrite8(0x47E5E8, 0x90);
MakeJump(0x47E5E1, AddPageOffset02);
MakeCalls(AddPageOffset03, {0x47E756});
}
+4 -6
View File
@@ -11,7 +11,6 @@ namespace sfall
{
static DWORD __fastcall BarterPriceHook_Script(register fo::GameObject* source, register fo::GameObject* target, DWORD callAddr) {
int computeCost = fo::func::barter_compute_value(source, target);
BeginHook();
@@ -253,7 +252,7 @@ static void __declspec(naked) CarTravelHack() {
}
}
static void __fastcall GlobalVarHook_Script(DWORD number, int value) {
static void __fastcall GlobalVarHook_Script(register DWORD number, register int value) {
int old = fo::var::game_global_vars[number];
BeginHook();
@@ -274,12 +273,12 @@ static void __fastcall GlobalVarHook_Script(DWORD number, int value) {
static void __declspec(naked) SetGlobalVarHook() {
__asm {
pushad;
mov ecx, eax; // number
mov ecx, eax; // number
call GlobalVarHook_Script; // edx - value
popad;
cmp cRet, 1;
cmp cRet, 1;
cmovnb edx, dword ptr rets[0];
jmp fo::funcoffs::game_set_global_var_;
jmp fo::funcoffs::game_set_global_var_;
}
}
@@ -345,7 +344,6 @@ skip:
}
static int __fastcall ExplosiveTimerHook_Script(DWORD type, DWORD item, DWORD time) {
BeginHook();
argCount = 3;
+2 -4
View File
@@ -304,8 +304,7 @@ skip:
}
}
static DWORD __fastcall ActionButtons(register DWORD key)
{
static DWORD __fastcall ActionButtons(register DWORD key) {
buttonsPressed = false;
if (key == 0x300) { // up
if (curent_quest_page == 0) return -1;
@@ -329,8 +328,7 @@ static DWORD __fastcall ActionButtons(register DWORD key)
return -1;
}
static void __declspec(naked) pipboy_hack_action()
{
static void __declspec(naked) pipboy_hack_action() {
__asm {
test calledflag, 0xFF;
jz skip;
+86 -6
View File
@@ -18,16 +18,96 @@
#include "main.h"
extern ddrawDll ddraw;
typedef HRESULT (_stdcall *DDrawCreateProc)(void* a, void* b, void* c);
HRESULT _stdcall FakeDirectDrawCreate(void* a, void* b, void* c) {
char path[MAX_PATH];
GetSystemDirectoryA(path, MAX_PATH);
strcat_s(path, "\\ddraw.dll");
HMODULE ddraw = LoadLibraryA(path);
if (!ddraw || ddraw == INVALID_HANDLE_VALUE) return -1;
DDrawCreateProc proc = (DDrawCreateProc)GetProcAddress(ddraw, "DirectDrawCreate");
DDrawCreateProc proc = (DDrawCreateProc)ddraw.DirectDrawCreate;
if (!proc) return -1;
return proc(a, b, c);
}
__declspec(naked) void FakeAcquireDDThreadLock() {
_asm jmp [ddraw.AcquireDDThreadLock];
}
__declspec(naked) void FakeCheckFullscreen() {
_asm jmp [ddraw.CheckFullscreen];
}
__declspec(naked) void FakeCompleteCreateSysmemSurface() {
_asm jmp [ddraw.CompleteCreateSysmemSurface];
}
__declspec(naked) void FakeD3DParseUnknownCommand() {
_asm jmp [ddraw.D3DParseUnknownCommand];
}
__declspec(naked) void FakeDDGetAttachedSurfaceLcl() {
_asm jmp [ddraw.DDGetAttachedSurfaceLcl];
}
__declspec(naked) void FakeDDInternalLock() {
_asm jmp [ddraw.DDInternalLock];
}
__declspec(naked) void FakeDDInternalUnlock() {
_asm jmp [ddraw.DDInternalUnlock];
}
__declspec(naked) void FakeDSoundHelp() {
_asm jmp [ddraw.DSoundHelp];
}
__declspec(naked) void FakeDirectDrawCreateClipper() {
_asm jmp [ddraw.DirectDrawCreateClipper];
}
__declspec(naked) void FakeDirectDrawCreateEx() {
_asm jmp [ddraw.DirectDrawCreateEx];
}
__declspec(naked) void FakeDirectDrawEnumerateA() {
_asm jmp [ddraw.DirectDrawEnumerateA];
}
__declspec(naked) void FakeDirectDrawEnumerateExA() {
_asm jmp [ddraw.DirectDrawEnumerateExA];
}
__declspec(naked) void FakeDirectDrawEnumerateExW() {
_asm jmp [ddraw.DirectDrawEnumerateExW];
}
__declspec(naked) void FakeDirectDrawEnumerateW() {
_asm jmp [ddraw.DirectDrawEnumerateW];
}
//__declspec(naked) void FakeDllCanUnloadNow() {
// _asm jmp [ddraw.DllCanUnloadNow];
//}
//__declspec(naked) void FakeDllGetClassObject() {
// _asm jmp [ddraw.DllGetClassObject];
//}
__declspec(naked) void FakeGetDDSurfaceLocal() {
_asm jmp [ddraw.GetDDSurfaceLocal];
}
__declspec(naked) void FakeGetOLEThunkData() {
_asm jmp [ddraw.GetOLEThunkData];
}
__declspec(naked) void FakeGetSurfaceFromDC() {
_asm jmp [ddraw.GetSurfaceFromDC];
}
__declspec(naked) void FakeRegisterSpecialCase() {
_asm jmp [ddraw.RegisterSpecialCase];
}
__declspec(naked) void FakeReleaseDDThreadLock() {
_asm jmp [ddraw.ReleaseDDThreadLock];
}
+25 -3
View File
@@ -1,6 +1,28 @@
LIBRARY ddraw
EXPORTS
DirectDrawCreate=FakeDirectDrawCreate
DirectDrawCreat2=FakeDirectDrawCreate2
DirectInputCreateA=FakeDirectInputCreate
AcquireDDThreadLock = FakeAcquireDDThreadLock @1
CheckFullscreen = FakeCheckFullscreen @2
CompleteCreateSysmemSurface = FakeCompleteCreateSysmemSurface @3
D3DParseUnknownCommand = FakeD3DParseUnknownCommand @4
DDGetAttachedSurfaceLcl = FakeDDGetAttachedSurfaceLcl @5
DDInternalLock = FakeDDInternalLock @6
DDInternalUnlock = FakeDDInternalUnlock @7
DSoundHelp = FakeDSoundHelp @8
DirectDrawCreate = FakeDirectDrawCreate @9
DirectDrawCreateClipper = FakeDirectDrawCreateClipper @10
DirectDrawCreateEx = FakeDirectDrawCreateEx @11
DirectDrawEnumerateA = FakeDirectDrawEnumerateA @12
DirectDrawEnumerateExA = FakeDirectDrawEnumerateExA @13
DirectDrawEnumerateExW = FakeDirectDrawEnumerateExW @14
DirectDrawEnumerateW = FakeDirectDrawEnumerateW @15
;DllCanUnloadNow = FakeDllCanUnloadNow @16
;DllGetClassObject = FakeDllGetClassObject @17
GetDDSurfaceLocal = FakeGetDDSurfaceLocal @18
GetOLEThunkData = FakeGetOLEThunkData @19
GetSurfaceFromDC = FakeGetSurfaceFromDC @20
RegisterSpecialCase = FakeRegisterSpecialCase @21
ReleaseDDThreadLock = FakeReleaseDDThreadLock @22
DirectDrawCreat2 = FakeDirectDrawCreate2
DirectInputCreateA = FakeDirectInputCreate
+44 -2
View File
@@ -205,7 +205,7 @@ static void CompatModeCheck(HKEY root, const char* filepath, int extra) {
inline void SfallInit() {
// enabling debugging features
isDebug = (GetPrivateProfileIntA("Debugging", "Enable", 0, ::sfall::ddrawIni) != 0);
isDebug = (GetPrivateProfileIntA("Debugging", "Enable", 0, ::sfall::ddrawIni) != 0);
if (isDebug) {
LoggingInit();
}
@@ -274,8 +274,50 @@ inline void SfallInit() {
}
ddrawDll ddraw;
static bool LoadOriginalDll(DWORD dwReason) {
switch (dwReason) {
case DLL_PROCESS_ATTACH:
char path[MAX_PATH];
CopyMemory(path + GetSystemDirectory(path , MAX_PATH - 10), "\\ddraw.dll", 11); // path to original dll
ddraw.dll = LoadLibrary(path);
if (!ddraw.dll || ddraw.dll == INVALID_HANDLE_VALUE) {
MessageBox(0, "Cannot load the original ddraw.dll library.", "sfall", MB_ICONERROR);
ExitProcess(-1);
break;
}
ddraw.AcquireDDThreadLock = GetProcAddress(ddraw.dll, "AcquireDDThreadLock");
ddraw.CheckFullscreen = GetProcAddress(ddraw.dll, "CheckFullscreen");
ddraw.CompleteCreateSysmemSurface = GetProcAddress(ddraw.dll, "CompleteCreateSysmemSurface");
ddraw.D3DParseUnknownCommand = GetProcAddress(ddraw.dll, "D3DParseUnknownCommand");
ddraw.DDGetAttachedSurfaceLcl = GetProcAddress(ddraw.dll, "DDGetAttachedSurfaceLcl");
ddraw.DDInternalLock = GetProcAddress(ddraw.dll, "DDInternalLock");
ddraw.DDInternalUnlock = GetProcAddress(ddraw.dll, "DDInternalUnlock");
ddraw.DSoundHelp = GetProcAddress(ddraw.dll, "DSoundHelp");
ddraw.DirectDrawCreateClipper = GetProcAddress(ddraw.dll, "DirectDrawCreateClipper");
ddraw.DirectDrawCreate = GetProcAddress(ddraw.dll, "DirectDrawCreate");
ddraw.DirectDrawCreateEx = GetProcAddress(ddraw.dll, "DirectDrawCreateEx");
ddraw.DirectDrawEnumerateA = GetProcAddress(ddraw.dll, "DirectDrawEnumerateA");
ddraw.DirectDrawEnumerateExA = GetProcAddress(ddraw.dll, "DirectDrawEnumerateExA");
ddraw.DirectDrawEnumerateExW = GetProcAddress(ddraw.dll, "DirectDrawEnumerateExW");
ddraw.DirectDrawEnumerateW = GetProcAddress(ddraw.dll, "DirectDrawEnumerateW");
//ddraw.DllCanUnloadNow = GetProcAddress(ddraw.dll, "DllCanUnloadNow");
//ddraw.DllGetClassObject = GetProcAddress(ddraw.dll, "DllGetClassObject");
ddraw.GetDDSurfaceLocal = GetProcAddress(ddraw.dll, "GetDDSurfaceLocal");
ddraw.GetOLEThunkData = GetProcAddress(ddraw.dll, "GetOLEThunkData");
ddraw.GetSurfaceFromDC = GetProcAddress(ddraw.dll, "GetSurfaceFromDC");
ddraw.RegisterSpecialCase = GetProcAddress(ddraw.dll, "RegisterSpecialCase");
ddraw.ReleaseDDThreadLock = GetProcAddress(ddraw.dll, "ReleaseDDThreadLock");
return true;
case DLL_PROCESS_DETACH:
FreeLibrary(ddraw.dll);
break;
}
return false;
}
bool _stdcall DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved) {
if (dwReason == DLL_PROCESS_ATTACH) {
if (LoadOriginalDll(dwReason)) {
sfall::SfallInit();
}
return true;
+26
View File
@@ -26,6 +26,32 @@
#include "SafeWrite.h"
#include "Logging.h"
struct ddrawDll {
HMODULE dll;
FARPROC DirectDrawEnumerateExA;
FARPROC DirectDrawCreate;
FARPROC DirectDrawCreateEx;
FARPROC AcquireDDThreadLock;
FARPROC ReleaseDDThreadLock;
FARPROC CheckFullscreen;
FARPROC CompleteCreateSysmemSurface;
FARPROC D3DParseUnknownCommand;
FARPROC DDGetAttachedSurfaceLcl;
FARPROC DDInternalLock;
FARPROC DDInternalUnlock;
FARPROC DSoundHelp;
FARPROC DirectDrawCreateClipper;
FARPROC DirectDrawEnumerateA;
FARPROC DirectDrawEnumerateExW;
FARPROC DirectDrawEnumerateW;
//FARPROC DllCanUnloadNow;
//FARPROC DllGetClassObject;
FARPROC GetDDSurfaceLocal;
FARPROC GetOLEThunkData;
FARPROC GetSurfaceFromDC;
FARPROC RegisterSpecialCase;
};
namespace sfall
{