Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void *__fastcall _RTDynamicCast(void *inptr, int VfDelta, void *SrcType, void *TargetType, int isReference)
- {
- TypeDescriptor *v5; // r15@1
- TypeDescriptor *v6; // r12@1
- __int64 v7; // r13@1
- void *v8; // r14@1
- void *v9; // rbx@1
- void *v10; // rax@2
- __int64 v11; // rsi@3
- char *v12; // rdi@3
- PVOID v13; // rcx@6
- __int64 v14; // r14@8
- int v15; // edx@8
- _s_RTTIBaseClassDescriptor *v16; // rax@9
- std::bad_cast result; // [sp+40h] [bp-48h]@18
- PVOID BaseOfImage; // [sp+90h] [bp+8h]@6
- v5 = (TypeDescriptor *)TargetType;
- v6 = (TypeDescriptor *)SrcType;
- v7 = VfDelta;
- v8 = inptr;
- v9 = 0i64;
- if ( inptr )
- {
- v11 = *(_QWORD *)(*(_QWORD *)inptr - 8i64);
- v12 = (char *)inptr - *(_DWORD *)(v11 + 4);
- if ( *(_DWORD *)(v11 + 8) )
- v12 -= *(_DWORD *)((char *)inptr - *(_DWORD *)(v11 + 8));
- if ( *(_DWORD *)v11 )
- {
- v13 = (PVOID)(v11 - *(_DWORD *)(v11 + 20));
- }
- else
- {
- v13 = RtlPcToFileHeader((PVOID)v11, &BaseOfImage);
- BaseOfImage = v13;
- }
- v14 = (char *)v8 - v7 - v12;
- v15 = *(_DWORD *)((char *)v13 + *(_DWORD *)(v11 + 16) + 4);
- if ( v15 & 1 )
- {
- if ( v15 & 2 )
- v16 = FindVITargetTypeInstance(v12, (_s_RTTICompleteObjectLocator *)v11, v6, v14, v5, (unsigned __int64)v13);
- else
- v16 = FindMITargetTypeInstance(v12, (_s_RTTICompleteObjectLocator *)v11, v6, v14, v5, (unsigned __int64)v13);
- }
- else
- {
- v16 = FindSITargetTypeInstance((_s_RTTICompleteObjectLocator *)v11, v6, v5, (unsigned __int64)v13);
- }
- if ( v16 )
- {
- if ( v16->where.pdisp >= 0 )
- v9 = (void *)(*(_DWORD *)(*(_QWORD *)&v12[v16->where.pdisp] + v16->where.vdisp)
- + (signed __int64)v16->where.pdisp);
- v9 = (char *)v9 + v16->where.mdisp + (_QWORD)v12;
- }
- else if ( isReference )
- {
- std::bad_cast::__construct_from_string_literal(&result, (const char *const )v16);
- CxxThrowException(&result, &TI2_AVbad_cast_std__);
- }
- v10 = v9;
- }
- else
- {
- v10 = 0i64;
- }
- return v10;
- }
- unsigned __int64 __fastcall FindVITargetTypeInstance(void *pCompleteObject, _s_RTTICompleteObjectLocator *pCOLocator, TypeDescriptor *pSrcTypeID, __int64 SrcOffset, TypeDescriptor *pTargetTypeID, unsigned __int64 _ImageBase)
- {
- unsigned __int64 v6; // rdi@1
- signed __int64 v7; // r8@1
- __int64 v8; // rax@1
- signed int v9; // er12@1
- unsigned __int64 v10; // rsi@1
- unsigned __int64 v11; // r14@1
- unsigned __int64 v12; // rbp@1
- unsigned __int64 v13; // r11@1
- unsigned int v14; // er13@1
- char v15; // r9@1
- unsigned __int64 v16; // r15@1
- signed int v17; // ebx@1
- unsigned __int64 v18; // rdx@2
- TypeDescriptor *v19; // rax@3
- signed __int64 v20; // rax@4
- char *v21; // r10@4
- int v22; // er8@5
- int v23; // ecx@5
- unsigned __int64 v24; // rax@8
- TypeDescriptor *v25; // rax@11
- signed __int64 v26; // rax@12
- signed __int64 v27; // r10@12
- int v28; // er8@13
- int v29; // ecx@13
- __int64 v30; // r8@19
- char v31; // dl@25
- __int64 v32; // rcx@26
- bool v33; // zf@26
- char v34; // cl@26
- signed __int64 v35; // rdx@31
- void *v37; // [sp+48h] [bp+8h]@1
- signed __int64 v38; // [sp+50h] [bp+10h]@1
- TypeDescriptor *v39; // [sp+58h] [bp+18h]@1
- __int64 v40; // [sp+60h] [bp+20h]@1
- unsigned int _ImageBasea; // [sp+70h] [bp+30h]@1
- v40 = SrcOffset;
- v39 = pSrcTypeID;
- v37 = pCompleteObject;
- v6 = _ImageBase;
- v7 = 0i64;
- v8 = pCOLocator->pClassDescriptor;
- v9 = -1;
- v38 = -1i64;
- v10 = 0i64;
- v11 = 0i64;
- v12 = 0i64;
- v13 = 0i64;
- v14 = 0;
- v15 = 1;
- v16 = _ImageBase + *(_DWORD *)(v8 + _ImageBase + 12);
- _ImageBasea = *(_DWORD *)(v8 + _ImageBase + 8);
- v17 = 0;
- if ( !_ImageBasea )
- return 0i64;
- do
- {
- v18 = v6 + *(_DWORD *)v16;
- if ( v17 - v9 > v14 )
- {
- v19 = (TypeDescriptor *)(v6 + *(_DWORD *)v18);
- if ( v19 == pTargetTypeID )
- goto LABEL_49;
- v20 = (signed __int64)&v19[1];
- v21 = (char *)&pTargetTypeID[1] - v20;
- do
- {
- v22 = (unsigned __int8)v21[v20];
- v23 = *(_BYTE *)v20 - v22;
- if ( *(_BYTE *)v20 != v22 )
- break;
- ++v20;
- }
- while ( v22 );
- v7 = 0i64;
- if ( !v23 )
- {
- LABEL_49:
- v24 = v6 + *(_DWORD *)v16;
- v14 = *(_DWORD *)(v18 + 4);
- v13 = v6 + *(_DWORD *)v16;
- if ( *(_BYTE *)(v18 + 20) & 3 )
- v24 = v12;
- v9 = v17;
- v12 = v24;
- }
- }
- v25 = (TypeDescriptor *)(v6 + *(_DWORD *)v18);
- if ( v25 == v39 )
- goto LABEL_50;
- v26 = (signed __int64)&v25[1];
- v27 = (signed __int64)((char *)&v39[1] - v26);
- do
- {
- v28 = *(_BYTE *)(v26 + v27);
- v29 = *(_BYTE *)v26 - v28;
- if ( *(_BYTE *)v26 != v28 )
- break;
- ++v26;
- }
- while ( v28 );
- v7 = 0i64;
- if ( !v29 )
- {
- LABEL_50:
- if ( *(_DWORD *)(v18 + 12) >= 0 )
- v7 = *(_DWORD *)(*(_QWORD *)((char *)v37 + *(_DWORD *)(v18 + 12)) + *(_DWORD *)(v18 + 16))
- + (signed __int64)*(_DWORD *)(v18 + 12);
- if ( v7 + *(_DWORD *)(v18 + 8) != v40 )
- goto LABEL_38;
- v30 = (unsigned int)(v17 - v9);
- if ( (unsigned int)v30 > v14 )
- {
- if ( !(*(_BYTE *)(v18 + 20) & 5) )
- v11 = v6 + *(_DWORD *)v16;
- LABEL_38:
- v7 = 0i64;
- goto LABEL_39;
- }
- if ( !v15 )
- goto LABEL_38;
- if ( *(_BYTE *)(v13 + 20) & 0x40 )
- {
- v32 = *(_DWORD *)(v6 + *(_DWORD *)(*(_DWORD *)(v13 + 24) + v6 + 12) + 4 * v30);
- v7 = 0i64;
- v31 = ~(unsigned __int8)(*(_DWORD *)(v32 + v6 + 20) >> 2) & 1;
- v33 = (*(_BYTE *)(v32 + v6 + 20) & 1) == 0;
- v34 = 0;
- if ( v33 )
- v34 = v15;
- v15 = v34;
- }
- else
- {
- v7 = 0i64;
- if ( !v9 && *(_BYTE *)(v18 + 20) & 1 )
- v15 = 0;
- v31 = 1;
- }
- if ( v15 && v31 )
- {
- v35 = 0i64;
- if ( *(_DWORD *)(v13 + 12) >= 0 )
- v35 = *(_DWORD *)(*(_QWORD *)((char *)v37 + *(_DWORD *)(v13 + 12)) + *(_DWORD *)(v13 + 16))
- + (signed __int64)*(_DWORD *)(v13 + 12);
- if ( v10 && v38 != v35 + *(_DWORD *)(v13 + 8) )
- return 0i64;
- v10 = v13;
- v38 = v35 + *(_DWORD *)(v13 + 8);
- }
- }
- LABEL_39:
- ++v17;
- v16 += 4i64;
- }
- while ( v17 < _ImageBasea );
- if ( v15 && v10 )
- return v10;
- if ( v11 && v12 )
- return v12;
- return 0i64;
- }
- unsigned __int64 __fastcall FindMITargetTypeInstance(void *pCompleteObject, _s_RTTICompleteObjectLocator *pCOLocator, TypeDescriptor *pSrcTypeID, __int64 SrcOffset, TypeDescriptor *pTargetTypeID, unsigned __int64 _ImageBase)
- {
- __int64 v6; // rax@1
- signed int v7; // edi@1
- TypeDescriptor *v8; // r13@1
- unsigned __int64 v9; // r10@1
- unsigned __int64 v10; // rsi@1
- unsigned int v11; // er14@1
- signed int v12; // er8@1
- unsigned int v13; // er12@1
- unsigned __int64 v14; // rbp@1
- unsigned __int64 v15; // rdx@2
- TypeDescriptor *v16; // rax@3
- signed __int64 v17; // rax@4
- char *v18; // rbx@4
- int v19; // er9@5
- int v20; // ecx@5
- unsigned __int64 v21; // rax@10
- signed __int64 v22; // rax@11
- signed __int64 v23; // rbx@11
- int v24; // er9@12
- int v25; // ecx@12
- signed __int64 v26; // r9@15
- __int64 v28; // r8@25
- void *v29; // [sp+38h] [bp+8h]@1
- __int64 v30; // [sp+50h] [bp+20h]@1
- v30 = SrcOffset;
- v29 = pCompleteObject;
- v6 = pCOLocator->pClassDescriptor;
- v7 = -1;
- v8 = pSrcTypeID;
- v9 = 0i64;
- v10 = 0i64;
- v11 = 0;
- v12 = 0;
- v13 = *(_DWORD *)(v6 + _ImageBase + 8);
- v14 = _ImageBase + *(_DWORD *)(v6 + _ImageBase + 12);
- if ( !v13 )
- return 0i64;
- while ( 1 )
- {
- v15 = _ImageBase + *(_DWORD *)v14;
- if ( v12 - v7 > v11 )
- {
- v16 = (TypeDescriptor *)(_ImageBase + *(_DWORD *)v15);
- if ( v16 == pTargetTypeID )
- goto LABEL_37;
- v17 = (signed __int64)&v16[1];
- v18 = (char *)&pTargetTypeID[1] - v17;
- do
- {
- v19 = (unsigned __int8)v18[v17];
- v20 = *(_BYTE *)v17 - v19;
- if ( *(_BYTE *)v17 != v19 )
- break;
- ++v17;
- }
- while ( v19 );
- if ( !v20 )
- {
- LABEL_37:
- if ( v10 )
- {
- if ( !(*(_BYTE *)(v15 + 20) & 3) && !(*(_BYTE *)(v10 + 20) & 1) )
- return _ImageBase + *(_DWORD *)v14;
- return 0i64;
- }
- v11 = *(_DWORD *)(v15 + 4);
- v9 = _ImageBase + *(_DWORD *)v14;
- v7 = v12;
- }
- }
- v21 = _ImageBase + *(_DWORD *)v15;
- if ( (TypeDescriptor *)v21 == v8 )
- goto LABEL_38;
- v22 = v21 + 16;
- v23 = (signed __int64)((char *)&v8[1] - v22);
- do
- {
- v24 = *(_BYTE *)(v22 + v23);
- v25 = *(_BYTE *)v22 - v24;
- if ( *(_BYTE *)v22 != v24 )
- break;
- ++v22;
- }
- while ( v24 );
- if ( !v25 )
- {
- LABEL_38:
- v26 = 0i64;
- if ( *(_DWORD *)(v15 + 12) >= 0 )
- v26 = *(_DWORD *)(*(_QWORD *)((char *)v29 + *(_DWORD *)(v15 + 12)) + *(_DWORD *)(v15 + 16))
- + (signed __int64)*(_DWORD *)(v15 + 12);
- if ( v26 + *(_DWORD *)(v15 + 8) == v30 )
- break;
- }
- LABEL_20:
- ++v12;
- v14 += 4i64;
- if ( v12 >= v13 )
- return 0i64;
- }
- if ( !v9 )
- {
- v10 = _ImageBase + *(_DWORD *)v14;
- goto LABEL_20;
- }
- v28 = (unsigned int)(v12 - v7);
- if ( (unsigned int)v28 <= v11 )
- {
- if ( *(_BYTE *)(v9 + 20) & 0x40 )
- {
- if ( *(_BYTE *)(*(_DWORD *)(_ImageBase + *(_DWORD *)(*(_DWORD *)(v9 + 24) + _ImageBase + 12) + 4 * v28)
- + _ImageBase
- + 20) & 1 )
- v9 = 0i64;
- }
- else if ( !v7 )
- {
- LABEL_28:
- if ( *(_BYTE *)(v15 + 20) & 1 )
- return 0i64;
- }
- return v9;
- }
- if ( !(*(_BYTE *)(v9 + 20) & 3) )
- goto LABEL_28;
- return 0i64;
- }
- unsigned __int64 __fastcall FindSITargetTypeInstance(_s_RTTICompleteObjectLocator *pCOLocator, TypeDescriptor *pSrcTypeID, TypeDescriptor *pTargetTypeID, unsigned __int64 _ImageBase)
- {
- __int64 v4; // rax@1
- unsigned __int64 v5; // r11@1
- unsigned int v6; // ecx@1
- TypeDescriptor *v7; // rbp@1
- TypeDescriptor *v8; // r14@1
- unsigned int v9; // esi@1
- unsigned __int64 v10; // r10@1
- unsigned __int64 v11; // r8@2
- unsigned __int64 v12; // rbx@3
- TypeDescriptor *v13; // rax@3
- signed __int64 v14; // rax@4
- signed __int64 v15; // rdi@4
- int v16; // er9@5
- int v17; // edx@5
- __int64 v19; // rcx@11
- signed __int64 v20; // r8@12
- __int64 v21; // rax@13
- TypeDescriptor *v22; // rax@14
- signed __int64 v23; // rax@15
- signed __int64 v24; // r10@15
- int v25; // er9@16
- int v26; // edx@16
- v4 = pCOLocator->pClassDescriptor;
- v5 = _ImageBase;
- v6 = 0;
- v7 = pTargetTypeID;
- v8 = pSrcTypeID;
- v9 = *(_DWORD *)(v4 + _ImageBase + 8);
- v10 = _ImageBase + *(_DWORD *)(v4 + _ImageBase + 12);
- if ( v9 )
- {
- v11 = _ImageBase + *(_DWORD *)(v4 + _ImageBase + 12);
- while ( 1 )
- {
- v12 = v5 + *(_DWORD *)v11;
- v13 = (TypeDescriptor *)(v5 + *(_DWORD *)v12);
- if ( v13 == v7 )
- break;
- v14 = (signed __int64)&v13[1];
- v15 = (signed __int64)((char *)&v7[1] - v14);
- do
- {
- v16 = *(_BYTE *)(v14 + v15);
- v17 = *(_BYTE *)v14 - v16;
- if ( *(_BYTE *)v14 != v16 )
- break;
- ++v14;
- }
- while ( v16 );
- if ( !v17 )
- break;
- ++v6;
- v11 += 4i64;
- if ( v6 >= v9 )
- return 0i64;
- }
- v19 = v6 + 1;
- if ( (unsigned int)v19 < v9 )
- {
- v20 = v10 + 4 * v19;
- do
- {
- v21 = *(_DWORD *)v20;
- if ( *(_BYTE *)(v21 + v5 + 20) & 4 )
- break;
- v22 = (TypeDescriptor *)(v5 + *(_DWORD *)(v21 + v5));
- if ( v22 == v8 )
- return v12;
- v23 = (signed __int64)&v22[1];
- v24 = (signed __int64)((char *)&v8[1] - v23);
- do
- {
- v25 = *(_BYTE *)(v23 + v24);
- v26 = *(_BYTE *)v23 - v25;
- if ( *(_BYTE *)v23 != v25 )
- break;
- ++v23;
- }
- while ( v25 );
- if ( !v26 )
- return v12;
- LODWORD(v19) = v19 + 1;
- v20 += 4i64;
- }
- while ( (unsigned int)v19 < v9 );
- }
- }
- return 0i64;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement