You are not logged in.
Кто может помочь сделать такую вещь: в GTA SA нужно вместо стандартной мини-игры внедрить любую другую (например "сапер", шахматы или типа того), есть вот такой код GTA SA main menu Stalker Theme
#include <iostream>
#include <windows.h>
#include <string>
#include <conio.h>
#include <fstream>
#include <iomanip>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm")
using namespace std;
DWORD WINAPI GtaSA_thread (LPVOID);
DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return true;
}
DWORD WINAPI GtaSA_thread (LPVOID)
{
DWORD*var = (DWORD*)0xBA68A5;
for (;;Sleep (100))
{
if (*var != 0x00000022)
{
PlaySound("C:\\Games\\GTA2\\sound.WAV", NULL, SND_ASYNC);
}
}
}проигрывает музыку из папки C:\\Games\\GTA2 - нужно что-то вроде этого
Last edited by zorin_chel (17-03-2018 06:03)
Offline
Кто может помочь сделать такую вещь: в GTA SA нужно вместо стандартной мини-игры внедрить любую другую
проигрывает музыку из папки C:\\Games\\GTA2 - нужно что-то вроде этого
Что?
Стандартные мини-игры - это scm-скрипты. Т.е. для их редактирования надо менять main.scm.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Мне нужно вместо scm-скрипта "врезать" exe поток другой игры, т.е. я через базу адресов найду адрес который запускает scm-скрипт мини-игры и его нужно подменить, чтобы запускалось окно с другой игрой. Должно выглядеть вот так:
https://yadi.sk/i/UBkABtTy3TTemx
https://yadi.sk/i/Y6eYfvAF3TTepi
Last edited by zorin_chel (17-03-2018 06:04)
Offline
пока получилось вот что
#include <iostream>
#include <windows.h>
#include <string>
#include <conio.h>
#include <fstream>
#include <iomanip>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <mmsystem.h>
#include <tlhelp32.h>
#pragma comment(lib, "winmm")
using namespace std;
DWORD WINAPI GtaSA_thread (LPVOID);
DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return true;
}
DWORD WINAPI GtaSA_thread(LPVOID)
{
for (;; Sleep(1000))
{
if (GetAsyncKeyState(VK_NUMPAD0) & 0x8000)
{
ShellExecute(NULL, "open", "c:\\GSR_1.5\\GAMES\\MK4\\MK4.exe", NULL, NULL, SW_SHOWNORMAL);
}
}
}но работает хреново
https://www.youtube.com/watch?v=3MMbbno18i8
Offline
Ахахах. МК запускаешь?
Offline
получился вот такой код
#include <iostream>
#include <windows.h>
#include <string>
#include <conio.h>
#include <fstream>
#include <iomanip>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <mmsystem.h>
#include <tlhelp32.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <d3dx9core.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib, "winmm")
#pragma comment(lib, "D3dx9.lib")
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
// Register the window class.
const wchar_t CLASS_NAME[] = L"Sample Window Class";
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
// Create the window.
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
L"Learn to Program Windows", // Window text
WS_OVERLAPPEDWINDOW, // Window style
// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, // Parent window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);
if (hwnd == NULL)
{
return 0;
}
ShowWindow(hwnd, nCmdShow);
// Run the message loop.
MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
EndPaint(hwnd, &ps);
}
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
typedef HRESULT(__stdcall* PRESENT9)(IDirect3DDevice9* pDevice, const RECT*, const RECT*, HWND, void*);
PRESENT9 g_D3D9_Present = 0;
BYTE g_codeFragment_p9[5] = { 0, 0, 0, 0, 0 };
BYTE g_jmp_p9[5] = { 0, 0, 0, 0, 0 };
DWORD present9 = 0;
bool indicator = 0;
D3DRECT rec = { 10, 10, 160, 240 }; //menu size
ID3DXFont* m_font = 0;
RECT fontRect = { 10, 15, 120, 120 };
D3DCOLOR fontColor = 0;
D3DCOLOR bkgColor = 0;
void DrawIndicator(void* pDevice)
{
IDirect3DDevice9* dev = (IDirect3DDevice9*)pDevice; //get the actual D3D-device
dev->BeginScene();
if (indicator)
{
HDC hdc = GetDC(0);
RECT rect = { 20, 20, 200, 200 };
SetTextColor(hdc, RGB(255, 0, 0));
SetBkMode(hdc, TRANSPARENT);
SetBkColor(hdc, RGB(0, 255, 0, 0));
DrawText(hdc, L"Directx Hook", -1, &rect, DT_LEFT);
//PlaySound(L"H:\\Program Files (x86)\\GTA SA Revision2\\GAMES\\CNN Intro.wav", NULL, SND_ASYNC);
//Sleep(1000);
//CreateProcess(L"H:\\Program Files(x86)\\GTA SA Revision2\\GAMES\\CNN Intro.mp4", NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL);
}
dev->EndScene();
}
//get the VMT and the hooking functions offsets
void GetDevice9Methods()
{
IDirect3D9* d3d9_ptr;
IDirect3DDevice9* pDevice;
DWORD* vtablePtr;
D3DPRESENT_PARAMETERS d3dpp;
static HMODULE d3d9_handle = 0;
HWND hWnd = CreateWindowExA(0, "STATIC", "dummy", 0, 0, 0, 0, 0, 0, 0, 0, 0);
d3d9_handle = LoadLibraryA("d3d9.dll");
d3d9_ptr = Direct3DCreate9(D3D_SDK_VERSION);
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = 1;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
IDirect3D9_CreateDevice(d3d9_ptr, 0, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice);
vtablePtr = (DWORD*)(*((DWORD*)pDevice));
present9 = vtablePtr[17] - (DWORD)d3d9_handle;
IDirect3DDevice9_Release(pDevice);
IDirect3D9_Release(d3d9_ptr);
FreeLibrary(d3d9_handle);
CloseHandle(hWnd);
}
HRESULT HookedPresent9(IDirect3DDevice9* pDevice, const RECT* src, const RECT* dest, HWND hWnd, void* unused)
{
BYTE* codeDest = (BYTE*)g_D3D9_Present; //restore the original Present() bytes
codeDest[0] = g_codeFragment_p9[0];
*((DWORD*)(codeDest + 1)) = *((DWORD*)(g_codeFragment_p9 + 1));
DrawIndicator(pDevice); //draw the menu
DWORD res = g_D3D9_Present(pDevice, src, dest, hWnd, unused); //place the hook back
codeDest[0] = g_jmp_p9[0];
*((DWORD*)(codeDest + 1)) = *((DWORD*)(g_jmp_p9 + 1));
return res;
}
void HookDevice9Methods()
{
DWORD g_savedProtection_p9 = 0;
HMODULE hD3D9 = GetModuleHandleA("d3d9.dll"); //get the actual d3d9.dll address
g_D3D9_Present = (PRESENT9)((DWORD)hD3D9 + present9); //calculate the actual Present() address
g_jmp_p9[0] = 0xE9; //fill the codecave array ("jmp hooked_present")
DWORD addr = (DWORD)HookedPresent9 - (DWORD)g_D3D9_Present - 5; //calculate the hooked Present() address
memcpy(g_jmp_p9 + 1, &addr, sizeof(DWORD)); //write it into the cave
memcpy(g_codeFragment_p9, g_D3D9_Present, 5); //save the first 5 (jmp + addr) bytes of the original Present()
VirtualProtect(g_D3D9_Present, 8, PAGE_EXECUTE_READWRITE, &g_savedProtection_p9); //make the code writable\executable
memcpy(g_D3D9_Present, g_jmp_p9, 5); //write the codecave in the beginning of the original Present()
}
//hooking thread main function
DWORD WINAPI TF(LPVOID)
{
GetDevice9Methods(); //get the VMT and the offsets
HookDevice9Methods(); //actually, hook the needed functions
return 0;
}
//hotkeys thread main function
DWORD WINAPI KeyboardHook(LPVOID)
{
while (1)
{
if (GetAsyncKeyState(VK_F4))
{
indicator = !indicator;
Beep(500, 200);
}
Sleep(100);
}
return 0;
}
int _stdcall DllMain(HINSTANCE hInst, DWORD ul_reason_for_call, void* lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: //if we are attached into the game's process
CreateThread(0, 0, TF, 0, 0, 0); //start D3D-hooking thread
CreateThread(0, 0, KeyboardHook, 0, 0, 0); //start hotkeys thread
}
return 1;
}только он текст выводит, а надо что бы окно другой программы, кто может подсказать
Offline
спустя 2 года)
Offline