Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void __fastcall StartReadEBX(struct_StreamReader_5 *a1, __int64 ReadingStart, __int64 ReadingSize)
- {
- int ReadSize; // er15@1
- __int64 ReadingPointer; // rsi@1
- struct_StreamReader_5 *StreamReader; // rbx@1
- char IsValid; // r12@1
- __int64 ReadingEndPointer; // r14@1
- int ReaderState; // eax@4
- unsigned int ReadingLeft1; // edi@4
- EBXHeader *v10; // rcx@5
- int magic; // eax@5
- __int64 AbsStringOffset; // rdx@9
- __int64 v13; // rax@11
- __int64 v14; // rdx@11
- struct_a1_1 *v15; // rcx@11
- __int64 v16; // rax@11
- struct_v17 *v17; // rcx@12
- char *v18; // rbp@15
- char *v19; // rax@15
- __int64 v20; // rdi@17
- unsigned __int8 v21; // cf@19
- bool v22; // zf@19
- __int64 v23; // rax@20
- __int64 GUIDOffset; // rcx@22
- __int64 NumGUIDs; // rdx@22
- signed __int64 KeywordAreaStart; // rcx@22
- __int64 KeywordAreaSize; // rax@22
- FieldDescriptor *FieldDescStart; // rcx@22
- signed __int64 FieldDescSize; // rax@22
- ComplexField *ComplexDescStart; // rcx@22
- signed __int64 ComplexDescSize; // rax@22
- ComplexField *InstanceRepListStart; // rcx@22
- signed __int64 InstanceRepListSize; // rax@22
- char *v34; // rcx@24
- unsigned int v35; // eax@25
- char *v36; // rcx@27
- unsigned int v37; // eax@28
- __int64 v38; // rcx@29
- __int16 v39; // ax@31
- __int16 v40; // ax@31
- unsigned int v41; // ecx@32
- signed __int64 v42; // rax@33
- unsigned int v43; // ecx@34
- _DWORD *v44; // rbp@37
- _DWORD *SizePointer; // rax@37
- __int64 Size; // rdi@39
- __int64 v47; // rax@42
- __int64 v48; // rcx@44
- __int64 v49; // rax@44
- int ReadingLeft2; // [sp+60h] [bp+18h]@4
- ReadSize = ReadingSize;
- ReadingPointer = ReadingStart;
- StreamReader = a1;
- IsValid = 0;
- ReadingEndPointer = ReadingStart + (unsigned int)ReadingSize;
- LABEL_2:
- while ( ReadingPointer != ReadingEndPointer || !ReadSize )
- {
- ReaderState = StreamReader->ReadingState;
- ReadingLeft1 = ReadingEndPointer - ReadingPointer;
- ReadingLeft2 = ReadingEndPointer - ReadingPointer;
- switch ( ReaderState )
- {
- case 0:
- v10 = &StreamReader->Header;
- *(_QWORD *)&v10->magic = *(_QWORD *)ReadingPointer;
- *(_QWORD *)&v10->PayloadSize = *(_QWORD *)(ReadingPointer + 8);
- *(_QWORD *)&v10->numInstanceRepeater = *(_QWORD *)(ReadingPointer + 0x10);
- *(_QWORD *)&v10->numField = *(_QWORD *)(ReadingPointer + 0x18);
- *(_QWORD *)&v10->numArrayRepeater = *(_QWORD *)(ReadingPointer + 0x20);
- *(_QWORD *)&v10->GUID[0] = *(_QWORD *)(ReadingPointer + 0x28);
- *(_QWORD *)&v10->GUID[8] = *(_QWORD *)(ReadingPointer + 0x30);
- *(_QWORD *)&v10->padding[0] = *(_QWORD *)(ReadingPointer + 0x38);
- magic = StreamReader->Header.magic;
- if ( magic == 0xFB2D1CE )
- {
- StreamReader->isLittleEndian = 0;
- }
- else if ( magic == 0xCED1B20F )
- {
- StreamReader->isLittleEndian = 1;
- sub_142FEE1FD();
- }
- AbsStringOffset = StreamReader->Header.absStringOffset;
- if ( (_DWORD)AbsStringOffset + StreamReader->Header.PayloadSize == ReadingLeft1 )
- {
- IsValid = 1;
- }
- else
- {
- LODWORD(v13) = sub_142F9DEA2((struct_a1_2 *)StreamReader->pstruct_a1_118, AbsStringOffset, 16i64);
- v14 = StreamReader->Header.PayloadSize;
- v15 = StreamReader->pstruct_a1_118;
- StreamReader->qword110 = v13;
- StreamReader->dword118 = 0;
- LODWORD(v16) = sub_142F9DEA2((struct_a1_2 *)v15, v14, 16i64);
- StreamReader->ReadSize = 0;
- StreamReader->ReadStart = v16;
- }
- v17 = StreamReader->pstruct_v1710;
- ReadingPointer += 0x40i64;
- StreamReader->dword80 = StreamReader->Header.absStringOffset - 0x40;
- StreamReader->PayloadSize = StreamReader->Header.PayloadSize;
- if ( v17 )
- {
- ProcessEBX(v17->pstruct_v310, &v17->struct_v5_10, (struct_v4_1 *)StreamReader->Header.GUID);
- }
- StreamReader->ReadingState = 1;
- goto LABEL_2;
- case 1:
- v18 = (char *)&StreamReader->dword80;
- v19 = (char *)&ReadingLeft2;
- if ( StreamReader->dword80 < ReadingLeft1 )
- {
- v19 = (char *)&StreamReader->dword80;
- }
- v20 = *(_DWORD *)v19;
- if ( IsValid )
- {
- StreamReader->GUIDOffset = ReadingPointer;
- StreamReader->ReadingState = 2;
- ReadingPointer += v20;
- }
- else
- {
- v21 = __CFADD__(StreamReader->qword110, StreamReader->dword118);
- sub_1441D0E8C();
- StreamReader->dword118 += v20;
- v22 = *(_DWORD *)v18 == (_DWORD)v20;
- *(_DWORD *)v18 -= v20;
- if ( v22 )
- {
- v23 = StreamReader->qword110;
- StreamReader->ReadingState = 2;
- StreamReader->GUIDOffset = v23;
- }
- ReadingPointer += v20;
- }
- goto LABEL_2;
- case 2:
- GUIDOffset = StreamReader->GUIDOffset;
- NumGUIDs = StreamReader->Header.numGUID;
- StreamReader->GUIDOffset2 = GUIDOffset;
- KeywordAreaStart = 0x20i64 * (unsigned int)NumGUIDs + GUIDOffset;
- KeywordAreaSize = StreamReader->Header.lenName;
- StreamReader->KeywordAreaOffset = KeywordAreaStart;
- FieldDescStart = (FieldDescriptor *)(KeywordAreaSize + KeywordAreaStart);
- FieldDescSize = 0x10i64 * StreamReader->Header.numField;
- StreamReader->FieldDescStart = FieldDescStart;
- ComplexDescStart = (ComplexField *)((char *)FieldDescStart + ((FieldDescSize + 15) & 0xFFFFFFFFFFFFFFF0ui64));
- ComplexDescSize = StreamReader->Header.numComplex;
- StreamReader->ComplexDescOffset = ComplexDescStart;
- InstanceRepListStart = &ComplexDescStart[ComplexDescSize];
- InstanceRepListSize = 4i64 * StreamReader->Header.numInstanceRepeater + 15;
- StreamReader->InstanceRepListOffset = InstanceRepListStart;
- v22 = StreamReader->isLittleEndian == 0;
- StreamReader->ArrayRepListOffset = (char *)InstanceRepListStart + (InstanceRepListSize & 0xFFFFFFFFFFFFFFF0ui64);
- if ( !v22 )
- {
- sub_142FEE2B1(StreamReader->GUIDOffset2, NumGUIDs);
- if ( StreamReader->Header.numField )
- {
- v34 = (char *)&StreamReader->FieldDescStart->reference;
- NumGUIDs = StreamReader->Header.numField;
- do
- {
- v35 = *(_DWORD *)(v34 - 6);
- v34 += 16;
- *(_DWORD *)(v34 - 22) = _byteswap_ulong(v35);
- LOWORD(v35) = __ROR2__(*((_WORD *)v34 - 9), 8);
- *((_WORD *)v34 - 9) = v35;
- LOWORD(v35) = __ROR2__(*((_WORD *)v34 - 8), 8);
- *((_WORD *)v34 - 8) = v35;
- *(_DWORD *)(v34 - 14) = _byteswap_ulong(*(_DWORD *)(v34 - 14));
- *(_DWORD *)(v34 - 10) = _byteswap_ulong(*(_DWORD *)(v34 - 10));
- --NumGUIDs;
- }
- while ( NumGUIDs );
- }
- if ( StreamReader->Header.numComplex )
- {
- v36 = (char *)&StreamReader->ComplexDescOffset->type;
- NumGUIDs = StreamReader->Header.numComplex;
- do
- {
- v37 = *(_DWORD *)(v36 - 10);
- v36 += 16;
- *(_DWORD *)(v36 - 26) = _byteswap_ulong(v37);
- *(_DWORD *)(v36 - 22) = _byteswap_ulong(*(_DWORD *)(v36 - 22));
- LOWORD(v37) = __ROR2__(*((_WORD *)v36 - 8), 8);
- *((_WORD *)v36 - 8) = v37;
- LOWORD(v37) = __ROR2__(*((_WORD *)v36 - 7), 8);
- *((_WORD *)v36 - 7) = v37;
- LOWORD(v37) = __ROR2__(*((_WORD *)v36 - 6), 8);
- *((_WORD *)v36 - 6) = v37;
- --NumGUIDs;
- }
- while ( NumGUIDs );
- }
- v38 = StreamReader->InstanceRepListOffset;
- if ( StreamReader->Header.numInstanceRepeater )
- {
- NumGUIDs = StreamReader->Header.numInstanceRepeater;
- do
- {
- v39 = *(_WORD *)v38;
- v38 += 4i64;
- v39 = __ROR2__(v39, 8);
- *(_WORD *)(v38 - 4) = v39;
- v40 = __ROR2__(*(_WORD *)(v38 - 2), 8);
- *(_WORD *)(v38 - 2) = v40;
- --NumGUIDs;
- }
- while ( NumGUIDs );
- }
- v41 = StreamReader->Header.numArrayRepeater;
- if ( v41 )
- {
- v42 = StreamReader->ArrayRepListOffset + 8i64;
- NumGUIDs = v41;
- do
- {
- v43 = *(_DWORD *)(v42 - 8);
- v42 += 0xCi64;
- *(_DWORD *)(v42 - 20) = _byteswap_ulong(v43);
- *(_DWORD *)(v42 - 16) = _byteswap_ulong(*(_DWORD *)(v42 - 16));
- *(_DWORD *)(v42 - 12) = _byteswap_ulong(*(_DWORD *)(v42 - 12));
- --NumGUIDs;
- }
- while ( NumGUIDs );
- }
- }
- ProcessGUIDs(StreamReader, NumGUIDs, ReadingSize);
- StreamReader->ReadingState = 5;
- goto LABEL_2;
- case 5:
- ProcessMeta(StreamReader);
- StreamReader->ReadingState = 3;
- goto LABEL_2;
- case 3:
- v44 = &StreamReader->PayloadSize;
- SizePointer = &ReadingLeft2;
- if ( StreamReader->PayloadSize < ReadingLeft1 )
- {
- SizePointer = &StreamReader->PayloadSize;
- }
- Size = *SizePointer;
- if ( IsValid )
- {
- StreamReader->PayloadOffset = ReadingPointer;
- StreamReader->ReadingState = 4;
- ReadingPointer += Size;
- }
- else
- {
- v21 = __CFADD__(StreamReader->ReadStart, StreamReader->ReadSize);
- sub_1441D0E8C();
- *v44 -= Size;
- StreamReader->ReadSize += Size;
- if ( !*v44 )
- {
- v47 = StreamReader->ReadStart;
- StreamReader->ReadingState = 4;
- StreamReader->PayloadOffset = v47;
- }
- ReadingPointer += Size;
- }
- goto LABEL_2;
- case 4:
- v48 = StreamReader->PayloadOffset;
- v49 = StreamReader->Header.lenString;
- StreamReader->ReadingState = 6;
- StreamReader->PayLoadStart2 = v48;
- StreamReader->PayLoadStart = v48 + v49;
- return;
- case 6:
- JUMPOUT(unk_142FF54F6); // start loading ebx
- return;
- case 7:
- return;
- default:
- goto LABEL_2;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement