#pragma once

#ifdef _WIN64
typedef __int64 INT_PTR;
typedef unsigned __int64 UINT_PTR;
typedef __int64 LONG_PTR;
typedef unsigned __int64 ULONG_PTR;
#else
typedef _W64 int INT_PTR;
typedef _W64 unsigned int UINT_PTR;
typedef _W64 long LONG_PTR;
typedef _W64 unsigned long ULONG_PTR;
#endif // WIN64

typedef unsigned long DWORD;
typedef DWORD *LPDWORD;
#define STD_OUTPUT_HANDLE ((DWORD)-11)
#define STD_ERROR_HANDLE ((DWORD)-12)
#define WINAPI __stdcall
typedef void *HWND;
typedef void *HANDLE;
typedef unsigned int UINT;
#define WINBASEAPI
typedef int BOOL;
#define CONST const
#define VOID void
typedef void *LPVOID;
typedef char CHAR;
typedef const CHAR *LPCSTR;
typedef wchar_t WCHAR;
typedef const WCHAR *LPCWSTR;
typedef CONST CHAR *LPCCH, *PCCH;
#define CP_UTF8 65001
typedef wchar_t WCHAR;
typedef WCHAR *LPWSTR;
typedef void *PVOID;
typedef long LONG;
typedef LONG *PLONG;
typedef CONST void *LPCVOID;

#define GENERIC_READ (0x80000000L)
#define GENERIC_WRITE (0x40000000L)

#define FILE_SHARE_READ 0x00000001

#define CREATE_ALWAYS 2
#define OPEN_EXISTING 3

#define FILE_ATTRIBUTE_NORMAL 0x00000080
#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)
#define FILE_BEGIN 0
#define FILE_CURRENT 1
#define MAX_PATH 260

typedef struct _SECURITY_ATTRIBUTES {
	DWORD nLength;
	LPVOID lpSecurityDescriptor;
	BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;

typedef struct _OVERLAPPED {
	ULONG_PTR Internal;
	ULONG_PTR InternalHigh;
	union {
		struct {
			DWORD Offset;
			DWORD OffsetHigh;
		} DUMMYSTRUCTNAME;
		PVOID Pointer;
	} DUMMYUNIONNAME;

	HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;

WINBASEAPI BOOL WINAPI WriteConsoleA(HANDLE hConsoleOutput, CONST VOID *lpBuffer, DWORD nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten,
                                     LPVOID lpReserved);

WINBASEAPI BOOL WINAPI WriteConsoleW(HANDLE hConsoleOutput, CONST VOID *lpBuffer, DWORD nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten,
                                     LPVOID lpReserved);

WINBASEAPI VOID WINAPI OutputDebugStringA(LPCSTR lpOutputString);

WINBASEAPI VOID WINAPI OutputDebugStringW(LPCWSTR lpOutputString);

WINBASEAPI HANDLE WINAPI GetStdHandle(DWORD nStdHandle);

int WINAPI MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCCH lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar);

WINBASEAPI HANDLE WINAPI CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                                     DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);

WINBASEAPI DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);

WINBASEAPI BOOL WINAPI ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);

WINBASEAPI DWORD WINAPI SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);

WINBASEAPI BOOL WINAPI CloseHandle(HANDLE hObject);

WINBASEAPI BOOL WINAPI WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);

int WINAPI MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);