// Undocumented function BOOL WINAPI OnSetConsoleKeyShortcuts(BOOL bSet, BYTE bReserveKeys, LPVOID p1, DWORD n1) { //typedef BOOL (WINAPI* OnSetConsoleKeyShortcuts_t)(BOOL,BYTE,LPVOID,DWORD); ORIGINALFASTEX(SetConsoleKeyShortcuts,NULL); BOOL lbRc = FALSE; if (F(SetConsoleKeyShortcuts)) lbRc = F(SetConsoleKeyShortcuts)(bSet, bReserveKeys, p1, n1); if (ghConEmuWnd && IsWindow(ghConEmuWnd)) { DWORD nLastErr = GetLastError(); DWORD nSize = sizeof(CESERVER_REQ_HDR)+sizeof(BYTE)*2; CESERVER_REQ *pIn = ExecuteNewCmd(CECMD_KEYSHORTCUTS, nSize); if (pIn) { pIn->Data[0] = bSet; pIn->Data[1] = bReserveKeys; wchar_t szGuiPipeName[128]; msprintf(szGuiPipeName, countof(szGuiPipeName), CEGUIPIPENAME, L".", LODWORD(ghConWnd)); CESERVER_REQ* pOut = ExecuteCmd(szGuiPipeName, pIn, 1000, NULL); if (pOut) ExecuteFreeResult(pOut); ExecuteFreeResult(pIn); } SetLastError(nLastErr); } return lbRc; }
LONG WINAPI OnRegConnectRegistryW(LPCWSTR lpMachineName, HKEY hKey, PHKEY phkResult) { LONG lRc = -1; ORIGINALFASTEX(RegConnectRegistryW,NULL); lRc = F(RegConnectRegistryW)(lpMachineName, hKey, phkResult); if ((lRc == 0) && (!lpMachineName || !*lpMachineName) && gpRegKeyStore && phkResult && ((hKey == HKEY_CURRENT_USER) || (hKey == HKEY_LOCAL_MACHINE))) { RegKeyType rkt; if (hKey == HKEY_CURRENT_USER) { rkt = RKT_HKCU; } else { #ifdef _WIN64 rkt = RKT_HKLM64; #else rkt = RKT_HKLM32; #endif } gpRegKeyStore->Store(*phkResult, rkt); } return lRc; }
int WINAPI OnStretchDIBits(HDC hdc, int XDest, int YDest, int nDestWidth, int nDestHeight, int XSrc, int YSrc, int nSrcWidth, int nSrcHeight, const VOID *lpBits, const BITMAPINFO *lpBitsInfo, UINT iUsage, DWORD dwRop) { //typedef int (WINAPI* OnStretchDIBits_t)(HDC hdc, int XDest, int YDest, int nDestWidth, int nDestHeight, int XSrc, int YSrc, int nSrcWidth, int nSrcHeight, const VOID *lpBits, const BITMAPINFO *lpBitsInfo, UINT iUsage, DWORD dwRop); ORIGINALFASTEX(StretchDIBits,NULL); int iRc = 0; if (F(StretchDIBits)) iRc = F(StretchDIBits)(hdc, XDest, YDest, nDestWidth, nDestHeight, XSrc, YSrc, nSrcWidth, nSrcHeight, lpBits, lpBitsInfo, iUsage, dwRop); // Если рисуют _прямо_ на канвасе ConEmu if (iRc != (int)GDI_ERROR && hdc && hdc == ghTempHDC) { // Уведомить GUI, что у него прямо на канвасе кто-то что-то нарисовал :) CESERVER_REQ* pIn = ExecuteNewCmd(CECMD_LOCKDC, sizeof(CESERVER_REQ_HDR)+sizeof(CESERVER_REQ_LOCKDC)); if (pIn) { pIn->LockDc.hDcWnd = ghConEmuWndDC; // На всякий случай pIn->LockDc.bLock = TRUE; pIn->LockDc.Rect.left = XDest; pIn->LockDc.Rect.top = YDest; pIn->LockDc.Rect.right = XDest+nDestWidth-1; pIn->LockDc.Rect.bottom = YDest+nDestHeight-1; CESERVER_REQ* pOut = ExecuteGuiCmd(ghConWnd, pIn, ghConWnd); if (pOut) ExecuteFreeResult(pOut); ExecuteFreeResult(pIn); } } return iRc; }
BOOL WINAPI OnBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop) { //typedef int (WINAPI* OnBitBlt_t)(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop); ORIGINALFASTEX(BitBlt,NULL); BOOL bRc = FALSE; if (F(BitBlt)) bRc = F(BitBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop); // Если рисуют _прямо_ на канвасе ConEmu if (bRc && hdcDest && hdcDest == ghTempHDC) { // Уведомить GUI, что у него прямо на канвасе кто-то что-то нарисовал :) CESERVER_REQ* pIn = ExecuteNewCmd(CECMD_LOCKDC, sizeof(CESERVER_REQ_HDR)+sizeof(CESERVER_REQ_LOCKDC)); if (pIn) { pIn->LockDc.hDcWnd = ghConEmuWndDC; // На всякий случай pIn->LockDc.bLock = TRUE; pIn->LockDc.Rect.left = nXDest; pIn->LockDc.Rect.top = nYDest; pIn->LockDc.Rect.right = nXDest+nWidth-1; pIn->LockDc.Rect.bottom = nYDest+nHeight-1; CESERVER_REQ* pOut = ExecuteGuiCmd(ghConWnd, pIn, ghConWnd); if (pOut) ExecuteFreeResult(pOut); ExecuteFreeResult(pIn); } } return bRc; }
BOOL WINAPI OnSetConsoleTitleA(LPCSTR lpConsoleTitle) { //typedef BOOL (WINAPI* OnSetConsoleTitleA_t)(LPCSTR lpConsoleTitle); ORIGINALFASTEX(SetConsoleTitleA,NULL); BOOL bRc = FALSE; if (F(SetConsoleTitleA)) bRc = F(SetConsoleTitleA)(lpConsoleTitle); return bRc; }
BOOL WINAPI OnStretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop) { //typedef int (WINAPI* OnStretchBlt_t)(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop); ORIGINALFASTEX(StretchBlt,NULL); BOOL bRc = FALSE; //#ifdef _DEBUG //HWND h = WindowFromDC(hdcDest); //#endif // Если рисуют _прямо_ на канвасе ConEmu if (/*bRc &&*/ hdcDest && hdcDest == ghTempHDC) { if ( (!StretchBltBatch.bottom && !StretchBltBatch.top) || (nYOriginDest <= StretchBltBatch.top) || (nXOriginDest != StretchBltBatch.left) || (StretchBltBatch.right != (nXOriginDest+nWidthDest-1)) || (StretchBltBatch.bottom != (nYOriginDest-1)) ) { // Сброс батча StretchBltBatch.left = nXOriginDest; StretchBltBatch.top = nYOriginDest; StretchBltBatch.right = nXOriginDest+nWidthDest-1; StretchBltBatch.bottom = nYOriginDest+nHeightDest-1; } else { StretchBltBatch.bottom = nYOriginDest+nHeightDest-1; } // Уведомить GUI, что у него прямо на канвасе кто-то что-то нарисовал :) CESERVER_REQ* pIn = ExecuteNewCmd(CECMD_LOCKDC, sizeof(CESERVER_REQ_HDR)+sizeof(CESERVER_REQ_LOCKDC)); if (pIn) { pIn->LockDc.hDcWnd = ghConEmuWndDC; // На всякий случай pIn->LockDc.bLock = TRUE; pIn->LockDc.Rect = StretchBltBatch; CESERVER_REQ* pOut = ExecuteGuiCmd(ghConWnd, pIn, ghConWnd); if (pOut) ExecuteFreeResult(pOut); ExecuteFreeResult(pIn); } } if (F(StretchBlt)) bRc = F(StretchBlt)(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, dwRop); return bRc; }
LONG WINAPI OnRegCloseKey(HKEY hKey) { LONG lRc = -1; ORIGINALFASTEX(RegCloseKey,NULL); if (hKey && gpRegKeyStore) { PRINTCLOSE(hKey); gpRegKeyStore->Remove(hKey); } if (!F(RegCloseKey)) return ERROR_INVALID_FUNCTION; lRc = F(RegCloseKey)(hKey); return lRc; }
int WINAPI OnReleaseDC(HWND hWnd, HDC hDC) { //typedef int (WINAPI* OnReleaseDC_t)(HWND hWnd, HDC hDC); ORIGINALFASTEX(ReleaseDC,NULL); int iRc = 0; if (F(ReleaseDC)) iRc = F(ReleaseDC)(hWnd, hDC); if (ghTempHDC == hDC) ghTempHDC = NULL; return iRc; }
HDC WINAPI OnGetDCEx(HWND hWnd, HRGN hrgnClip, DWORD flags) { //typedef HDC (WINAPI* OnGetDCEx_t)(HWND hWnd, HRGN hrgnClip, DWORD flags); ORIGINALFASTEX(GetDCEx,NULL); HDC hDC = NULL; if (F(GetDCEx)) hDC = F(GetDCEx)(hWnd, hrgnClip, flags); if (hDC && ghConEmuWndDC && hWnd == ghConEmuWndDC) ghTempHDC = hDC; return hDC; }
HDC WINAPI OnGetDC(HWND hWnd) { //typedef HDC (WINAPI* OnGetDC_t)(HWND hWnd); ORIGINALFASTEX(GetDC,NULL); HDC hDC = NULL; if (F(GetDC)) hDC = F(GetDC)(hWnd); if (hDC && ghConEmuWndDC && hWnd == ghConEmuWndDC) ghTempHDC = hDC; return hDC; }
COORD WINAPI OnGetConsoleFontSize(HANDLE hConsoleOutput, DWORD nFont) { //typedef COORD (WINAPI* OnGetConsoleFontSize_t)(HANDLE hConsoleOutput, DWORD nFont); ORIGINALFASTEX(GetConsoleFontSize,NULL); COORD cr = {}; if (!MyGetConsoleFontSize(cr)) { if (F(GetConsoleFontSize)) cr = F(GetConsoleFontSize)(hConsoleOutput, nFont); } return cr; }
HWND WINAPI OnCreateDialogParamW(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam) { //typedef HWND (WINAPI* OnCreateDialogParamW_t)(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam); ORIGINALFASTEX(CreateDialogParamW,NULL); HWND hWnd = NULL; BOOL bAttachGui = FALSE, bStyleHidden = FALSE; LPCDLGTEMPLATE lpTemplate = NULL; DWORD lStyle = 0; //lpTemplate ? lpTemplate->style : 0; DWORD lStyleEx = 0; //lpTemplate ? lpTemplate->dwExtendedStyle : 0; // Загрузить ресурс диалога, и глянуть его параметры lStyle/lStyleEx HRSRC hDlgSrc = FindResourceW(hInstance, lpTemplateName, RT_DIALOG); if (hDlgSrc) { HGLOBAL hDlgHnd = LoadResource(hInstance, hDlgSrc); if (hDlgHnd) { lpTemplate = (LPCDLGTEMPLATE)LockResource(hDlgHnd); if (lpTemplate) { lStyle = lpTemplate ? lpTemplate->style : 0; lStyleEx = lpTemplate ? lpTemplate->dwExtendedStyle : 0; } } } if ((!lpTemplate || CheckCanCreateWindow(NULL, (LPWSTR)32770, lStyle, lStyleEx, hWndParent, bAttachGui, bStyleHidden)) && F(CreateDialogParamW) != NULL) { //if (bAttachGui) //{ // x = grcConEmuClient.left; y = grcConEmuClient.top; // nWidth = grcConEmuClient.right - grcConEmuClient.left; nHeight = grcConEmuClient.bottom - grcConEmuClient.top; //} hWnd = F(CreateDialogParamW)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam); DWORD dwErr = GetLastError(); if (hWnd && bAttachGui) { OnGuiWindowAttached(hWnd, NULL, NULL, (LPCWSTR)32770, lStyle, lStyleEx, bStyleHidden); SetLastError(dwErr); } } return hWnd; }
BOOL WINAPI OnGetCurrentConsoleFont(HANDLE hConsoleOutput, BOOL bMaximumWindow, PCONSOLE_FONT_INFO lpConsoleCurrentFont) { //typedef BOOL (WINAPI* OnGetCurrentConsoleFont_t)(HANDLE hConsoleOutput, BOOL bMaximumWindow, PCONSOLE_FONT_INFO lpConsoleCurrentFont); ORIGINALFASTEX(GetCurrentConsoleFont,NULL); BOOL lbRc = FALSE; COORD crSize = {}; if (lpConsoleCurrentFont && MyGetConsoleFontSize(crSize)) { lpConsoleCurrentFont->dwFontSize = crSize; lpConsoleCurrentFont->nFont = 1; lbRc = TRUE; } else if (F(GetCurrentConsoleFont)) lbRc = F(GetCurrentConsoleFont)(hConsoleOutput, bMaximumWindow, lpConsoleCurrentFont); return lbRc; }
// !!! UNDOCUMENTED !!! // Old note: Required for bring create dialog on top (Z-order) during shell operations // Does this mention "Run as" (pre-UAC) // or Explorer's choose application (start using) - can't remember. // New note: It's required for proper function of ChooseColor functions INT_PTR WINAPI OnDialogBoxIndirectParamAorW(HINSTANCE hInstance, LPCDLGTEMPLATE hDialogTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam, DWORD Flags) { //typedef INT_PTR (WINAPI* OnDialogBoxIndirectParamAorW_t)(HINSTANCE hInstance, LPCDLGTEMPLATE hDialogTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam, DWORD Flags); ORIGINALFASTEX(DialogBoxIndirectParamAorW,NULL); INT_PTR iRc = 0; if (ghConEmuWndDC) { // Необходимо "поднять" наверх консольное окно, иначе Shell-овский диалог окажется ПОД ConEmu GuiSetForeground(hWndParent ? hWndParent : ghConWnd); // bugreport from Andrey Budko: conemu + emenu/{Run Sandboxed} замораживает фар PatchDialogParentWnd(hWndParent); } if (F(DialogBoxIndirectParamAorW)) iRc = F(DialogBoxIndirectParamAorW)(hInstance, hDialogTemplate, hWndParent, lpDialogFunc, dwInitParam, Flags); return iRc; }
BOOL WINAPI OnSetConsoleTitleW(LPCWSTR lpConsoleTitle) { //typedef BOOL (WINAPI* OnSetConsoleTitleW_t)(LPCWSTR lpConsoleTitle); ORIGINALFASTEX(SetConsoleTitleW,NULL); #ifdef DEBUG_CON_TITLE if (!gpLastSetConTitle) gpLastSetConTitle = new CEStr(lstrdup(lpConsoleTitle)); else gpLastSetConTitle->Set(lpConsoleTitle); CEStr lsDbg(lstrmerge(L"SetConsoleTitleW('", lpConsoleTitle, L"')\n")); OutputDebugString(lsDbg); #endif BOOL bRc = FALSE; if (F(SetConsoleTitleW)) bRc = F(SetConsoleTitleW)(lpConsoleTitle); return bRc; }
// WARNING!!! This function exist in Vista and higher OS only!!! // Issue 1410 BOOL WINAPI OnSetCurrentConsoleFontEx(HANDLE hConsoleOutput, BOOL bMaximumWindow, MY_CONSOLE_FONT_INFOEX* lpConsoleCurrentFontEx) { //typedef BOOL (WINAPI* OnSetCurrentConsoleFontEx_t)(HANDLE hConsoleOutput, BOOL bMaximumWindow, MY_CONSOLE_FONT_INFOEX* lpConsoleCurrentFontEx); ORIGINALFASTEX(SetCurrentConsoleFontEx,NULL); BOOL lbRc = FALSE; if (ghConEmuWndDC) { DebugString(L"Application tries to change console font! Prohibited!"); //_ASSERTEX(FALSE && "Application tries to change console font! Prohibited!"); //SetLastError(ERROR_INVALID_HANDLE); //Damn powershell close itself if received an error on this call lbRc = TRUE; // Cheating goto wrap; } if (F(SetCurrentConsoleFontEx)) lbRc = F(SetCurrentConsoleFontEx)(hConsoleOutput, bMaximumWindow, lpConsoleCurrentFontEx); wrap: return lbRc; }
HWND WINAPI OnCreateDialogIndirectParamA(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit) { //typedef HWND (WINAPI* OnCreateDialogIndirectParamA_t)(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit); ORIGINALFASTEX(CreateDialogIndirectParamA,NULL); HWND hWnd = NULL; BOOL bAttachGui = (hWndParent == NULL), bStyleHidden = FALSE; // Со стилями - полная фигня сюда попадает DWORD lStyle = lpTemplate ? lpTemplate->style : 0; DWORD lStyleEx = lpTemplate ? lpTemplate->dwExtendedStyle : 0; if (/*CheckCanCreateWindow((LPCSTR)32770, NULL, lStyle, lStyleEx, hWndParent, bAttachGui, bStyleHidden) &&*/ F(CreateDialogIndirectParamA) != NULL) { //if (bAttachGui) //{ // x = grcConEmuClient.left; y = grcConEmuClient.top; // nWidth = grcConEmuClient.right - grcConEmuClient.left; nHeight = grcConEmuClient.bottom - grcConEmuClient.top; //} hWnd = F(CreateDialogIndirectParamA)(hInstance, lpTemplate, hWndParent, lpDialogFunc, lParamInit); DWORD dwErr = GetLastError(); if (hWnd && bAttachGui) { lStyle = (DWORD)GetWindowLongPtr(hWnd, GWL_STYLE); lStyleEx = (DWORD)GetWindowLongPtr(hWnd, GWL_EXSTYLE); if (CheckCanCreateWindow((LPCSTR)32770, NULL, lStyle, lStyleEx, hWndParent, bAttachGui, bStyleHidden) && bAttachGui) { OnGuiWindowAttached(hWnd, NULL, (LPCSTR)32770, NULL, lStyle, lStyleEx, bStyleHidden); } SetLastError(dwErr); } } return hWnd; }
// WARNING!!! This function exist in Vista and higher OS only!!! BOOL WINAPI OnSetConsoleScreenBufferInfoEx(HANDLE hConsoleOutput, MY_CONSOLE_SCREEN_BUFFER_INFOEX* lpConsoleScreenBufferInfoEx) { //typedef BOOL (WINAPI* OnSetConsoleScreenBufferInfoEx_t)(HANDLE hConsoleOutput, MY_CONSOLE_SCREEN_BUFFER_INFOEX* lpConsoleScreenBufferInfoEx); ORIGINALFASTEX(SetConsoleScreenBufferInfoEx,NULL); BOOL lbRc = FALSE; COORD crLocked; DWORD dwErr = -1; CONSOLE_SCREEN_BUFFER_INFO sbi = {}; BOOL lbSbi = GetConsoleScreenBufferInfo(hConsoleOutput, &sbi); UNREFERENCED_PARAMETER(lbSbi); #ifdef _DEBUG wchar_t szDbgSize[512]; if (lpConsoleScreenBufferInfoEx) { msprintf(szDbgSize, countof(szDbgSize), L"SetConsoleScreenBufferInfoEx(%08X, {%ix%i}), Current={%ix%i}, Wnd={%ix%i}\n", LODWORD(hConsoleOutput), lpConsoleScreenBufferInfoEx->dwSize.X, lpConsoleScreenBufferInfoEx->dwSize.Y, sbi.dwSize.X, sbi.dwSize.Y, sbi.srWindow.Right-sbi.srWindow.Left+1, sbi.srWindow.Bottom-sbi.srWindow.Top+1); } else { lstrcpyn(szDbgSize, L"SetConsoleScreenBufferInfoEx(%08X, NULL)\n", LODWORD(hConsoleOutput)); } DebugStringConSize(szDbgSize); #endif BOOL lbLocked = IsVisibleRectLocked(crLocked); if (lbLocked && lpConsoleScreenBufferInfoEx && ((crLocked.X > lpConsoleScreenBufferInfoEx->dwSize.X) || (crLocked.Y > lpConsoleScreenBufferInfoEx->dwSize.Y))) { // Размер _видимой_ области. Консольным приложениям запрещено менять его "изнутри". // Размер может менять только пользователь ресайзом окна ConEmu if (crLocked.X > lpConsoleScreenBufferInfoEx->dwSize.X) lpConsoleScreenBufferInfoEx->dwSize.X = crLocked.X; if (crLocked.Y > lpConsoleScreenBufferInfoEx->dwSize.Y) lpConsoleScreenBufferInfoEx->dwSize.Y = crLocked.Y; #ifdef _DEBUG msprintf(szDbgSize, countof(szDbgSize), L"---> IsVisibleRectLocked, dwSize was patched {%ix%i}\n", lpConsoleScreenBufferInfoEx->dwSize.X, lpConsoleScreenBufferInfoEx->dwSize.Y); DebugStringConSize(szDbgSize); #endif } if (F(SetConsoleScreenBufferInfoEx)) { CESERVER_REQ *pIn = NULL, *pOut = NULL; if (lpConsoleScreenBufferInfoEx) LockServerReadingThread(true, lpConsoleScreenBufferInfoEx->dwSize, pIn, pOut); lbRc = F(SetConsoleScreenBufferInfoEx)(hConsoleOutput, lpConsoleScreenBufferInfoEx); dwErr = GetLastError(); if (lpConsoleScreenBufferInfoEx) LockServerReadingThread(false, lpConsoleScreenBufferInfoEx->dwSize, pIn, pOut); } UNREFERENCED_PARAMETER(dwErr); return lbRc; }