/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.46M | #define HANDLE_TYPE_PROCESS 1 |
30 | 1.82M | #define HANDLE_TYPE_THREAD 2 |
31 | 1.30M | #define HANDLE_TYPE_EVENT 3 |
32 | 731k | #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 | | static INLINE BOOL WINPR_HANDLE_IS_HANDLED(HANDLE handle, ULONG type, BOOL invalidValue) |
117 | 2.43M | { |
118 | 2.43M | WINPR_HANDLE* pWinprHandle = (WINPR_HANDLE*)handle; |
119 | 2.43M | BOOL invalid = !pWinprHandle; |
120 | | |
121 | 2.43M | if (invalidValue) |
122 | 0 | { |
123 | 0 | if (INVALID_HANDLE_VALUE == pWinprHandle) |
124 | 0 | invalid = TRUE; |
125 | 0 | } |
126 | | |
127 | 2.43M | if (invalid || (pWinprHandle->Type != type)) |
128 | 0 | { |
129 | 0 | SetLastError(ERROR_INVALID_HANDLE); |
130 | 0 | return FALSE; |
131 | 0 | } |
132 | | |
133 | 2.43M | return TRUE; |
134 | 2.43M | } Unexecuted instantiation: critical.c:WINPR_HANDLE_IS_HANDLED event.c:WINPR_HANDLE_IS_HANDLED Line | Count | Source | 117 | 975k | { | 118 | 975k | WINPR_HANDLE* pWinprHandle = (WINPR_HANDLE*)handle; | 119 | 975k | BOOL invalid = !pWinprHandle; | 120 | | | 121 | 975k | if (invalidValue) | 122 | 0 | { | 123 | 0 | if (INVALID_HANDLE_VALUE == pWinprHandle) | 124 | 0 | invalid = TRUE; | 125 | 0 | } | 126 | | | 127 | 975k | if (invalid || (pWinprHandle->Type != type)) | 128 | 0 | { | 129 | 0 | SetLastError(ERROR_INVALID_HANDLE); | 130 | 0 | return FALSE; | 131 | 0 | } | 132 | | | 133 | 975k | return TRUE; | 134 | 975k | } |
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: 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: io.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.46M | { | 118 | 1.46M | WINPR_HANDLE* pWinprHandle = (WINPR_HANDLE*)handle; | 119 | 1.46M | BOOL invalid = !pWinprHandle; | 120 | | | 121 | 1.46M | if (invalidValue) | 122 | 0 | { | 123 | 0 | if (INVALID_HANDLE_VALUE == pWinprHandle) | 124 | 0 | invalid = TRUE; | 125 | 0 | } | 126 | | | 127 | 1.46M | if (invalid || (pWinprHandle->Type != type)) | 128 | 0 | { | 129 | 0 | SetLastError(ERROR_INVALID_HANDLE); | 130 | 0 | return FALSE; | 131 | 0 | } | 132 | | | 133 | 1.46M | return TRUE; | 134 | 1.46M | } |
Unexecuted instantiation: nt.c:WINPR_HANDLE_IS_HANDLED Unexecuted instantiation: comm_io.c:WINPR_HANDLE_IS_HANDLED Unexecuted instantiation: nonehandle.c:WINPR_HANDLE_IS_HANDLED Unexecuted instantiation: sspicli.c:WINPR_HANDLE_IS_HANDLED |
135 | | |
136 | | static INLINE void WINPR_HANDLE_SET_TYPE_AND_MODE(void* _handle, ULONG _type, ULONG _mode) |
137 | 609k | { |
138 | 609k | WINPR_HANDLE* hdl = (WINPR_HANDLE*)_handle; |
139 | | |
140 | 609k | hdl->Type = _type; |
141 | 609k | hdl->Mode = _mode; |
142 | 609k | } Unexecuted instantiation: critical.c:WINPR_HANDLE_SET_TYPE_AND_MODE event.c:WINPR_HANDLE_SET_TYPE_AND_MODE Line | Count | Source | 137 | 243k | { | 138 | 243k | WINPR_HANDLE* hdl = (WINPR_HANDLE*)_handle; | 139 | | | 140 | 243k | hdl->Type = _type; | 141 | 243k | hdl->Mode = _mode; | 142 | 243k | } |
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: 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: io.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 | 365k | { | 138 | 365k | WINPR_HANDLE* hdl = (WINPR_HANDLE*)_handle; | 139 | | | 140 | 365k | hdl->Type = _type; | 141 | 365k | hdl->Mode = _mode; | 142 | 365k | } |
Unexecuted instantiation: nt.c:WINPR_HANDLE_SET_TYPE_AND_MODE Unexecuted instantiation: comm_io.c:WINPR_HANDLE_SET_TYPE_AND_MODE Unexecuted instantiation: nonehandle.c:WINPR_HANDLE_SET_TYPE_AND_MODE Unexecuted instantiation: sspicli.c:WINPR_HANDLE_SET_TYPE_AND_MODE |
143 | | |
144 | | static INLINE BOOL winpr_Handle_GetInfo(HANDLE handle, ULONG* pType, WINPR_HANDLE** pObject) |
145 | 4.71M | { |
146 | 4.71M | WINPR_HANDLE* wHandle; |
147 | | |
148 | 4.71M | 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.71M | #ifndef __clang_analyzer__ |
154 | 4.71M | if (handle == INVALID_HANDLE_VALUE) |
155 | 0 | return FALSE; |
156 | 4.71M | #endif |
157 | | |
158 | 4.71M | wHandle = (WINPR_HANDLE*)handle; |
159 | | |
160 | 4.71M | *pType = wHandle->Type; |
161 | 4.71M | *pObject = handle; |
162 | | |
163 | 4.71M | return TRUE; |
164 | 4.71M | } Unexecuted instantiation: critical.c:winpr_Handle_GetInfo event.c:winpr_Handle_GetInfo Line | Count | Source | 145 | 80.6k | { | 146 | 80.6k | WINPR_HANDLE* wHandle; | 147 | | | 148 | 80.6k | 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 | 80.6k | #ifndef __clang_analyzer__ | 154 | 80.6k | if (handle == INVALID_HANDLE_VALUE) | 155 | 0 | return FALSE; | 156 | 80.6k | #endif | 157 | | | 158 | 80.6k | wHandle = (WINPR_HANDLE*)handle; | 159 | | | 160 | 80.6k | *pType = wHandle->Type; | 161 | 80.6k | *pObject = handle; | 162 | | | 163 | 80.6k | return TRUE; | 164 | 80.6k | } |
Unexecuted instantiation: sleep.c:winpr_Handle_GetInfo wait.c:winpr_Handle_GetInfo Line | Count | Source | 145 | 4.02M | { | 146 | 4.02M | WINPR_HANDLE* wHandle; | 147 | | | 148 | 4.02M | 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.02M | #ifndef __clang_analyzer__ | 154 | 4.02M | if (handle == INVALID_HANDLE_VALUE) | 155 | 0 | return FALSE; | 156 | 4.02M | #endif | 157 | | | 158 | 4.02M | wHandle = (WINPR_HANDLE*)handle; | 159 | | | 160 | 4.02M | *pType = wHandle->Type; | 161 | 4.02M | *pObject = handle; | 162 | | | 163 | 4.02M | return TRUE; | 164 | 4.02M | } |
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: io.c:winpr_Handle_GetInfo handle.c:winpr_Handle_GetInfo Line | Count | Source | 145 | 609k | { | 146 | 609k | WINPR_HANDLE* wHandle; | 147 | | | 148 | 609k | 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 | 609k | #ifndef __clang_analyzer__ | 154 | 609k | if (handle == INVALID_HANDLE_VALUE) | 155 | 0 | return FALSE; | 156 | 609k | #endif | 157 | | | 158 | 609k | wHandle = (WINPR_HANDLE*)handle; | 159 | | | 160 | 609k | *pType = wHandle->Type; | 161 | 609k | *pObject = handle; | 162 | | | 163 | 609k | return TRUE; | 164 | 609k | } |
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: comm_io.c:winpr_Handle_GetInfo Unexecuted instantiation: nonehandle.c:winpr_Handle_GetInfo Unexecuted instantiation: sspicli.c:winpr_Handle_GetInfo |
165 | | |
166 | | static INLINE int winpr_Handle_getFd(HANDLE handle) |
167 | 1.46M | { |
168 | 1.46M | WINPR_HANDLE* hdl; |
169 | 1.46M | ULONG type; |
170 | | |
171 | 1.46M | if (!winpr_Handle_GetInfo(handle, &type, &hdl)) |
172 | 0 | return -1; |
173 | | |
174 | 1.46M | if (!hdl || !hdl->ops || !hdl->ops->GetFd) |
175 | 0 | return -1; |
176 | | |
177 | 1.46M | return hdl->ops->GetFd(handle); |
178 | 1.46M | } Unexecuted instantiation: critical.c:winpr_Handle_getFd Unexecuted instantiation: event.c:winpr_Handle_getFd Unexecuted instantiation: sleep.c:winpr_Handle_getFd wait.c:winpr_Handle_getFd Line | Count | Source | 167 | 1.46M | { | 168 | 1.46M | WINPR_HANDLE* hdl; | 169 | 1.46M | ULONG type; | 170 | | | 171 | 1.46M | if (!winpr_Handle_GetInfo(handle, &type, &hdl)) | 172 | 0 | return -1; | 173 | | | 174 | 1.46M | if (!hdl || !hdl->ops || !hdl->ops->GetFd) | 175 | 0 | return -1; | 176 | | | 177 | 1.46M | return hdl->ops->GetFd(handle); | 178 | 1.46M | } |
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: io.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: comm_io.c:winpr_Handle_getFd Unexecuted instantiation: nonehandle.c:winpr_Handle_getFd Unexecuted instantiation: sspicli.c:winpr_Handle_getFd |
179 | | |
180 | | static INLINE DWORD winpr_Handle_cleanup(HANDLE handle) |
181 | 1.09M | { |
182 | 1.09M | WINPR_HANDLE* hdl; |
183 | 1.09M | ULONG type; |
184 | | |
185 | 1.09M | if (!winpr_Handle_GetInfo(handle, &type, &hdl)) |
186 | 0 | return WAIT_FAILED; |
187 | | |
188 | 1.09M | if (!hdl || !hdl->ops) |
189 | 0 | return WAIT_FAILED; |
190 | | |
191 | | /* If there is no cleanup function, assume all ok. */ |
192 | 1.09M | if (!hdl->ops->CleanupHandle) |
193 | 364k | return WAIT_OBJECT_0; |
194 | | |
195 | 731k | return hdl->ops->CleanupHandle(handle); |
196 | 1.09M | } Unexecuted instantiation: critical.c:winpr_Handle_cleanup Unexecuted instantiation: event.c:winpr_Handle_cleanup Unexecuted instantiation: sleep.c:winpr_Handle_cleanup wait.c:winpr_Handle_cleanup Line | Count | Source | 181 | 1.09M | { | 182 | 1.09M | WINPR_HANDLE* hdl; | 183 | 1.09M | ULONG type; | 184 | | | 185 | 1.09M | if (!winpr_Handle_GetInfo(handle, &type, &hdl)) | 186 | 0 | return WAIT_FAILED; | 187 | | | 188 | 1.09M | if (!hdl || !hdl->ops) | 189 | 0 | return WAIT_FAILED; | 190 | | | 191 | | /* If there is no cleanup function, assume all ok. */ | 192 | 1.09M | if (!hdl->ops->CleanupHandle) | 193 | 364k | return WAIT_OBJECT_0; | 194 | | | 195 | 731k | return hdl->ops->CleanupHandle(handle); | 196 | 1.09M | } |
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: io.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: comm_io.c:winpr_Handle_cleanup Unexecuted instantiation: nonehandle.c:winpr_Handle_cleanup Unexecuted instantiation: sspicli.c:winpr_Handle_cleanup |
197 | | |
198 | | #endif /* WINPR_HANDLE_PRIVATE_H */ |