// Battery.cpp : Defines the entry point for the console application.
//

#include <windows.h>


#pragma pack(4)
typedef struct _BatteryStatus_tag {
    SYSTEM_POWER_STATUS_EX2 sps;
    WORD    wMainLevels;
    WORD    wBackupLevels;
    BOOL    fSupportsChange;
    BOOL    fChanged;
} BATTERY_STATUS, *PBATTERY_STATUS;
#pragma pack()

#define BATTERY_API_EVENT_NAME  _T("SYSTEM/BatteryAPIsReady")

static HANDLE g_hThreadProc       = NULL;
static HANDLE g_hBatteryFileMutex = NULL;
static HANDLE g_hFileMap          = NULL;
static LPVOID g_lpMemBlock        = NULL;

#define BATTERY_STATUS_FILE TEXT("Battery File")
#define BATTERY_FILE_MUTEX  TEXT("Battery File Mutex")


int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE          hEvent;
    DWORD       lala;
    BATTERY_STATUS *batStat;
    hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, BATTERY_API_EVENT_NAME); 

    g_hFileMap = CreateFileMapping((HANDLE)INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(BATTERY_STATUS), BATTERY_STATUS_FILE);

    if(g_hFileMap == NULL)
    {
        goto cleanup;
    }
    if(ERROR_ALREADY_EXISTS != GetLastError())
    {
        goto cleanup;
    }
    g_lpMemBlock = MapViewOfFile(g_hFileMap, FILE_MAP_ALL_ACCESS,0,  0,sizeof(BATTERY_STATUS));
    if(NULL == g_lpMemBlock)
    {
        goto cleanup;
    }

    g_hBatteryFileMutex = CreateMutex(NULL, FALSE, BATTERY_FILE_MUTEX);
    if  (NULL == g_hBatteryFileMutex)
    {
        goto cleanup;
    }


     batStat = (BATTERY_STATUS*)g_lpMemBlock;

    while (1)
    {
        LONG levels = MAKELONG (3, 0);
        WaitForSingleObject(g_hBatteryFileMutex, INFINITE);

        batStat->wMainLevels   = LOWORD(levels);
        batStat->wBackupLevels = HIWORD(levels);

        batStat->fSupportsChange = FALSE;
        batStat->sps.ACLineStatus = AC_LINE_OFFLINE;
        batStat->sps.BatteryFlag = BATTERY_FLAG_CRITICAL;
        ReleaseMutex(g_hBatteryFileMutex);

        Sleep(5000);    
    }

cleanup:
    printf("ERROR\r\n");

}

