Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenhandle.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS WinSock 2 DLL 00004 * FILE: misc/handle.c 00005 * PURPOSE: Provider handle management 00006 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) 00007 * REVISIONS: 00008 * CSH 01/09-2000 Created 00009 */ 00010 00011 #include "ws2_32.h" 00012 00013 PPROVIDER_HANDLE_BLOCK ProviderHandleTable; 00014 CRITICAL_SECTION ProviderHandleTableLock; 00015 00016 PPROVIDER_HANDLE 00017 GetProviderByHandle(PPROVIDER_HANDLE_BLOCK HandleTable, 00018 HANDLE Handle) 00019 /* 00020 * FUNCTION: Get the data structure for a handle 00021 * ARGUMENTS: 00022 * HandleTable = Pointer to handle table 00023 * Handle = Handle to get data structure for 00024 * RETURNS: 00025 * Pointer to the data structure identified by the handle on success, 00026 * NULL on failure 00027 */ 00028 { 00029 PPROVIDER_HANDLE_BLOCK Current; 00030 PLIST_ENTRY CurrentEntry; 00031 ULONG i; 00032 00033 WS_DbgPrint(MAX_TRACE, ("HandleTable (0x%X) Handle (0x%X).\n", HandleTable, Handle)); 00034 00035 CurrentEntry = HandleTable->Entry.Flink; 00036 00037 while (CurrentEntry != &HandleTable->Entry) 00038 { 00039 Current = CONTAINING_RECORD(CurrentEntry, PROVIDER_HANDLE_BLOCK, Entry); 00040 00041 for (i = 0; i < HANDLE_BLOCK_ENTRIES; i++) 00042 { 00043 if ((Current->Handles[i].Provider != NULL) && 00044 (Current->Handles[i].Handle == Handle)) 00045 { 00046 return &Current->Handles[i]; 00047 } 00048 } 00049 CurrentEntry = CurrentEntry->Flink; 00050 } 00051 00052 return NULL; 00053 } 00054 00055 00056 VOID 00057 CloseAllHandles(PPROVIDER_HANDLE_BLOCK HandleTable) 00058 { 00059 PPROVIDER_HANDLE_BLOCK Current; 00060 PLIST_ENTRY CurrentEntry; 00061 PCATALOG_ENTRY Provider; 00062 ULONG i; 00063 00064 WS_DbgPrint(MAX_TRACE, ("HandleTable (0x%X).\n", HandleTable)); 00065 00066 CurrentEntry = HandleTable->Entry.Flink; 00067 00068 while (CurrentEntry != &HandleTable->Entry) 00069 { 00070 Current = CONTAINING_RECORD(CurrentEntry, PROVIDER_HANDLE_BLOCK, Entry); 00071 00072 for (i = 0; i < HANDLE_BLOCK_ENTRIES; i++) 00073 { 00074 Provider = Current->Handles[i].Provider; 00075 if (Provider != NULL) 00076 { 00077 DereferenceProviderByPointer(Provider); 00078 Current->Handles[i].Handle = (HANDLE)0; 00079 Current->Handles[i].Provider = NULL; 00080 } 00081 } 00082 CurrentEntry = CurrentEntry->Flink; 00083 } 00084 } 00085 00086 00087 VOID 00088 DeleteHandleTable(PPROVIDER_HANDLE_BLOCK HandleTable) 00089 { 00090 PPROVIDER_HANDLE_BLOCK Current; 00091 PLIST_ENTRY CurrentEntry; 00092 00093 CloseAllHandles(HandleTable); 00094 00095 CurrentEntry = RemoveHeadList(&HandleTable->Entry); 00096 00097 while (CurrentEntry != &HandleTable->Entry) 00098 { 00099 Current = CONTAINING_RECORD(CurrentEntry, 00100 PROVIDER_HANDLE_BLOCK, 00101 Entry); 00102 00103 HeapFree(GlobalHeap, 0, Current); 00104 00105 CurrentEntry = RemoveHeadList(&HandleTable->Entry); 00106 } 00107 } 00108 00109 00110 PCATALOG_ENTRY 00111 DeleteProviderHandle(PPROVIDER_HANDLE_BLOCK HandleTable, 00112 HANDLE Handle) 00113 { 00114 PPROVIDER_HANDLE Entry; 00115 PCATALOG_ENTRY Provider; 00116 00117 WS_DbgPrint(MAX_TRACE, ("HandleTable (0x%X) Handle (0x%X).\n", HandleTable, Handle)); 00118 00119 Entry = GetProviderByHandle(HandleTable, Handle); 00120 if (!Entry) 00121 return NULL; 00122 00123 Provider = Entry->Provider; 00124 Entry->Handle = (HANDLE)0; 00125 Entry->Provider = NULL; 00126 00127 return Provider; 00128 } 00129 00130 00131 HANDLE 00132 CreateProviderHandleTable(PPROVIDER_HANDLE_BLOCK HandleTable, 00133 HANDLE Handle, 00134 PCATALOG_ENTRY Provider) 00135 { 00136 PPROVIDER_HANDLE_BLOCK NewBlock; 00137 PLIST_ENTRY CurrentEntry; 00138 ULONG i; 00139 00140 WS_DbgPrint(MAX_TRACE, ("HandleTable (0x%X) Handle (0x%X) Provider (0x%X).\n", 00141 HandleTable, Handle, Provider)); 00142 00143 /* Scan through the currently allocated handle blocks looking for a free slot */ 00144 CurrentEntry = HandleTable->Entry.Flink; 00145 while (CurrentEntry != &HandleTable->Entry) 00146 { 00147 PPROVIDER_HANDLE_BLOCK Block = CONTAINING_RECORD(CurrentEntry, 00148 PROVIDER_HANDLE_BLOCK, 00149 Entry); 00150 00151 for (i = 0; i < HANDLE_BLOCK_ENTRIES; i++) 00152 { 00153 WS_DbgPrint(MAX_TRACE, ("Considering slot %ld containing 0x%X.\n", 00154 i, 00155 Block->Handles[i].Provider)); 00156 if (Block->Handles[i].Provider == NULL) 00157 { 00158 Block->Handles[i].Handle = Handle; 00159 Block->Handles[i].Provider = Provider; 00160 return Handle; 00161 } 00162 } 00163 CurrentEntry = CurrentEntry->Flink; 00164 } 00165 00166 /* Add a new handle block to the end of the list */ 00167 NewBlock = (PPROVIDER_HANDLE_BLOCK)HeapAlloc(GlobalHeap, 00168 0, 00169 sizeof(PROVIDER_HANDLE_BLOCK)); 00170 00171 WS_DbgPrint(MID_TRACE,("using table entry %x\n", NewBlock)); 00172 00173 if (!NewBlock) 00174 return (HANDLE)0; 00175 00176 ZeroMemory(NewBlock, sizeof(PROVIDER_HANDLE_BLOCK)); 00177 InsertTailList(&HandleTable->Entry, 00178 &NewBlock->Entry); 00179 00180 NewBlock->Handles[0].Handle = Handle; 00181 NewBlock->Handles[0].Provider = Provider; 00182 00183 return Handle; 00184 } 00185 00186 00187 HANDLE 00188 CreateProviderHandle(HANDLE Handle, 00189 PCATALOG_ENTRY Provider) 00190 { 00191 HANDLE h; 00192 00193 EnterCriticalSection(&ProviderHandleTableLock); 00194 00195 h = CreateProviderHandleTable(ProviderHandleTable, 00196 Handle, 00197 Provider); 00198 00199 LeaveCriticalSection(&ProviderHandleTableLock); 00200 00201 if (h != NULL) 00202 ReferenceProviderByPointer(Provider); 00203 00204 return h; 00205 } 00206 00207 00208 BOOL 00209 ReferenceProviderByHandle(HANDLE Handle, 00210 PCATALOG_ENTRY* Provider) 00211 /* 00212 * FUNCTION: Increments the reference count for a provider and returns a pointer to it 00213 * ARGUMENTS: 00214 * Handle = Handle for the provider 00215 * Provider = Address of buffer to place pointer to provider 00216 * RETURNS: 00217 * TRUE if handle was valid, FALSE if not 00218 */ 00219 { 00220 PPROVIDER_HANDLE ProviderHandle; 00221 00222 WS_DbgPrint(MID_TRACE, ("Handle (0x%X) Provider (0x%X).\n", Handle, Provider)); 00223 00224 EnterCriticalSection(&ProviderHandleTableLock); 00225 00226 ProviderHandle = GetProviderByHandle(ProviderHandleTable, 00227 Handle); 00228 00229 WS_DbgPrint(MID_TRACE, ("ProviderHandle is %x\n", ProviderHandle)); 00230 00231 LeaveCriticalSection(&ProviderHandleTableLock); 00232 00233 if (ProviderHandle) 00234 { 00235 ReferenceProviderByPointer(ProviderHandle->Provider); 00236 *Provider = ProviderHandle->Provider; 00237 } 00238 00239 return (ProviderHandle != NULL); 00240 } 00241 00242 00243 BOOL 00244 CloseProviderHandle(HANDLE Handle) 00245 { 00246 PCATALOG_ENTRY Provider; 00247 00248 WS_DbgPrint(MAX_TRACE, ("Handle (0x%X).\n", Handle)); 00249 00250 EnterCriticalSection(&ProviderHandleTableLock); 00251 00252 Provider = DeleteProviderHandle(ProviderHandleTable, 00253 Handle); 00254 if (!Provider) 00255 return FALSE; 00256 00257 LeaveCriticalSection(&ProviderHandleTableLock); 00258 00259 DereferenceProviderByPointer(Provider); 00260 00261 return TRUE; 00262 } 00263 00264 00265 BOOL 00266 InitProviderHandleTable(VOID) 00267 { 00268 ProviderHandleTable = 00269 (PPROVIDER_HANDLE_BLOCK)HeapAlloc(GlobalHeap, 00270 0, 00271 sizeof(PROVIDER_HANDLE_BLOCK)); 00272 if (!ProviderHandleTable) 00273 return FALSE; 00274 00275 WS_DbgPrint(MID_TRACE,("Called\n")); 00276 00277 ZeroMemory(ProviderHandleTable, 00278 sizeof(PROVIDER_HANDLE_BLOCK)); 00279 00280 InitializeListHead(&ProviderHandleTable->Entry); 00281 00282 InitializeCriticalSection(&ProviderHandleTableLock); 00283 00284 return TRUE; 00285 } 00286 00287 00288 VOID 00289 FreeProviderHandleTable(VOID) 00290 { 00291 DeleteHandleTable(ProviderHandleTable); 00292 00293 DeleteCriticalSection(&ProviderHandleTableLock); 00294 } 00295 00296 /* EOF */ Generated on Sat May 26 2012 04:22:59 for ReactOS by
1.7.6.1
|