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