rendered paste bodyThanks to Tom (AntiRush) for a lot of help on this one.
004C7FE0 /$ 66:8B4424 08 MOV AX,WORD PTR SS:[ESP+8]
004C7FE5 |. 53 PUSH EBX ; Preserves EBX
004C7FE6 |. 33DB XOR EBX,EBX
004C7FE8 |. 885E 02 MOV BYTE PTR DS:[ESI+2],BL
004C7FEB |. 885E 03 MOV BYTE PTR DS:[ESI+3],BL
004C7FEE |. 895E 04 MOV DWORD PTR DS:[ESI+4],EBX ; Empty?
004C7FF1 |. 66:895E 08 MOV WORD PTR DS:[ESI+8],BX
004C7FF5 |. 66:C746 0A 010>MOV WORD PTR DS:[ESI+A],1 ; Set to a constant, can I assume it's a flag of some kind?
004C7FFB |. 66:891E MOV WORD PTR DS:[ESI],BX
004C7FFE |. 66:8946 50 MOV WORD PTR DS:[ESI+50],AX
struct unkStruct
{
WORD unk0 = 0 // ESI
BYTE unk1 = x //ESI+2
BYTE unk2 = x //ESI+3
DWORD unk3 = 0 //ES+4
WORD unk4 = 0 //ESI+8
WORD unk5 = 1 //ESI+A
DWORD unk6 = 0 //ESI+C
//Unknown field in our struct
DWORD unk7 = ?? //ESI + 10 - this must be set earlier
BYTE[66] unk8 = null //
WORD unk9 = [the md5 hash] //ESI+50 - Only 2 bytes worth - what is this really?
WORD unk10 = null //Unknown field - could be 2 bytes instead, I'm just guessing
DWORD unk11 = 0 //ESI+54
BYTE unk12 = 0 //ESI+58
}
004C8002 |. 55 PUSH EBP
004C8003 |. 8B6C24 0C MOV EBP,DWORD PTR SS:[ESP+C]
004C8007 |. 895E 0C MOV DWORD PTR DS:[ESI+C],EBX
004C800A |. 895E 54 MOV DWORD PTR DS:[ESI+54],EBX
004C800D |. 885E 58 MOV BYTE PTR DS:[ESI+58],BL
004C8010 |. 8A11 MOV DL,BYTE PTR DS:[ECX]
004C8012 |. 80FA 01 CMP DL,1
004C8015 |. 8D46 10 LEA EAX,DWORD PTR DS:[ESI+10]
004C8018 |. 57 PUSH EDI
004C8019 |. 8D78 1E LEA EDI,DWORD PTR DS:[EAX+1E]
004C801C |. 75 0E JNZ SHORT magic1.004C802C
004C801E |. 6A 01 PUSH 1 ; /Arg3 = 00000001
004C8020 |. 57 PUSH EDI ; |Arg2
004C8021 |. 50 PUSH EAX ; |Arg1
004C8022 |. E8 D9720100 CALL magic1.004DF300 ; \magic1.004DF300
004C8027 |. 83C4 0C ADD ESP,0C
004C802A |. EB 18 JMP SHORT magic1.004C8044
004C802C |> 3AD3 CMP DL,BL
004C802E |. 74 12 JE SHORT magic1.004C8042
004C8030 |. 4F DEC EDI
004C8031 |. 2BC8 SUB ECX,EAX
004C8033 |> 3BC7 /CMP EAX,EDI
004C8035 |. 74 0B |JE SHORT magic1.004C8042
004C8037 |. 8810 |MOV BYTE PTR DS:[EAX],DL
004C8039 |. 8A5401 01 |MOV DL,BYTE PTR DS:[ECX+EAX+1]
004C803D |. 40 |INC EAX
004C803E |. 3AD3 |CMP DL,BL
004C8040 |.^75 F1 \JNZ SHORT magic1.004C8033
004C8042 |> 8818 MOV BYTE PTR DS:[EAX],BL
004C8044 |> 885E 2D MOV BYTE PTR DS:[ESI+2D],BL
004C8047 |. 8A4D 00 MOV CL,BYTE PTR SS:[EBP]
004C804A |. 80F9 01 CMP CL,1
004C804D |. 8D46 2E LEA EAX,DWORD PTR DS:[ESI+2E]
004C8050 |. 8D50 21 LEA EDX,DWORD PTR DS:[EAX+21]
004C8053 |. 75 19 JNZ SHORT magic1.004C806E
004C8055 |. 6A 01 PUSH 1 ; /Arg3 = 00000001
004C8057 |. 52 PUSH EDX ; |Arg2
004C8058 |. 50 PUSH EAX ; |Arg1
004C8059 |. 8BCD MOV ECX,EBP ; |
004C805B |. E8 A0720100 CALL magic1.004DF300 ; \magic1.004DF300
004C8060 |. 83C4 0C ADD ESP,0C
004C8063 |. 5F POP EDI
004C8064 |. 5D POP EBP
004C8065 |. 885E 4E MOV BYTE PTR DS:[ESI+4E],BL
004C8068 |. 8BC6 MOV EAX,ESI
004C806A |. 5B POP EBX
004C806B |. C2 0800 RETN 8
004C806E |> 3ACB CMP CL,BL
004C8070 |. 74 1D JE SHORT magic1.004C808F
004C8072 |. 8D7A FF LEA EDI,DWORD PTR DS:[EDX-1]
004C8075 |. 8BD5 MOV EDX,EBP
004C8077 |. 2BD0 SUB EDX,EAX
004C8079 |. 8DA424 0000000>LEA ESP,DWORD PTR SS:[ESP]
004C8080 |> 3BC7 /CMP EAX,EDI
004C8082 |. 74 0B |JE SHORT magic1.004C808F
004C8084 |. 8808 |MOV BYTE PTR DS:[EAX],CL
004C8086 |. 8A4C02 01 |MOV CL,BYTE PTR DS:[EDX+EAX+1]
004C808A |. 40 |INC EAX
004C808B |. 3ACB |CMP CL,BL
004C808D |.^75 F1 \JNZ SHORT magic1.004C8080
004C808F |> 5F POP EDI
004C8090 |. 8818 MOV BYTE PTR DS:[EAX],BL
004C8092 |. 5D POP EBP
004C8093 |. 885E 4E MOV BYTE PTR DS:[ESI+4E],BL
004C8096 |. 8BC6 MOV EAX,ESI
004C8098 |. 5B POP EBX
004C8099 \. C2 0800 RETN 8