From 64511becf23a2a3d68fd4648638f42c1e608370d Mon Sep 17 00:00:00 2001 From: Luke Street Date: Tue, 18 Nov 2025 21:53:16 -0700 Subject: [PATCH] kernel32/wincon cleanup --- dll/kernel32/processthreadsapi.cpp | 13 ++++++++----- dll/kernel32/wincon.cpp | 12 ++++++++---- dll/kernel32/wincon.h | 10 +++++----- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/dll/kernel32/processthreadsapi.cpp b/dll/kernel32/processthreadsapi.cpp index 362f98d..46e4a8d 100644 --- a/dll/kernel32/processthreadsapi.cpp +++ b/dll/kernel32/processthreadsapi.cpp @@ -168,13 +168,16 @@ BOOL WINAPI IsProcessorFeaturePresent(DWORD ProcessorFeature) { HOST_CONTEXT_GUARD(); DEBUG_LOG("IsProcessorFeaturePresent(%u)\n", ProcessorFeature); if (ProcessorFeature == 0) { // PF_FLOATING_POINT_PRECISION_ERRATA - return TRUE; + return FALSE; + } + if (ProcessorFeature == 1) { // PF_FLOATING_POINT_EMULATED + return FALSE; } if (ProcessorFeature == 10) { // PF_XMMI64_INSTRUCTIONS_AVAILABLE (SSE2) return TRUE; } - if (ProcessorFeature == 23) { // PF_FASTFAIL_AVAILABLE (__fastfail() supported) - return TRUE; + if (ProcessorFeature == 23) { // PF_FASTFAIL_AVAILABLE (__fastfail) + return FALSE; } DEBUG_LOG(" IsProcessorFeaturePresent: unknown feature %u, returning TRUE\n", ProcessorFeature); return TRUE; @@ -599,7 +602,7 @@ BOOL WINAPI GetThreadTimes(HANDLE hThread, FILETIME *lpCreationTime, FILETIME *l } #ifdef __linux__ - struct rusage usage {}; + struct rusage usage{}; if (getrusage(RUSAGE_THREAD, &usage) == 0) { *lpKernelTime = fileTimeFromTimeval(usage.ru_stime); *lpUserTime = fileTimeFromTimeval(usage.ru_utime); @@ -607,7 +610,7 @@ BOOL WINAPI GetThreadTimes(HANDLE hThread, FILETIME *lpCreationTime, FILETIME *l } #endif - struct timespec cpuTime {}; + struct timespec cpuTime{}; if (clock_gettime(CLOCK_THREAD_CPUTIME_ID, &cpuTime) == 0) { *lpKernelTime = fileTimeFromDuration(0); *lpUserTime = fileTimeFromTimespec(cpuTime); diff --git a/dll/kernel32/wincon.cpp b/dll/kernel32/wincon.cpp index 95baafb..8a26a6a 100644 --- a/dll/kernel32/wincon.cpp +++ b/dll/kernel32/wincon.cpp @@ -61,7 +61,7 @@ BOOL WINAPI GetConsoleScreenBufferInfo(HANDLE hConsoleOutput, CONSOLE_SCREEN_BUF return TRUE; } -BOOL WINAPI WriteConsoleW(HANDLE hConsoleOutput, LPCVOID lpBuffer, DWORD nNumberOfCharsToWrite, +BOOL WINAPI WriteConsoleW(HANDLE hConsoleOutput, LPCWSTR lpBuffer, DWORD nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved) { HOST_CONTEXT_GUARD(); DEBUG_LOG("WriteConsoleW(%p, %p, %u, %p, %p)\n", hConsoleOutput, lpBuffer, nNumberOfCharsToWrite, @@ -77,10 +77,14 @@ BOOL WINAPI WriteConsoleW(HANDLE hConsoleOutput, LPCVOID lpBuffer, DWORD nNumber auto file = wibo::handles().getAs(hConsoleOutput); if (file->fd == STDOUT_FILENO || file->fd == STDERR_FILENO) { - auto str = wideStringToString(static_cast(lpBuffer), static_cast(nNumberOfCharsToWrite)); - dprintf(file->fd, "%s", str.c_str()); + auto str = wideStringToString(lpBuffer, static_cast(nNumberOfCharsToWrite)); + auto io = files::write(file.get(), str.c_str(), str.size(), std::nullopt, true); if (lpNumberOfCharsWritten) { - *lpNumberOfCharsWritten = nNumberOfCharsToWrite; + *lpNumberOfCharsWritten = io.bytesTransferred; + } + if (io.unixError != 0) { + setLastError(wibo::winErrorFromErrno(io.unixError)); + return FALSE; } return TRUE; } diff --git a/dll/kernel32/wincon.h b/dll/kernel32/wincon.h index 818c968..a34b8ac 100644 --- a/dll/kernel32/wincon.h +++ b/dll/kernel32/wincon.h @@ -24,7 +24,7 @@ struct CONSOLE_SCREEN_BUFFER_INFO { struct INPUT_RECORD; -typedef BOOL (_CC_STDCALL *PHANDLER_ROUTINE)(DWORD CtrlType); +typedef BOOL(_CC_STDCALL *PHANDLER_ROUTINE)(DWORD CtrlType); namespace kernel32 { @@ -34,14 +34,14 @@ UINT WINAPI GetConsoleCP(); UINT WINAPI GetConsoleOutputCP(); BOOL WINAPI SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add); BOOL WINAPI GetConsoleScreenBufferInfo(HANDLE hConsoleOutput, CONSOLE_SCREEN_BUFFER_INFO *lpConsoleScreenBufferInfo); -BOOL WINAPI WriteConsoleW(HANDLE hConsoleOutput, LPCVOID lpBuffer, DWORD nNumberOfCharsToWrite, - LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved); +BOOL WINAPI WriteConsoleW(HANDLE hConsoleOutput, LPCWSTR lpBuffer, DWORD nNumberOfCharsToWrite, + LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved); DWORD WINAPI GetConsoleTitleA(LPSTR lpConsoleTitle, DWORD nSize); DWORD WINAPI GetConsoleTitleW(LPWSTR lpConsoleTitle, DWORD nSize); BOOL WINAPI PeekConsoleInputA(HANDLE hConsoleInput, INPUT_RECORD *lpBuffer, DWORD nLength, - LPDWORD lpNumberOfEventsRead); + LPDWORD lpNumberOfEventsRead); BOOL WINAPI ReadConsoleInputA(HANDLE hConsoleInput, INPUT_RECORD *lpBuffer, DWORD nLength, - LPDWORD lpNumberOfEventsRead); + LPDWORD lpNumberOfEventsRead); BOOL WINAPI VerifyConsoleIoHandle(HANDLE handle); } // namespace kernel32