ReactOS 0.4.16-dev-2491-g3dc6630
utils.c File Reference

General-purpose utility functions (wrappers around or reimplementations of Win32 APIs). More...

#include <windef.h>
#include <winbase.h>
#include <wincon.h>
#include <strsafe.h>
#include <pseh/pseh2.h>
#include "utils.h"
Include dependency graph for utils.c:

Go to the source code of this file.

Macros

#define UNICODE
 
#define _UNICODE
 
#define MAKEINTRESOURCE(i)   ((ULONG_PTR)((WORD)(i)))
 
#define RT_STRING   MAKEINTRESOURCE(6)
 
#define RT_MESSAGETABLE   MAKEINTRESOURCE(11)
 

Functions

K32LoadStringExW

Loads a string resource from the executable file associated with a specified module, copies the string into a buffer, and appends a terminating null character. This is basically the LoadString() API ripped from user32.dll to remove any dependency of ConUtils from user32.dll, and to add support for loading strings from other languages than the current one.

Parameters
[in]hInstanceOptional handle to an instance of the module whose executable file contains the string resource. Can be set to NULL to get the handle to the application itself.
[in]uIDThe identifier of the string to be loaded.
[in]LanguageIdThe language identifier of the resource. If this parameter is MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), the current language associated with the calling thread is used. To specify a language other than the current language, use the MAKELANGID macro to create this parameter.
[out]lpBufferThe buffer that receives the string. Must be of sufficient length to hold a pointer (8 bytes).
[in]nBufferMaxThe size of the buffer, in characters. The string is truncated and NULL-terminated if it is longer than the number of characters specified. If this parameter is 0, then lpBuffer receives a read-only pointer to the resource itself.
Returns
If the function succeeds, the return value is the number of characters copied into the buffer, not including the terminating null character, or zero if the string resource does not exist. To get extended error information, call GetLastError().
See also
LoadString(), K32LoadStringW()
INT WINAPI K32LoadStringExW (IN HINSTANCE hInstance OPTIONAL, IN UINT uID, IN LANGID LanguageId, OUT LPWSTR lpBuffer, IN INT nBufferMax)
 
K32LoadStringW

Loads a string resource from the executable file associated with a specified module, copies the string into a buffer, and appends a terminating null character. This is a restricted version of K32LoadStringExW().

See also
LoadString(), K32LoadStringExW()
INT WINAPI K32LoadStringW (IN HINSTANCE hInstance OPTIONAL, IN UINT uID, OUT LPWSTR lpBuffer, IN INT nBufferMax)
 
FormatMessageSafeW

Loads and formats a message string. The function requires a message definition as input. The message definition can come from a buffer passed to the function. It can come from a message table resource in an already-loaded module, or the caller can ask the function to search the system's message table resource(s) for the message definition. Please refer to the Win32 FormatMessage() function for more details.

Parameters
[in]dwFlagsThe formatting options, and how to interpret the lpSource parameter. See FormatMessage() for more details.
[in]lpSourceThe location of the message definition. The type of this parameter depends upon the settings in the dwFlags parameter.
[in]dwMessageIdThe message identifier for the requested message. This parameter is ignored if dwFlags includes FORMAT_MESSAGE_FROM_STRING.
[in]dwLanguageIdThe language identifier for the requested message. This parameter is ignored if dwFlags includes FORMAT_MESSAGE_FROM_STRING.
[out]lpBufferA pointer to a buffer that receives the null-terminated string that specifies the formatted message. If dwFlags includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc() function, and places the pointer to the buffer at the address specified in lpBuffer. This buffer cannot be larger than 64kB.
[in]nSizeIf the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the size of the output buffer, in TCHARs. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. The output buffer cannot be larger than 64kB.
[in]ArgumentsOptional pointer to an array of values describing a variable number of arguments, depending on the message string. Each argument is used to replace an insert sequence in the message string. By default, the Arguments parameter is of type va_list*, initialized with va_start(). The state of the va_list argument is undefined upon return from the function. To use the va_list again, destroy the variable argument list pointer using va_end() and reinitialize it with va_start(). If you do not have a pointer of type va_list*, then specify the FORMAT_MESSAGE_ARGUMENT_ARRAY flag and pass a pointer to an array of DWORD_PTR values; those values are input to the message formatted as the insert values. Each insert must have a corresponding element in the array.
Returns
If the function succeeds, the return value is the number of characters copied into the buffer, not including the terminating null character, or zero if the string resource does not exist. To get extended error information, call GetLastError().
Remarks
This function is a "safe" version of FormatMessage(), that does not crash if a malformed source string is retrieved and then being used for formatting. It basically wraps calls to FormatMessage() within SEH.
See also
FormatMessage() (on MSDN)
DWORD WINAPI FormatMessageSafeW (IN DWORD dwFlags, IN LPCVOID lpSource OPTIONAL, IN DWORD dwMessageId, IN DWORD dwLanguageId, OUT LPWSTR lpBuffer, IN DWORD nSize, IN va_list *Arguments OPTIONAL)
 
