-
Notifications
You must be signed in to change notification settings - Fork 1
Decompiled : Native operation with file
iamkisly edited this page Dec 10, 2016
·
1 revision
##Open File Function ###sub_53A3D0 OpenFile
//----- (0053A3D0) --------------------------------------------------------
int __cdecl sub_53A3D0(char *a1, char *a2)
{
int v2; // esi@1
int result; // eax@2
v2 = (int)sub_53AC00();
if ( sub_53ACA0(a1, a2, v2) )
{
result = v2;
}
else
{
sub_53AC20((LPVOID)v2);
result = 0;
}
return result;
}
//AllocMemoryForPtr
//----- (0053AC00) --------------------------------------------------------
void *sub_53AC00()
{
void *result; // eax@1
result = malloc(0xCu);
*(_DWORD *)result = 0;
*((_DWORD *)result + 1) = 0;
*((_DWORD *)result + 2) = 0;
return result;
}
//----- (0053ACA0) --------------------------------------------------------
int __cdecl sub_53ACA0(char *a1, char *a2, int a3)
{
int v3; // eax@4
LPVOID v4; // esi@4
char v5; // bl@4
int v6; // eax@12
LPVOID v7; // ebx@14
FILE *v8; // eax@17
int v9; // eax@21
int v10; // edx@21
int v11; // ecx@21
int v12; // ecx@23
int v13; // eax@23
LPVOID v14; // ebx@27
FILE *v15; // eax@29
int result; // eax@31
int v17; // eax@32
FILE *v18; // eax@34
int v19; // eax@35
int v20; // [sp+8h] [bp-110h]@9
LPVOID v21; // [sp+Ch] [bp-10Ch]@4
int v22; // [sp+10h] [bp-108h]@4
char v23; // [sp+14h] [bp-104h]@17
*(_DWORD *)(a3 + 4) &= 0xFFFFFFFC;
if ( *a1 == 46 || *a1 == 92 || a1[1] == 58 )
{
v18 = fopen(a1, a2);
*(_DWORD *)(a3 + 8) = v18;
if ( v18 )
{
v19 = *(_DWORD *)(a3 + 4);
LOBYTE(v19) = v19 | 2;
*(_DWORD *)(a3 + 4) = v19;
result = 1;
}
else
{
result = 0;
}
}
else
{
v3 = sub_53B1A0((int)a1);
v4 = dword_5DD6FC;
v5 = v3;
v21 = dword_5DD6FC;
v22 = v3;
if ( dword_5DD6FC )
{
while ( !(*(_BYTE *)v4 & 1) || v5 & 1 || !sub_5413E0(*((_DWORD *)v4 + 2), a1, (int)&v20) )
{
v21 = (LPVOID)*((_DWORD *)v4 + 3);
if ( !v21 )
goto LABEL_25;
v4 = v21;
}
v6 = *(_DWORD *)(v20 + 4);
if ( BYTE1(v6) & 3 || *a2 == 119 )
{
v7 = dword_5DD6FC;
if ( dword_5DD6FC )
{
while ( v7 != v4 )
{
if ( *(_BYTE *)v7 & 2 )
{
strcpy(&v23, *((const char **)v7 + 1));
strcat(&v23, asc_574654);
strcat(&v23, a1);
v8 = fopen(&v23, a2);
*(_DWORD *)(a3 + 8) = v8;
if ( v8 )
{
v9 = v20;
*(_DWORD *)(a3 + 4) |= 2u;
v10 = *(_DWORD *)(v9 + 4);
BYTE1(v10) &= 0xFEu;
v4 = v21;
*(_DWORD *)(v9 + 4) = v10;
v11 = *(_DWORD *)(v20 + 4);
BYTE1(v11) |= 2u;
*(_DWORD *)(v20 + 4) = v11;
break;
}
v4 = v21;
}
v7 = (LPVOID)*((_DWORD *)v7 + 3);
if ( !v7 )
break;
}
}
}
if ( !(*(_BYTE *)(a3 + 4) & 2) )
{
v12 = *(_DWORD *)(v20 + 4);
BYTE1(v12) &= 0xFCu;
*(_DWORD *)(v20 + 4) = v12;
*(_DWORD *)(a3 + 8) = sub_541510(*((_DWORD *)v4 + 2), v20, (int)a2);
v13 = *(_DWORD *)(a3 + 4);
LOBYTE(v13) = v13 | 1;
*(_DWORD *)(a3 + 4) = v13;
}
v5 = v22;
}
LABEL_25:
if ( !(*(_BYTE *)(a3 + 4) & 3) && !(v5 & 2) )
{
v14 = dword_5DD6FC;
if ( dword_5DD6FC )
{
while ( 1 )
{
if ( *(_BYTE *)v14 & 2 )
{
strcpy(&v23, *((const char **)v14 + 1));
strcat(&v23, asc_574654);
strcat(&v23, a1);
v15 = fopen(&v23, a2);
*(_DWORD *)(a3 + 8) = v15;
if ( v15 )
break;
}
v14 = (LPVOID)*((_DWORD *)v14 + 3);
if ( !v14 )
return *(_DWORD *)(a3 + 4) & 3;
}
v17 = *(_DWORD *)(a3 + 4);
LOBYTE(v17) = v17 | 2;
*(_DWORD *)(a3 + 4) = v17;
}
}
result = *(_DWORD *)(a3 + 4) & 3;
}
return result;
}
###sub_539B70 GetSize
//----- (00539B70) --------------------------------------------------------
signed int __cdecl sub_539B70(int a1)
{
int v1; // eax@1
signed int result; // eax@2
int v3; // eax@4
v1 = *(_DWORD *)(a1 + 4);
if ( v1 & 1 )
{
result = sub_5413D0(*(_DWORD *)(a1 + 8));
}
else if ( v1 & 2 )
{
v3 = _fileno_0(*(FILE **)(a1 + 8));
result = _filelength(v3);
}
else
{
result = -1;
}
return result;
}
##Read and Write Function ###sub_53A670 FREAD wrapper
//----- (0053A670) --------------------------------------------------------
// обертка над size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
size_t __cdecl sub_53A670(void *a1, size_t a2, size_t a3, int a4) //FREAD
{
int v4; // edx@3
size_t result; // eax@4
if ( a2 && a3 )
{
v4 = *(_DWORD *)(a4 + 4);
if ( v4 & 1 )
{
result = sub_5416B0((int)a1, a2, a3, *(_DWORD *)(a4 + 8));
}
else if ( v4 & 2 )
{
result = fread(a1, a2, a3, *(FILE **)(a4 + 8));
}
else
{
result = a3 - 1;
}
}
else
{
result = 0;
}
return result;
}
###sub_53A6D0 FWRITE wrapper
//----- (0053A6D0) --------------------------------------------------------
// обертка над size_t fwrite( const void * ptrvoid, size_t size, size_t count, FILE * filestream )
size_t __cdecl sub_53A6D0(void *a1, size_t a2, size_t a3, int a4) //FWRITE
{
int v4; // eax@1
int v5; // ST0C_4@2
size_t result; // eax@2
v4 = *(_DWORD *)(a4 + 4);
if ( v4 & 1 )
{
v5 = *(_DWORD *)(a4 + 8);
result = sub_541730((int)a1, a2, a3);
}
else if ( v4 & 2 )
{
result = fwrite(a1, a2, a3, *(FILE **)(a4 + 8));
}
else
{
result = a3 - 1;
}
return result;
}
###sub_5416B0
//----- (005416B0) --------------------------------------------------------
int __cdecl sub_5416B0(int a1, unsigned int a2, int a3, int a4)
{
DWORD v4; // esi@3
unsigned int v5; // edi@3
int v6; // edx@3
void *v7; // ecx@6
int result; // eax@10
if ( a2 && a3 )
{
v4 = a3 * a2;
v5 = 0;
v6 = *(_DWORD *)(a4 + 16);
if ( a3 * a2 > *(_DWORD *)(*(_DWORD *)(a4 + 8) + 8) - v6 )
{
v4 = *(_DWORD *)(*(_DWORD *)(a4 + 8) + 8) - v6;
*(_DWORD *)a4 |= 2u;
}
if ( *(_DWORD *)a4 & 1 )
{
*(_DWORD *)a4 &= 0xFFFFFFFE;
*(_DWORD *)(a4 + 16) = v6 + 1;
*(_BYTE *)a1 = *(_BYTE *)(a4 + 24);
v7 = (void *)(a1 + 1);
v5 = 1;
--v4;
}
else
{
v7 = (void *)a1;
}
if ( sub_5422B0(v7, v4, a4) )
v5 += v4;
result = v5 / a2;
}
else
{
result = 0;
}
return result;
}
###sub_541730
//----- (00541730) --------------------------------------------------------
int __cdecl sub_541730(int a1, int a2, int a3)
{
return a3 - 1; //wtf ? HexRays are you sure ?
}