You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
221 lines
5.5 KiB
221 lines
5.5 KiB
/* |
|
* UNPUBLISHED -- Rights reserved under the copyright laws of the |
|
* United States. Use of a copyright notice is precautionary only and |
|
* does not imply publication or disclosure. |
|
* |
|
* THIS DOCUMENTATION CONTAINS CONFIDENTIAL AND PROPRIETARY INFORMATION |
|
* OF BLIZZARD ENTERTAINMENT. ANY DUPLICATION, MODIFICATION, |
|
* DISTRIBUTION, OR DISCLOSURE IS STRICTLY PROHIBITED WITHOUT THE PRIOR |
|
* EXPRESS WRITTEN PERMISSION OF BLIZZARD ENTERTAINMENT. |
|
*/ |
|
|
|
#include "../types.h" |
|
|
|
int dthread_cpp_init_value; // weak |
|
static CRITICAL_SECTION sgMemCrit; // idb |
|
unsigned int glpDThreadId; // idb |
|
TMegaPkt *sgpInfoHead; /* may not be right struct */ |
|
char byte_52A508; // weak |
|
HANDLE sghWorkToDoEvent; // idb |
|
|
|
int dthread_inf = 0x7F800000; // weak |
|
|
|
/* rdata */ |
|
static HANDLE sghThread = (HANDLE)0xFFFFFFFF; // idb |
|
|
|
//----- (0041509D) -------------------------------------------------------- |
|
struct dthread_cpp_init_1 |
|
{ |
|
dthread_cpp_init_1() |
|
{ |
|
dthread_cpp_init_value = dthread_inf; |
|
} |
|
} _dthread_cpp_init_1; |
|
// 47A460: using guessed type int dthread_inf; |
|
// 52A4E0: using guessed type int dthread_cpp_init_value; |
|
|
|
//----- (004150A8) -------------------------------------------------------- |
|
struct dthread_cpp_init_2 |
|
{ |
|
dthread_cpp_init_2() |
|
{ |
|
dthread_init_mutex(); |
|
dthread_cleanup_mutex_atexit(); |
|
} |
|
} _dthread_cpp_init_2; |
|
|
|
//----- (004150B2) -------------------------------------------------------- |
|
void __cdecl dthread_init_mutex() |
|
{ |
|
InitializeCriticalSection(&sgMemCrit); |
|
} |
|
|
|
//----- (004150BE) -------------------------------------------------------- |
|
void __cdecl dthread_cleanup_mutex_atexit() |
|
{ |
|
atexit(dthread_cleanup_mutex); |
|
} |
|
|
|
//----- (004150CA) -------------------------------------------------------- |
|
void __cdecl dthread_cleanup_mutex() |
|
{ |
|
DeleteCriticalSection(&sgMemCrit); |
|
} |
|
|
|
//----- (004150D6) -------------------------------------------------------- |
|
void __fastcall dthread_remove_player(int pnum) |
|
{ |
|
int v1; // edi |
|
TMegaPkt *i; // eax |
|
|
|
v1 = pnum; |
|
EnterCriticalSection(&sgMemCrit); |
|
for ( i = sgpInfoHead; i; i = i->pNext ) |
|
{ |
|
if ( i->dwSpaceLeft == v1 ) |
|
i->dwSpaceLeft = 4; |
|
} |
|
LeaveCriticalSection(&sgMemCrit); |
|
} |
|
|
|
//----- (00415109) -------------------------------------------------------- |
|
void __fastcall dthread_send_delta(int pnum, int cmd, void *pbSrc, int dwLen) |
|
{ |
|
char v4; // bl |
|
TMegaPkt *v5; // eax |
|
TMegaPkt *v6; // esi |
|
TMegaPkt *v7; // eax |
|
TMegaPkt **v8; // ecx |
|
int v9; // [esp+4h] [ebp-4h] |
|
|
|
v4 = cmd; |
|
v9 = pnum; |
|
if ( gbMaxPlayers != 1 ) |
|
{ |
|
v5 = (TMegaPkt *)DiabloAllocPtr(dwLen + 20); |
|
v6 = v5; |
|
v5->pNext = 0; |
|
v5->dwSpaceLeft = v9; |
|
v5->data[0] = v4; |
|
*(_DWORD *)&v5->data[4] = dwLen; |
|
memcpy(&v5->data[8], pbSrc, dwLen); |
|
EnterCriticalSection(&sgMemCrit); |
|
v7 = sgpInfoHead; |
|
v8 = &sgpInfoHead; |
|
while ( v7 ) |
|
{ |
|
v8 = &v7->pNext; |
|
v7 = v7->pNext; |
|
} |
|
*v8 = v6; |
|
SetEvent(sghWorkToDoEvent); |
|
LeaveCriticalSection(&sgMemCrit); |
|
} |
|
} |
|
// 679660: using guessed type char gbMaxPlayers; |
|
|
|
//----- (00415186) -------------------------------------------------------- |
|
void __cdecl dthread_start() |
|
{ |
|
char *v0; // eax |
|
char *v1; // eax |
|
|
|
if ( gbMaxPlayers != 1 ) |
|
{ |
|
sghWorkToDoEvent = CreateEventA(NULL, TRUE, FALSE, NULL); |
|
if ( !sghWorkToDoEvent ) |
|
{ |
|
v0 = GetLastErr(); |
|
TermMsg("dthread:1\n%s", v0); |
|
} |
|
byte_52A508 = 1; |
|
sghThread = (HANDLE)_beginthreadex(NULL, 0, dthread_handler, NULL, 0, &glpDThreadId); |
|
if ( sghThread == (HANDLE)-1 ) |
|
{ |
|
v1 = GetLastErr(); |
|
TermMsg("dthread2:\n%s", v1); |
|
} |
|
} |
|
} |
|
// 52A508: using guessed type char byte_52A508; |
|
// 679660: using guessed type char gbMaxPlayers; |
|
|
|
//----- (004151F3) -------------------------------------------------------- |
|
unsigned int __stdcall dthread_handler(void *a1) |
|
{ |
|
char *v1; // eax |
|
TMegaPkt *v2; // esi |
|
int v3; // ecx |
|
unsigned int v4; // edi |
|
|
|
while ( byte_52A508 ) |
|
{ |
|
if ( !sgpInfoHead && WaitForSingleObject(sghWorkToDoEvent, 0xFFFFFFFF) == -1 ) |
|
{ |
|
v1 = GetLastErr(); |
|
TermMsg("dthread4:\n%s", v1); |
|
} |
|
EnterCriticalSection(&sgMemCrit); |
|
v2 = sgpInfoHead; |
|
if ( sgpInfoHead ) |
|
sgpInfoHead = sgpInfoHead->pNext; |
|
else |
|
ResetEvent(sghWorkToDoEvent); |
|
LeaveCriticalSection(&sgMemCrit); |
|
if ( v2 ) |
|
{ |
|
v3 = v2->dwSpaceLeft; |
|
if ( v3 != 4 ) |
|
multi_send_zero_packet(v3, v2->data[0], &v2->data[8], *(_DWORD *)&v2->data[4]); |
|
v4 = 1000 * *(_DWORD *)&v2->data[4] / (unsigned int)gdwDeltaBytesSec; |
|
if ( v4 >= 1 ) |
|
v4 = 1; |
|
mem_free_dbg(v2); |
|
if ( v4 ) |
|
Sleep(v4); |
|
} |
|
} |
|
return 0; |
|
} |
|
// 52A508: using guessed type char byte_52A508; |
|
// 679730: using guessed type int gdwDeltaBytesSec; |
|
|
|
//----- (004152C0) -------------------------------------------------------- |
|
void __cdecl dthread_cleanup() |
|
{ |
|
char *v0; // eax |
|
TMegaPkt *v1; // eax |
|
TMegaPkt *v2; // esi |
|
|
|
if ( sghWorkToDoEvent ) |
|
{ |
|
byte_52A508 = 0; |
|
SetEvent(sghWorkToDoEvent); |
|
if ( sghThread != (HANDLE)-1 && glpDThreadId != GetCurrentThreadId() ) |
|
{ |
|
if ( WaitForSingleObject(sghThread, 0xFFFFFFFF) == -1 ) |
|
{ |
|
v0 = GetLastErr(); |
|
TermMsg("dthread3:\n(%s)", v0); |
|
} |
|
CloseHandle(sghThread); |
|
sghThread = (HANDLE)-1; |
|
} |
|
CloseHandle(sghWorkToDoEvent); |
|
v1 = sgpInfoHead; |
|
sghWorkToDoEvent = 0; |
|
if ( sgpInfoHead ) |
|
{ |
|
do |
|
{ |
|
v2 = v1->pNext; |
|
sgpInfoHead = 0; |
|
mem_free_dbg(v1); |
|
v1 = v2; |
|
sgpInfoHead = v2; |
|
} |
|
while ( v2 ); |
|
} |
|
} |
|
} |
|
// 52A508: using guessed type char byte_52A508;
|
|
|