ConSetThreadUILanguage

Sets the current thread's user interface language. Mostly used by console applications for selecting a language identifier that best supports the NT Console. This function dynamically loads and calls kernel32!SetThreadUILanguage() so as to be able to work on older environments where this API is not supported. The FormatMessage() API also bases itself on the thread's current language for its default behaviour (unless an explicit language identifier has been provided).

Parameters
[in,opt]LangId (Vista+) A non-zero language identifier that specifies the current thread's user interface language to set. (XP/2003) Set the language identifier to 0 for selecting a language identifier that best supports the NT Console.
Returns
Returns LangId in case of success, or 0 in case of failure. If LangId was set to 0, the function always succeeds and returns the language identifier that best supports the NT Console.
Remarks
This function is thread-safe.
See also
SetThreadUILanguage() (on MSDN)
LANGID ConSetThreadUILanguage (IN LANGID LangId OPTIONAL)
 
IsTTYHandle

Checks whether a handle refers to a valid TTY object. A TTY object may be a console or a "communications" (e.g. serial) port.

Parameters
[in]hHandleHandle to the TTY object to check for.
Returns
TRUE when the handle refers to a valid TTY object, FALSE if it does not.
Remarks
This test is more general than IsConsoleHandle() as it is not limited to Win32 console objects only.
See also
IsConsoleHandle()
BOOL IsTTYHandle (IN HANDLE hHandle)
 
IsConsoleHandle

Checks whether a handle refers to a valid Win32 console object.

Parameters
[in]hHandleHandle to the Win32 console object to check for: console input buffer, console output buffer.
Returns
TRUE when the handle refers to a valid Win32 console object, FALSE if it does not.
See also
IsTTYHandle()
BOOL IsConsoleHandle (IN HANDLE hHandle)
 

Detailed Description

General-purpose utility functions (wrappers around or reimplementations of Win32 APIs).

Definition in file utils.c.

Macro Definition Documentation

◆ _UNICODE

#define _UNICODE

Definition at line 20 of file utils.c.

◆ MAKEINTRESOURCE

#define MAKEINTRESOURCE (   i)    ((ULONG_PTR)((WORD)(i)))

Definition at line 36 of file utils.c.

◆ RT_MESSAGETABLE

#define RT_MESSAGETABLE   MAKEINTRESOURCE(11)

Definition at line 42 of file utils.c.

◆ RT_STRING

#define RT_STRING   MAKEINTRESOURCE(6)

Definition at line 39 of file utils.c.

◆ UNICODE

Definition at line 19 of file utils.c.

Function Documentation

◆ ConSetThreadUILanguage()

LANGID ConSetThreadUILanguage ( IN LANGID LangId  OPTIONAL)

Definition at line 362 of file utils.c.

364{
365 /* The function pointer is shared amongst all threads */
366 static volatile LANGID (WINAPI *pfnSetThreadUILanguage)(LANGID) = NULL;
367
368 if (!pfnSetThreadUILanguage)
369 {
370 /* Load the API from kernel32 */
371 PVOID pFunc = (PVOID)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "SetThreadUILanguage");
372 if (!pFunc)
373 {
374 /* Fail since the API is not available */
375 return 0;
376 }
377 /* Set the function pointer in case it hasn't been already set by another thread */
378 InterlockedCompareExchangePointer((PVOID*)&pfnSetThreadUILanguage, pFunc, NULL);
379 // ASSERT(pfnSetThreadUILanguage);
380 }
381 return pfnSetThreadUILanguage(LangId);
382}
#define NULL
Definition: types.h:112
#define GetProcAddress(x, y)
Definition: compat.h:753
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
#define L(x)
Definition: resources.c:13
#define InterlockedCompareExchangePointer
Definition: interlocked.h:144
USHORT LANGID
Definition: mui.h:9
void * PVOID
Definition: typedefs.h:50
#define WINAPI
Definition: msvc.h:6

