// Vista+ only BOOL apiGetConsoleFontSize(HANDLE hOutput, int &SizeY, int &SizeX, wchar_t (&rsFontName)[LF_FACESIZE]) { HMODULE hKernel = GetModuleHandle(L"kernel32.dll"); if (!hKernel) { _ASSERTE(hKernel!=NULL); return FALSE; } BOOL lbRc = FALSE; if (IsWin6()) // We have Vista { MY_CONSOLE_FONT_INFOEX cfi = {sizeof(cfi)}; lbRc = apiGetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi); if (lbRc) { SizeX = cfi.dwFontSize.X; SizeY = cfi.dwFontSize.Y; lstrcpynW(rsFontName, cfi.FaceName, countof(rsFontName)); } } return lbRc; }
// ConEmuC -OsVerInfo int OsVerInfo() { OSVERSIONINFOEX osv = {sizeof(osv)}; GetOsVersionInformational((OSVERSIONINFO*)&osv); UINT DBCS = IsDbcs(); UINT HWFS = IsHwFullScreenAvailable(); UINT W5fam = IsWin5family(); UINT WXPSP1 = IsWinXPSP1(); UINT W6 = IsWin6(); UINT W7 = IsWin7(); UINT W10 = IsWin10(); UINT Wx64 = IsWindows64(); UINT WINE = IsWine(); UINT WPE = IsWinPE(); UINT TELNET = isTerminalMode(); wchar_t szInfo[200]; _wsprintf(szInfo, SKIPCOUNT(szInfo) L"OS version information\n" L"%u.%u build %u SP%u.%u suite=x%04X type=%u\n" L"W5fam=%u WXPSP1=%u W6=%u W7=%u W10=%u Wx64=%u\n" L"HWFS=%u DBCS=%u WINE=%u WPE=%u TELNET=%u\n", osv.dwMajorVersion, osv.dwMinorVersion, osv.dwBuildNumber, osv.wServicePackMajor, osv.wServicePackMinor, osv.wSuiteMask, osv.wProductType, W5fam, WXPSP1, W6, W7, W10, Wx64, HWFS, DBCS, WINE, WPE, TELNET); _wprintf(szInfo); return MAKEWORD(osv.dwMinorVersion, osv.dwMajorVersion); }
// Check running process bits - 32/64 int GetProcessBits(DWORD nPID, HANDLE hProcess /*= NULL*/) { if (!IsWindows64()) return 32; int ImageBits = WIN3264TEST(32,64); //-V112 typedef BOOL (WINAPI* IsWow64Process_t)(HANDLE, PBOOL); static IsWow64Process_t IsWow64Process_f = NULL; if (!IsWow64Process_f) { HMODULE hKernel = GetModuleHandle(L"kernel32.dll"); if (hKernel) { IsWow64Process_f = (IsWow64Process_t)GetProcAddress(hKernel, "IsWow64Process"); } } if (IsWow64Process_f) { BOOL bWow64 = FALSE; HANDLE h = hProcess ? hProcess : OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, nPID); // IsWow64Process would be succeessfull for PROCESS_QUERY_LIMITED_INFORMATION (Vista+) if ((h == NULL) && IsWin6()) { // PROCESS_QUERY_LIMITED_INFORMATION not defined in GCC h = OpenProcess(0x1000/*PROCESS_QUERY_LIMITED_INFORMATION*/, FALSE, nPID); } if (h == NULL) { // If it is blocked due to access rights - try to find alternative ways (by path or PERF COUNTER) ImageBits = 0; } else if (IsWow64Process_f(h, &bWow64) && !bWow64) { ImageBits = 64; } else { ImageBits = 32; } if (h && (h != hProcess)) CloseHandle(h); } return ImageBits; }
/// Check running process bitness - 32/64 int GetProcessBits(DWORD nPID, HANDLE hProcess /*= NULL*/) { if (!IsWindows64()) return 32; int ImageBits = WIN3264TEST(32,64); //-V112 static BOOL (WINAPI* IsWow64Process_f)(HANDLE, PBOOL) = NULL; if (!IsWow64Process_f) { // Kernel32.dll is always loaded due to static link MModule kernel(GetModuleHandle(L"kernel32.dll")); kernel.GetProcAddress("IsWow64Process", IsWow64Process_f); // 64-bit OS must have this function _ASSERTE(IsWow64Process_f != NULL); } if (IsWow64Process_f) { BOOL bWow64 = FALSE; HANDLE h = hProcess ? hProcess : OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, nPID); // IsWow64Process would be succeessfull for PROCESS_QUERY_LIMITED_INFORMATION (Vista+) if ((h == NULL) && IsWin6()) { // PROCESS_QUERY_LIMITED_INFORMATION not defined in GCC h = OpenProcess(0x1000/*PROCESS_QUERY_LIMITED_INFORMATION*/, FALSE, nPID); } if (h == NULL) { // If it is blocked due to access rights - try to find alternative ways (by path or PERF COUNTER) ImageBits = 0; } else if (IsWow64Process_f(h, &bWow64) && !bWow64) { ImageBits = 64; } else { ImageBits = 32; } if (h && (h != hProcess)) CloseHandle(h); } return ImageBits; }
// Vista+ only BOOL apiSetConsoleFontSize(HANDLE hOutput, int inSizeY, int inSizeX, const wchar_t *asFontName) { HMODULE hKernel = GetModuleHandle(L"kernel32.dll"); if (!hKernel) { _ASSERTE(hKernel!=NULL); return FALSE; } BOOL lbRc = FALSE; if (IsWin6()) // We have Vista { MY_CONSOLE_FONT_INFOEX cfi = {sizeof(cfi)}; //apiGetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi); cfi.dwFontSize.X = inSizeX; cfi.dwFontSize.Y = inSizeY; lstrcpynW(cfi.FaceName, asFontName ? asFontName : L"Lucida Console", countof(cfi.FaceName)); HANDLE hConOut = GetStdHandle(STD_OUTPUT_HANDLE); lbRc = apiSetCurrentConsoleFontEx(hConOut, FALSE, &cfi); // Store for further comparison if (lbRc) { MY_CONSOLE_FONT_INFOEX cfiSet = {sizeof(cfiSet)}; if (apiGetCurrentConsoleFontEx(hConOut, FALSE, &cfiSet)) { // Win10 can't set "Lucida Console 3x5" and we get "4x6" _ASSERTE(_abs(cfiSet.dwFontSize.X-cfi.dwFontSize.X)<=1 && _abs(cfiSet.dwFontSize.Y-cfi.dwFontSize.Y)<=1); g_LastSetConsoleFont = cfiSet; } else { DEBUGTEST(DWORD dwErr = GetLastError()); _ASSERTE(FALSE && "apiGetConsoleScreenBufferInfoEx failed"); g_LastSetConsoleFont = cfi; } } } return lbRc; }
//Used in RM_ALTSERVER BOOL apiInitConsoleFontSize(HANDLE hOutput) { BOOL lbRc = FALSE; HMODULE hKernel = GetModuleHandle(L"kernel32.dll"); if (!hKernel) return FALSE; if (IsWin6()) // We have Vista { MY_CONSOLE_FONT_INFOEX cfi = { sizeof(cfi) }; if (apiGetCurrentConsoleFontEx(hOutput, FALSE, &cfi)) { g_LastSetConsoleFont = cfi; lbRc = TRUE; } } return lbRc; }
void SetConsoleFontSizeTo(HWND inConWnd, int inSizeY, int inSizeX, const wchar_t *asFontName, WORD anTextColors /*= 0*/, WORD anPopupColors /*= 0*/) { if (IsWin6()) { // We have Vista apiSetConsoleFontSize(GetStdHandle(STD_OUTPUT_HANDLE), inSizeY, inSizeX, asFontName); } else { // We have older NT (Win2k, WinXP) // So... using undocumented hack const COLORREF DefaultColors[16] = { 0x00000000, 0x00800000, 0x00008000, 0x00808000, 0x00000080, 0x00800080, 0x00008080, 0x00c0c0c0, 0x00808080, 0x00ff0000, 0x0000ff00, 0x00ffff00, 0x000000ff, 0x00ff00ff, 0x0000ffff, 0x00ffffff }; if (!gpConsoleInfoStr) { gpConsoleInfoStr = (CONSOLE_INFO*)LocalAlloc(LPTR, sizeof(CONSOLE_INFO)); if (!gpConsoleInfoStr) { _ASSERTE(gpConsoleInfoStr!=NULL); return; // memory allocation failed } gpConsoleInfoStr->Length = sizeof(CONSOLE_INFO); } if (!anTextColors) { CONSOLE_SCREEN_BUFFER_INFO csbi = {}; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); anTextColors = csbi.wAttributes ? csbi.wAttributes : MAKEWORD(0x7, 0x0); } if (!anPopupColors) { anPopupColors = MAKEWORD(0x5, 0xf); } // get current size/position settings rather than using defaults.. GetConsoleSizeInfo(gpConsoleInfoStr); // set these to zero to keep current settings gpConsoleInfoStr->FontSize.X = inSizeX; gpConsoleInfoStr->FontSize.Y = inSizeY; gpConsoleInfoStr->FontFamily = 0;//0x30;//FF_MODERN|FIXED_PITCH;//0x30; gpConsoleInfoStr->FontWeight = 0;//0x400; lstrcpynW(gpConsoleInfoStr->FaceName, asFontName ? asFontName : L"Lucida Console", countof(gpConsoleInfoStr->FaceName)); //-V303 gpConsoleInfoStr->CursorSize = 25; gpConsoleInfoStr->FullScreen = FALSE; gpConsoleInfoStr->QuickEdit = FALSE; //gpConsoleInfoStr->AutoPosition = 0x10000; gpConsoleInfoStr->AutoPosition = FALSE; RECT rcCon; GetWindowRect(inConWnd, &rcCon); gpConsoleInfoStr->WindowPosX = rcCon.left; gpConsoleInfoStr->WindowPosY = rcCon.top; gpConsoleInfoStr->InsertMode = TRUE; gpConsoleInfoStr->ScreenColors = anTextColors; //MAKEWORD(0x7, 0x0); gpConsoleInfoStr->PopupColors = anPopupColors; //MAKEWORD(0x5, 0xf); gpConsoleInfoStr->HistoryNoDup = FALSE; gpConsoleInfoStr->HistoryBufferSize = 50; gpConsoleInfoStr->NumberOfHistoryBuffers = 32; //-V112 // Issue 700: Default history buffers count too small. HKEY hkConsole = NULL; LONG lRegRc; if (0 == (lRegRc = RegCreateKeyEx(HKEY_CURRENT_USER, L"Console\\ConEmu", 0, NULL, 0, KEY_READ, NULL, &hkConsole, NULL))) { DWORD nSize = sizeof(DWORD), nValue, nType; struct { LPCWSTR pszName; DWORD nMin, nMax; ULONG *pnVal; } BufferValues[] = { {L"HistoryBufferSize", 16, 999, &gpConsoleInfoStr->HistoryBufferSize}, {L"NumberOfHistoryBuffers", 16, 999, &gpConsoleInfoStr->NumberOfHistoryBuffers} }; for (size_t i = 0; i < countof(BufferValues); ++i) { lRegRc = RegQueryValueEx(hkConsole, BufferValues[i].pszName, NULL, &nType, (LPBYTE)&nValue, &nSize); if ((lRegRc == 0) && (nType == REG_DWORD) && (nSize == sizeof(DWORD))) { if (nValue < BufferValues[i].nMin) nValue = BufferValues[i].nMin; else if (nValue > BufferValues[i].nMax) nValue = BufferValues[i].nMax; if (nValue != *BufferValues[i].pnVal) *BufferValues[i].pnVal = nValue; } } } // color table for(size_t i = 0; i < 16; i++) gpConsoleInfoStr->ColorTable[i] = DefaultColors[i]; gpConsoleInfoStr->CodePage = GetConsoleOutputCP();//0;//0x352; gpConsoleInfoStr->Hwnd = inConWnd; gpConsoleInfoStr->ConsoleTitle[0] = 0; // Send data to console window SetConsoleInfo(inConWnd, gpConsoleInfoStr); } }
void CDwmHelper::InitDwm() { BOOL lbDbg; mh_User32 = GetModuleHandle(L"User32.dll"); //gOSVer.dwOSVersionInfoSize = sizeof(gOSVer); //GetVersionEx(&gOSVer); if (IsWin6()) { user._ChangeWindowMessageFilter = (USER::ChangeWindowMessageFilter_t)GetProcAddress(mh_User32, "ChangeWindowMessageFilter"); if (user._ChangeWindowMessageFilter) { lbDbg = user._ChangeWindowMessageFilter(WM_DWMSENDICONICTHUMBNAIL, MSGFLT_ADD); lbDbg = user._ChangeWindowMessageFilter(WM_DWMSENDICONICLIVEPREVIEWBITMAP, MSGFLT_ADD); UNREFERENCED_PARAMETER(lbDbg); } mh_DwmApi = LoadLibrary(_T("dwmapi.dll")); if (mh_DwmApi) { // Vista+ dwm._DwmIsCompositionEnabled = (DWM::DwmIsCompositionEnabled_t)GetProcAddress(mh_DwmApi, "DwmIsCompositionEnabled"); dwm._DwmSetWindowAttribute = (DWM::DwmSetWindowAttribute_t)GetProcAddress(mh_DwmApi, "DwmSetWindowAttribute"); dwm._DwmGetWindowAttribute = (DWM::DwmGetWindowAttribute_t)GetProcAddress(mh_DwmApi, "DwmGetWindowAttribute"); dwm._DwmExtendFrameIntoClientArea = (DWM::DwmExtendFrameIntoClientArea_t)GetProcAddress(mh_DwmApi, "DwmExtendFrameIntoClientArea"); dwm._DwmDefWindowProc = (DWM::DwmDefWindowProc_t)GetProcAddress(mh_DwmApi, "DwmDefWindowProc"); dwm._DwmSetIconicThumbnail = (DWM::DwmSetIconicThumbnail_t)GetProcAddress(mh_DwmApi, "DwmSetIconicThumbnail"); dwm._DwmSetIconicLivePreviewBitmap = (DWM::DwmSetIconicLivePreviewBitmap_t)GetProcAddress(mh_DwmApi, "DwmSetIconicLivePreviewBitmap"); dwm._DwmInvalidateIconicBitmaps = (DWM::DwmInvalidateIconicBitmaps_t)GetProcAddress(mh_DwmApi, "DwmInvalidateIconicBitmaps"); dwm._DwmEnableBlurBehindWindow = (DWM::DwmEnableBlurBehindWindow_t)GetProcAddress(mh_DwmApi, "DwmEnableBlurBehindWindow"); mb_DwmAllowed = (dwm._DwmIsCompositionEnabled != NULL) && (dwm._DwmGetWindowAttribute != NULL) && (dwm._DwmSetWindowAttribute != NULL) && (dwm._DwmExtendFrameIntoClientArea != NULL) && (dwm._DwmDefWindowProc != NULL); if (mb_DwmAllowed) mb_EnableGlass = true; } } if (gOSVer.dwMajorVersion >= 6 || (gOSVer.dwMajorVersion == 5 && gOSVer.dwMinorVersion >= 1)) { mh_UxTheme = LoadLibrary(_T("UxTheme.dll")); if (mh_UxTheme) { // XP+ ux._IsAppThemed = (UX::AppThemed_t)GetProcAddress(mh_UxTheme, "IsAppThemed"); ux._IsThemeActive = (UX::AppThemed_t)GetProcAddress(mh_UxTheme, "IsThemeActive"); ux._OpenThemeData = (UX::OpenThemeData_t)GetProcAddress(mh_UxTheme, "OpenThemeData"); ux._CloseThemeData = (UX::CloseThemeData_t)GetProcAddress(mh_UxTheme, "CloseThemeData"); ux._DrawThemeBackground = (UX::DrawThemeBackground_t)GetProcAddress(mh_UxTheme, "DrawThemeBackground"); ux._DrawThemeEdge = (UX::DrawThemeEdge_t)GetProcAddress(mh_UxTheme, "DrawThemeEdge"); ux._GetThemeMargins = (UX::GetThemeMargins_t)GetProcAddress(mh_UxTheme, "GetThemeMargins"); ux._GetThemePartSize = (UX::GetThemePartSize_t)GetProcAddress(mh_UxTheme, "GetThemePartSize"); ux._GetThemePosition = (UX::GetThemePosition_t)GetProcAddress(mh_UxTheme, "GetThemePosition"); ux._GetThemeSysSize = (UX::GetThemeSysSize_t)GetProcAddress(mh_UxTheme, "GetThemeSysSize"); ux._GetThemeBackgroundContentRect = (UX::GetThemeBackgroundContentRect_t)GetProcAddress(mh_UxTheme, "GetThemeBackgroundContentRect"); ux._SetThemeAppProperties = (UX::SetThemeAppProperties_t)GetProcAddress(mh_UxTheme, "SetThemeAppProperties"); // Vista+ ux._BufferedPaintInit = (UX::BufferedPaintInit_t)GetProcAddress(mh_UxTheme, "BufferedPaintInit"); ux._BufferedPaintUnInit = (UX::BufferedPaintInit_t)GetProcAddress(mh_UxTheme, "BufferedPaintUnInit"); ux._BeginBufferedPaint = (UX::BeginBufferedPaint_t)GetProcAddress(mh_UxTheme, "BeginBufferedPaint"); ux._BufferedPaintSetAlpha = (UX::BufferedPaintSetAlpha_t)GetProcAddress(mh_UxTheme, "BufferedPaintSetAlpha"); ux._EndBufferedPaint = (UX::EndBufferedPaint_t)GetProcAddress(mh_UxTheme, "EndBufferedPaint"); ux._DrawThemeTextEx = (UX::DrawThemeTextEx_t)GetProcAddress(mh_UxTheme, "DrawThemeTextEx"); ux._SetWindowTheme = (UX::SetWindowTheme_t)GetProcAddress(mh_UxTheme, "SetWindowTheme"); mb_ThemeAllowed = (ux._IsAppThemed != NULL) && (ux._IsThemeActive != NULL); if (mb_ThemeAllowed) { mb_EnableTheming = true; if (ux._BufferedPaintInit && ux._BufferedPaintUnInit) { HRESULT hr = ux._BufferedPaintInit(); mb_BufferedAllowed = SUCCEEDED(hr); } } } } if (IsWin10()) { user._AdjustWindowRectExForDpi = (USER::AdjustWindowRectExForDpi_t)GetProcAddress(mh_User32, "AdjustWindowRectExForDpi"); } }