From cd682e2c1be11cd0046d30bece527d4228e308dc Mon Sep 17 00:00:00 2001 From: akallabeth Date: Thu, 20 Mar 2025 11:41:15 +0100 Subject: [PATCH] [winpr,file] create global instance for GetStdHandle --- winpr/libwinpr/file/file.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/winpr/libwinpr/file/file.c b/winpr/libwinpr/file/file.c index be8eae4f9..cbc43147d 100644 --- a/winpr/libwinpr/file/file.c +++ b/winpr/libwinpr/file/file.c @@ -56,6 +56,10 @@ #define MIN(x, y) (((x) < (y)) ? (x) : (y)) #endif +static WINPR_FILE* pStdHandleFile = NULL; + +static void GetStdHandle_Uninit(void) __attribute__((destructor)); + static BOOL FileIsHandled(HANDLE handle) { return WINPR_HANDLE_IS_HANDLED(handle, HANDLE_TYPE_FILE, FALSE); @@ -71,13 +75,21 @@ static int FileGetFd(HANDLE handle) return fileno(file->fp); } -static BOOL FileCloseHandle(HANDLE handle) +static BOOL FileCloseHandleInt(HANDLE handle, BOOL force) { WINPR_FILE* file = (WINPR_FILE*)handle; if (!FileIsHandled(handle)) return FALSE; + if (!force) + { + if (handle == pStdHandleFile) + { + return FALSE; + } + } + if (file->fp) { /* Don't close stdin/stdout/stderr */ @@ -93,6 +105,11 @@ static BOOL FileCloseHandle(HANDLE handle) return TRUE; } +static BOOL FileCloseHandle(HANDLE handle) +{ + return FileCloseHandleInt(handle, FALSE); +} + static BOOL FileSetEndOfFile(HANDLE hFile) { WINPR_FILE* pFile = (WINPR_FILE*)hFile; @@ -1008,10 +1025,14 @@ static WINPR_FILE* FileHandle_New(FILE* fp) return pFile; } +void GetStdHandle_Uninit(void) +{ + FileCloseHandleInt(pStdHandleFile, TRUE); +} + HANDLE GetStdHandle(DWORD nStdHandle) { FILE* fp = NULL; - WINPR_FILE* pFile = NULL; switch (nStdHandle) { @@ -1027,11 +1048,13 @@ HANDLE GetStdHandle(DWORD nStdHandle) default: return INVALID_HANDLE_VALUE; } - pFile = FileHandle_New(fp); - if (!pFile) + if (!pStdHandleFile) + pStdHandleFile = FileHandle_New(fp); + + if (!pStdHandleFile) return INVALID_HANDLE_VALUE; - return (HANDLE)pFile; + return (HANDLE)pStdHandleFile; } BOOL SetStdHandle(WINPR_ATTR_UNUSED DWORD nStdHandle, WINPR_ATTR_UNUSED HANDLE hHandle)