Referenced by _tmain(), cmd_start(), Execute(), SetConsoleCPState(), and wmain().

◆ FormatMessageSafeW()

DWORD WINAPI FormatMessageSafeW ( IN DWORD  dwFlags,
IN LPCVOID lpSource  OPTIONAL,
IN DWORD  dwMessageId,
IN DWORD  dwLanguageId,
OUT LPWSTR  lpBuffer,
IN DWORD  nSize,
IN va_list *Arguments  OPTIONAL 
)

Definition at line 264 of file utils.c.

272{
273 DWORD dwLength = 0;
274
276 {
277 /*
278 * Retrieve the message string. Wrap in SEH
279 * to protect from invalid string parameters.
280 */
282 {
284 lpSource,
285 dwMessageId,
286 dwLanguageId,
287 lpBuffer,
288 nSize,
289 Arguments);
290 }
292 {
293 dwLength = 0;
294
295 /*
296 * An exception occurred while calling FormatMessage, this is usually
297 * the sign that a parameter was invalid, either 'lpBuffer' was NULL
298 * but we did not pass the flag FORMAT_MESSAGE_ALLOCATE_BUFFER, or the
299 * array pointer 'Arguments' was NULL or did not contain enough elements,
300 * and we did not pass the flag FORMAT_MESSAGE_IGNORE_INSERTS, and the
301 * message string expected too many inserts.
302 * In this last case only, we can call again FormatMessage but ignore
303 * explicitly the inserts. The string that we will return to the user
304 * will not be pre-formatted.
305 */
308 {
309 /* Remove any possible harmful flags and always ignore inserts */
310 dwFlags &= ~FORMAT_MESSAGE_ARGUMENT_ARRAY;
312
313 /* If this call also throws an exception, we are really dead */
315 lpSource,
316 dwMessageId,
317 dwLanguageId,
318 lpBuffer,
319 nSize,
320 NULL /* Arguments */);
321 }
322 }
323 _SEH2_END;
324 }
326 {
327 }
328 _SEH2_END;
329
330 return dwLength;
331}
static DWORD DWORD * dwLength
Definition: fusion.c:86
DWORD WINAPI FormatMessageW(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPWSTR lpBuffer, DWORD nSize, __ms_va_list *args)
Definition: format_msg.c:583
unsigned long DWORD
Definition: ntddk_ex.h:95
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
_Out_ LPWSTR lpBuffer
Definition: netsh.h:68
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:104
#define _SEH2_FINALLY
Definition: pseh2_64.h:153
#define _SEH2_END
Definition: pseh2_64.h:194
#define _SEH2_TRY
Definition: pseh2_64.h:93
#define FORMAT_MESSAGE_IGNORE_INSERTS
Definition: winbase.h:397
#define FORMAT_MESSAGE_ALLOCATE_BUFFER
Definition: winbase.h:396
*nSize LPSTR _Inout_ LPDWORD nSize
Definition: winbase.h:1834

Referenced by ConMsgPrintfV(), and ConResMsgPrintfExV().

◆ IsConsoleHandle()

BOOL IsConsoleHandle ( IN HANDLE  hHandle)

Definition at line 429 of file utils.c.

430{
431 DWORD dwMode;
432
433 /* Check whether the handle may be that of a console... */
434 if ((GetFileType(hHandle) & ~FILE_TYPE_REMOTE) != FILE_TYPE_CHAR)
435 return FALSE;
436
437 /*
438 * It may be. Perform another test. The idea comes from the
439 * MSDN description of the WriteConsole API:
440 *
441 * "WriteConsole fails if it is used with a standard handle
442 * that is redirected to a file. If an application processes
443 * multilingual output that can be redirected, determine whether
444 * the output handle is a console handle (one method is to call
445 * the GetConsoleMode function and check whether it succeeds).
446 * If the handle is a console handle, call WriteConsole. If the
447 * handle is not a console handle, the output is redirected and
448 * you should call WriteFile to perform the I/O."
449 */
450 return GetConsoleMode(hHandle, &dwMode);
451}
#define FALSE
Definition: types.h:117
BOOL WINAPI GetConsoleMode(HANDLE hConsoleHandle, LPDWORD lpMode)
Definition: console.c:1571
DWORD WINAPI GetFileType(HANDLE hFile)
Definition: fileinfo.c:269
#define FILE_TYPE_CHAR
Definition: winbase.h:284
#define FILE_TYPE_REMOTE
Definition: winbase.h:286

