Skip to content

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 ?
}