Coverage Report

Created: 2025-07-01 06:46

/src/FreeRDP/winpr/libwinpr/handle/handle.h
Line
Count
Source (jump to first uncovered line)
1
/**
2
 * WinPR: Windows Portable Runtime
3
 * Handle Management
4
 *
5
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6
 *
7
 * Licensed under the Apache License, Version 2.0 (the "License");
8
 * you may not use this file except in compliance with the License.
9
 * You may obtain a copy of the License at
10
 *
11
 *     http://www.apache.org/licenses/LICENSE-2.0
12
 *
13
 * Unless required by applicable law or agreed to in writing, software
14
 * distributed under the License is distributed on an "AS IS" BASIS,
15
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
 * See the License for the specific language governing permissions and
17
 * limitations under the License.
18
 */
19
20
#ifndef WINPR_HANDLE_PRIVATE_H
21
#define WINPR_HANDLE_PRIVATE_H
22
23
#include <winpr/handle.h>
24
#include <winpr/file.h>
25
#include <winpr/synch.h>
26
#include <winpr/winsock.h>
27
28
0
#define HANDLE_TYPE_NONE 0
29
0
#define HANDLE_TYPE_PROCESS 1
30
0
#define HANDLE_TYPE_THREAD 2
31
0
#define HANDLE_TYPE_EVENT 3
32
0
#define HANDLE_TYPE_MUTEX 4
33
#define HANDLE_TYPE_SEMAPHORE 5
34
#define HANDLE_TYPE_TIMER 6
35
0
#define HANDLE_TYPE_NAMED_PIPE 7
36
0
#define HANDLE_TYPE_ANONYMOUS_PIPE 8
37
#define HANDLE_TYPE_ACCESS_TOKEN 9
38
0
#define HANDLE_TYPE_FILE 10
39
#define HANDLE_TYPE_TIMER_QUEUE 11
40
#define HANDLE_TYPE_TIMER_QUEUE_TIMER 12
41
0
#define HANDLE_TYPE_COMM 13
42
43
typedef BOOL (*pcIsHandled)(HANDLE handle);
44
typedef BOOL (*pcCloseHandle)(HANDLE handle);
45
typedef int (*pcGetFd)(HANDLE handle);
46
typedef DWORD (*pcCleanupHandle)(HANDLE handle);
47
typedef BOOL (*pcReadFile)(PVOID Object, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
48
                           LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
49
typedef BOOL (*pcReadFileEx)(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
50
                             LPOVERLAPPED lpOverlapped,
51
                             LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
52
typedef BOOL (*pcReadFileScatter)(HANDLE hFile, FILE_SEGMENT_ELEMENT aSegmentArray[],
53
                                  DWORD nNumberOfBytesToRead, LPDWORD lpReserved,
54
                                  LPOVERLAPPED lpOverlapped);
55
typedef BOOL (*pcWriteFile)(PVOID Object, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
56
                            LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);
57
typedef BOOL (*pcWriteFileEx)(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
58
                              LPOVERLAPPED lpOverlapped,
59
                              LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
60
typedef BOOL (*pcWriteFileGather)(HANDLE hFile, FILE_SEGMENT_ELEMENT aSegmentArray[],
61
                                  DWORD nNumberOfBytesToWrite, LPDWORD lpReserved,
62
                                  LPOVERLAPPED lpOverlapped);
63
typedef DWORD (*pcGetFileSize)(HANDLE handle, LPDWORD lpFileSizeHigh);
64
typedef BOOL (*pcGetFileInformationByHandle)(HANDLE handle,
65
                                             LPBY_HANDLE_FILE_INFORMATION lpFileInformation);
66
typedef BOOL (*pcFlushFileBuffers)(HANDLE hFile);
67
typedef BOOL (*pcSetEndOfFile)(HANDLE handle);
68
typedef DWORD (*pcSetFilePointer)(HANDLE handle, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh,
69
                                  DWORD dwMoveMethod);
70
typedef BOOL (*pcSetFilePointerEx)(HANDLE hFile, LARGE_INTEGER liDistanceToMove,
71
                                   PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod);
72
typedef BOOL (*pcLockFile)(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh,
73
                           DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh);
74
typedef BOOL (*pcLockFileEx)(HANDLE hFile, DWORD dwFlags, DWORD dwReserved,
75
                             DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh,
76
                             LPOVERLAPPED lpOverlapped);
77
typedef BOOL (*pcUnlockFile)(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh,
78
                             DWORD nNumberOfBytesToUnlockLow, DWORD nNumberOfBytesToUnlockHigh);
79
typedef BOOL (*pcUnlockFileEx)(HANDLE hFile, DWORD dwReserved, DWORD nNumberOfBytesToUnlockLow,
80
                               DWORD nNumberOfBytesToUnlockHigh, LPOVERLAPPED lpOverlapped);
81
typedef BOOL (*pcSetFileTime)(HANDLE hFile, const FILETIME* lpCreationTime,
82
                              const FILETIME* lpLastAccessTime, const FILETIME* lpLastWriteTime);
83
84
typedef struct
85
{
86
  pcIsHandled IsHandled;
87
  pcCloseHandle CloseHandle;
88
  pcGetFd GetFd;
89
  pcCleanupHandle CleanupHandle;
90
  pcReadFile ReadFile;
91
  pcReadFileEx ReadFileEx;
92
  pcReadFileScatter ReadFileScatter;
93
  pcWriteFile WriteFile;
94
  pcWriteFileEx WriteFileEx;
95
  pcWriteFileGather WriteFileGather;
96
  pcGetFileSize GetFileSize;
97
  pcFlushFileBuffers FlushFileBuffers;
98
  pcSetEndOfFile SetEndOfFile;
99
  pcSetFilePointer SetFilePointer;
100
  pcSetFilePointerEx SetFilePointerEx;
101
  pcLockFile LockFile;
102
  pcLockFileEx LockFileEx;
103
  pcUnlockFile UnlockFile;
104
  pcUnlockFileEx UnlockFileEx;
105
  pcSetFileTime SetFileTime;
106
  pcGetFileInformationByHandle GetFileInformationByHandle;
107
} HANDLE_OPS;
108
109
typedef struct
110
{
111
  ULONG Type;
112
  ULONG Mode;
113
  HANDLE_OPS* ops;
114
} WINPR_HANDLE;
115
116
static INLINE BOOL WINPR_HANDLE_IS_HANDLED(HANDLE handle, ULONG type, BOOL invalidValue)
117
0
{
118
0
  WINPR_HANDLE* pWinprHandle = (WINPR_HANDLE*)handle;
119
0
  BOOL invalid = !pWinprHandle;
120
121
0
  if (invalidValue)
122
0
  {
123
0
    if (INVALID_HANDLE_VALUE == pWinprHandle)
124
0
      invalid = TRUE;
125
0
  }
126
127
0
  if (invalid || (pWinprHandle->Type != type))
128
0
  {
129
0
    SetLastError(ERROR_INVALID_HANDLE);
130
0
    return FALSE;
131
0
  }
132
133
0
  return TRUE;
134
0
}
Unexecuted instantiation: file.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: process.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: nt.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: critical.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: event.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: sleep.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: wait.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: generic.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: namedPipeClient.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: comm.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: comm_ioctl.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: comm_serial_sys.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: comm_sercx_sys.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: comm_sercx2_sys.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: pipe.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: shell.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: handle.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: nonehandle.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: apc.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: thread.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: comm_io.c:WINPR_HANDLE_IS_HANDLED
135
136
static INLINE void WINPR_HANDLE_SET_TYPE_AND_MODE(void* _handle, ULONG _type, ULONG _mode)
137
0
{
138
0
  WINPR_HANDLE* hdl = (WINPR_HANDLE*)_handle;
139
140
0
  hdl->Type = _type;
141
0
  hdl->Mode = _mode;
142
0
}
Unexecuted instantiation: file.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: process.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: nt.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: critical.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: event.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: sleep.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: wait.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: generic.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: namedPipeClient.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: comm.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: comm_ioctl.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: comm_serial_sys.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: comm_sercx_sys.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: comm_sercx2_sys.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: pipe.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: shell.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: handle.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: nonehandle.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: apc.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: thread.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: comm_io.c:WINPR_HANDLE_SET_TYPE_AND_MODE
143
144
static INLINE BOOL winpr_Handle_GetInfo(HANDLE handle, ULONG* pType, WINPR_HANDLE** pObject)
145
0
{
146
0
  WINPR_HANDLE* wHandle = NULL;
147
148
0
  if (handle == NULL)
149
0
    return FALSE;
150
151
    /* INVALID_HANDLE_VALUE is an invalid value for every handle, but it
152
     * confuses the clang scanbuild analyzer. */
153
0
#ifndef __clang_analyzer__
154
0
  if (handle == INVALID_HANDLE_VALUE)
155
0
    return FALSE;
156
0
#endif
157
158
0
  wHandle = (WINPR_HANDLE*)handle;
159
160
0
  *pType = wHandle->Type;
161
0
  *pObject = handle;
162
163
0
  return TRUE;
164
0
}
Unexecuted instantiation: file.c:winpr_Handle_GetInfo
Unexecuted instantiation: process.c:winpr_Handle_GetInfo
Unexecuted instantiation: nt.c:winpr_Handle_GetInfo
Unexecuted instantiation: critical.c:winpr_Handle_GetInfo
Unexecuted instantiation: event.c:winpr_Handle_GetInfo
Unexecuted instantiation: sleep.c:winpr_Handle_GetInfo
Unexecuted instantiation: wait.c:winpr_Handle_GetInfo
Unexecuted instantiation: generic.c:winpr_Handle_GetInfo
Unexecuted instantiation: namedPipeClient.c:winpr_Handle_GetInfo
Unexecuted instantiation: comm.c:winpr_Handle_GetInfo
Unexecuted instantiation: comm_ioctl.c:winpr_Handle_GetInfo
Unexecuted instantiation: comm_serial_sys.c:winpr_Handle_GetInfo
Unexecuted instantiation: comm_sercx_sys.c:winpr_Handle_GetInfo
Unexecuted instantiation: comm_sercx2_sys.c:winpr_Handle_GetInfo
Unexecuted instantiation: pipe.c:winpr_Handle_GetInfo
Unexecuted instantiation: shell.c:winpr_Handle_GetInfo
Unexecuted instantiation: handle.c:winpr_Handle_GetInfo
Unexecuted instantiation: nonehandle.c:winpr_Handle_GetInfo
Unexecuted instantiation: apc.c:winpr_Handle_GetInfo
Unexecuted instantiation: thread.c:winpr_Handle_GetInfo
Unexecuted instantiation: comm_io.c:winpr_Handle_GetInfo
165
166
static INLINE int winpr_Handle_getFd(HANDLE handle)
167
0
{
168
0
  WINPR_HANDLE* hdl = NULL;
169
0
  ULONG type = 0;
170
171
0
  if (!winpr_Handle_GetInfo(handle, &type, &hdl))
172
0
    return -1;
173
174
0
  if (!hdl || !hdl->ops || !hdl->ops->GetFd)
175
0
    return -1;
176
177
0
  return hdl->ops->GetFd(handle);
178
0
}
Unexecuted instantiation: file.c:winpr_Handle_getFd
Unexecuted instantiation: process.c:winpr_Handle_getFd
Unexecuted instantiation: nt.c:winpr_Handle_getFd
Unexecuted instantiation: critical.c:winpr_Handle_getFd
Unexecuted instantiation: event.c:winpr_Handle_getFd
Unexecuted instantiation: sleep.c:winpr_Handle_getFd
Unexecuted instantiation: wait.c:winpr_Handle_getFd
Unexecuted instantiation: generic.c:winpr_Handle_getFd
Unexecuted instantiation: namedPipeClient.c:winpr_Handle_getFd
Unexecuted instantiation: comm.c:winpr_Handle_getFd
Unexecuted instantiation: comm_ioctl.c:winpr_Handle_getFd
Unexecuted instantiation: comm_serial_sys.c:winpr_Handle_getFd
Unexecuted instantiation: comm_sercx_sys.c:winpr_Handle_getFd
Unexecuted instantiation: comm_sercx2_sys.c:winpr_Handle_getFd
Unexecuted instantiation: pipe.c:winpr_Handle_getFd
Unexecuted instantiation: shell.c:winpr_Handle_getFd
Unexecuted instantiation: handle.c:winpr_Handle_getFd
Unexecuted instantiation: nonehandle.c:winpr_Handle_getFd
Unexecuted instantiation: apc.c:winpr_Handle_getFd
Unexecuted instantiation: thread.c:winpr_Handle_getFd
Unexecuted instantiation: comm_io.c:winpr_Handle_getFd
179
180
static INLINE DWORD winpr_Handle_cleanup(HANDLE handle)
181
0
{
182
0
  WINPR_HANDLE* hdl = NULL;
183
0
  ULONG type = 0;
184
185
0
  if (!winpr_Handle_GetInfo(handle, &type, &hdl))
186
0
    return WAIT_FAILED;
187
188
0
  if (!hdl || !hdl->ops)
189
0
    return WAIT_FAILED;
190
191
  /* If there is no cleanup function, assume all ok. */
192
0
  if (!hdl->ops->CleanupHandle)
193
0
    return WAIT_OBJECT_0;
194
195
0
  return hdl->ops->CleanupHandle(handle);
196
0
}
Unexecuted instantiation: file.c:winpr_Handle_cleanup
Unexecuted instantiation: process.c:winpr_Handle_cleanup
Unexecuted instantiation: nt.c:winpr_Handle_cleanup
Unexecuted instantiation: critical.c:winpr_Handle_cleanup
Unexecuted instantiation: event.c:winpr_Handle_cleanup
Unexecuted instantiation: sleep.c:winpr_Handle_cleanup
Unexecuted instantiation: wait.c:winpr_Handle_cleanup
Unexecuted instantiation: generic.c:winpr_Handle_cleanup
Unexecuted instantiation: namedPipeClient.c:winpr_Handle_cleanup
Unexecuted instantiation: comm.c:winpr_Handle_cleanup
Unexecuted instantiation: comm_ioctl.c:winpr_Handle_cleanup
Unexecuted instantiation: comm_serial_sys.c:winpr_Handle_cleanup
Unexecuted instantiation: comm_sercx_sys.c:winpr_Handle_cleanup
Unexecuted instantiation: comm_sercx2_sys.c:winpr_Handle_cleanup
Unexecuted instantiation: pipe.c:winpr_Handle_cleanup
Unexecuted instantiation: shell.c:winpr_Handle_cleanup
Unexecuted instantiation: handle.c:winpr_Handle_cleanup
Unexecuted instantiation: nonehandle.c:winpr_Handle_cleanup
Unexecuted instantiation: apc.c:winpr_Handle_cleanup
Unexecuted instantiation: thread.c:winpr_Handle_cleanup
Unexecuted instantiation: comm_io.c:winpr_Handle_cleanup
197
198
#endif /* WINPR_HANDLE_PRIVATE_H */