// Helper function void OnReadConsoleEnd(BOOL bSucceeded, bool bUnicode, HANDLE hConsoleInput, LPVOID lpBuffer, DWORD nNumberOfCharsToRead, LPDWORD lpNumberOfCharsRead, LPVOID pInputControl) { if (bSucceeded && !gbWasSucceededInRead && lpNumberOfCharsRead && *lpNumberOfCharsRead) gbWasSucceededInRead = TRUE; if (gReadConsoleInfo.InReadConsoleTID) { gReadConsoleInfo.LastReadConsoleTID = gReadConsoleInfo.InReadConsoleTID; gReadConsoleInfo.InReadConsoleTID = 0; TODO("Отослать в ConEmu считанную строку?"); } bool bNoLineFeed = true; if (bSucceeded) { // Empty line was "readed" (Ctrl+C)? // Or 'Tab'-eneded when Tab was pressed (for completion)? if (lpNumberOfCharsRead && lpBuffer) { if (!*lpNumberOfCharsRead) bNoLineFeed = true; // empty line else if (bUnicode && (((wchar_t*)lpBuffer)[*lpNumberOfCharsRead] == L'\t')) bNoLineFeed = true; // completion was requested else if (!bUnicode && (((char*)lpBuffer)[*lpNumberOfCharsRead] == '\t')) bNoLineFeed = true; // completion was requested // ANSI logging if (bUnicode) CEAnsi::WriteAnsiLogW((wchar_t*)lpBuffer, *lpNumberOfCharsRead); else CEAnsi::WriteAnsiLogA((char*)lpBuffer, *lpNumberOfCharsRead); } } CEAnsi::OnReadConsoleAfter(true, bNoLineFeed); // Сброс кешированных значений GetConsoleScreenBufferInfoCached(NULL, NULL); PostReadConsoleInput(hConsoleInput, (bUnicode ? rcif_Unicode : rcif_Ansi)); }
// Helper function: Notification ‘Debug’ setting page in ConEmu void OnPeekReadConsoleInput(char acPeekRead/*'P'/'R'*/, char acUnicode/*'A'/'W'*/, HANDLE hConsoleInput, PINPUT_RECORD lpBuffer, DWORD nRead) { #ifdef TRAP_ON_MOUSE_0x0 if (lpBuffer && nRead) { for (UINT i = 0; i < nRead; i++) { if (lpBuffer[i].EventType == MOUSE_EVENT) { if (lpBuffer[i].Event.MouseEvent.dwMousePosition.X == 0 && lpBuffer[i].Event.MouseEvent.dwMousePosition.Y == 0) { _ASSERTE(!(lpBuffer[i].Event.MouseEvent.dwMousePosition.X == 0 && lpBuffer[i].Event.MouseEvent.dwMousePosition.Y == 0)); } //if (lpBuffer[i].Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED && lpBuffer[i].Event.MouseEvent.dwMousePosition.X != 5) //{ // _ASSERTE(!(lpBuffer[i].Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED && lpBuffer[i].Event.MouseEvent.dwMousePosition.X != 5)); //} } } } #endif DWORD nCurrentTID = GetCurrentThreadId(); gReadConsoleInfo.LastReadConsoleInputTID = nCurrentTID; gReadConsoleInfo.hConsoleInput2 = hConsoleInput; if (nRead) { if (!gbWasSucceededInRead) gbWasSucceededInRead = TRUE; // Сброс кешированных значений GetConsoleScreenBufferInfoCached(NULL, NULL); } if (!gFarMode.bFarHookMode || !gFarMode.bMonitorConsoleInput || !nRead || !lpBuffer) return; //// Пока - только Read. Peek игнорируем //if (acPeekRead != 'R') // return; CESERVER_REQ *pIn = ExecuteNewCmd(CECMD_PEEKREADINFO, sizeof(CESERVER_REQ_HDR) //-V119 +sizeof(CESERVER_REQ_PEEKREADINFO)+(nRead-1)*sizeof(INPUT_RECORD)); if (pIn) { pIn->PeekReadInfo.nCount = (WORD)nRead; pIn->PeekReadInfo.cPeekRead = acPeekRead; pIn->PeekReadInfo.cUnicode = acUnicode; pIn->PeekReadInfo.h = hConsoleInput; pIn->PeekReadInfo.nTID = nCurrentTID; pIn->PeekReadInfo.nPID = GetCurrentProcessId(); pIn->PeekReadInfo.bMainThread = (pIn->PeekReadInfo.nTID == gnHookMainThreadId); memmove(pIn->PeekReadInfo.Buffer, lpBuffer, nRead*sizeof(INPUT_RECORD)); CESERVER_REQ* pOut = ExecuteGuiCmd(ghConWnd, pIn, ghConWnd); if (pOut) ExecuteFreeResult(pOut); ExecuteFreeResult(pIn); } }
// Helper function: Notification ‘Debug’ setting page in ConEmu void OnPeekReadConsoleInput(char acPeekRead/*'P'/'R'*/, char acUnicode/*'A'/'W'*/, HANDLE hConsoleInput, PINPUT_RECORD lpBuffer, DWORD& nRead) { #ifdef TRAP_ON_MOUSE_0x0 if (lpBuffer && nRead) { for (UINT i = 0; i < nRead; i++) { if (lpBuffer[i].EventType == MOUSE_EVENT) { if (lpBuffer[i].Event.MouseEvent.dwMousePosition.X == 0 && lpBuffer[i].Event.MouseEvent.dwMousePosition.Y == 0) { _ASSERTE(!(lpBuffer[i].Event.MouseEvent.dwMousePosition.X == 0 && lpBuffer[i].Event.MouseEvent.dwMousePosition.Y == 0)); } //if (lpBuffer[i].Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED && lpBuffer[i].Event.MouseEvent.dwMousePosition.X != 5) //{ // _ASSERTE(!(lpBuffer[i].Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED && lpBuffer[i].Event.MouseEvent.dwMousePosition.X != 5)); //} } } } #endif DWORD nCurrentTID = GetCurrentThreadId(); gReadConsoleInfo.LastReadConsoleInputTID = nCurrentTID; gReadConsoleInfo.hConsoleInput2 = hConsoleInput; if (nRead) { if (!gbWasSucceededInRead) gbWasSucceededInRead = TRUE; // Сброс кешированных значений GetConsoleScreenBufferInfoCached(NULL, NULL); } if (!nRead || !lpBuffer) return; if (gFarMode.bFarHookMode && gFarMode.bMonitorConsoleInput) { CESERVER_REQ *pIn = ExecuteNewCmd(CECMD_PEEKREADINFO, sizeof(CESERVER_REQ_HDR) //-V119 +sizeof(CESERVER_REQ_PEEKREADINFO)+(nRead-1)*sizeof(INPUT_RECORD)); if (pIn) { pIn->PeekReadInfo.nCount = (WORD)nRead; pIn->PeekReadInfo.cPeekRead = acPeekRead; pIn->PeekReadInfo.cUnicode = acUnicode; pIn->PeekReadInfo.h = hConsoleInput; pIn->PeekReadInfo.nTID = nCurrentTID; pIn->PeekReadInfo.nPID = GetCurrentProcessId(); pIn->PeekReadInfo.bMainThread = (pIn->PeekReadInfo.nTID == gnHookMainThreadId); memmove(pIn->PeekReadInfo.Buffer, lpBuffer, nRead*sizeof(INPUT_RECORD)); CESERVER_REQ* pOut = ExecuteGuiCmd(ghConWnd, pIn, ghConWnd); if (pOut) ExecuteFreeResult(pOut); ExecuteFreeResult(pIn); } } // Temp bugfix for unexpected WINDOW_BUFFER_SIZE_EVENT if (gFarMode.bFarHookMode && (acPeekRead == 'R') && IsWin10()) { static WINDOW_BUFFER_SIZE_RECORD last_size = {}; INPUT_RECORD *src = lpBuffer, *dst = lpBuffer, *buf_end = lpBuffer + nRead; while (src < buf_end) { if (src != dst) { *dst = *src; } if (src->EventType != WINDOW_BUFFER_SIZE_EVENT) { ++src; ++dst; continue; } // OK, reported size was changed since last call if (last_size.dwSize != src->Event.WindowBufferSizeEvent.dwSize) { last_size = src->Event.WindowBufferSizeEvent; ++src; ++dst; continue; } // Size was not changed _ASSERTE(nRead > 0); --nRead; ++src; dst->EventType = 0; } } }