ReactOS  0.4.15-dev-316-g938df97
tools.c File Reference
#include "precomp.h"
Include dependency graph for tools.c:

Go to the source code of this file.

Functions

DoesPortExist

Checks all Port Monitors installed on the local system to find out if a given port already exists.

Parameters
pwszPortNameThe port name to check.
Returns
TRUE if a port with that name already exists on the local system. If the return value is FALSE, either the port doesn't exist or an error occurred. Use GetLastError in this case to check the error case.
BOOL DoesPortExist (PCWSTR pwszPortName)
 
DWORD GetLPTTransmissionRetryTimeout (VOID)
 
GetPortNameWithoutColon

Most of the time, we operate on port names with a trailing colon. But some functions require the name without the trailing colon. This function checks if the port has a trailing colon and if so, it returns the port name without the colon.

Parameters
pwszPortNameThe port name with colon
ppwszPortNameWithoutColonPointer to a PWSTR that will contain the port name without colon. You have to free this buffer using DllFreeSplMem.
Returns
ERROR_SUCCESS if the port name without colon was successfully copied into the buffer. ERROR_INVALID_PARAMETER if this port name has no trailing colon. ERROR_NOT_ENOUGH_MEMORY if memory allocation failed.
DWORD GetPortNameWithoutColon (PCWSTR pwszPortName, PWSTR *ppwszPortNameWithoutColon)
 

Function Documentation

◆ DoesPortExist()

BOOL DoesPortExist ( PCWSTR  pwszPortName)

Definition at line 24 of file tools.c.

25 {
26  BOOL bReturnValue = FALSE;
27  DWORD cbNeeded;
28  DWORD dwErrorCode;
29  DWORD dwReturned;
30  DWORD i;
32  PPORT_INFO_1W pPortInfo1 = NULL;
33 
34  // Determine the required buffer size.
35  EnumPortsW(NULL, 1, NULL, 0, &cbNeeded, &dwReturned);
37  {
38  dwErrorCode = GetLastError();
39  ERR("EnumPortsW failed with error %lu!\n", dwErrorCode);
40  goto Cleanup;
41  }
42 
43  // Allocate a buffer large enough.
44  pPortInfo1 = DllAllocSplMem(cbNeeded);
45  if (!pPortInfo1)
46  {
47  dwErrorCode = ERROR_NOT_ENOUGH_MEMORY;
48  ERR("DllAllocSplMem failed with error %lu!\n", GetLastError());
49  goto Cleanup;
50  }
51 
52  // Now get the actual port information.
53  if (!EnumPortsW(NULL, 1, (PBYTE)pPortInfo1, cbNeeded, &cbNeeded, &dwReturned))
54  {
55  dwErrorCode = GetLastError();
56  ERR("EnumPortsW failed with error %lu!\n", dwErrorCode);
57  goto Cleanup;
58  }
59 
60  // We were successful! Loop through all returned ports.
61  dwErrorCode = ERROR_SUCCESS;
62  p = pPortInfo1;
63 
64  for (i = 0; i < dwReturned; i++)
65  {
66  // Check if this existing port matches our queried one.
67  if (wcsicmp(p->pName, pwszPortName) == 0)
68  {
69  bReturnValue = TRUE;
70  goto Cleanup;
71  }
72 
73  p++;
74  }
75 
76 Cleanup:
77  if (pPortInfo1)
78  DllFreeSplMem(pPortInfo1);
79 
80  SetLastError(dwErrorCode);
81  return bReturnValue;
82 }
#define TRUE
Definition: types.h:120
#define ERROR_SUCCESS
Definition: deptool.c:10
BOOL WINAPI DllFreeSplMem(PVOID pMem)
Definition: memory.c:112
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
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
unsigned int BOOL
Definition: ntddk_ex.h:94
smooth NULL
Definition: ftsmooth.c:416
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SetLastError(x)
Definition: compat.h:418
static const WCHAR Cleanup[]
Definition: register.c:80
#define wcsicmp
Definition: string.h:1152
#define ERR(fmt,...)
Definition: debug.h:110
WINBOOL WINAPI EnumPortsW(LPWSTR pName, DWORD Level, LPBYTE pPorts, DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned)
PVOID WINAPI DllAllocSplMem(DWORD dwBytes)
Definition: memory.c:95
GLfloat GLfloat p
Definition: glext.h:8902
BYTE * PBYTE
Definition: pedump.c:66
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10

