-
Notifications
You must be signed in to change notification settings - Fork 1
/
AboutMessage.cpp
102 lines (86 loc) · 3.89 KB
/
AboutMessage.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include "stdafx.h"
#include "AboutMessage.H"
#include <Windows.h>
static WORD GetConsoleTextAttribute(HANDLE Console)
{
CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo = { sizeof(CONSOLE_SCREEN_BUFFER_INFO ) };
GetConsoleScreenBufferInfo(Console, &ConsoleInfo);
return ConsoleInfo.wAttributes;
}
static void GetVersionString(void *Info, const TCHAR* s, const TCHAR*& r)
{
TCHAR *String = nullptr;
UINT Length = 0;
VerQueryValue(Info, s, (LPVOID *) &String, &Length);
if (String != nullptr)
r = String;
}
#define LANGUAGE "0c0904b0"
void DisplayAboutMessage(HINSTANCE hInstance)
{
const TCHAR* FileVersion = L"Unknown";
const TCHAR* FileDescription = L"Unknown";
const TCHAR* CompanyName = L"Unknown";
const TCHAR* ProductName = L"Unknown";
const TCHAR* Copyright = L"Unknown";
TCHAR FileName[1024];
GetModuleFileName(hInstance, FileName, 1024);
DWORD Dummy;
DWORD Size = GetFileVersionInfoSize(FileName, &Dummy);
void *Info = nullptr;
if (Size > 0)
{
Info = malloc(Size);
// VS_VERSION_INFO VS_VERSIONINFO VS_FIXEDFILEINFO
GetFileVersionInfo(FileName, Dummy, Size, Info);
GetVersionString(Info, TEXT("\\StringFileInfo\\" LANGUAGE "\\FileVersion"), FileVersion);
GetVersionString(Info, TEXT("\\StringFileInfo\\" LANGUAGE "\\FileDescription"), FileDescription);
GetVersionString(Info, TEXT("\\StringFileInfo\\" LANGUAGE "\\CompanyName"), CompanyName);
GetVersionString(Info, TEXT("\\StringFileInfo\\" LANGUAGE "\\ProductName"), ProductName);
GetVersionString(Info, TEXT("\\StringFileInfo\\" LANGUAGE "\\LegalCopyright"), Copyright);
}
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
WORD wOriginalAttribute = GetConsoleTextAttribute(hOut);
WORD wOriginalBackground= wOriginalAttribute & 0xF0;
WORD wHighlight = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY | wOriginalBackground;
SetConsoleTextAttribute(hOut, wHighlight);
WriteConsole(hOut, ProductName, static_cast<DWORD>(_tcslen(ProductName)), nullptr, nullptr);
SetConsoleTextAttribute(hOut, wOriginalAttribute);
TCHAR Version[] = L" Version ";
WriteConsole(hOut, Version, ARRAYSIZE(Version) - 1, nullptr, nullptr);
SetConsoleTextAttribute(hOut, wHighlight);
WriteConsole(hOut, FileVersion, static_cast<DWORD>(_tcslen(FileVersion)), nullptr, nullptr);
SetConsoleTextAttribute(hOut, wOriginalAttribute);
TCHAR s[] = L" - ";
WriteConsole(hOut, s, ARRAYSIZE(s) - 1, nullptr, nullptr);
WriteConsole(hOut, Copyright, static_cast<DWORD>(_tcslen(Copyright)), nullptr, nullptr);
TCHAR n[] = L"\n ";
WriteConsole(hOut, n, ARRAYSIZE(n) - 1, nullptr, nullptr);
WriteConsole(hOut, FileDescription, static_cast<DWORD>(_tcslen(FileDescription)), nullptr, nullptr);
TCHAR By[] = L"\n By ";
WriteConsole(hOut, By, ARRAYSIZE(By) - 1, nullptr, nullptr);
SetConsoleTextAttribute(hOut, wHighlight);
WriteConsole(hOut, CompanyName, static_cast<DWORD>(_tcslen(CompanyName)), nullptr, nullptr);
SetConsoleTextAttribute(hOut, wOriginalAttribute);
TCHAR Details[] = L" ([email protected]) - http://radsoft.boxathome.net/\n\n";
WriteConsole(hOut, Details, ARRAYSIZE(Details) - 1, nullptr, nullptr);
free(Info);
}
Memory GetResource(HMODULE hModule, WORD wRes)
{
Memory ret = {};
HRSRC hResource = FindResource(hModule, MAKEINTRESOURCE(wRes), RT_RCDATA);
if (hResource == NULL)
throw std::exception("Can't find resource");
ret.size = SizeofResource(hModule, hResource);
HGLOBAL hResourceData = LoadResource(hModule, hResource);
ret.data = LockResource(hResourceData);
return ret;
}
void DisplayResource(HMODULE hModule, WORD wRes)
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
Memory mem = GetResource(hModule, wRes);
const char* pData = static_cast<const char*>(mem.data);
WriteConsoleA(hOut, pData, mem.size, nullptr, nullptr);
}