//DispStatus.cpp : Defines the entry point for the application.

#include "stdafx.h"

HKEY hKey;
DWORD dwType, dwDataSize = sizeof(DWORD);

SYSTEM_POWER_STATUS_EX pst;
MEMORYSTATUS ms;

static ULARGE_INTEGER ul1,ul2,ul3,ul4;

TCHAR StrageName[_MAX_PATH];
TCHAR USBHDName[_MAX_PATH];

#define StrageRegPath					L"\\System\\StorageManager\\Profiles\\SDMemory"
#define USBHDRegPath					L"\\System\\StorageManager\\Profiles\\USBHDProfile"

void DispStatus();
LPTSTR GetStrageName();
LPTSTR GetUSBHDName();

int WINAPI WinMain(	HINSTANCE hInstance,
					HINSTANCE hPrevInstance,
					LPTSTR    lpCmdLine,
					int       nCmdShow)
{	
	HWND hWnd;

	hWnd = FindWindowW(NULL,L"DispStatus");
	if(hWnd==GetForegroundWindow())
	{
		PostMessage(hWnd,WM_CLOSE,0,0);
		return 0;
	}
	else if (hWnd)
		PostMessage(hWnd,WM_CLOSE,0,0);

	DispStatus();
	return 0;
}

void DispStatus()
{
	WCHAR str[64], str2[512], str_s[64], str_s2[64];
	GetSystemPowerStatusEx(&pst,true);

	if (pst.ACLineStatus==1)
	{
		wsprintf(str, L"%s", L"ﾊﾞｯﾃﾘｰ：充電中");
	} else {
		wsprintf(str, L"ﾊﾞｯﾃﾘｰ：残り %d%%", pst.BatteryLifePercent);
	}

	// ストレージ
	WIN32_FIND_DATA fd;
	HANDLE hFind;

	ul1.QuadPart=ul2.QuadPart=0;

	// ストレージ
	unsigned short *(StrageName) = GetStrageName();

	hFind = FindFirstFile(L"\\*.*",&fd);
	if(hFind!=INVALID_HANDLE_VALUE)
	{
		do
		{
			if((fd.dwFileAttributes&(FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_TEMPORARY))==(FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_TEMPORARY))
			{
				if (wcsstr(fd.cFileName, StrageName) != NULL)
				{
					if(GetDiskFreeSpaceEx(fd.cFileName,&ul1,&ul2,NULL))
						break;
				}
			}
		}while(FindNextFile(hFind,&fd));
		FindClose(hFind);
	}

	if (ul1.QuadPart>0)
	{
		wsprintf(str_s, L"%s：\n               残り %4.1fMB", StrageName, (float)ul1.QuadPart/(1024*1024));
	}
	else
	{
		wsprintf(str_s, L"%s：なし", StrageName);
	}

	// USBHD
	unsigned short *(USBHDName) = GetUSBHDName();
	
	ul3.QuadPart=ul4.QuadPart=0;

	hFind = FindFirstFile(L"\\*.*",&fd);
	if(hFind!=INVALID_HANDLE_VALUE)
	{
		do
		{
			if((fd.dwFileAttributes&(FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_TEMPORARY))==(FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_TEMPORARY))
			{
				if (wcsstr(fd.cFileName, USBHDName) != NULL)
				{
					if(GetDiskFreeSpaceEx(fd.cFileName,&ul3,&ul4,NULL))
						break;
				}
			}
		}while(FindNextFile(hFind,&fd));
		FindClose(hFind);
	}

	if (ul3.QuadPart>0)
	{
		wsprintf(str_s2, L"%s：\n               残り %4.1fMB", USBHDName, (float)ul3.QuadPart/(1024*1024));
	}
	else
	{
		wsprintf(str_s2, L"%s：なし", USBHDName);
	}

	// メモリ
	GlobalMemoryStatus(&ms);

	// 本体容量
	STORE_INFORMATION strinf;
	GetStoreInformation(&strinf);

	wsprintf(str2, L"%s\n実行用ﾒﾓﾘ：残り %2.2fMB\n記憶用ﾒﾓﾘ：残り %3.2fMB\n%s\n%s", str, (float)ms.dwAvailPhys/(1024*1024), (float)strinf.dwFreeSize/(1024*1024), str_s, str_s2);
	MessageBox(NULL, str2, L"DispStatus", MB_OKCANCEL);
	return;
}

LPTSTR GetStrageName()
{
	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, StrageRegPath, 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)
	{
		RegQueryValueEx(hKey, L"Folder", NULL, &dwType, NULL, &dwDataSize);
		RegQueryValueEx(hKey, L"Folder", NULL, &dwType, (LPBYTE)&StrageName, &dwDataSize);
	}
	RegCloseKey(hKey);
	return StrageName;
}

LPTSTR GetUSBHDName()
{
	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, USBHDRegPath, 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)
	{
		RegQueryValueEx(hKey, L"Folder", NULL, &dwType, NULL, &dwDataSize);
		RegQueryValueEx(hKey, L"Folder", NULL, &dwType, (LPBYTE)&USBHDName, &dwDataSize);
	}
	RegCloseKey(hKey);
	return USBHDName;
}

