Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenndr_fullpointer.cGo 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
1.6.3
|