Sözde kodu, orijinal kodla tam olarak aynı olmasa da benzer şekilde derlemesi ve çalışması için temizlemeye çalışıyorum.
Buna benzeyen bu bit, bulunduğum çeşitli yerlerde tam olarak ne anlama geldiğini anlamaya çalışıyorum.
if (ZonePlayerCount > 0) {v3 = 0; v4 = 0; v5 = playerPointerList; v6 = &playerPointerList [1]; do {if (* (unsigned int *) & (* v5) ->IPAddressDWORD.S_un.S_un_b.s_b1 == IPAddress && (* v5) ->Port == Bağlantı koptuğu için bağlantı noktası) {printf (bağlantı noktası) başka bir bağlantı \ n "); sub_41CBD0 ((int) & (* v5) ->encryptionPointer->ConnectionStatus); Bellek = * v5; eğer (* v5) {DisconnectUser (* v5); Boş hafıza); } --ZonePlayerCount; memcpy (v5, v6, 4 * (v4 + ZonePlayerCount)); --v3; v4 - = 0x3FFFFFFFu; v6 = (karakter *) v6 - 4; --v5; } ++ v3; v4 + = 0x3FFFFFFFu; v6 = (karakter *) v6 + 4; ++ v5; } while (v3 < ZonePlayerCount); }
Bunun gibi diğer yerler ..
v1 = 0; eğer (ArenaArrayLength > v1) {v18 = 0; v19 = Arenalar; v20 = &Arenas [1]; do {if (ProcessArena (* v19)) {if ((* v19) ->ArenaName [0]) WriteSubGameLog ("Özel alan bırakıldı:% s \ n", (* v19) ->ArenaName); else WriteSubGameLog ("Arena düştü \ n"); bufa = * v19; eğer (* v19) {ShutdownArena (* v19); ücretsiz (bufa); } --ArenaArrayLength; memcpy (v19, v20, 4 * (v18 + ArenaArrayLength)); --v1; v18 - = 0x3FFFFFFFu; v20 = (karakter *) v20 - 4; --v19; } ++ v1; v18 + = 0x3FFFFFFFu; v20 = (karakter *) v20 + 4; ++ v19; }
while (v1 < ArenaArrayLength); }
Burada verdiğim ilk sözde kod parçası için derleme.
.text: 00412D7B mov esi, offset playerPointerList.text: 00412D80 mov ebx, (ofset playerPointerList + 4) .text: 00412D85.text: 00412D85 loc_412D85:; KOD XREF: NewConnectionRequest + C0j.text: 00412D85 mov eax, [esi] .text: 00412D87 mov ecx, [esp + 20h + IPAddress] .text: 00412D8B cmp [eax + 2F3h], ecx.text: 00412D91 jnz short loc_412DFC. text: 00412D93 mov dx, [esp + 20h + Port] .text: 00412D98 cmp [eax + 2F7h], dx.text: 00412D9F jnz short loc_412DFC.text: 00412DA1 push offset aConnectionIsBrok; "Aynı ip / bağlantı noktası nedeniyle bağlantı koptu" .... metin: 00412DA6 _printf.text: 00412DAB mov eax, [esi] .text: 00412DAD add esp, 4.text: 00412DB0 mov ecx, [eax + 28h]. metin: 00412DB3 çağrı sub_41CBD0.text: 00412DB8 mov ecx, [esi]; player.text: 00412DBA test ecx, ecx.text: 00412DBC mov [esp + 20h + Memory], ecx.text: 00412DC0 jz short loc_412DD4.text: 00412DC2 call DisconnectUser.text: 00412DC7 mov ecx, [esp + 20h + Bellek] .text: 00412DCB ecx itme; Memory.text: 00412DCC çağrısı 3 @ YAXPAX @ Z; operatör silme (void *). metin: 00412DD1 esp ekle, 4. metin: 00412DD4.text: 00412DD4 loc_412DD4:; KOD XREF: NewConnectionRequest + 70j.text: 00412DD4 mov eax, ZonePlayerCount.text: 00412DD9 dec eax.text: 00412DDA mov ZonePlayerCount, eax.text: 00412DDF eax ekle, edi
.text: 00412DE1 shl eax, 2.text: 00412DE4 push eax; Size.text: 00412DE5 ebx'i itin; Src.text: 00412DE6 push esi; Dst.text: 00412DE7 çağrı _memcpy.text: 00412DEC esp ekle, 0Ch.text: 00412DEF dec ebp.text: 00412DF0 alt edi, 3FFFFFFFh.text: 00412DF6 alt ebx, 4. metin: 00412DF9 alt esi, 4. metin: 00412DFC. metin: 00412DFC loc_412DFC:; KOD XREF: NewConnectionRequest + 41j.text: 00412DFC; NewConnectionRequest + 4Fj.text: 00412DFC mov eax, ZonePlayerCount.text: 00412E01 inc ebp.text: 00412E02 add edi, 3FFFFFFFh.text: 00412E08 ebx ekle, 4. metin: 00412E0B esi, 4.text: 00412E0E cmp ebp. text: 00412E10 jl loc_412D85
Anladığım kadarıyla 0x3FFFFFFF
dizinin sınırları ile bir ilgisi var mı?
DisconnectUser'dan sonra ve belleksiz tüm playerPointer işaretçilerinin sola kaydırılmasının doğru olduğunu düşünüyorum. veya sayacı farklı yollarda değiştirir.
Bence sayaç ya v3
döngü devam ederken artmaya devam edebilir, ancak bir oyuncu kaldırıldığında listenin sonu falan mı?