ReactOS Fundraising Campaign 2012
 
€ 3,303 / € 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

ndr_fullpointer.c

Go to the documentation of this file.
00001 /*
00002  * Full Pointer Translation Routines
00003  *
00004  * Copyright 2006 Robert Shearman
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU Lesser General Public
00008  * License as published by the Free Software Foundation; either
00009  * version 2.1 of the License, or (at your option) any later version.
00010  *
00011  * This library is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014  * Lesser General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU Lesser General Public
00017  * License along with this library; if not, write to the Free Software
00018  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00019  */
00020 
00021 #include <stdarg.h>
00022 
00023 #include "windef.h"
00024 #include "winbase.h"
00025 #include "rpc.h"
00026 #include "rpcndr.h"
00027 
00028 #include "wine/debug.h"
00029 
00030 WINE_DEFAULT_DEBUG_CHANNEL(rpc);
00031 
00032 PFULL_PTR_XLAT_TABLES WINAPI NdrFullPointerXlatInit(ULONG NumberOfPointers,
00033                                                     XLAT_SIDE XlatSide)
00034 {
00035     ULONG NumberOfBuckets;
00036     PFULL_PTR_XLAT_TABLES pXlatTables = HeapAlloc(GetProcessHeap(), 0, sizeof(*pXlatTables));
00037 
00038     TRACE("(%d, %d)\n", NumberOfPointers, XlatSide);
00039 
00040     if (!NumberOfPointers) NumberOfPointers = 512;
00041     NumberOfBuckets = ((NumberOfPointers + 3) & ~3) - 1;
00042 
00043     pXlatTables->RefIdToPointer.XlatTable =
00044         HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
00045             sizeof(void *) * NumberOfPointers);
00046     pXlatTables->RefIdToPointer.StateTable =
00047         HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
00048             sizeof(unsigned char) * NumberOfPointers);
00049     pXlatTables->RefIdToPointer.NumberOfEntries = NumberOfPointers;
00050 
00051     TRACE("NumberOfBuckets = %d\n", NumberOfBuckets);
00052     pXlatTables->PointerToRefId.XlatTable =
00053         HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
00054             sizeof(PFULL_PTR_TO_REFID_ELEMENT) * NumberOfBuckets);
00055     pXlatTables->PointerToRefId.NumberOfBuckets = NumberOfBuckets;
00056     pXlatTables->PointerToRefId.HashMask = NumberOfBuckets - 1;
00057 
00058     pXlatTables->NextRefId = 1;
00059     pXlatTables->XlatSide = XlatSide;
00060 
00061     return pXlatTables;
00062 }
00063 
00064 void WINAPI NdrFullPointerXlatFree(PFULL_PTR_XLAT_TABLES pXlatTables)
00065 {
00066     ULONG i;
00067 
00068     TRACE("(%p)\n", pXlatTables);
00069 
00070     /* free the entries in the table */
00071     for (i = 0; i < pXlatTables->PointerToRefId.NumberOfBuckets; i++)
00072     {
00073         PFULL_PTR_TO_REFID_ELEMENT XlatTableEntry;
00074         for (XlatTableEntry = pXlatTables->PointerToRefId.XlatTable[i];
00075             XlatTableEntry; )
00076         {
00077             PFULL_PTR_TO_REFID_ELEMENT Next = XlatTableEntry->Next;
00078             HeapFree(GetProcessHeap(), 0, XlatTableEntry);
00079             XlatTableEntry = Next;
00080         }
00081     }
00082 
00083     HeapFree(GetProcessHeap(), 0, pXlatTables->RefIdToPointer.XlatTable);
00084     HeapFree(GetProcessHeap(), 0, pXlatTables->RefIdToPointer.StateTable);
00085     HeapFree(GetProcessHeap(), 0, pXlatTables->PointerToRefId.XlatTable);
00086 
00087     HeapFree(GetProcessHeap(), 0, pXlatTables);
00088 }
00089 
00090 static void expand_pointer_table_if_necessary(PFULL_PTR_XLAT_TABLES pXlatTables, ULONG RefId)
00091 {
00092     if (RefId >= pXlatTables->RefIdToPointer.NumberOfEntries)
00093     {
00094         pXlatTables->RefIdToPointer.NumberOfEntries = RefId * 2;
00095         pXlatTables->RefIdToPointer.XlatTable =
00096             HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
00097                 pXlatTables->RefIdToPointer.XlatTable,
00098                 sizeof(void *) * pXlatTables->RefIdToPointer.NumberOfEntries);
00099         pXlatTables->RefIdToPointer.StateTable =
00100             HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
00101                 pXlatTables->RefIdToPointer.StateTable,
00102                 sizeof(unsigned char) * pXlatTables->RefIdToPointer.NumberOfEntries);
00103 
00104         if (!pXlatTables->RefIdToPointer.XlatTable || !pXlatTables->RefIdToPointer.StateTable)
00105             pXlatTables->RefIdToPointer.NumberOfEntries = 0;
00106     }
00107 }
00108 
00109 int WINAPI NdrFullPointerQueryPointer(PFULL_PTR_XLAT_TABLES pXlatTables,
00110                                       void *pPointer, unsigned char QueryType,
00111                                       ULONG *pRefId )
00112 {
00113     ULONG Hash = 0;
00114     unsigned int i;
00115     PFULL_PTR_TO_REFID_ELEMENT XlatTableEntry;
00116 
00117     TRACE("(%p, %p, %d, %p)\n", pXlatTables, pPointer, QueryType, pRefId);
00118 
00119     if (!pPointer)
00120     {
00121         *pRefId = 0;
00122         return 1;
00123     }
00124 
00125     /* simple hashing algorithm, don't know whether it matches native */
00126     for (i = 0; i < sizeof(pPointer); i++)
00127         Hash = (Hash * 3) ^ ((unsigned char *)&pPointer)[i];
00128 
00129     XlatTableEntry = pXlatTables->PointerToRefId.XlatTable[Hash & pXlatTables->PointerToRefId.HashMask];
00130     for (; XlatTableEntry; XlatTableEntry = XlatTableEntry->Next)
00131         if (pPointer == XlatTableEntry->Pointer)
00132         {
00133             *pRefId = XlatTableEntry->RefId;
00134             if (XlatTableEntry->State & QueryType)
00135                 return 1;
00136             XlatTableEntry->State |= QueryType;
00137             return 0;
00138         }
00139 
00140     XlatTableEntry = HeapAlloc(GetProcessHeap(), 0, sizeof(*XlatTableEntry));
00141     XlatTableEntry->Next = pXlatTables->PointerToRefId.XlatTable[Hash & pXlatTables->PointerToRefId.HashMask];
00142     XlatTableEntry->Pointer = pPointer;
00143     XlatTableEntry->RefId = *pRefId = pXlatTables->NextRefId++;
00144     XlatTableEntry->State = QueryType;
00145     pXlatTables->PointerToRefId.XlatTable[Hash & pXlatTables->PointerToRefId.HashMask] = XlatTableEntry;
00146 
00147     /* insert pointer into mapping table */
00148     expand_pointer_table_if_necessary(pXlatTables, XlatTableEntry->RefId);
00149     if (pXlatTables->RefIdToPointer.NumberOfEntries > XlatTableEntry->RefId)
00150     {
00151         pXlatTables->RefIdToPointer.XlatTable[XlatTableEntry->RefId] = pPointer;
00152         pXlatTables->RefIdToPointer.StateTable[XlatTableEntry->RefId] = QueryType;
00153     }
00154 
00155     return 0;
00156 }
00157 
00158 int WINAPI NdrFullPointerQueryRefId(PFULL_PTR_XLAT_TABLES pXlatTables,
00159                                     ULONG RefId, unsigned char QueryType,
00160                                     void **ppPointer)
00161 {
00162     TRACE("(%p, 0x%x, %d, %p)\n", pXlatTables, RefId, QueryType, ppPointer);
00163 
00164     if (!RefId)
00165         return 1;
00166 
00167     expand_pointer_table_if_necessary(pXlatTables, RefId);
00168 
00169     pXlatTables->NextRefId = max(RefId + 1, pXlatTables->NextRefId);
00170 
00171     if (pXlatTables->RefIdToPointer.NumberOfEntries > RefId)
00172     {
00173         *ppPointer = pXlatTables->RefIdToPointer.XlatTable[RefId];
00174         if (QueryType)
00175         {
00176             if (pXlatTables->RefIdToPointer.StateTable[RefId] & QueryType)
00177                 return 1;
00178             pXlatTables->RefIdToPointer.StateTable[RefId] |= QueryType;
00179             return 0;
00180         }
00181         else
00182             return 0;
00183     }
00184     *ppPointer = NULL;
00185     return 0;
00186 }
00187 
00188 void WINAPI NdrFullPointerInsertRefId(PFULL_PTR_XLAT_TABLES pXlatTables,
00189                                       ULONG RefId, void *pPointer)
00190 {
00191     ULONG Hash = 0;
00192     unsigned int i;
00193     PFULL_PTR_TO_REFID_ELEMENT XlatTableEntry;
00194 
00195     TRACE("(%p, 0x%x, %p)\n", pXlatTables, RefId, pPointer);
00196 
00197     /* simple hashing algorithm, don't know whether it matches native */
00198     for (i = 0; i < sizeof(pPointer); i++)
00199         Hash = (Hash * 3) ^ ((unsigned char *)&pPointer)[i];
00200 
00201     XlatTableEntry = HeapAlloc(GetProcessHeap(), 0, sizeof(*XlatTableEntry));
00202     XlatTableEntry->Next = pXlatTables->PointerToRefId.XlatTable[Hash & pXlatTables->PointerToRefId.HashMask];
00203     XlatTableEntry->Pointer = pPointer;
00204     XlatTableEntry->RefId = RefId;
00205     XlatTableEntry->State = 0;
00206     pXlatTables->PointerToRefId.XlatTable[Hash & pXlatTables->PointerToRefId.HashMask] = XlatTableEntry;
00207 
00208     /* insert pointer into mapping table */
00209     expand_pointer_table_if_necessary(pXlatTables, RefId);
00210     if (pXlatTables->RefIdToPointer.NumberOfEntries > RefId)
00211         pXlatTables->RefIdToPointer.XlatTable[XlatTableEntry->RefId] = pPointer;
00212 }
00213 
00214 int WINAPI NdrFullPointerFree(PFULL_PTR_XLAT_TABLES pXlatTables, void *Pointer)
00215 {
00216     ULONG Hash = 0;
00217     unsigned int i;
00218     PFULL_PTR_TO_REFID_ELEMENT XlatTableEntry;
00219     ULONG RefId = 0;
00220 
00221     TRACE("(%p, %p)\n", pXlatTables, Pointer);
00222 
00223     if (!Pointer)
00224         return 1;
00225 
00226     /* simple hashing algorithm, don't know whether it matches native */
00227     for (i = 0; i < sizeof(Pointer); i++)
00228         Hash = (Hash * 3) ^ ((unsigned char *)&Pointer)[i];
00229 
00230     XlatTableEntry = pXlatTables->PointerToRefId.XlatTable[Hash & pXlatTables->PointerToRefId.HashMask];
00231     for (; XlatTableEntry; XlatTableEntry = XlatTableEntry->Next)
00232         if (Pointer == XlatTableEntry->Pointer)
00233         {
00234             if (XlatTableEntry->State & 0x20)
00235                 return 0;
00236             XlatTableEntry->State |= 0x20;
00237             RefId = XlatTableEntry->RefId;
00238             break;
00239         }
00240 
00241     if (!XlatTableEntry)
00242         return 0;
00243 
00244     if (pXlatTables->RefIdToPointer.NumberOfEntries > RefId)
00245     {
00246         pXlatTables->RefIdToPointer.StateTable[RefId] |= 0x20;
00247         return 1;
00248     }
00249 
00250     return 0;
00251 }

Generated on Tue May 15 04:48:41 2012 for ReactOS by doxygen 1.6.3

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