#include "precomp.h"

/*
#ifdef _WIN64
// sf: for the x64 build we dont need to redifine this
#else
typedef struct tagLASTINPUTINFO {
    UINT cbSize;
    DWORD dwTime;
} LASTINPUTINFO, *PLASTINPUTINFO;
#endif
*/

/*
 * Returns the number of seconds the local user has been idle
 */
DWORD request_ui_get_idle_time(Remote *remote, Packet *request)
{
	LASTINPUTINFO info;
	HMODULE user32 = NULL;
	Packet *response = packet_create_response(request);
	DWORD result = ERROR_SUCCESS;
	BOOL (WINAPI *getLastInputInfo)(PLASTINPUTINFO) = NULL;

	do
	{
		// Load user32
		if (!(user32 = LoadLibrary("user32")))
		{
			result = GetLastError();
			break;
		}

		// Resolve the address of GetLastInputInfo (Windows 2000+)
		if (!(getLastInputInfo = (BOOL (WINAPI *)(PLASTINPUTINFO))GetProcAddress(
				user32, "GetLastInputInfo")))
		{
			result = GetLastError();
			break;
		}

		info.cbSize = sizeof(info);

		if (getLastInputInfo(&info))
			packet_add_tlv_uint(response, TLV_TYPE_IDLE_TIME,
					(GetTickCount() - info.dwTime) / 1000);
		else
			result = GetLastError();

	} while (0);

	// Unload the library
	if (user32)
		FreeLibrary(user32);

	// Transmit the response packet
	packet_transmit_response(result, remote, response);

	return ERROR_SUCCESS;
}