Coverage Report

Created: 2024-09-08 06:18

/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
1.38M
#define HANDLE_TYPE_PROCESS 1
30
1.72M
#define HANDLE_TYPE_THREAD 2
31
789k
#define HANDLE_TYPE_EVENT 3
32
691k
#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
2.10M
{
118
2.10M
  WINPR_HANDLE* pWinprHandle = (WINPR_HANDLE*)handle;
119
2.10M
  BOOL invalid = !pWinprHandle;
120
121
2.10M
  if (invalidValue)
122
0
  {
123
0
    if (INVALID_HANDLE_VALUE == pWinprHandle)
124
0
      invalid = TRUE;
125
0
  }
126
127
2.10M
  if (invalid || (pWinprHandle->Type != type))
128
0
  {
129
0
    SetLastError(ERROR_INVALID_HANDLE);
130
0
    return FALSE;
131
0
  }
132
133
2.10M
  return TRUE;
134
2.10M
}
Unexecuted instantiation: sleep.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: handle.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: apc.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: process.c:WINPR_HANDLE_IS_HANDLED
thread.c:WINPR_HANDLE_IS_HANDLED
Line
Count
Source
117
1.38M
{
118
1.38M
  WINPR_HANDLE* pWinprHandle = (WINPR_HANDLE*)handle;
119
1.38M
  BOOL invalid = !pWinprHandle;
120
121
1.38M
  if (invalidValue)
122
0
  {
123
0
    if (INVALID_HANDLE_VALUE == pWinprHandle)
124
0
      invalid = TRUE;
125
0
  }
126
127
1.38M
  if (invalid || (pWinprHandle->Type != type))
128
0
  {
129
0
    SetLastError(ERROR_INVALID_HANDLE);
130
0
    return FALSE;
131
0
  }
132
133
1.38M
  return TRUE;
134
1.38M
}
Unexecuted instantiation: critical.c:WINPR_HANDLE_IS_HANDLED
event.c:WINPR_HANDLE_IS_HANDLED
Line
Count
Source
117
724k
{
118
724k
  WINPR_HANDLE* pWinprHandle = (WINPR_HANDLE*)handle;
119
724k
  BOOL invalid = !pWinprHandle;
120
121
724k
  if (invalidValue)
122
0
  {
123
0
    if (INVALID_HANDLE_VALUE == pWinprHandle)
124
0
      invalid = TRUE;
125
0
  }
126
127
724k
  if (invalid || (pWinprHandle->Type != type))
128
0
  {
129
0
    SetLastError(ERROR_INVALID_HANDLE);
130
0
    return FALSE;
131
0
  }
132
133
724k
  return TRUE;
134
724k
}
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: file.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: nonehandle.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: nt.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
378k
{
138
378k
  WINPR_HANDLE* hdl = (WINPR_HANDLE*)_handle;
139
140
378k
  hdl->Type = _type;
141
378k
  hdl->Mode = _mode;
142
378k
}
Unexecuted instantiation: sleep.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: handle.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: apc.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: process.c:WINPR_HANDLE_SET_TYPE_AND_MODE
thread.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Line
Count
Source
137
345k
{
138
345k
  WINPR_HANDLE* hdl = (WINPR_HANDLE*)_handle;
139
140
345k
  hdl->Type = _type;
141
345k
  hdl->Mode = _mode;
142
345k
}
Unexecuted instantiation: critical.c:WINPR_HANDLE_SET_TYPE_AND_MODE
event.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Line
Count
Source
137
32.4k
{
138
32.4k
  WINPR_HANDLE* hdl = (WINPR_HANDLE*)_handle;
139
140
32.4k
  hdl->Type = _type;
141
32.4k
  hdl->Mode = _mode;
142
32.4k
}
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: file.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: nonehandle.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: nt.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
4.21M
{
146
4.21M
  WINPR_HANDLE* wHandle = NULL;
147
148
4.21M
  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
4.21M
#ifndef __clang_analyzer__
154
4.21M
  if (handle == INVALID_HANDLE_VALUE)
155
0
    return FALSE;
156
4.21M
#endif
157
158
4.21M
  wHandle = (WINPR_HANDLE*)handle;
159
160
4.21M
  *pType = wHandle->Type;
161
4.21M
  *pObject = handle;
162
163
4.21M
  return TRUE;
164
4.21M
}
Unexecuted instantiation: sleep.c:winpr_Handle_GetInfo
handle.c:winpr_Handle_GetInfo
Line
Count
Source
145
378k
{
146
378k
  WINPR_HANDLE* wHandle = NULL;
147
148
378k
  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
378k
#ifndef __clang_analyzer__
154
378k
  if (handle == INVALID_HANDLE_VALUE)
155
0
    return FALSE;
156
378k
#endif
157
158
378k
  wHandle = (WINPR_HANDLE*)handle;
159
160
378k
  *pType = wHandle->Type;
161
378k
  *pObject = handle;
162
163
378k
  return TRUE;
164
378k
}
Unexecuted instantiation: apc.c:winpr_Handle_GetInfo
Unexecuted instantiation: process.c:winpr_Handle_GetInfo
Unexecuted instantiation: thread.c:winpr_Handle_GetInfo
Unexecuted instantiation: critical.c:winpr_Handle_GetInfo
event.c:winpr_Handle_GetInfo
Line
Count
Source
145
32.4k
{
146
32.4k
  WINPR_HANDLE* wHandle = NULL;
147
148
32.4k
  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
32.4k
#ifndef __clang_analyzer__
154
32.4k
  if (handle == INVALID_HANDLE_VALUE)
155
0
    return FALSE;
156
32.4k
#endif
157
158
32.4k
  wHandle = (WINPR_HANDLE*)handle;
159
160
32.4k
  *pType = wHandle->Type;
161
32.4k
  *pObject = handle;
162
163
32.4k
  return TRUE;
164
32.4k
}
wait.c:winpr_Handle_GetInfo
Line
Count
Source
145
3.80M
{
146
3.80M
  WINPR_HANDLE* wHandle = NULL;
147
148
3.80M
  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
3.80M
#ifndef __clang_analyzer__
154
3.80M
  if (handle == INVALID_HANDLE_VALUE)
155
0
    return FALSE;
156
3.80M
#endif
157
158
3.80M
  wHandle = (WINPR_HANDLE*)handle;
159
160
3.80M
  *pType = wHandle->Type;
161
3.80M
  *pObject = handle;
162
163
3.80M
  return TRUE;
164
3.80M
}
Unexecuted instantiation: generic.c:winpr_Handle_GetInfo
Unexecuted instantiation: namedPipeClient.c:winpr_Handle_GetInfo
Unexecuted instantiation: file.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: nonehandle.c:winpr_Handle_GetInfo
Unexecuted instantiation: nt.c:winpr_Handle_GetInfo
Unexecuted instantiation: comm_io.c:winpr_Handle_GetInfo
165
166
static INLINE int winpr_Handle_getFd(HANDLE handle)
167
1.38M
{
168
1.38M
  WINPR_HANDLE* hdl = NULL;
169
1.38M
  ULONG type = 0;
170
171
1.38M
  if (!winpr_Handle_GetInfo(handle, &type, &hdl))
172
0
    return -1;
173
174
1.38M
  if (!hdl || !hdl->ops || !hdl->ops->GetFd)
175
0
    return -1;
176
177
1.38M
  return hdl->ops->GetFd(handle);
178
1.38M
}
Unexecuted instantiation: sleep.c:winpr_Handle_getFd
Unexecuted instantiation: handle.c:winpr_Handle_getFd
Unexecuted instantiation: apc.c:winpr_Handle_getFd
Unexecuted instantiation: process.c:winpr_Handle_getFd
Unexecuted instantiation: thread.c:winpr_Handle_getFd
Unexecuted instantiation: critical.c:winpr_Handle_getFd
Unexecuted instantiation: event.c:winpr_Handle_getFd
wait.c:winpr_Handle_getFd
Line
Count
Source
167
1.38M
{
168
1.38M
  WINPR_HANDLE* hdl = NULL;
169
1.38M
  ULONG type = 0;
170
171
1.38M
  if (!winpr_Handle_GetInfo(handle, &type, &hdl))
172
0
    return -1;
173
174
1.38M
  if (!hdl || !hdl->ops || !hdl->ops->GetFd)
175
0
    return -1;
176
177
1.38M
  return hdl->ops->GetFd(handle);
178
1.38M
}
Unexecuted instantiation: generic.c:winpr_Handle_getFd
Unexecuted instantiation: namedPipeClient.c:winpr_Handle_getFd
Unexecuted instantiation: file.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: nonehandle.c:winpr_Handle_getFd
Unexecuted instantiation: nt.c:winpr_Handle_getFd
Unexecuted instantiation: comm_io.c:winpr_Handle_getFd
179
180
static INLINE DWORD winpr_Handle_cleanup(HANDLE handle)
181
1.03M
{
182
1.03M
  WINPR_HANDLE* hdl = NULL;
183
1.03M
  ULONG type = 0;
184
185
1.03M
  if (!winpr_Handle_GetInfo(handle, &type, &hdl))
186
0
    return WAIT_FAILED;
187
188
1.03M
  if (!hdl || !hdl->ops)
189
0
    return WAIT_FAILED;
190
191
  /* If there is no cleanup function, assume all ok. */
192
1.03M
  if (!hdl->ops->CleanupHandle)
193
344k
    return WAIT_OBJECT_0;
194
195
692k
  return hdl->ops->CleanupHandle(handle);
196
1.03M
}
Unexecuted instantiation: sleep.c:winpr_Handle_cleanup
Unexecuted instantiation: handle.c:winpr_Handle_cleanup
Unexecuted instantiation: apc.c:winpr_Handle_cleanup
Unexecuted instantiation: process.c:winpr_Handle_cleanup
Unexecuted instantiation: thread.c:winpr_Handle_cleanup
Unexecuted instantiation: critical.c:winpr_Handle_cleanup
Unexecuted instantiation: event.c:winpr_Handle_cleanup
wait.c:winpr_Handle_cleanup
Line
Count
Source
181
1.03M
{
182
1.03M
  WINPR_HANDLE* hdl = NULL;
183
1.03M
  ULONG type = 0;
184
185
1.03M
  if (!winpr_Handle_GetInfo(handle, &type, &hdl))
186
0
    return WAIT_FAILED;
187
188
1.03M
  if (!hdl || !hdl->ops)
189
0
    return WAIT_FAILED;
190
191
  /* If there is no cleanup function, assume all ok. */
192
1.03M
  if (!hdl->ops->CleanupHandle)
193
344k
    return WAIT_OBJECT_0;
194
195
692k
  return hdl->ops->CleanupHandle(handle);
196
1.03M
}
Unexecuted instantiation: generic.c:winpr_Handle_cleanup
Unexecuted instantiation: namedPipeClient.c:winpr_Handle_cleanup
Unexecuted instantiation: file.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: nonehandle.c:winpr_Handle_cleanup
Unexecuted instantiation: nt.c:winpr_Handle_cleanup
Unexecuted instantiation: comm_io.c:winpr_Handle_cleanup
197
198
#endif /* WINPR_HANDLE_PRIVATE_H */