Browse Source

diablo_reload_proc & Xiaolin Wu ref

pull/100/head
galaxyhaxz 7 years ago committed by Anders Jenbo
parent
commit
5e10dcb912
  1. 137
      Source/diablo.cpp
  2. 2
      Source/diablo.h
  3. 3
      Source/engine.cpp

137
Source/diablo.cpp

@ -507,80 +507,87 @@ BOOL diablo_find_window(LPCSTR lpClassName)
return 1;
}
void diablo_reload_process(HMODULE hModule)
void diablo_reload_process(HINSTANCE hInstance)
{
char *i; // eax
DWORD dwSize; // esi
BOOL v3; // edi
_DWORD *v4; // eax
_DWORD *v5; // esi
HWND v6; // eax
char Name[276]; // [esp+Ch] [ebp-29Ch]
char Filename[MAX_PATH]; // [esp+120h] [ebp-188h]
STARTUPINFOA si; // [esp+224h] [ebp-84h]
SYSTEM_INFO sinf; // [esp+268h] [ebp-40h]
PROCESS_INFORMATION pi; // [esp+28Ch] [ebp-1Ch]
DWORD dwProcessId; // [esp+29Ch] [ebp-Ch]
HANDLE hMap; // [esp+2A0h] [ebp-8h]
HWND hWnd; // [esp+2A4h] [ebp-4h]
//*Filename = empty_string;
memset(Filename, 0, sizeof(Filename));
// *(_WORD *)&Filename[257] = 0;
// Filename[259] = 0;
GetModuleFileName(hModule, Filename, sizeof(Filename));
wsprintf(Name, "Reload-%s", Filename);
for (i = Name; *i; ++i) {
if (*i == '\\')
*i = '/';
DWORD dwSize, dwProcessId;
BOOL bNoExist;
char *s;
long *plMap;
HWND hWnd, hPrev;
HANDLE hMap;
STARTUPINFO si;
SYSTEM_INFO sinf;
PROCESS_INFORMATION pi;
char szReload[MAX_PATH + 16];
char szFileName[MAX_PATH] = "";
GetModuleFileName(hInstance, szFileName, sizeof(szFileName));
wsprintf(szReload, "Reload-%s", szFileName);
for(s = szReload; *s != '\0'; s++) {
if(*s == '\\') {
*s = '/';
}
}
GetSystemInfo(&sinf);
dwSize = sinf.dwPageSize;
if (sinf.dwPageSize < 4096)
if(dwSize < 4096) {
dwSize = 4096;
hMap = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, SEC_COMMIT | PAGE_READWRITE, 0, dwSize, Name);
v3 = GetLastError() != ERROR_ALREADY_EXISTS;
if (hMap) {
v4 = (unsigned int *)MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, dwSize);
v5 = v4;
if (v4) {
if (v3) {
*v4 = -1;
v4[1] = 0;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
CreateProcess(Filename, NULL, NULL, NULL, FALSE, CREATE_NEW_PROCESS_GROUP, NULL, NULL, &si, &pi);
WaitForInputIdle(pi.hProcess, 0xFFFFFFFF);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
while (*v5 < 0)
Sleep(1000);
UnmapViewOfFile(v5);
CloseHandle(hMap);
ExitProcess(0);
}
hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, SEC_COMMIT | PAGE_READWRITE, 0, dwSize, szReload);
bNoExist = GetLastError() != ERROR_ALREADY_EXISTS;
if(hMap == NULL) {
return;
}
plMap = (long *)MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, dwSize);
if(plMap == NULL) {
return;
}
if(bNoExist) {
plMap[0] = -1;
plMap[1] = 0;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
CreateProcess(szFileName, NULL, NULL, NULL, FALSE, CREATE_NEW_PROCESS_GROUP, NULL, NULL, &si, &pi);
WaitForInputIdle(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
while(plMap[0] < 0) {
Sleep(1000);
}
UnmapViewOfFile(plMap);
CloseHandle(hMap);
ExitProcess(0);
}
if(InterlockedIncrement(plMap) == 0) {
plMap[1] = GetCurrentProcessId();
} else {
hPrev = GetForegroundWindow();
hWnd = hPrev;
while(1) {
hPrev = GetWindow(hPrev, GW_HWNDPREV);
if(hPrev == NULL) {
break;
}
if (InterlockedIncrement((LPLONG)v4)) {
v6 = GetForegroundWindow();
do {
hWnd = v6;
v6 = GetWindow(v6, 3u);
} while (v6);
while (1) {
GetWindowThreadProcessId(hWnd, &dwProcessId);
if (dwProcessId == v5[1])
break;
hWnd = GetWindow(hWnd, 2u);
if (!hWnd)
goto LABEL_23;
}
hWnd = hPrev;
}
while(1) {
GetWindowThreadProcessId(hWnd, &dwProcessId);
if(dwProcessId == plMap[1]) {
SetForegroundWindow(hWnd);
LABEL_23:
UnmapViewOfFile(v5);
CloseHandle(hMap);
ExitProcess(0);
break;
}
hWnd = GetWindow(hWnd, GW_HWNDNEXT);
if(hWnd == NULL) {
break;
}
v5[1] = GetCurrentProcessId();
}
UnmapViewOfFile(plMap);
CloseHandle(hMap);
ExitProcess(0);
}
}

2
Source/diablo.h

@ -124,7 +124,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
void diablo_parse_flags(char *args);
void diablo_init_screen();
BOOL diablo_find_window(LPCSTR lpClassName);
void diablo_reload_process(HMODULE hModule);
void diablo_reload_process(HINSTANCE hInstance);
BOOL PressEscKey();
LRESULT CALLBACK DisableInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK GM_Game(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

3
Source/engine.cpp

@ -2088,6 +2088,9 @@ void engine_draw_pixel(int sx, int sy)
// 52B99C: using guessed type int gbNotInView;
// 69CF0C: using guessed type int gpBufEnd;
/*
* Xiaolin Wu's anti-aliased line algorithm
*/
void DrawLine(int x0, int y0, int x1, int y1, BYTE col)
{
int i, sx, sy, dx, dy, nx, ny, xlen, ylen, pixels, remain, xy_same, line_dir, mult_2, mult_4;

Loading…
Cancel
Save