20#ifndef WINPR_HANDLE_PRIVATE_H
21#define WINPR_HANDLE_PRIVATE_H
25#include <winpr/handle.h>
26#include <winpr/file.h>
27#include <winpr/interlocked.h>
28#include <winpr/synch.h>
29#include <winpr/winsock.h>
31#define HANDLE_TYPE_NONE 0
32#define HANDLE_TYPE_PROCESS 1
33#define HANDLE_TYPE_THREAD 2
34#define HANDLE_TYPE_EVENT 3
35#define HANDLE_TYPE_MUTEX 4
36#define HANDLE_TYPE_SEMAPHORE 5
37#define HANDLE_TYPE_TIMER 6
38#define HANDLE_TYPE_NAMED_PIPE 7
39#define HANDLE_TYPE_ANONYMOUS_PIPE 8
40#define HANDLE_TYPE_ACCESS_TOKEN 9
41#define HANDLE_TYPE_FILE 10
42#define HANDLE_TYPE_TIMER_QUEUE 11
43#define HANDLE_TYPE_TIMER_QUEUE_TIMER 12
44#define HANDLE_TYPE_COMM 13
46typedef BOOL (*pcIsHandled)(HANDLE handle);
47typedef BOOL (*pcCloseHandle)(HANDLE handle);
48typedef int (*pcGetFd)(HANDLE handle);
49typedef DWORD (*pcCleanupHandle)(HANDLE handle);
50typedef BOOL (*pcReadFile)(PVOID Object, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
52typedef BOOL (*pcReadFileEx)(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
54 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
56 DWORD nNumberOfBytesToRead, LPDWORD lpReserved,
58typedef BOOL (*pcWriteFile)(PVOID Object, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
59 LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped);
60typedef BOOL (*pcWriteFileEx)(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
62 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
64 DWORD nNumberOfBytesToWrite, LPDWORD lpReserved,
66typedef DWORD (*pcGetFileSize)(HANDLE handle, LPDWORD lpFileSizeHigh);
67typedef BOOL (*pcGetFileInformationByHandle)(HANDLE handle,
69typedef BOOL (*pcFlushFileBuffers)(HANDLE hFile);
70typedef BOOL (*pcSetEndOfFile)(HANDLE handle);
71typedef DWORD (*pcSetFilePointer)(HANDLE handle, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh,
73typedef BOOL (*pcSetFilePointerEx)(HANDLE hFile,
LARGE_INTEGER liDistanceToMove,
74 PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod);
75typedef BOOL (*pcLockFile)(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh,
76 DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh);
77typedef BOOL (*pcLockFileEx)(HANDLE hFile, DWORD dwFlags, DWORD dwReserved,
78 DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh,
80typedef BOOL (*pcUnlockFile)(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh,
81 DWORD nNumberOfBytesToUnlockLow, DWORD nNumberOfBytesToUnlockHigh);
82typedef BOOL (*pcUnlockFileEx)(HANDLE hFile, DWORD dwReserved, DWORD nNumberOfBytesToUnlockLow,
83 DWORD nNumberOfBytesToUnlockHigh,
LPOVERLAPPED lpOverlapped);
84typedef BOOL (*pcSetFileTime)(HANDLE hFile,
const FILETIME* lpCreationTime,
89 pcIsHandled IsHandled;
90 pcCloseHandle CloseHandle;
92 pcCleanupHandle CleanupHandle;
94 pcReadFileEx ReadFileEx;
95 pcReadFileScatter ReadFileScatter;
96 pcWriteFile WriteFile;
97 pcWriteFileEx WriteFileEx;
98 pcWriteFileGather WriteFileGather;
99 pcGetFileSize GetFileSize;
100 pcFlushFileBuffers FlushFileBuffers;
101 pcSetEndOfFile SetEndOfFile;
102 pcSetFilePointer SetFilePointer;
103 pcSetFilePointerEx SetFilePointerEx;
105 pcLockFileEx LockFileEx;
106 pcUnlockFile UnlockFile;
107 pcUnlockFileEx UnlockFileEx;
108 pcSetFileTime SetFileTime;
109 pcGetFileInformationByHandle GetFileInformationByHandle;
117 volatile LONG refCount;
121static inline BOOL WINPR_HANDLE_IS_HANDLED(HANDLE handle, ULONG type, BOOL invalidValue)
124 BOOL invalid = !pWinprHandle;
128 if (INVALID_HANDLE_VALUE == pWinprHandle)
132 if (invalid || (pWinprHandle->Type != type))
134 SetLastError(ERROR_INVALID_HANDLE);
141static inline void WINPR_HANDLE_SET_TYPE_AND_MODE(
void* _handle, ULONG _type, ULONG _mode)
151static inline BOOL winpr_Handle_GetInfo(HANDLE handle, ULONG* pType,
WINPR_HANDLE** pObject)
155 if (handle ==
nullptr)
160#ifndef __clang_analyzer__
161 if (handle == INVALID_HANDLE_VALUE)
167 *pType = wHandle->Type;
173static inline void winpr_Handle_AddRef(HANDLE handle)
178 if (!winpr_Handle_GetInfo(handle, &type, &hdl) || !hdl)
181 InterlockedIncrement(&hdl->refCount);
186void winpr_Handle_ConvertToNone(HANDLE handle);
191static inline BOOL winpr_Handle_Release(HANDLE handle)
196 if (!winpr_Handle_GetInfo(handle, &type, &hdl) || !hdl)
199 if (InterlockedDecrement(&hdl->refCount) > 0)
207static inline int winpr_Handle_getFd(HANDLE handle)
212 if (!winpr_Handle_GetInfo(handle, &type, &hdl))
215 if (!hdl || !hdl->ops || !hdl->ops->GetFd)
218 return hdl->ops->GetFd(handle);
222static inline DWORD winpr_Handle_cleanup(HANDLE handle)
227 if (!winpr_Handle_GetInfo(handle, &type, &hdl))
230 if (!hdl || !hdl->ops)
234 if (!hdl->ops->CleanupHandle)
235 return WAIT_OBJECT_0;
237 return hdl->ops->CleanupHandle(handle);
241BOOL winpr_set_cloexec(
int fd, BOOL cloexec);