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
)) {
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
) {
69 Current
= CONTAINING_RECORD(CurrentEntry
, PROVIDER_HANDLE_BLOCK
, Entry
);
71 for (i
= 0; i
< HANDLE_BLOCK_ENTRIES
; i
++) {
72 Provider
= Current
->Handles
[i
].Provider
;
74 if (Provider
!= NULL
) {
75 DereferenceProviderByPointer(Provider
);
76 Current
->Handles
[i
].Handle
= (HANDLE
)0;
77 Current
->Handles
[i
].Provider
= NULL
;
81 CurrentEntry
= CurrentEntry
->Flink
;
87 DeleteHandleTable(PPROVIDER_HANDLE_BLOCK HandleTable
)
89 PPROVIDER_HANDLE_BLOCK Current
;
90 PLIST_ENTRY CurrentEntry
;
92 CloseAllHandles(HandleTable
);
94 CurrentEntry
= RemoveHeadList(&HandleTable
->Entry
);
96 while (CurrentEntry
!= &HandleTable
->Entry
) {
97 Current
= CONTAINING_RECORD(CurrentEntry
,
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
);
122 Provider
= Entry
->Provider
;
124 if (Provider
!= NULL
) {
125 Entry
->Handle
= (HANDLE
)0;
126 Entry
->Provider
= NULL
;
134 CreateProviderHandleTable(PPROVIDER_HANDLE_BLOCK HandleTable
,
136 PCATALOG_ENTRY Provider
)
138 PPROVIDER_HANDLE_BLOCK NewBlock
;
139 PLIST_ENTRY CurrentEntry
;
142 WS_DbgPrint(MAX_TRACE
, ("HandleTable (0x%X) Handle (0x%X) Provider (0x%X).\n", HandleTable
, Handle
, Provider
));
144 /* Scan through the currently allocated handle blocks looking for a free slot */
145 CurrentEntry
= HandleTable
->Entry
.Flink
;
146 while (CurrentEntry
!= &HandleTable
->Entry
) {
147 PPROVIDER_HANDLE_BLOCK Block
= CONTAINING_RECORD(
148 CurrentEntry
, PROVIDER_HANDLE_BLOCK
, Entry
);
150 for (i
= 0; i
< HANDLE_BLOCK_ENTRIES
; i
++) {
151 WS_DbgPrint(MAX_TRACE
, ("Considering slot %ld containing 0x%X.\n", i
, Block
->Handles
[i
].Provider
));
152 if (!Block
->Handles
[i
].Provider
) {
153 Block
->Handles
[i
].Handle
= Handle
;
154 Block
->Handles
[i
].Provider
= Provider
;
158 CurrentEntry
= CurrentEntry
->Flink
;
161 /* Add a new handle block to the end of the list */
162 NewBlock
= (PPROVIDER_HANDLE_BLOCK
)HeapAlloc(
163 GlobalHeap
, 0, sizeof(PROVIDER_HANDLE_BLOCK
));
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(HANDLE Handle
,
181 PCATALOG_ENTRY Provider
)
185 //EnterCriticalSection(&ProviderHandleTableLock);
187 h
= CreateProviderHandleTable(ProviderHandleTable
, Handle
, Provider
);
189 //LeaveCriticalSection(&ProviderHandleTableLock);
192 ReferenceProviderByPointer(Provider
);
200 ReferenceProviderByHandle(HANDLE Handle
,
201 PCATALOG_ENTRY
* Provider
)
203 * FUNCTION: Increments the reference count for a provider and returns a pointer to it
205 * Handle = Handle for the provider
206 * Provider = Address of buffer to place pointer to provider
208 * TRUE if handle was valid, FALSE if not
211 PPROVIDER_HANDLE ProviderHandle
;
213 WS_DbgPrint(MAX_TRACE
, ("Handle (0x%X) Provider (0x%X).\n", Handle
, Provider
));
215 //EnterCriticalSection(&ProviderHandleTableLock);
217 ProviderHandle
= GetProviderByHandle(ProviderHandleTable
, Handle
);
219 //LeaveCriticalSection(&ProviderHandleTableLock);
221 if (ProviderHandle
) {
222 ReferenceProviderByPointer(ProviderHandle
->Provider
);
223 *Provider
= ProviderHandle
->Provider
;
226 return (ProviderHandle
!= NULL
);
231 CloseProviderHandle(HANDLE Handle
)
233 PCATALOG_ENTRY Provider
;
235 WS_DbgPrint(MAX_TRACE
, ("Handle (0x%X).\n", Handle
));
237 //EnterCriticalSection(&ProviderHandleTableLock);
239 Provider
= DeleteProviderHandle(ProviderHandleTable
, Handle
);
244 //LeaveCriticalSection(&ProviderHandleTableLock);
246 DereferenceProviderByPointer(Provider
);
253 InitProviderHandleTable(VOID
)
255 ProviderHandleTable
= (PPROVIDER_HANDLE_BLOCK
)
256 HeapAlloc(GlobalHeap
, 0, sizeof(PROVIDER_HANDLE_BLOCK
));
257 if (!ProviderHandleTable
) {
261 ZeroMemory(ProviderHandleTable
, sizeof(PROVIDER_HANDLE_BLOCK
));
263 InitializeListHead(&ProviderHandleTable
->Entry
);
265 //InitializeCriticalSection(&ProviderHandleTableLock);
272 FreeProviderHandleTable(VOID
)
274 DeleteHandleTable(ProviderHandleTable
);
276 //DeleteCriticalSection(&ProviderHandleTableLock);