Advertisement
Guest User

Untitled

a guest
Jun 12th, 2015
522
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.46 KB | None | 0 0
  1. void __fastcall StartReadEBX(struct_StreamReader_5 *a1, __int64 ReadingStart, __int64 ReadingSize)
  2. {
  3.   int ReadSize; // er15@1
  4.   __int64 ReadingPointer; // rsi@1
  5.   struct_StreamReader_5 *StreamReader; // rbx@1
  6.   char IsValid; // r12@1
  7.   __int64 ReadingEndPointer; // r14@1
  8.   int ReaderState; // eax@4
  9.   unsigned int ReadingLeft1; // edi@4
  10.   EBXHeader *v10; // rcx@5
  11.   int magic; // eax@5
  12.   __int64 AbsStringOffset; // rdx@9
  13.   __int64 v13; // rax@11
  14.   __int64 v14; // rdx@11
  15.   struct_a1_1 *v15; // rcx@11
  16.   __int64 v16; // rax@11
  17.   struct_v17 *v17; // rcx@12
  18.   char *v18; // rbp@15
  19.   char *v19; // rax@15
  20.   __int64 v20; // rdi@17
  21.   unsigned __int8 v21; // cf@19
  22.   bool v22; // zf@19
  23.   __int64 v23; // rax@20
  24.   __int64 GUIDOffset; // rcx@22
  25.   __int64 NumGUIDs; // rdx@22
  26.   signed __int64 KeywordAreaStart; // rcx@22
  27.   __int64 KeywordAreaSize; // rax@22
  28.   FieldDescriptor *FieldDescStart; // rcx@22
  29.   signed __int64 FieldDescSize; // rax@22
  30.   ComplexField *ComplexDescStart; // rcx@22
  31.   signed __int64 ComplexDescSize; // rax@22
  32.   ComplexField *InstanceRepListStart; // rcx@22
  33.   signed __int64 InstanceRepListSize; // rax@22
  34.   char *v34; // rcx@24
  35.   unsigned int v35; // eax@25
  36.   char *v36; // rcx@27
  37.   unsigned int v37; // eax@28
  38.   __int64 v38; // rcx@29
  39.   __int16 v39; // ax@31
  40.   __int16 v40; // ax@31
  41.   unsigned int v41; // ecx@32
  42.   signed __int64 v42; // rax@33
  43.   unsigned int v43; // ecx@34
  44.   _DWORD *v44; // rbp@37
  45.   _DWORD *SizePointer; // rax@37
  46.   __int64 Size; // rdi@39
  47.   __int64 v47; // rax@42
  48.   __int64 v48; // rcx@44
  49.   __int64 v49; // rax@44
  50.   int ReadingLeft2; // [sp+60h] [bp+18h]@4
  51.  
  52.   ReadSize = ReadingSize;
  53.   ReadingPointer = ReadingStart;
  54.   StreamReader = a1;
  55.   IsValid = 0;
  56.   ReadingEndPointer = ReadingStart + (unsigned int)ReadingSize;
  57. LABEL_2:
  58.   while ( ReadingPointer != ReadingEndPointer || !ReadSize )
  59.   {
  60.     ReaderState = StreamReader->ReadingState;
  61.     ReadingLeft1 = ReadingEndPointer - ReadingPointer;
  62.     ReadingLeft2 = ReadingEndPointer - ReadingPointer;
  63.     switch ( ReaderState )
  64.     {
  65.       case 0:
  66.         v10 = &StreamReader->Header;
  67.         *(_QWORD *)&v10->magic = *(_QWORD *)ReadingPointer;
  68.         *(_QWORD *)&v10->PayloadSize = *(_QWORD *)(ReadingPointer + 8);
  69.         *(_QWORD *)&v10->numInstanceRepeater = *(_QWORD *)(ReadingPointer + 0x10);
  70.         *(_QWORD *)&v10->numField = *(_QWORD *)(ReadingPointer + 0x18);
  71.         *(_QWORD *)&v10->numArrayRepeater = *(_QWORD *)(ReadingPointer + 0x20);
  72.         *(_QWORD *)&v10->GUID[0] = *(_QWORD *)(ReadingPointer + 0x28);
  73.         *(_QWORD *)&v10->GUID[8] = *(_QWORD *)(ReadingPointer + 0x30);
  74.         *(_QWORD *)&v10->padding[0] = *(_QWORD *)(ReadingPointer + 0x38);
  75.         magic = StreamReader->Header.magic;
  76.         if ( magic == 0xFB2D1CE )
  77.         {
  78.           StreamReader->isLittleEndian = 0;
  79.         }
  80.         else if ( magic == 0xCED1B20F )
  81.         {
  82.           StreamReader->isLittleEndian = 1;
  83.           sub_142FEE1FD();
  84.         }
  85.         AbsStringOffset = StreamReader->Header.absStringOffset;
  86.         if ( (_DWORD)AbsStringOffset + StreamReader->Header.PayloadSize == ReadingLeft1 )
  87.         {
  88.           IsValid = 1;
  89.         }
  90.         else
  91.         {
  92.           LODWORD(v13) = sub_142F9DEA2((struct_a1_2 *)StreamReader->pstruct_a1_118, AbsStringOffset, 16i64);
  93.           v14 = StreamReader->Header.PayloadSize;
  94.           v15 = StreamReader->pstruct_a1_118;
  95.           StreamReader->qword110 = v13;
  96.           StreamReader->dword118 = 0;
  97.           LODWORD(v16) = sub_142F9DEA2((struct_a1_2 *)v15, v14, 16i64);
  98.           StreamReader->ReadSize = 0;
  99.           StreamReader->ReadStart = v16;
  100.         }
  101.         v17 = StreamReader->pstruct_v1710;
  102.         ReadingPointer += 0x40i64;
  103.         StreamReader->dword80 = StreamReader->Header.absStringOffset - 0x40;
  104.         StreamReader->PayloadSize = StreamReader->Header.PayloadSize;
  105.         if ( v17 )
  106.         {
  107.           ProcessEBX(v17->pstruct_v310, &v17->struct_v5_10, (struct_v4_1 *)StreamReader->Header.GUID);
  108.         }
  109.         StreamReader->ReadingState = 1;
  110.         goto LABEL_2;
  111.       case 1:
  112.         v18 = (char *)&StreamReader->dword80;
  113.         v19 = (char *)&ReadingLeft2;
  114.         if ( StreamReader->dword80 < ReadingLeft1 )
  115.         {
  116.           v19 = (char *)&StreamReader->dword80;
  117.         }
  118.         v20 = *(_DWORD *)v19;
  119.         if ( IsValid )
  120.         {
  121.           StreamReader->GUIDOffset = ReadingPointer;
  122.           StreamReader->ReadingState = 2;
  123.           ReadingPointer += v20;
  124.         }
  125.         else
  126.         {
  127.           v21 = __CFADD__(StreamReader->qword110, StreamReader->dword118);
  128.           sub_1441D0E8C();
  129.           StreamReader->dword118 += v20;
  130.           v22 = *(_DWORD *)v18 == (_DWORD)v20;
  131.           *(_DWORD *)v18 -= v20;
  132.           if ( v22 )
  133.           {
  134.             v23 = StreamReader->qword110;
  135.             StreamReader->ReadingState = 2;
  136.             StreamReader->GUIDOffset = v23;
  137.           }
  138.           ReadingPointer += v20;
  139.         }
  140.         goto LABEL_2;
  141.       case 2:
  142.         GUIDOffset = StreamReader->GUIDOffset;
  143.         NumGUIDs = StreamReader->Header.numGUID;
  144.         StreamReader->GUIDOffset2 = GUIDOffset;
  145.         KeywordAreaStart = 0x20i64 * (unsigned int)NumGUIDs + GUIDOffset;
  146.         KeywordAreaSize = StreamReader->Header.lenName;
  147.         StreamReader->KeywordAreaOffset = KeywordAreaStart;
  148.         FieldDescStart = (FieldDescriptor *)(KeywordAreaSize + KeywordAreaStart);
  149.         FieldDescSize = 0x10i64 * StreamReader->Header.numField;
  150.         StreamReader->FieldDescStart = FieldDescStart;
  151.         ComplexDescStart = (ComplexField *)((char *)FieldDescStart + ((FieldDescSize + 15) & 0xFFFFFFFFFFFFFFF0ui64));
  152.         ComplexDescSize = StreamReader->Header.numComplex;
  153.         StreamReader->ComplexDescOffset = ComplexDescStart;
  154.         InstanceRepListStart = &ComplexDescStart[ComplexDescSize];
  155.         InstanceRepListSize = 4i64 * StreamReader->Header.numInstanceRepeater + 15;
  156.         StreamReader->InstanceRepListOffset = InstanceRepListStart;
  157.         v22 = StreamReader->isLittleEndian == 0;
  158.         StreamReader->ArrayRepListOffset = (char *)InstanceRepListStart + (InstanceRepListSize & 0xFFFFFFFFFFFFFFF0ui64);
  159.         if ( !v22 )
  160.         {
  161.           sub_142FEE2B1(StreamReader->GUIDOffset2, NumGUIDs);
  162.           if ( StreamReader->Header.numField )
  163.           {
  164.             v34 = (char *)&StreamReader->FieldDescStart->reference;
  165.             NumGUIDs = StreamReader->Header.numField;
  166.             do
  167.             {
  168.               v35 = *(_DWORD *)(v34 - 6);
  169.               v34 += 16;
  170.               *(_DWORD *)(v34 - 22) = _byteswap_ulong(v35);
  171.               LOWORD(v35) = __ROR2__(*((_WORD *)v34 - 9), 8);
  172.               *((_WORD *)v34 - 9) = v35;
  173.               LOWORD(v35) = __ROR2__(*((_WORD *)v34 - 8), 8);
  174.               *((_WORD *)v34 - 8) = v35;
  175.               *(_DWORD *)(v34 - 14) = _byteswap_ulong(*(_DWORD *)(v34 - 14));
  176.               *(_DWORD *)(v34 - 10) = _byteswap_ulong(*(_DWORD *)(v34 - 10));
  177.               --NumGUIDs;
  178.             }
  179.             while ( NumGUIDs );
  180.           }
  181.           if ( StreamReader->Header.numComplex )
  182.           {
  183.             v36 = (char *)&StreamReader->ComplexDescOffset->type;
  184.             NumGUIDs = StreamReader->Header.numComplex;
  185.             do
  186.             {
  187.               v37 = *(_DWORD *)(v36 - 10);
  188.               v36 += 16;
  189.               *(_DWORD *)(v36 - 26) = _byteswap_ulong(v37);
  190.               *(_DWORD *)(v36 - 22) = _byteswap_ulong(*(_DWORD *)(v36 - 22));
  191.               LOWORD(v37) = __ROR2__(*((_WORD *)v36 - 8), 8);
  192.               *((_WORD *)v36 - 8) = v37;
  193.               LOWORD(v37) = __ROR2__(*((_WORD *)v36 - 7), 8);
  194.               *((_WORD *)v36 - 7) = v37;
  195.               LOWORD(v37) = __ROR2__(*((_WORD *)v36 - 6), 8);
  196.               *((_WORD *)v36 - 6) = v37;
  197.               --NumGUIDs;
  198.             }
  199.             while ( NumGUIDs );
  200.           }
  201.           v38 = StreamReader->InstanceRepListOffset;
  202.           if ( StreamReader->Header.numInstanceRepeater )
  203.           {
  204.             NumGUIDs = StreamReader->Header.numInstanceRepeater;
  205.             do
  206.             {
  207.               v39 = *(_WORD *)v38;
  208.               v38 += 4i64;
  209.               v39 = __ROR2__(v39, 8);
  210.               *(_WORD *)(v38 - 4) = v39;
  211.               v40 = __ROR2__(*(_WORD *)(v38 - 2), 8);
  212.               *(_WORD *)(v38 - 2) = v40;
  213.               --NumGUIDs;
  214.             }
  215.             while ( NumGUIDs );
  216.           }
  217.           v41 = StreamReader->Header.numArrayRepeater;
  218.           if ( v41 )
  219.           {
  220.             v42 = StreamReader->ArrayRepListOffset + 8i64;
  221.             NumGUIDs = v41;
  222.             do
  223.             {
  224.               v43 = *(_DWORD *)(v42 - 8);
  225.               v42 += 0xCi64;
  226.               *(_DWORD *)(v42 - 20) = _byteswap_ulong(v43);
  227.               *(_DWORD *)(v42 - 16) = _byteswap_ulong(*(_DWORD *)(v42 - 16));
  228.               *(_DWORD *)(v42 - 12) = _byteswap_ulong(*(_DWORD *)(v42 - 12));
  229.               --NumGUIDs;
  230.             }
  231.             while ( NumGUIDs );
  232.           }
  233.         }
  234.         ProcessGUIDs(StreamReader, NumGUIDs, ReadingSize);
  235.         StreamReader->ReadingState = 5;
  236.         goto LABEL_2;
  237.       case 5:
  238.         ProcessMeta(StreamReader);
  239.         StreamReader->ReadingState = 3;
  240.         goto LABEL_2;
  241.       case 3:
  242.         v44 = &StreamReader->PayloadSize;
  243.         SizePointer = &ReadingLeft2;
  244.         if ( StreamReader->PayloadSize < ReadingLeft1 )
  245.         {
  246.           SizePointer = &StreamReader->PayloadSize;
  247.         }
  248.         Size = *SizePointer;
  249.         if ( IsValid )
  250.         {
  251.           StreamReader->PayloadOffset = ReadingPointer;
  252.           StreamReader->ReadingState = 4;
  253.           ReadingPointer += Size;
  254.         }
  255.         else
  256.         {
  257.           v21 = __CFADD__(StreamReader->ReadStart, StreamReader->ReadSize);
  258.           sub_1441D0E8C();
  259.           *v44 -= Size;
  260.           StreamReader->ReadSize += Size;
  261.           if ( !*v44 )
  262.           {
  263.             v47 = StreamReader->ReadStart;
  264.             StreamReader->ReadingState = 4;
  265.             StreamReader->PayloadOffset = v47;
  266.           }
  267.           ReadingPointer += Size;
  268.         }
  269.         goto LABEL_2;
  270.       case 4:
  271.         v48 = StreamReader->PayloadOffset;
  272.         v49 = StreamReader->Header.lenString;
  273.         StreamReader->ReadingState = 6;
  274.         StreamReader->PayLoadStart2 = v48;
  275.         StreamReader->PayLoadStart = v48 + v49;
  276.         return;
  277.       case 6:
  278.         JUMPOUT(unk_142FF54F6);                 // start loading ebx
  279.         return;
  280.       case 7:
  281.         return;
  282.       default:
  283.         goto LABEL_2;
  284.     }
  285.   }
  286. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement