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
13 PPROVIDER_HANDLE_BLOCK ProviderHandleTable
;
14 CRITICAL_SECTION ProviderHandleTableLock
;
17 GetProviderByHandle(PPROVIDER_HANDLE_BLOCK HandleTable
,
20 * FUNCTION: Get the data structure for a handle
22 * HandleTable = Pointer to handle table
23 * Handle = Handle to get data structure for
25 * Pointer to the data structure identified by the handle on success,
29 PPROVIDER_HANDLE_BLOCK Current
;
30 PLIST_ENTRY CurrentEntry
;
33 WS_DbgPrint(MAX_TRACE
, ("HandleTable (0x%X) Handle (0x%X).\n", HandleTable
, Handle
));
35 CurrentEntry
= HandleTable
->Entry
.Flink
;
37 while (CurrentEntry
!= &HandleTable
->Entry
)
39 Current
= CONTAINING_RECORD(CurrentEntry
, PROVIDER_HANDLE_BLOCK
, Entry
);
41 for (i
= 0; i
< HANDLE_BLOCK_ENTRIES
; i
++)
43 if ((Current
->Handles
[i
].Provider
!= NULL
) &&
44 (Current
->Handles
[i
].Handle
== Handle
))
46 return &Current
->Handles
[i
];
49 CurrentEntry
= CurrentEntry
->Flink
;
57 CloseAllHandles(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
)
70 Current
= CONTAINING_RECORD(CurrentEntry
, PROVIDER_HANDLE_BLOCK
, Entry
);
72 for (i
= 0; i
< HANDLE_BLOCK_ENTRIES
; i
++)
74 Provider
= Current
->Handles
[i
].Provider
;
77 DereferenceProviderByPointer(Provider
);
78 Current
->Handles
[i
].Handle
= (HANDLE
)0;
79 Current
->Handles
[i
].Provider
= NULL
;
82 CurrentEntry
= CurrentEntry
->Flink
;
88 DeleteHandleTable(PPROVIDER_HANDLE_BLOCK HandleTable
)
90 PPROVIDER_HANDLE_BLOCK Current
;
91 PLIST_ENTRY CurrentEntry
;
93 CloseAllHandles(HandleTable
);
95 CurrentEntry
= RemoveHeadList(&HandleTable
->Entry
);
97 while (CurrentEntry
!= &HandleTable
->Entry
)
99 Current
= CONTAINING_RECORD(CurrentEntry
,
100 PROVIDER_HANDLE_BLOCK
,
103 HeapFree(GlobalHeap
, 0, Current
);
105 CurrentEntry
= RemoveHeadList(&HandleTable
->Entry
);
111 DeleteProviderHandle(PPROVIDER_HANDLE_BLOCK HandleTable
,
114 PPROVIDER_HANDLE Entry
;
115 PCATALOG_ENTRY Provider
;
117 WS_DbgPrint(MAX_TRACE
, ("HandleTable (0x%X) Handle (0x%X).\n", HandleTable
, Handle
));
119 Entry
= GetProviderByHandle(HandleTable
, Handle
);
123 Provider
= Entry
->Provider
;
124 Entry
->Handle
= (HANDLE
)0;
125 Entry
->Provider
= NULL
;
132 CreateProviderHandleTable(PPROVIDER_HANDLE_BLOCK HandleTable
,
134 PCATALOG_ENTRY Provider
)
136 PPROVIDER_HANDLE_BLOCK NewBlock
;
137 PLIST_ENTRY CurrentEntry
;
140 WS_DbgPrint(MAX_TRACE
, ("HandleTable (0x%X) Handle (0x%X) Provider (0x%X).\n",
141 HandleTable
, Handle
, Provider
));
143 /* Scan through the currently allocated handle blocks looking for a free slot */
144 CurrentEntry
= HandleTable
->Entry
.Flink
;
145 while (CurrentEntry
!= &HandleTable
->Entry
)
147 PPROVIDER_HANDLE_BLOCK Block
= CONTAINING_RECORD(CurrentEntry
,
148 PROVIDER_HANDLE_BLOCK
,
151 for (i
= 0; i
< HANDLE_BLOCK_ENTRIES
; i
++)
153 WS_DbgPrint(MAX_TRACE
, ("Considering slot %ld containing 0x%X.\n",
155 Block
->Handles
[i
].Provider
));
156 if (Block
->Handles
[i
].Provider
== NULL
)
158 Block
->Handles
[i
].Handle
= Handle
;
159 Block
->Handles
[i
].Provider
= Provider
;
163 CurrentEntry
= CurrentEntry
->Flink
;
166 /* Add a new handle block to the end of the list */
167 NewBlock
= (PPROVIDER_HANDLE_BLOCK
)HeapAlloc(GlobalHeap
,
169 sizeof(PROVIDER_HANDLE_BLOCK
));
171 WS_DbgPrint(MID_TRACE
,("using table entry %x\n", NewBlock
));
176 ZeroMemory(NewBlock
, sizeof(PROVIDER_HANDLE_BLOCK
));
177 InsertTailList(&HandleTable
->Entry
,
180 NewBlock
->Handles
[0].Handle
= Handle
;
181 NewBlock
->Handles
[0].Provider
= Provider
;
188 CreateProviderHandle(HANDLE Handle
,
189 PCATALOG_ENTRY Provider
)
193 EnterCriticalSection(&ProviderHandleTableLock
);
195 h
= CreateProviderHandleTable(ProviderHandleTable
,
199 LeaveCriticalSection(&ProviderHandleTableLock
);
202 ReferenceProviderByPointer(Provider
);
209 ReferenceProviderByHandle(HANDLE Handle
,
210 PCATALOG_ENTRY
* Provider
)
212 * FUNCTION: Increments the reference count for a provider and returns a pointer to it
214 * Handle = Handle for the provider
215 * Provider = Address of buffer to place pointer to provider
217 * TRUE if handle was valid, FALSE if not
220 PPROVIDER_HANDLE ProviderHandle
;
222 WS_DbgPrint(MID_TRACE
, ("Handle (0x%X) Provider (0x%X).\n", Handle
, Provider
));
224 EnterCriticalSection(&ProviderHandleTableLock
);
226 ProviderHandle
= GetProviderByHandle(ProviderHandleTable
,
229 WS_DbgPrint(MID_TRACE
, ("ProviderHandle is %x\n", ProviderHandle
));
231 LeaveCriticalSection(&ProviderHandleTableLock
);
235 ReferenceProviderByPointer(ProviderHandle
->Provider
);
236 *Provider
= ProviderHandle
->Provider
;
239 return (ProviderHandle
!= NULL
);
244 CloseProviderHandle(HANDLE Handle
)
246 PCATALOG_ENTRY Provider
;
248 WS_DbgPrint(MAX_TRACE
, ("Handle (0x%X).\n", Handle
));
250 EnterCriticalSection(&ProviderHandleTableLock
);
252 Provider
= DeleteProviderHandle(ProviderHandleTable
,
257 LeaveCriticalSection(&ProviderHandleTableLock
);
259 DereferenceProviderByPointer(Provider
);
266 InitProviderHandleTable(VOID
)
268 ProviderHandleTable
=
269 (PPROVIDER_HANDLE_BLOCK
)HeapAlloc(GlobalHeap
,
271 sizeof(PROVIDER_HANDLE_BLOCK
));
272 if (!ProviderHandleTable
)
275 WS_DbgPrint(MID_TRACE
,("Called\n"));
277 ZeroMemory(ProviderHandleTable
,
278 sizeof(PROVIDER_HANDLE_BLOCK
));
280 InitializeListHead(&ProviderHandleTable
->Entry
);
282 InitializeCriticalSection(&ProviderHandleTableLock
);
289 FreeProviderHandleTable(VOID
)
291 DeleteHandleTable(ProviderHandleTable
);
293 DeleteCriticalSection(&ProviderHandleTableLock
);