◆ IsTTYHandle()

BOOL IsTTYHandle ( IN HANDLE  hHandle)

Definition at line 403 of file utils.c.

404{
405 /*
406 * More general test than IsConsoleHandle(). Consoles, as well as serial
407 * (communications) ports, etc... verify this test, but only consoles
408 * verify the IsConsoleHandle() test: indeed the latter checks whether
409 * the handle is really handled by the console subsystem.
410 */
411 return ((GetFileType(hHandle) & ~FILE_TYPE_REMOTE) == FILE_TYPE_CHAR);
412}

Referenced by ConClearLine(), ConClearScreen(), ConGetScreenInfo(), and ConRingBell().

◆ K32LoadStringExW()

INT WINAPI K32LoadStringExW ( IN HINSTANCE hInstance  OPTIONAL,
IN UINT  uID,
IN LANGID  LanguageId,
OUT LPWSTR  lpBuffer,
IN INT  nBufferMax 
)

Definition at line 110 of file utils.c.

116{
117 HRSRC hrsrc;
118 HGLOBAL hmem;
119 WCHAR *p;
120 UINT i;
121
122 if (!lpBuffer)
123 return 0;
124
125 /* Use LOWORD (incremented by 1) as ResourceID */
126 /* There are always blocks of 16 strings */
129 MAKEINTRESOURCEW((LOWORD(uID) >> 4) + 1),
130 LanguageId);
131 if (!hrsrc) return 0;
132
133 hmem = LoadResource(hInstance, hrsrc);
134 if (!hmem) return 0;
135
136 p = LockResource(hmem);
137 // FreeResource(hmem);
138
139 /* Find the string we're looking for */
140 uID &= 0x000F; /* Position in the block, same as % 16 */
141 for (i = 0; i < uID; i++)
142 p += *p + 1;
143
144 /*
145 * If nBufferMax == 0, then return a read-only pointer to the resource
146 * itself in lpBuffer. It is assumed that lpBuffer is actually a (LPWSTR*).
147 */
148 if (nBufferMax == 0)
149 {
150 *((LPWSTR*)lpBuffer) = p + 1;
151 return *p;
152 }
153
154 i = min(nBufferMax - 1, *p);
155 if (i > 0)
156 {
157 memcpy(lpBuffer, p + 1, i * sizeof(WCHAR));
158 lpBuffer[i] = L'\0';
159 }
160 else
161 {
162 if (nBufferMax > 1)
163 {
164 lpBuffer[0] = L'\0';
165 return 0;
166 }
167 }
168
169 return i;
170}
HINSTANCE hInstance
Definition: charmap.c:19
LPVOID WINAPI LockResource(HGLOBAL handle)
Definition: res.c:550
HRSRC WINAPI FindResourceExW(HMODULE hModule, LPCWSTR type, LPCWSTR name, WORD lang)
Definition: res.c:164
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:532
GLfloat GLfloat p
Definition: glext.h:8902
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define min(a, b)
Definition: monoChain.cc:55
unsigned int UINT
Definition: ndis.h:50
_Out_ LPWSTR _In_ DWORD nBufferMax
Definition: netsh.h:69
#define LOWORD(l)
Definition: pedump.c:82
#define RT_STRING
Definition: pedump.c:368
_In_ UINT uID
Definition: shlwapi.h:156
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by ConResMsgPrintfExV(), ConResPrintfExV(), ConResPutsEx(), and K32LoadStringW().

◆ K32LoadStringW()

INT WINAPI K32LoadStringW ( IN HINSTANCE hInstance  OPTIONAL,
IN UINT  uID,
OUT LPWSTR  lpBuffer,
IN INT  nBufferMax 
)

Definition at line 183 of file utils.c.

188{
189 // NOTE: Instead of using LANG_NEUTRAL, one might use LANG_USER_DEFAULT...
193}
#define LANG_NEUTRAL
Definition: nls.h:22
#define MAKELANGID(p, s)
Definition: nls.h:15
#define SUBLANG_NEUTRAL
Definition: nls.h:167
INT WINAPI K32LoadStringExW(IN HINSTANCE hInstance OPTIONAL, IN UINT uID, IN LANGID LanguageId, OUT LPWSTR lpBuffer, IN INT nBufferMax)
Definition: utils.c:110

Referenced by ConResPagingEx(), HelpCommand(), HelpCommandList(), Usage(), WlanPrintCurrentStatus(), WlanScan(), and wmain().