FreeRDP
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 
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 {
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 
136 static 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 
144 static 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 
166 static 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 
180 static 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 */