diff --git a/Source/diablo.cpp b/Source/diablo.cpp index e157faaa6..a57f635e0 100644 --- a/Source/diablo.cpp +++ b/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); } } diff --git a/Source/diablo.h b/Source/diablo.h index c4b371f0b..d1efb1049 100644 --- a/Source/diablo.h +++ b/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); diff --git a/Source/engine.cpp b/Source/engine.cpp index 0944340a3..c5c0a0499 100644 --- a/Source/engine.cpp +++ b/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;