Changeset 5830 for trunk/src/kernel32/winimagepeldr.cpp
- Timestamp:
- May 30, 2001, 3:36:07 AM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/winimagepeldr.cpp
r5545 r5830 1 /* $Id: winimagepeldr.cpp,v 1.7 4 2001-04-19 08:32:49 sandervlExp $ */1 /* $Id: winimagepeldr.cpp,v 1.75 2001-05-30 01:34:12 phaller Exp $ */ 2 2 3 3 /* … … 55 55 #include <wprocess.h> 56 56 57 #include <ccollection.h> 58 57 59 //Define COMMIT_ALL to let the pe loader commit all sections of the image 58 60 //This is very useful during debugging as you'll get lots of exceptions 59 61 //otherwise. 60 //#ifdef DEBUG 62 63 // 2001-05-30 PH enabled this again 64 #ifdef DEBUG 61 65 #define COMMIT_ALL 62 //#endif66 #endif 63 67 64 68 char szErrorTitle[] = "Odin"; … … 139 143 strcpy(szModule, OSLibStripPath(szFileName)); 140 144 strupr(szModule); 145 146 // create objects for fast API lookup 147 pLookupOrdinal = new CIndexLookupLimit(0, 65535); 148 pLookupName = new CHashtableLookup(79); 141 149 } 142 150 //****************************************************************************** … … 144 152 Win32PeLdrImage::~Win32PeLdrImage() 145 153 { 154 if (pLookupName) 155 delete pLookupName; 156 157 if (pLookupOrdinal) 158 delete pLookupOrdinal; 159 146 160 if(memmap) 147 161 delete memmap; … … 1340 1354 } 1341 1355 } 1356 1357 // resize the caches 1358 pLookupOrdinal->shrink(); 1359 pLookupName->rehash(); 1360 1342 1361 return(TRUE); 1343 1362 } … … 1346 1365 void Win32PeLdrImage::AddNameExport(ULONG virtaddr, char *apiname, ULONG ordinal, BOOL fAbsoluteAddress) 1347 1366 { 1348 ULONG nsize;1367 ULONG nsize; 1349 1368 1350 1369 if(nameexports == NULL) { … … 1362 1381 free(tmp); 1363 1382 } 1364 if(fAbsoluteAddress) {//forwarders use absolute address 1383 1384 if(fAbsoluteAddress) //forwarders use absolute address 1385 { 1365 1386 curnameexport->virtaddr = virtaddr; 1366 1387 } 1367 else curnameexport->virtaddr = realBaseAddress + (virtaddr - oh.ImageBase); 1388 else 1389 { 1390 curnameexport->virtaddr = realBaseAddress + (virtaddr - oh.ImageBase); 1391 } 1392 1393 // add named export to the lookup cache 1394 pLookupName->addElement(apiname, (void*)curnameexport->virtaddr); 1395 1396 // also add the ordinal export to the lookup cache 1397 pLookupOrdinal->addElement(ordinal, (void*)curnameexport->virtaddr); 1398 1368 1399 curnameexport->ordinal = ordinal; 1369 1400 *(ULONG *)curnameexport->name = 0; … … 1380 1411 void Win32PeLdrImage::AddOrdExport(ULONG virtaddr, ULONG ordinal, BOOL fAbsoluteAddress) 1381 1412 { 1382 if(ordexports == NULL) { 1413 if(ordexports == NULL) 1414 { 1383 1415 ordexports = (OrdExport *)malloc(nrOrdExports * sizeof(OrdExport)); 1384 1416 curordexport = ordexports; 1385 1417 } 1386 if(fAbsoluteAddress) {//forwarders use absolute address 1418 1419 if(fAbsoluteAddress) 1420 { //forwarders use absolute address 1387 1421 curordexport->virtaddr = virtaddr; 1388 1422 } 1389 else curordexport->virtaddr = realBaseAddress + (virtaddr - oh.ImageBase); 1423 else 1424 { 1425 curordexport->virtaddr = realBaseAddress + (virtaddr - oh.ImageBase); 1426 } 1427 1428 // add ordinal export to the lookup cache 1429 pLookupOrdinal->addElement((int)ordinal, (void*)curordexport->virtaddr); 1390 1430 1391 1431 curordexport->ordinal = ordinal; … … 1806 1846 ULONG Win32PeLdrImage::getApi(char *name) 1807 1847 { 1808 ULONG apiaddr, i, apilen; 1809 char *apiname; 1810 char tmp[4]; 1811 NameExport *curexport; 1812 ULONG ulAPIOrdinal; /* api requested by ordinal */ 1848 // ordinal export from the lookup cache 1849 void* pNamed = pLookupName->getElement(name); 1850 if (pNamed != NULL) 1851 return (ULONG)pNamed; 1852 1853 1854 ULONG apiaddr, i, apilen; 1855 char *apiname; 1856 char tmp[4]; 1857 NameExport *curexport; 1858 ULONG ulAPIOrdinal; /* api requested by ordinal */ 1813 1859 1814 1860 apilen = strlen(name) + 1; … … 1829 1875 { 1830 1876 if(strcmp(curexport->name, apiname) == 0) 1877 { 1831 1878 return(curexport->virtaddr); 1879 } 1832 1880 } 1833 1881 curexport = (NameExport *)((ULONG)curexport->name + curexport->nlength); … … 1839 1887 ULONG Win32PeLdrImage::getApi(int ordinal) 1840 1888 { 1841 ULONG apiaddr, i; 1842 OrdExport *curexport; 1843 NameExport *nexport; 1889 // ordinal export from the lookup cache 1890 void* pOrdinal = pLookupOrdinal->getElement(ordinal); 1891 if (pOrdinal != NULL) 1892 return (ULONG)pOrdinal; 1893 1894 ULONG apiaddr, i; 1895 OrdExport *curexport; 1896 NameExport *nexport; 1844 1897 1845 1898 curexport = ordexports; 1846 for(i=0;i<nrOrdExports;i++) { 1899 for(i=0;i<nrOrdExports;i++) 1900 { 1847 1901 if(curexport->ordinal == ordinal) 1848 1902 return(curexport->virtaddr); … … 1851 1905 //Name exports also contain an ordinal, so check this 1852 1906 nexport = nameexports; 1853 for(i=0;i<nrNameExports;i++) { 1907 for(i=0;i<nrNameExports;i++) 1908 { 1854 1909 if(nexport->ordinal == ordinal) 1910 { 1855 1911 return(nexport->virtaddr); 1912 } 1856 1913 1857 1914 nexport = (NameExport *)((ULONG)nexport->name + nexport->nlength);
Note:
See TracChangeset
for help on using the changeset viewer.