BOOL WINAPI OnReadConsoleInputA(HANDLE hConsoleInput, PINPUT_RECORD lpBuffer, DWORD nLength, LPDWORD lpNumberOfEventsRead) { //typedef BOOL (WINAPI* OnReadConsoleInputA_t)(HANDLE hConsoleInput, PINPUT_RECORD lpBuffer, DWORD nLength, LPDWORD lpNumberOfEventsRead); SUPPRESSORIGINALSHOWCALL; ORIGINAL_KRNL(ReadConsoleInputA); //if (gpFarInfo && bMainThread) // TouchReadPeekConsoleInputs(0); BOOL lbRc = FALSE; #if defined(_DEBUG) #if 1 UINT nCp = GetConsoleCP(); UINT nOutCp = GetConsoleOutputCP(); UINT nOemCp = GetOEMCP(); UINT nAnsiCp = GetACP(); #endif #endif // To minimize startup duration and possible problems // hook server will start on first 'user interaction' CheckHookServer(); if (ph && ph->PreCallBack) { SETARGS4(&lbRc,hConsoleInput,lpBuffer,nLength,lpNumberOfEventsRead); // Если функция возвращает FALSE - реальное чтение не будет вызвано if (!ph->PreCallBack(&args)) return lbRc; } CESERVER_CONSOLE_APP_MAPPING* pAppMap = NULL; PreReadConsoleInput(hConsoleInput, rcif_Ansi|rcif_LLInput, &pAppMap); //#ifdef USE_INPUT_SEMAPHORE //DWORD nSemaphore = ghConInSemaphore ? WaitForSingleObject(ghConInSemaphore, INSEMTIMEOUT_READ) : 1; //_ASSERTE(nSemaphore<=1); //#endif lbRc = F(ReadConsoleInputA)(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead); PostReadConsoleInput(hConsoleInput, rcif_Ansi|rcif_LLInput, pAppMap); //#ifdef USE_INPUT_SEMAPHORE //if ((nSemaphore == WAIT_OBJECT_0) && ghConInSemaphore) ReleaseSemaphore(ghConInSemaphore, 1, NULL); //#endif if (ph && ph->PostCallBack) { SETARGS4(&lbRc,hConsoleInput,lpBuffer,nLength,lpNumberOfEventsRead); ph->PostCallBack(&args); } if (lbRc && lpNumberOfEventsRead && *lpNumberOfEventsRead && lpBuffer) { OnPeekReadConsoleInput('R', 'A', hConsoleInput, lpBuffer, *lpNumberOfEventsRead); } return lbRc; }
// Helper function void OnReadConsoleStart(bool bUnicode, HANDLE hConsoleInput, LPVOID lpBuffer, DWORD nNumberOfCharsToRead, LPDWORD lpNumberOfCharsRead, MY_CONSOLE_READCONSOLE_CONTROL* pInputControl) { if (gReadConsoleInfo.InReadConsoleTID) gReadConsoleInfo.LastReadConsoleTID = gReadConsoleInfo.InReadConsoleTID; #ifdef _DEBUG wchar_t szCurDir[MAX_PATH+1]; GetCurrentDirectory(countof(szCurDir), szCurDir); #endif // To minimize startup duration and possible problems // hook server will start on first 'user interaction' CheckHookServer(); bool bCatch = false; CONSOLE_SCREEN_BUFFER_INFO csbi = {}; HANDLE hConOut = GetStdHandle(STD_OUTPUT_HANDLE); DWORD nConIn = 0, nConOut = 0; if (GetConsoleScreenBufferInfo(hConOut, &csbi)) { if (GetConsoleMode(hConsoleInput, &nConIn) && GetConsoleMode(hConOut, &nConOut)) { if ((nConIn & ENABLE_ECHO_INPUT) && (nConIn & ENABLE_LINE_INPUT)) { bCatch = true; gReadConsoleInfo.InReadConsoleTID = GetCurrentThreadId(); gReadConsoleInfo.bIsUnicode = bUnicode; gReadConsoleInfo.hConsoleInput = hConsoleInput; // Support Tab-completion in cmd.exe and others gReadConsoleInfo.crStartCursorPos = FixupReadStartCursorPos(nNumberOfCharsToRead, csbi, pInputControl); gReadConsoleInfo.nConInMode = nConIn; gReadConsoleInfo.nConOutMode = nConOut; CEAnsi::OnReadConsoleBefore(hConOut, csbi); } } } if (!bCatch) { gReadConsoleInfo.InReadConsoleTID = 0; } PreReadConsoleInput(hConsoleInput, (bUnicode ? rcif_Unicode : rcif_Ansi)); }
BOOL WINAPI OnReadConsoleInputW(HANDLE hConsoleInput, PINPUT_RECORD lpBuffer, DWORD nLength, LPDWORD lpNumberOfEventsRead) { //typedef BOOL (WINAPI* OnReadConsoleInputW_t)(HANDLE hConsoleInput, PINPUT_RECORD lpBuffer, DWORD nLength, LPDWORD lpNumberOfEventsRead); SUPPRESSORIGINALSHOWCALL; ORIGINAL_KRNL(ReadConsoleInputW); //if (gpFarInfo && bMainThread) // TouchReadPeekConsoleInputs(0); BOOL lbRc = FALSE; // To minimize startup duration and possible problems // hook server will start on first 'user interaction' CheckHookServer(); if (ph && ph->PreCallBack) { SETARGS4(&lbRc,hConsoleInput,lpBuffer,nLength,lpNumberOfEventsRead); // Если функция возвращает FALSE - реальное чтение не будет вызвано if (!ph->PreCallBack(&args)) return lbRc; } CESERVER_CONSOLE_APP_MAPPING* pAppMap = NULL; PreReadConsoleInput(hConsoleInput, rcif_Unicode|rcif_LLInput, &pAppMap); //#ifdef USE_INPUT_SEMAPHORE //DWORD nSemaphore = ghConInSemaphore ? WaitForSingleObject(ghConInSemaphore, INSEMTIMEOUT_READ) : 1; //_ASSERTE(nSemaphore<=1); //#endif #if 0 // get-help Get-ChildItem -full | out-host -paging HANDLE hInTest; HANDLE hTestHandle = NULL; DWORD nInMode, nArgMode; BOOL bInTest = FALSE, bArgTest = FALSE; if (gbPowerShellMonitorProgress) { hInTest = GetStdHandle(STD_INPUT_HANDLE); #ifdef _DEBUG bInTest = GetConsoleMode(hInTest, &nInMode); bArgTest = GetConsoleMode(hConsoleInput, &nArgMode); hTestHandle = CreateFile(L"CONIN$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hTestHandle != INVALID_HANDLE_VALUE) CloseHandle(hTestHandle); #endif } #endif if (gFarMode.bFarHookMode && USE_INTERNAL_QUEUE) // ecompl speed-up { #ifdef _DEBUG DWORD nDbgReadReal = countof(gir_Real), nDbgReadVirtual = countof(gir_Virtual); BOOL bReadReal = PeekConsoleInputW(hConsoleInput, gir_Real, nDbgReadReal, &nDbgReadReal); BOOL bReadVirt = gInQueue.ReadInputQueue(gir_Virtual, &nDbgReadVirtual, TRUE); #endif if ((!lbRc || !(lpNumberOfEventsRead && *lpNumberOfEventsRead)) && !gInQueue.IsInputQueueEmpty()) { DWORD n = nLength; lbRc = gInQueue.ReadInputQueue(lpBuffer, &n, FALSE); if (lpNumberOfEventsRead) *lpNumberOfEventsRead = lbRc ? n : 0; } else { lbRc = F(ReadConsoleInputW)(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead); } } else { lbRc = F(ReadConsoleInputW)(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead); } // cygwin/msys shells prompt if (lbRc && CEAnsi::ghAnsiLogFile && (nLength == 1) && (*lpNumberOfEventsRead == 1) && (lpBuffer->EventType == KEY_EVENT) && lpBuffer->Event.KeyEvent.bKeyDown && (lpBuffer->Event.KeyEvent.wVirtualKeyCode == VK_RETURN) ) { CEAnsi::AnsiLogEnterPressed(); } PostReadConsoleInput(hConsoleInput, rcif_Unicode|rcif_LLInput, pAppMap); //#ifdef USE_INPUT_SEMAPHORE //if ((nSemaphore == WAIT_OBJECT_0) && ghConInSemaphore) ReleaseSemaphore(ghConInSemaphore, 1, NULL); //#endif if (ph && ph->PostCallBack) { SETARGS4(&lbRc,hConsoleInput,lpBuffer,nLength,lpNumberOfEventsRead); ph->PostCallBack(&args); } if (lbRc && lpNumberOfEventsRead && *lpNumberOfEventsRead && lpBuffer) { OnPeekReadConsoleInput('R', 'W', hConsoleInput, lpBuffer, *lpNumberOfEventsRead); } return lbRc; }