ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

handle.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.