Coverage Report

Created: 2026-04-12 07:03

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/FreeRDP/winpr/libwinpr/handle/handle.h
Line
Count
Source
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
71.1k
#define HANDLE_TYPE_PROCESS 1
30
88.7k
#define HANDLE_TYPE_THREAD 2
31
479k
#define HANDLE_TYPE_EVENT 3
32
35.5k
#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
0
#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
WINPR_ATTR_NODISCARD
117
static inline BOOL WINPR_HANDLE_IS_HANDLED(HANDLE handle, ULONG type, BOOL invalidValue)
118
284k
{
119
284k
  WINPR_HANDLE* pWinprHandle = (WINPR_HANDLE*)handle;
120
284k
  BOOL invalid = !pWinprHandle;
121
122
284k
  if (invalidValue)
123
0
  {
124
0
    if (INVALID_HANDLE_VALUE == pWinprHandle)
125
0
      invalid = TRUE;
126
0
  }
127
128
284k
  if (invalid || (pWinprHandle->Type != type))
129
0
  {
130
0
    SetLastError(ERROR_INVALID_HANDLE);
131
0
    return FALSE;
132
0
  }
133
134
284k
  return TRUE;
135
284k
}
Unexecuted instantiation: sleep.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: shell.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
118
71.0k
{
119
71.0k
  WINPR_HANDLE* pWinprHandle = (WINPR_HANDLE*)handle;
120
71.0k
  BOOL invalid = !pWinprHandle;
121
122
71.0k
  if (invalidValue)
123
0
  {
124
0
    if (INVALID_HANDLE_VALUE == pWinprHandle)
125
0
      invalid = TRUE;
126
0
  }
127
128
71.0k
  if (invalid || (pWinprHandle->Type != type))
129
0
  {
130
0
    SetLastError(ERROR_INVALID_HANDLE);
131
0
    return FALSE;
132
0
  }
133
134
71.0k
  return TRUE;
135
71.0k
}
Unexecuted instantiation: nt.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: critical.c:WINPR_HANDLE_IS_HANDLED
event.c:WINPR_HANDLE_IS_HANDLED
Line
Count
Source
118
213k
{
119
213k
  WINPR_HANDLE* pWinprHandle = (WINPR_HANDLE*)handle;
120
213k
  BOOL invalid = !pWinprHandle;
121
122
213k
  if (invalidValue)
123
0
  {
124
0
    if (INVALID_HANDLE_VALUE == pWinprHandle)
125
0
      invalid = TRUE;
126
0
  }
127
128
213k
  if (invalid || (pWinprHandle->Type != type))
129
0
  {
130
0
    SetLastError(ERROR_INVALID_HANDLE);
131
0
    return FALSE;
132
0
  }
133
134
213k
  return TRUE;
135
213k
}
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: comm_io.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: io.c:WINPR_HANDLE_IS_HANDLED
Unexecuted instantiation: sspicli.c:WINPR_HANDLE_IS_HANDLED
136
137
static inline void WINPR_HANDLE_SET_TYPE_AND_MODE(void* _handle, ULONG _type, ULONG _mode)
138
195k
{
139
195k
  WINPR_HANDLE* hdl = (WINPR_HANDLE*)_handle;
140
141
195k
  hdl->Type = _type;
142
195k
  hdl->Mode = _mode;
143
195k
}
Unexecuted instantiation: sleep.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: 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
138
17.7k
{
139
17.7k
  WINPR_HANDLE* hdl = (WINPR_HANDLE*)_handle;
140
141
17.7k
  hdl->Type = _type;
142
17.7k
  hdl->Mode = _mode;
143
17.7k
}
Unexecuted instantiation: nt.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: critical.c:WINPR_HANDLE_SET_TYPE_AND_MODE
event.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Line
Count
Source
138
177k
{
139
177k
  WINPR_HANDLE* hdl = (WINPR_HANDLE*)_handle;
140
141
177k
  hdl->Type = _type;
142
177k
  hdl->Mode = _mode;
143
177k
}
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: comm_io.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: io.c:WINPR_HANDLE_SET_TYPE_AND_MODE
Unexecuted instantiation: sspicli.c:WINPR_HANDLE_SET_TYPE_AND_MODE
144
145
WINPR_ATTR_NODISCARD
146
static inline BOOL winpr_Handle_GetInfo(HANDLE handle, ULONG* pType, WINPR_HANDLE** pObject)
147
479k
{
148
479k
  WINPR_HANDLE* wHandle = nullptr;
149
150
479k
  if (handle == nullptr)
151
0
    return FALSE;
152
153
  /* INVALID_HANDLE_VALUE is an invalid value for every handle, but it
154
   * confuses the clang scanbuild analyzer. */
155
479k
#ifndef __clang_analyzer__
156
479k
  if (handle == INVALID_HANDLE_VALUE)
157
0
    return FALSE;
158
479k
#endif
159
160
479k
  wHandle = (WINPR_HANDLE*)handle;
161
162
479k
  *pType = wHandle->Type;
163
479k
  *pObject = wHandle;
164
165
479k
  return TRUE;
166
479k
}
Unexecuted instantiation: sleep.c:winpr_Handle_GetInfo
Unexecuted instantiation: shell.c:winpr_Handle_GetInfo
handle.c:winpr_Handle_GetInfo
Line
Count
Source
147
195k
{
148
195k
  WINPR_HANDLE* wHandle = nullptr;
149
150
195k
  if (handle == nullptr)
151
0
    return FALSE;
152
153
  /* INVALID_HANDLE_VALUE is an invalid value for every handle, but it
154
   * confuses the clang scanbuild analyzer. */
155
195k
#ifndef __clang_analyzer__
156
195k
  if (handle == INVALID_HANDLE_VALUE)
157
0
    return FALSE;
158
195k
#endif
159
160
195k
  wHandle = (WINPR_HANDLE*)handle;
161
162
195k
  *pType = wHandle->Type;
163
195k
  *pObject = wHandle;
164
165
195k
  return TRUE;
166
195k
}
Unexecuted instantiation: apc.c:winpr_Handle_GetInfo
Unexecuted instantiation: process.c:winpr_Handle_GetInfo
Unexecuted instantiation: thread.c:winpr_Handle_GetInfo
Unexecuted instantiation: nt.c:winpr_Handle_GetInfo
Unexecuted instantiation: critical.c:winpr_Handle_GetInfo
event.c:winpr_Handle_GetInfo
Line
Count
Source
147
88.7k
{
148
88.7k
  WINPR_HANDLE* wHandle = nullptr;
149
150
88.7k
  if (handle == nullptr)
151
0
    return FALSE;
152
153
  /* INVALID_HANDLE_VALUE is an invalid value for every handle, but it
154
   * confuses the clang scanbuild analyzer. */
155
88.7k
#ifndef __clang_analyzer__
156
88.7k
  if (handle == INVALID_HANDLE_VALUE)
157
0
    return FALSE;
158
88.7k
#endif
159
160
88.7k
  wHandle = (WINPR_HANDLE*)handle;
161
162
88.7k
  *pType = wHandle->Type;
163
88.7k
  *pObject = wHandle;
164
165
88.7k
  return TRUE;
166
88.7k
}
wait.c:winpr_Handle_GetInfo
Line
Count
Source
147
195k
{
148
195k
  WINPR_HANDLE* wHandle = nullptr;
149
150
195k
  if (handle == nullptr)
151
0
    return FALSE;
152
153
  /* INVALID_HANDLE_VALUE is an invalid value for every handle, but it
154
   * confuses the clang scanbuild analyzer. */
155
195k
#ifndef __clang_analyzer__
156
195k
  if (handle == INVALID_HANDLE_VALUE)
157
0
    return FALSE;
158
195k
#endif
159
160
195k
  wHandle = (WINPR_HANDLE*)handle;
161
162
195k
  *pType = wHandle->Type;
163
195k
  *pObject = wHandle;
164
165
195k
  return TRUE;
166
195k
}
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: comm_io.c:winpr_Handle_GetInfo
Unexecuted instantiation: io.c:winpr_Handle_GetInfo
Unexecuted instantiation: sspicli.c:winpr_Handle_GetInfo
167
168
WINPR_ATTR_NODISCARD
169
static inline int winpr_Handle_getFd(HANDLE handle)
170
71.0k
{
171
71.0k
  WINPR_HANDLE* hdl = nullptr;
172
71.0k
  ULONG type = 0;
173
174
71.0k
  if (!winpr_Handle_GetInfo(handle, &type, &hdl))
175
0
    return -1;
176
177
71.0k
  if (!hdl || !hdl->ops || !hdl->ops->GetFd)
178
0
    return -1;
179
180
71.0k
  return hdl->ops->GetFd(handle);
181
71.0k
}
Unexecuted instantiation: sleep.c:winpr_Handle_getFd
Unexecuted instantiation: shell.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: nt.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
170
71.0k
{
171
71.0k
  WINPR_HANDLE* hdl = nullptr;
172
71.0k
  ULONG type = 0;
173
174
71.0k
  if (!winpr_Handle_GetInfo(handle, &type, &hdl))
175
0
    return -1;
176
177
71.0k
  if (!hdl || !hdl->ops || !hdl->ops->GetFd)
178
0
    return -1;
179
180
71.0k
  return hdl->ops->GetFd(handle);
181
71.0k
}
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: comm_io.c:winpr_Handle_getFd
Unexecuted instantiation: io.c:winpr_Handle_getFd
Unexecuted instantiation: sspicli.c:winpr_Handle_getFd
182
183
WINPR_ATTR_NODISCARD
184
static inline DWORD winpr_Handle_cleanup(HANDLE handle)
185
53.3k
{
186
53.3k
  WINPR_HANDLE* hdl = nullptr;
187
53.3k
  ULONG type = 0;
188
189
53.3k
  if (!winpr_Handle_GetInfo(handle, &type, &hdl))
190
0
    return WAIT_FAILED;
191
192
53.3k
  if (!hdl || !hdl->ops)
193
0
    return WAIT_FAILED;
194
195
  /* If there is no cleanup function, assume all ok. */
196
53.3k
  if (!hdl->ops->CleanupHandle)
197
17.8k
    return WAIT_OBJECT_0;
198
199
35.5k
  return hdl->ops->CleanupHandle(handle);
200
53.3k
}
Unexecuted instantiation: sleep.c:winpr_Handle_cleanup
Unexecuted instantiation: shell.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: nt.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
185
53.3k
{
186
53.3k
  WINPR_HANDLE* hdl = nullptr;
187
53.3k
  ULONG type = 0;
188
189
53.3k
  if (!winpr_Handle_GetInfo(handle, &type, &hdl))
190
0
    return WAIT_FAILED;
191
192
53.3k
  if (!hdl || !hdl->ops)
193
0
    return WAIT_FAILED;
194
195
  /* If there is no cleanup function, assume all ok. */
196
53.3k
  if (!hdl->ops->CleanupHandle)
197
17.8k
    return WAIT_OBJECT_0;
198
199
35.5k
  return hdl->ops->CleanupHandle(handle);
200
53.3k
}
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: comm_io.c:winpr_Handle_cleanup
Unexecuted instantiation: io.c:winpr_Handle_cleanup
Unexecuted instantiation: sspicli.c:winpr_Handle_cleanup
201
202
#endif /* WINPR_HANDLE_PRIVATE_H */