FreeRDP
Loading...
Searching...
No Matches
libwinpr/handle/handle.h
1
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#define HANDLE_TYPE_NONE 0
29#define HANDLE_TYPE_PROCESS 1
30#define HANDLE_TYPE_THREAD 2
31#define HANDLE_TYPE_EVENT 3
32#define HANDLE_TYPE_MUTEX 4
33#define HANDLE_TYPE_SEMAPHORE 5
34#define HANDLE_TYPE_TIMER 6
35#define HANDLE_TYPE_NAMED_PIPE 7
36#define HANDLE_TYPE_ANONYMOUS_PIPE 8
37#define HANDLE_TYPE_ACCESS_TOKEN 9
38#define HANDLE_TYPE_FILE 10
39#define HANDLE_TYPE_TIMER_QUEUE 11
40#define HANDLE_TYPE_TIMER_QUEUE_TIMER 12
41#define HANDLE_TYPE_COMM 13
42
43typedef BOOL (*pcIsHandled)(HANDLE handle);
44typedef BOOL (*pcCloseHandle)(HANDLE handle);
45typedef int (*pcGetFd)(HANDLE handle);
46typedef DWORD (*pcCleanupHandle)(HANDLE handle);
47typedef BOOL (*pcReadFile)(PVOID Object, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
48 LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
49typedef BOOL (*pcReadFileEx)(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
50 LPOVERLAPPED lpOverlapped,
51 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
52typedef BOOL (*pcReadFileScatter)(HANDLE hFile, FILE_SEGMENT_ELEMENT aSegmentArray[],
53 DWORD nNumberOfBytesToRead, LPDWORD lpReserved,
54 LPOVERLAPPED lpOverlapped);
55typedef BOOL (*pcWriteFile)(PVOID Object, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
56 LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);
57typedef BOOL (*pcWriteFileEx)(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
58 LPOVERLAPPED lpOverlapped,
59 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
60typedef BOOL (*pcWriteFileGather)(HANDLE hFile, FILE_SEGMENT_ELEMENT aSegmentArray[],
61 DWORD nNumberOfBytesToWrite, LPDWORD lpReserved,
62 LPOVERLAPPED lpOverlapped);
63typedef DWORD (*pcGetFileSize)(HANDLE handle, LPDWORD lpFileSizeHigh);
64typedef BOOL (*pcGetFileInformationByHandle)(HANDLE handle,
65 LPBY_HANDLE_FILE_INFORMATION lpFileInformation);
66typedef BOOL (*pcFlushFileBuffers)(HANDLE hFile);
67typedef BOOL (*pcSetEndOfFile)(HANDLE handle);
68typedef DWORD (*pcSetFilePointer)(HANDLE handle, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh,
69 DWORD dwMoveMethod);
70typedef BOOL (*pcSetFilePointerEx)(HANDLE hFile, LARGE_INTEGER liDistanceToMove,
71 PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod);
72typedef BOOL (*pcLockFile)(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh,
73 DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh);
74typedef BOOL (*pcLockFileEx)(HANDLE hFile, DWORD dwFlags, DWORD dwReserved,
75 DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh,
76 LPOVERLAPPED lpOverlapped);
77typedef BOOL (*pcUnlockFile)(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh,
78 DWORD nNumberOfBytesToUnlockLow, DWORD nNumberOfBytesToUnlockHigh);
79typedef BOOL (*pcUnlockFileEx)(HANDLE hFile, DWORD dwReserved, DWORD nNumberOfBytesToUnlockLow,
80 DWORD nNumberOfBytesToUnlockHigh, LPOVERLAPPED lpOverlapped);
81typedef BOOL (*pcSetFileTime)(HANDLE hFile, const FILETIME* lpCreationTime,
82 const FILETIME* lpLastAccessTime, const FILETIME* lpLastWriteTime);
83
84typedef 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
109typedef struct
110{
111 ULONG Type;
112 ULONG Mode;
113 HANDLE_OPS* ops;
115
116WINPR_ATTR_NODISCARD
117static inline BOOL WINPR_HANDLE_IS_HANDLED(HANDLE handle, ULONG type, BOOL invalidValue)
118{
119 WINPR_HANDLE* pWinprHandle = (WINPR_HANDLE*)handle;
120 BOOL invalid = !pWinprHandle;
121
122 if (invalidValue)
123 {
124 if (INVALID_HANDLE_VALUE == pWinprHandle)
125 invalid = TRUE;
126 }
127
128 if (invalid || (pWinprHandle->Type != type))
129 {
130 SetLastError(ERROR_INVALID_HANDLE);
131 return FALSE;
132 }
133
134 return TRUE;
135}
136
137static inline void WINPR_HANDLE_SET_TYPE_AND_MODE(void* _handle, ULONG _type, ULONG _mode)
138{
139 WINPR_HANDLE* hdl = (WINPR_HANDLE*)_handle;
140
141 hdl->Type = _type;
142 hdl->Mode = _mode;
143}
144
145WINPR_ATTR_NODISCARD
146static inline BOOL winpr_Handle_GetInfo(HANDLE handle, ULONG* pType, WINPR_HANDLE** pObject)
147{
148 WINPR_HANDLE* wHandle = nullptr;
149
150 if (handle == nullptr)
151 return FALSE;
152
153 /* INVALID_HANDLE_VALUE is an invalid value for every handle, but it
154 * confuses the clang scanbuild analyzer. */
155#ifndef __clang_analyzer__
156 if (handle == INVALID_HANDLE_VALUE)
157 return FALSE;
158#endif
159
160 wHandle = (WINPR_HANDLE*)handle;
161
162 *pType = wHandle->Type;
163 *pObject = wHandle;
164
165 return TRUE;
166}
167
168WINPR_ATTR_NODISCARD
169static inline int winpr_Handle_getFd(HANDLE handle)
170{
171 WINPR_HANDLE* hdl = nullptr;
172 ULONG type = 0;
173
174 if (!winpr_Handle_GetInfo(handle, &type, &hdl))
175 return -1;
176
177 if (!hdl || !hdl->ops || !hdl->ops->GetFd)
178 return -1;
179
180 return hdl->ops->GetFd(handle);
181}
182
183WINPR_ATTR_NODISCARD
184static inline DWORD winpr_Handle_cleanup(HANDLE handle)
185{
186 WINPR_HANDLE* hdl = nullptr;
187 ULONG type = 0;
188
189 if (!winpr_Handle_GetInfo(handle, &type, &hdl))
190 return WAIT_FAILED;
191
192 if (!hdl || !hdl->ops)
193 return WAIT_FAILED;
194
195 /* If there is no cleanup function, assume all ok. */
196 if (!hdl->ops->CleanupHandle)
197 return WAIT_OBJECT_0;
198
199 return hdl->ops->CleanupHandle(handle);
200}
201
202#endif /* WINPR_HANDLE_PRIVATE_H */