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
116static INLINE BOOL WINPR_HANDLE_IS_HANDLED(HANDLE handle, ULONG type, BOOL invalidValue)
117{
118 WINPR_HANDLE* pWinprHandle = (WINPR_HANDLE*)handle;
119 BOOL invalid = !pWinprHandle;
120
121 if (invalidValue)
122 {
123 if (INVALID_HANDLE_VALUE == pWinprHandle)
124 invalid = TRUE;
125 }
126
127 if (invalid || (pWinprHandle->Type != type))
128 {
129 SetLastError(ERROR_INVALID_HANDLE);
130 return FALSE;
131 }
132
133 return TRUE;
134}
135
136static INLINE void WINPR_HANDLE_SET_TYPE_AND_MODE(void* _handle, ULONG _type, ULONG _mode)
137{
138 WINPR_HANDLE* hdl = (WINPR_HANDLE*)_handle;
139
140 hdl->Type = _type;
141 hdl->Mode = _mode;
142}
143
144static INLINE BOOL winpr_Handle_GetInfo(HANDLE handle, ULONG* pType, WINPR_HANDLE** pObject)
145{
146 WINPR_HANDLE* wHandle = NULL;
147
148 if (handle == NULL)
149 return FALSE;
150
151 /* INVALID_HANDLE_VALUE is an invalid value for every handle, but it
152 * confuses the clang scanbuild analyzer. */
153#ifndef __clang_analyzer__
154 if (handle == INVALID_HANDLE_VALUE)
155 return FALSE;
156#endif
157
158 wHandle = (WINPR_HANDLE*)handle;
159
160 *pType = wHandle->Type;
161 *pObject = handle;
162
163 return TRUE;
164}
165
166static INLINE int winpr_Handle_getFd(HANDLE handle)
167{
168 WINPR_HANDLE* hdl = NULL;
169 ULONG type = 0;
170
171 if (!winpr_Handle_GetInfo(handle, &type, &hdl))
172 return -1;
173
174 if (!hdl || !hdl->ops || !hdl->ops->GetFd)
175 return -1;
176
177 return hdl->ops->GetFd(handle);
178}
179
180static INLINE DWORD winpr_Handle_cleanup(HANDLE handle)
181{
182 WINPR_HANDLE* hdl = NULL;
183 ULONG type = 0;
184
185 if (!winpr_Handle_GetInfo(handle, &type, &hdl))
186 return WAIT_FAILED;
187
188 if (!hdl || !hdl->ops)
189 return WAIT_FAILED;
190
191 /* If there is no cleanup function, assume all ok. */
192 if (!hdl->ops->CleanupHandle)
193 return WAIT_OBJECT_0;
194
195 return hdl->ops->CleanupHandle(handle);
196}
197
198#endif /* WINPR_HANDLE_PRIVATE_H */