2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS WinSock 2 DLL
5 * PURPOSE: Provider handle management
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * CSH 01/09-2000 Created
14 PPROVIDER_HANDLE_BLOCK ProviderHandleTable
;
15 CRITICAL_SECTION ProviderHandleTableLock
;
19 PPROVIDER_HANDLE_BLOCK HandleTable
,
22 * FUNCTION: Get the data structure for a handle
24 * HandleTable = Pointer to handle table
25 * Handle = Handle to get data structure for
27 * Pointer to the data structure identified by the handle on success,
31 PPROVIDER_HANDLE_BLOCK Current
;
32 PLIST_ENTRY CurrentEntry
;
35 WS_DbgPrint(MAX_TRACE
, ("HandleTable (0x%X) Handle (0x%X).\n", HandleTable
, Handle
));
37 CurrentEntry
= HandleTable
->Entry
.Flink
;
39 while (CurrentEntry
!= &HandleTable
->Entry
) {
40 Current
= CONTAINING_RECORD(CurrentEntry
, PROVIDER_HANDLE_BLOCK
, Entry
);
42 for (i
= 0; i
< HANDLE_BLOCK_ENTRIES
; i
++) {
43 if ((Current
->Handles
[i
].Provider
!= NULL
) &&
44 (Current
->Handles
[i
].Handle
== Handle
)) {
45 return &Current
->Handles
[i
];
48 CurrentEntry
= CurrentEntry
->Flink
;
57 PPROVIDER_HANDLE_BLOCK HandleTable
)
59 PPROVIDER_HANDLE_BLOCK Current
;
60 PLIST_ENTRY CurrentEntry
;
61 PCATALOG_ENTRY Provider
;
64 WS_DbgPrint(MAX_TRACE
, ("HandleTable (0x%X).\n", HandleTable
));
66 CurrentEntry
= HandleTable
->Entry
.Flink
;
68 while (CurrentEntry
!= &HandleTable
->Entry
) {
69 Current
= CONTAINING_RECORD(CurrentEntry
, PROVIDER_HANDLE_BLOCK
, Entry
);
71 for (i
= 0; i
< HANDLE_BLOCK_ENTRIES
; i
++) {
72 Provider
= Current
->Handles
[i
].Provider
;
73 if (Provider
!= NULL
) {
74 DereferenceProviderByPointer(Provider
);
75 Current
->Handles
[i
].Handle
= (HANDLE
)0;
76 Current
->Handles
[i
].Provider
= NULL
;
79 CurrentEntry
= CurrentEntry
->Flink
;
86 PPROVIDER_HANDLE_BLOCK HandleTable
)
88 PPROVIDER_HANDLE_BLOCK Current
;
89 PLIST_ENTRY CurrentEntry
;
91 CloseAllHandles(HandleTable
);
93 CurrentEntry
= RemoveHeadList(&HandleTable
->Entry
);
95 while (CurrentEntry
!= &HandleTable
->Entry
) {
96 Current
= CONTAINING_RECORD(
98 PROVIDER_HANDLE_BLOCK
,
101 HeapFree(GlobalHeap
, 0, Current
);
103 CurrentEntry
= RemoveHeadList(&HandleTable
->Entry
);
109 DeleteProviderHandle(PPROVIDER_HANDLE_BLOCK HandleTable
,
112 PPROVIDER_HANDLE Entry
;
113 PCATALOG_ENTRY Provider
;
115 WS_DbgPrint(MAX_TRACE
, ("HandleTable (0x%X) Handle (0x%X).\n", HandleTable
, Handle
));
117 Entry
= GetProviderByHandle(HandleTable
, Handle
);
121 Provider
= Entry
->Provider
;
122 Entry
->Handle
= (HANDLE
)0;
123 Entry
->Provider
= NULL
;
130 CreateProviderHandleTable(
131 PPROVIDER_HANDLE_BLOCK HandleTable
,
133 PCATALOG_ENTRY Provider
)
135 PPROVIDER_HANDLE_BLOCK NewBlock
;
136 PLIST_ENTRY CurrentEntry
;
139 WS_DbgPrint(MAX_TRACE
, ("HandleTable (0x%X) Handle (0x%X) Provider (0x%X).\n",
140 HandleTable
, Handle
, Provider
));
142 /* Scan through the currently allocated handle blocks looking for a free slot */
143 CurrentEntry
= HandleTable
->Entry
.Flink
;
144 while (CurrentEntry
!= &HandleTable
->Entry
) {
145 PPROVIDER_HANDLE_BLOCK Block
= CONTAINING_RECORD(
146 CurrentEntry
, PROVIDER_HANDLE_BLOCK
, Entry
);
148 for (i
= 0; i
< HANDLE_BLOCK_ENTRIES
; i
++) {
149 WS_DbgPrint(MAX_TRACE
, ("Considering slot %ld containing 0x%X.\n",
150 i
, Block
->Handles
[i
].Provider
));
151 if (Block
->Handles
[i
].Provider
== NULL
) {
152 Block
->Handles
[i
].Handle
= Handle
;
153 Block
->Handles
[i
].Provider
= Provider
;
157 CurrentEntry
= CurrentEntry
->Flink
;
160 /* Add a new handle block to the end of the list */
161 NewBlock
= (PPROVIDER_HANDLE_BLOCK
)HeapAlloc(
162 GlobalHeap
, 0, sizeof(PROVIDER_HANDLE_BLOCK
));
164 WS_DbgPrint(MID_TRACE
,("using table entry %x\n", NewBlock
));
169 ZeroMemory(NewBlock
, sizeof(PROVIDER_HANDLE_BLOCK
));
170 InsertTailList(&HandleTable
->Entry
, &NewBlock
->Entry
);
172 NewBlock
->Handles
[0].Handle
= Handle
;
173 NewBlock
->Handles
[0].Provider
= Provider
;
180 CreateProviderHandle(
182 PCATALOG_ENTRY Provider
)
186 EnterCriticalSection(&ProviderHandleTableLock
);
188 h
= CreateProviderHandleTable(ProviderHandleTable
, Handle
, Provider
);
190 LeaveCriticalSection(&ProviderHandleTableLock
);
193 ReferenceProviderByPointer(Provider
);
200 ReferenceProviderByHandle(
202 PCATALOG_ENTRY
* Provider
)
204 * FUNCTION: Increments the reference count for a provider and returns a pointer to it
206 * Handle = Handle for the provider
207 * Provider = Address of buffer to place pointer to provider
209 * TRUE if handle was valid, FALSE if not
212 PPROVIDER_HANDLE ProviderHandle
;
214 WS_DbgPrint(MID_TRACE
, ("Handle (0x%X) Provider (0x%X).\n", Handle
, Provider
));
216 EnterCriticalSection(&ProviderHandleTableLock
);
218 ProviderHandle
= GetProviderByHandle(ProviderHandleTable
, Handle
);
220 WS_DbgPrint(MID_TRACE
, ("ProviderHanddle is %x\n", ProviderHandle
));
222 LeaveCriticalSection(&ProviderHandleTableLock
);
224 if (ProviderHandle
) {
225 ReferenceProviderByPointer(ProviderHandle
->Provider
);
226 *Provider
= ProviderHandle
->Provider
;
229 return (ProviderHandle
!= NULL
);
237 PCATALOG_ENTRY Provider
;
239 WS_DbgPrint(MAX_TRACE
, ("Handle (0x%X).\n", Handle
));
241 EnterCriticalSection(&ProviderHandleTableLock
);
243 Provider
= DeleteProviderHandle(ProviderHandleTable
, Handle
);
247 LeaveCriticalSection(&ProviderHandleTableLock
);
249 DereferenceProviderByPointer(Provider
);
256 InitProviderHandleTable(VOID
)
258 ProviderHandleTable
= (PPROVIDER_HANDLE_BLOCK
)
259 HeapAlloc(GlobalHeap
, 0, sizeof(PROVIDER_HANDLE_BLOCK
));
260 if (!ProviderHandleTable
)
263 WS_DbgPrint(MID_TRACE
,("Called\n"));
265 ZeroMemory(ProviderHandleTable
, sizeof(PROVIDER_HANDLE_BLOCK
));
267 InitializeListHead(&ProviderHandleTable
->Entry
);
269 InitializeCriticalSection(&ProviderHandleTableLock
);
276 FreeProviderHandleTable(VOID
)
278 DeleteHandleTable(ProviderHandleTable
);
280 DeleteCriticalSection(&ProviderHandleTableLock
);