Referenced by _HandlePortExists().

◆ GetLPTTransmissionRetryTimeout()

DWORD GetLPTTransmissionRetryTimeout ( VOID  )

Definition at line 85 of file tools.c.

86 {
87  DWORD cbBuffer;
88  DWORD dwReturnValue = 90; // Use 90 seconds as default if we fail to read from registry.
89  HKEY hKey;
90  LSTATUS lStatus;
91 
92  // Six digits is the most you can enter in Windows' LocalUI.dll.
93  // Larger values make it crash, so introduce a limit here.
94  WCHAR wszBuffer[6 + 1];
95 
96  // Open the key where our value is stored.
97  lStatus = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows", 0, KEY_READ, &hKey);
98  if (lStatus != ERROR_SUCCESS)
99  {
100  ERR("RegOpenKeyExW failed with status %ld!\n", lStatus);
101  goto Cleanup;
102  }
103 
104  // Query the value.
105  cbBuffer = sizeof(wszBuffer);
106  lStatus = RegQueryValueExW(hKey, L"TransmissionRetryTimeout", NULL, NULL, (PBYTE)wszBuffer, &cbBuffer);
107  if (lStatus != ERROR_SUCCESS)
108  {
109  ERR("RegQueryValueExW failed with status %ld!\n", lStatus);
110  goto Cleanup;
111  }
112 
113  // Return it converted to a DWORD.
114  dwReturnValue = wcstoul(wszBuffer, NULL, 10);
115 
116 Cleanup:
117  if (hKey)
118  RegCloseKey(hKey);
119 
120  return dwReturnValue;
121 }
#define ERROR_SUCCESS
Definition: deptool.c:10
#define KEY_READ
Definition: nt_native.h:1023
_Check_return_ unsigned long __cdecl wcstoul(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
smooth NULL
Definition: ftsmooth.c:416
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4116
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned long DWORD
Definition: ntddk_ex.h:95
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
static const WCHAR L[]
Definition: oid.c:1250
static const WCHAR Cleanup[]
Definition: register.c:80
#define ERR(fmt,...)
Definition: debug.h:110
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3366
BYTE * PBYTE
Definition: pedump.c:66
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12

Referenced by _HandleGetTransmissionRetryTimeout(), and _SetTransmissionRetryTimeout().

◆ GetPortNameWithoutColon()

DWORD GetPortNameWithoutColon ( PCWSTR  pwszPortName,
PWSTR ppwszPortNameWithoutColon 
)

Definition at line 142 of file tools.c.

143 {
144  DWORD cchPortNameWithoutColon;
145 
146  // Compute the string length of pwszPortNameWithoutColon.
147  cchPortNameWithoutColon = wcslen(pwszPortName) - 1;
148 
149  // Check if pwszPortName really has a colon as the last character.
150  if (pwszPortName[cchPortNameWithoutColon] != L':')
152 
153  // Allocate the output buffer.
154  *ppwszPortNameWithoutColon = DllAllocSplMem((cchPortNameWithoutColon + 1) * sizeof(WCHAR));
155  if (!*ppwszPortNameWithoutColon)
156  {
157  ERR("DllAllocSplMem failed with error %lu!\n", GetLastError());
159  }
160 
161  // Copy the port name without colon into the buffer.
162  // The buffer is already zero-initialized, so no additional null-termination is necessary.
163  CopyMemory(*ppwszPortNameWithoutColon, pwszPortName, cchPortNameWithoutColon * sizeof(WCHAR));
164 
165  return ERROR_SUCCESS;
166 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
#define ERROR_SUCCESS
Definition: deptool.c:10
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define CopyMemory
Definition: winbase.h:1646
unsigned long DWORD
Definition: ntddk_ex.h:95
static const WCHAR L[]
Definition: oid.c:1250
#define ERR(fmt,...)
Definition: debug.h:110
PVOID WINAPI DllAllocSplMem(DWORD dwBytes)
Definition: memory.c:95
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)

Referenced by _ClosePortHandles(), _CreateNonspooledPort(), and _HandleSetDefaultCommConfig().