#include <windows.h>
#include <string.h>
#include "ui.h"

#define TEXTBOX_PROCESS	3000
#define TEXTBOX_DLL		3001
#define BUTTON_INJECT	3002

#define BUFFER_SIZE		128

TCHAR processName[BUFFER_SIZE];
TCHAR dllName[BUFFER_SIZE];

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	HWND hMainWnd;
	MSG msg;
	
	RegisterWndClass(WndProc, TEXT("Injector"), COLOR_WINDOW);

	hMainWnd = CreateWindow(TEXT("Injector"), TEXT("Injector"),
		WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
		CW_USEDEFAULT, 0, 250, 130, (HWND)NULL, (HMENU)NULL,
		(HINSTANCE)hInstance, NULL);

	if (!hMainWnd)
	{
		MessageBox(NULL, TEXT("Can\'t create main window."), TEXT("Error"), MB_OK);
		return GetLastError();
	}

	ShowWindow(hMainWnd, nCmdShow);

	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
}
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	HDC hDC;
	PAINTSTRUCT ps;
	RECT rect;
	TCHAR buffer[BUFFER_SIZE];

	switch (uMsg)
	{
	case WM_CREATE:
		/* Create text box containing process name */
		CreateWindow(TEXT("EDIT"), NULL, WS_BORDER | WS_VISIBLE | WS_CHILD | ES_LEFT | ES_MULTILINE,
			10, 10, 120, 20, hWnd, (HMENU)TEXTBOX_PROCESS, NULL, NULL);
		/* Create text box containing dll name */
		CreateWindow(TEXT("EDIT"), NULL, WS_BORDER | WS_VISIBLE | WS_CHILD | ES_LEFT | ES_MULTILINE,
			10, 35, 120, 20, hWnd, (HMENU)TEXTBOX_DLL, NULL, NULL);
		/* Create button to inject dll */
		CreateWindow(TEXT("BUTTON"), TEXT("Inject"), WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE,
			150, 10, 60, 20, hWnd, (HMENU)BUTTON_INJECT, NULL, NULL);
		break;
	case WM_PAINT:
		hDC = BeginPaint(hWnd, &ps);
		GetClientRect(hWnd, &rect);
		EndPaint(hWnd, &ps);
		break;
	case WM_SIZE:
		break;
	case WM_CLOSE:
		DestroyWindow(hWnd);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case BUTTON_INJECT:
			GetWindowText(hWnd, buffer, sizeof(buffer));
			strncpy(processName, buffer, BUFFER_SIZE);
			break;
		default:
			break;
		}
		break;
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}
