/* This file has been generated by the Hex-Rays decompiler.
Copyright (c) 2009 Hex-Rays <info@hex-rays.com>
Detected compiler: Visual C++
*/
#include <windows.h>
#include <defs.h>
//-------------------------------------------------------------------------
// Data declarations
// extern void *std__cout; weak
extern char aHelloWorld[13]; // weak
extern _UNKNOWN unk_402200; // weak
extern _UNKNOWN unk_402208; // weak
extern int dword_403000; // weak
//-------------------------------------------------------------------------
// Function declarations
#define __thiscall __cdecl // Test compile in C mode
int __cdecl main(int argc, const char **argv, const char **envp);
// int __userpurge sub_401020<eax>(int a1<esi>, int a2);
int __stdcall sub_4010B0(int a1);
int loc_401130(); // weak
int __cdecl sub_401150(int a1);
// int (*__usercall sub_4012E2<eax>(int a1<ebp>))();
int loc_401303(); // weak
int __thiscall sub_40130B(void *this, char a2);
// _DWORD __thiscall __report_gsfailure(_DWORD ecx0, _BYTE _4); weak
int (*__cdecl sub_4017DE())(void);
int (*__cdecl sub_401804())(void);
int __cdecl sub_401A35();
// int __usercall sub_401B10<eax>(int a1<ebp>);
// int __usercall sub_401B40<eax>(int a1<ebp>);
void __cdecl sub_401B4A();
// int __thiscall std__basic_ios_char_std__char_traits_char____setstate(_DWORD, _DWORD, _DWORD); weak
// int __thiscall std__basic_ostream_char_std__char_traits_char____flush(_DWORD); weak
// int __thiscall std__basic_streambuf_char_std__char_traits_char____sputc(_DWORD, _DWORD); weak
// int __thiscall std__basic_streambuf_char_std__char_traits_char_____Unlock(_DWORD); weak
// int __cdecl std__basic_streambuf_char_std__char_traits_char_____Lock(_DWORD); weak
// int __thiscall std__basic_ostream_char_std__char_traits_char_____Osfx(_DWORD); weak
// int __thiscall std__basic_streambuf_char_std__char_traits_char____sputn(_DWORD, _DWORD, _DWORD); weak
// int __cdecl std__uncaught_exception(_DWORD); weak
//----- (00401000) --------------------------------------------------------
int __cdecl main(int argc, const char **argv, const char **envp)
{
sub_401150((int)std__cout);
return 0;
}
// 402054: using guessed type void *std__cout;
//----- (00401020) --------------------------------------------------------
int __userpurge sub_401020<eax>(int a1<esi>, int a2)
{
int v2; // eax@3
int v3; // eax@4
unsigned int v5; // [sp-4h] [bp-14h]@1
char v6; // [sp+0h] [bp-10h]@1
int v7; // [sp+Ch] [bp-4h]@3
v5 = (unsigned int)&v6 ^ dword_403000;
*(_DWORD *)a2 = a1;
if ( *(_DWORD *)(*(_DWORD *)(*(_DWORD *)a1 + 4) + a1 + 40) )
std__basic_streambuf_char_std__char_traits_char_____Lock(v5);
v7 = 0;
v2 = a1 + *(_DWORD *)(*(_DWORD *)a1 + 4);
if ( !*(_DWORD *)(v2 + 8) )
{
v3 = *(_DWORD *)(v2 + 44);
if ( v3 )
std__basic_ostream_char_std__char_traits_char____flush(v3);
}
*(_BYTE *)(a2 + 4) = *(_DWORD *)(*(_DWORD *)(*(_DWORD *)a1 + 4) + a1 + 8) == 0;
return a2;
}
// 40203C: using guessed type int __thiscall std__basic_ostream_char_std__char_traits_char____flush(_DWORD);
// 402048: using guessed type int __cdecl std__basic_streambuf_char_std__char_traits_char_____Lock(_DWORD);
// 403000: using guessed type int dword_403000;
//----- (004010B0) --------------------------------------------------------
int __stdcall sub_4010B0(int a1)
{
int result; // eax@3
int v2; // edx@3
char v3; // [sp+0h] [bp-10h]@1
int v4; // [sp+Ch] [bp-4h]@1
v4 = 0;
if ( !(unsigned __int8)std__uncaught_exception((unsigned int)&v3 ^ dword_403000) )
std__basic_ostream_char_std__char_traits_char_____Osfx(*(_DWORD *)a1);
v4 = -1;
v2 = *(_DWORD *)(**(_DWORD **)a1 + 4);
result = *(_DWORD *)(v2 + *(_DWORD *)a1 + 40);
if ( result )
result = std__basic_streambuf_char_std__char_traits_char_____Unlock(*(_DWORD *)(v2 + *(_DWORD *)a1 + 40));
return result;
}
// 402044: using guessed type int __thiscall std__basic_streambuf_char_std__char_traits_char_____Unlock(_DWORD);
// 40204C: using guessed type int __thiscall std__basic_ostream_char_std__char_traits_char_____Osfx(_DWORD);
// 402058: using guessed type int __cdecl std__uncaught_exception(_DWORD);
// 403000: using guessed type int dword_403000;
//----- (00401150) --------------------------------------------------------
int __cdecl sub_401150(int a1)
{
signed int v1; // eax@1
int v2; // ebx@1
unsigned int v3; // edi@1
int v4; // eax@8
char v5; // cl@8
int v6; // eax@8
int v7; // ecx@16
int v9; // eax@21
char v10; // cl@21
int v11; // eax@21
char v12; // [sp+0h] [bp-30h]@1
int v13; // [sp+10h] [bp-20h]@4
char v14; // [sp+14h] [bp-1Ch]@4
int v15; // [sp+18h] [bp-18h]@8
int v16; // [sp+1Ch] [bp-14h]@1
char *v17; // [sp+20h] [bp-10h]@1
int v18; // [sp+2Ch] [bp-4h]@4
v17 = &v12;
v2 = 0;
v16 = 0;
v3 = strlen("Hello World!");
v1 = *(_DWORD *)(*(_DWORD *)(*(_DWORD *)a1 + 4) + a1 + 24);
if ( v1 > 0 )
{
if ( v1 > (signed int)v3 )
v2 = v1 - v3;
}
sub_401020(a1, (int)&v13);
v18 = 0;
if ( v14 )
{
LOBYTE(v18) = 1;
if ( (*(_DWORD *)(*(_DWORD *)(*(_DWORD *)a1 + 4) + a1 + 16) & 0x1C0) == 64 )
goto LABEL_26;
while ( v2 > 0 )
{
v4 = *(_DWORD *)(*(_DWORD *)a1 + 4);
v5 = *(_BYTE *)(v4 + a1 + 48);
v6 = *(_DWORD *)(a1 + v4 + 40);
LOBYTE(v15) = v5;
if ( std__basic_streambuf_char_std__char_traits_char____sputc(v6, v15) == -1 )
{
v16 |= 4u;
break;
}
--v2;
}
if ( !v16 )
{
LABEL_26:
if ( std__basic_streambuf_char_std__char_traits_char____sputn(
*(_DWORD *)(*(_DWORD *)(*(_DWORD *)a1 + 4) + a1 + 40),
"Hello World!",
v3) == v3 )
{
while ( v2 > 0 )
{
v9 = *(_DWORD *)(*(_DWORD *)a1 + 4);
v10 = *(_BYTE *)(v9 + a1 + 48);
v11 = *(_DWORD *)(a1 + v9 + 40);
LOBYTE(v15) = v10;
if ( std__basic_streambuf_char_std__char_traits_char____sputc(v11, v15) == -1 )
{
v16 |= 4u;
break;
}
--v2;
}
}
else
{
v16 = 4;
}
}
*(_DWORD *)(a1 + *(_DWORD *)(*(_DWORD *)a1 + 4) + 24) = 0;
v18 = 0;
}
else
{
v16 = 4;
}
std__basic_ios_char_std__char_traits_char____setstate(a1 + *(_DWORD *)(*(_DWORD *)a1 + 4), v16, 0);
v18 = 3;
if ( !(unsigned __int8)std__uncaught_exception(*(_DWORD *)&v12) )
std__basic_ostream_char_std__char_traits_char_____Osfx(v13);
v18 = -1;
v7 = *(_DWORD *)(*(_DWORD *)(*(_DWORD *)v13 + 4) + v13 + 40);
if ( v7 )
std__basic_streambuf_char_std__char_traits_char_____Unlock(v7);
return a1;
}
// 402038: using guessed type int __thiscall std__basic_ios_char_std__char_traits_char____setstate(_DWORD, _DWORD, _DWORD);
// 402040: using guessed type int __thiscall std__basic_streambuf_char_std__char_traits_char____sputc(_DWORD, _DWORD);
// 402044: using guessed type int __thiscall std__basic_streambuf_char_std__char_traits_char_____Unlock(_DWORD);
// 40204C: using guessed type int __thiscall std__basic_ostream_char_std__char_traits_char_____Osfx(_DWORD);
// 402050: using guessed type int __thiscall std__basic_streambuf_char_std__char_traits_char____sputn(_DWORD, _DWORD, _DWORD);
// 402058: using guessed type int __cdecl std__uncaught_exception(_DWORD);
//----- (004012E2) --------------------------------------------------------
int (*__usercall sub_4012E2<eax>(int a1<ebp>))()
{
std__basic_ios_char_std__char_traits_char____setstate(
*(_DWORD *)(a1 + 8) + *(_DWORD *)(**(_DWORD **)(a1 + 8) + 4),
4,
1);
*(_DWORD *)(a1 - 4) = 0;
return loc_401303;
}
// 401303: using guessed type int loc_401303();
// 402038: using guessed type int __thiscall std__basic_ios_char_std__char_traits_char____setstate(_DWORD, _DWORD, _DWORD);
//----- (0040130B) --------------------------------------------------------
int __thiscall sub_40130B(void *this, char a2)
{
if ( this == (void *)dword_403000 )
__asm { rep retn }
return __report_gsfailure(this, a2);
}
// 4015C6: using guessed type _DWORD __thiscall __report_gsfailure(_DWORD ecx0, _BYTE _4);
// 403000: using guessed type int dword_403000;
//----- (004017DE) --------------------------------------------------------
int (*__cdecl sub_4017DE())(void)
{
int (*result)(void); // eax@1
unsigned int v1; // edi@1
result = (int (*)(void))&unk_402200;
v1 = (unsigned int)&unk_402200;
if ( &unk_402200 < &unk_402200 )
{
do
{
result = *(int (**)(void))v1;
if ( *(_DWORD *)v1 )
result = (int (*)(void))result();
v1 += 4;
}
while ( v1 < (unsigned int)&unk_402200 );
}
return result;
}
//----- (00401804) --------------------------------------------------------
int (*__cdecl sub_401804())(void)
{
int (*result)(void); // eax@1
unsigned int v1; // edi@1
result = (int (*)(void))&unk_402208;
v1 = (unsigned int)&unk_402208;
if ( &unk_402208 < &unk_402208 )
{
do
{
result = *(int (**)(void))v1;
if ( *(_DWORD *)v1 )
result = (int (*)(void))result();
v1 += 4;
}
while ( v1 < (unsigned int)&unk_402208 );
}
return result;
}
//----- (00401A35) --------------------------------------------------------
int __cdecl sub_401A35()
{
return 0;
}
//----- (00401B10) --------------------------------------------------------
int __usercall sub_401B10<eax>(int a1<ebp>)
{
int result; // eax@1
result = *(_DWORD *)(*(_DWORD *)(***(_DWORD ***)(a1 + 4) + 4) + **(_DWORD **)(a1 + 4) + 40);
if ( result )
result = std__basic_streambuf_char_std__char_traits_char_____Unlock(result);
return result;
}
// 402044: using guessed type int __thiscall std__basic_streambuf_char_std__char_traits_char_____Unlock(_DWORD);
//----- (00401B40) --------------------------------------------------------
int __usercall sub_401B40<eax>(int a1<ebp>)
{
return sub_4010B0(a1 - 32);
}
//----- (00401B4A) --------------------------------------------------------
void __cdecl sub_401B4A()
{
JUMPOUT(*(unsigned int *)loc_401130);
}
// 401130: using guessed type int loc_401130();
// ALL OK, 12 function(s) have been successfully decompiled