20#include <winpr/config.h>
22#include <winpr/assert.h>
23#include <winpr/error.h>
24#include <winpr/thread.h>
30#include "../handle/handle.h"
32#define TAG WINPR_TAG("thread")
34BOOL InitializeProcThreadAttributeList(LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,
35 DWORD dwAttributeCount, DWORD dwFlags, PSIZE_T lpSize)
37 WINPR_UNUSED(dwFlags);
41 SetLastError(ERROR_INVALID_PARAMETER);
50 if (!lpAttributeList || (*lpSize < required))
53 SetLastError(ERROR_INSUFFICIENT_BUFFER);
57 lpAttributeList->capacity = dwAttributeCount;
58 lpAttributeList->count = 0;
62BOOL UpdateProcThreadAttribute(LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,
63 WINPR_ATTR_UNUSED DWORD dwFlags, DWORD_PTR Attribute, PVOID lpValue,
64 SIZE_T cbSize, WINPR_ATTR_UNUSED PVOID lpPreviousValue,
65 WINPR_ATTR_UNUSED PSIZE_T lpReturnSize)
67 if (!lpAttributeList || !lpValue)
69 SetLastError(ERROR_INVALID_PARAMETER);
73 if (lpAttributeList->count >= lpAttributeList->capacity)
75 WLog_ERR(TAG,
"attribute list is full (capacity=%" PRIu32
")", lpAttributeList->capacity);
76 SetLastError(ERROR_INSUFFICIENT_BUFFER);
81 entry->Attribute = Attribute;
82 entry->lpValue = lpValue;
83 entry->cbSize = cbSize;
85 if (Attribute == PROC_THREAD_ATTRIBUTE_HANDLE_LIST)
87 const HANDLE* handles = (
const HANDLE*)lpValue;
88 const size_t count = cbSize /
sizeof(HANDLE);
89 for (
size_t i = 0; i < count; i++)
90 winpr_Handle_AddRef(handles[i]);
96VOID DeleteProcThreadAttributeList(LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList)
105 for (DWORD i = 0; i < lpAttributeList->count; i++)
108 if (entry->Attribute != PROC_THREAD_ATTRIBUTE_HANDLE_LIST)
111 const HANDLE* handles = (
const HANDLE*)entry->lpValue;
112 const size_t count = entry->cbSize /
sizeof(HANDLE);
113 for (
size_t h = 0; h < count; h++)
114 (
void)winpr_Handle_Release(handles[h]);
opaque attribute list built by InitializeProcThreadAttributeList() / UpdateProcThreadAttribute(),...