// Undocumented function BOOL WINAPI OnSetConsoleKeyShortcuts(BOOL bSet, BYTE bReserveKeys, LPVOID p1, DWORD n1) { //typedef BOOL (WINAPI* OnSetConsoleKeyShortcuts_t)(BOOL,BYTE,LPVOID,DWORD); ORIGINAL_KRNL_EX(SetConsoleKeyShortcuts); 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; }
// ANSI хукать смысла нет, т.к. FAR 1.x сравнивает сам int WINAPI OnCompareStringW(LCID Locale, DWORD dwCmpFlags, LPCWSTR lpString1, int cchCount1, LPCWSTR lpString2, int cchCount2) { //typedef int (WINAPI* OnCompareStringW_t)(LCID Locale, DWORD dwCmpFlags, LPCWSTR lpString1, int cchCount1, LPCWSTR lpString2, int cchCount2); SUPPRESSORIGINALSHOWCALL; ORIGINAL_KRNL_EX(CompareStringW); int nCmp = -1; if (gFarMode.bFarHookMode && gFarMode.bFARuseASCIIsort) { if (dwCmpFlags == (NORM_IGNORECASE|NORM_STOP_ON_NULL|SORT_STRINGSORT)) { int n = 0; WCHAR ch1 = *lpString1++, /*ch10 = 0,*/ ch2 = *lpString2++ /*,ch20 = 0*/; int n1 = (cchCount1==cchCount2) ? cchCount1 : (cchCount1!=-1 && cchCount2!=-1) ? -1 : (cchCount1!=-1) ? cchCount2 : (cchCount2!=-1) ? cchCount1 : std::min(cchCount1,cchCount2); while(!n && /*(ch1=*lpString1++) && (ch2=*lpString2++) &&*/ n1--) { if (ch1==ch2) { if (!ch1) break; // n = 0; } else if (ch1<0x80 && ch2<0x80) { if (ch1>=L'A' && ch1<=L'Z') ch1 |= 0x20; //-V112 if (ch2>=L'A' && ch2<=L'Z') ch2 |= 0x20; //-V112 n = (ch1==ch2) ? 0 : (ch1<ch2) ? -1 : 1; } else { n = CompareStringW(Locale, dwCmpFlags, &ch1, 1, &ch2, 1)-2; } if (!ch1 || !ch2 || !n1) break; ch1 = *lpString1++; ch2 = *lpString2++; } nCmp = (n<0) ? 1 : (n>0) ? 3 : 2; } } if (nCmp == -1) nCmp = F(CompareStringW)(Locale, dwCmpFlags, lpString1, cchCount1, lpString2, cchCount2); return nCmp; }
// 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); ORIGINAL_KRNL_EX(SetCurrentConsoleFontEx); 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; }
// 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); ORIGINAL_KRNL_EX(SetConsoleScreenBufferInfoEx); 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; }