/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: 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 Unexecuted instantiation: thread.c:WINPR_HANDLE_IS_HANDLED Unexecuted instantiation: critical.c:WINPR_HANDLE_IS_HANDLED Unexecuted instantiation: event.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: shell.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 | 0 | { |
138 | 0 | WINPR_HANDLE* hdl = (WINPR_HANDLE*)_handle; |
139 | |
|
140 | 0 | hdl->Type = _type; |
141 | 0 | hdl->Mode = _mode; |
142 | 0 | } 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 Unexecuted instantiation: thread.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: 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: shell.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 | 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: sleep.c:winpr_Handle_GetInfo Unexecuted instantiation: handle.c:winpr_Handle_GetInfo 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 Unexecuted instantiation: event.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: 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: shell.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 | 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: 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 Unexecuted instantiation: wait.c:winpr_Handle_getFd 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: shell.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 | 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: 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 Unexecuted instantiation: wait.c:winpr_Handle_cleanup 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: shell.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 */ |