Changeset 2858
- Timestamp:
- Nov 6, 2006, 1:23:14 AM (19 years ago)
- Location:
- trunk/kLdr
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/Makefile.kmk
r2854 r2858 68 68 kLdr_TOOL = GCC3 69 69 kLdr_TOOL = VCC70 70 kLdr_CFLAGS = -W3 -Zl 70 kLdr_CFLAGS = -W3 -Zl -ML 71 71 kLdr_ASFLAGS = -f win 72 kLdr_LDFLAGS = -Entry:DllMain@12 72 kLdr_LDFLAGS = -Entry:DllMain@12 -Debug 73 73 kLdr_DEFS = __WIN__ 74 74 kLdr_SDKS = WIN32SDK 75 75 #kLdr_SDKS.x86 = WIN32SDK 76 76 #kLdr_SDKS.amd64 = WIN64SDK 77 kLdr_LIBS = \ 78 $$(PATH_TOOL_VCC70_LIB)/LIBC.lib 77 79 else 78 80 ifneq ($(filter os2,$(BUILD_TARGET)),) … … 138 140 kLdrHlpHeap.c \ 139 141 142 # 143 # Heap testcase. 144 # 145 PROGRAMS += tstkLdrMod 146 tstkLdrMod_TEMPLATE = TST 147 tstkLdrMod_SOURCES = \ 148 tstkLdrMod.c 149 ifneq ($(filter win win32 win64 nt,$(BUILD_TARGET)),) 150 tstkLdrMod_LIBS = $(TARGET_kLdr:.dll=.lib) 151 else 152 tstkLdrMod_LIBS = $(TARGET_kLdr) 153 endif 154 155 140 156 141 157 # generate rules. -
trunk/kLdr/kLdr-win.def
r2834 r2858 38 38 kLdrRdrTell 39 39 kLdrRdrName 40 kLdrRdrPageSize 41 kLdrRdrPrepare 42 kLdrRdrMap 43 kLdrRdrRefreshMap 44 kLdrRdrProtect 45 kLdrRdrUnmap 46 kLdrRdrUnprepare 47 kLdrRdrDone 40 48 41 49 ; The module interpreter API 50 kLdrModOpen 42 51 kLdrModOpenFromRdr 43 kLdrModOpen 52 kLdrModOpenNative 53 kLdrModClose 54 kLdrModQuerySymbol 55 kLdrModEnumSymbols 56 kLdrModGetImport 57 kLdrModNumberOfImports 58 kLdrModCanExecuteOn 59 kLdrModGetStackInfo 60 kLdrModQueryMainEntrypoint 61 kLdrModEnumDbgInfo 62 kLdrModHasDbgInfo 63 kLdrModMap 64 kLdrModUnmap 65 kLdrModAllocTLS 66 kLdrModFreeTLS 67 kLdrModReload 68 kLdrModFixupMapping 69 kLdrModCallInit 70 kLdrModCallTerm 71 kLdrModCallThread 72 kLdrModSize 73 kLdrModGetBits 74 kLdrModRelocateBits 44 75 45 76 ; Process Bootstrapping -
trunk/kLdr/kLdr.h
r2857 r2858 928 928 */ 929 929 #ifdef __OS2__ 930 # define KLDR_ERR_BASE 0x7face000930 # define KLDR_ERR_BASE 420000 931 931 #elif defined(__WIN__) 932 # define KLDR_ERR_BASE 0x7face000932 # define KLDR_ERR_BASE 420000 933 933 #else 934 934 # error "port me" -
trunk/kLdr/kLdrHlp.h
r2854 r2858 38 38 #define KLDR_MAX(a, b) ((a) >= (b) ? (a) : (b)) 39 39 /** Calculate the offset of a structure member. */ 40 #define KLDR_OFFSETOF(strct, memb) ( (size_t)( ((strct *)0)->memb ) )40 #define KLDR_OFFSETOF(strct, memb) ( (size_t)( &((strct *)0)->memb ) ) 41 41 /** Align a size_t value. */ 42 42 #define KLDR_ALIGN_Z(val, align) ( ((val) + ((align) - 1)) & ~(size_t)((align) - 1) ) -
trunk/kLdr/kLdrInternal.h
r2847 r2858 403 403 404 404 405 /** @name Module interpreter method tables 406 * @{ */ 407 extern KLDRMODOPS g_kLdrModPEOps; 408 /** @} */ 409 405 410 /** @} */ 406 411 #ifdef __cplusplus -
trunk/kLdr/kLdrMod.c
r2856 r2858 183 183 rc = KLDR_ERR_LE_NOT_SUPPORTED; 184 184 else if (u.u32 == IMAGE_NT_SIGNATURE) 185 rc = KLDR_ERR_PE_NOT_SUPPORTED;185 rc = g_kLdrModPEOps.pfnCreate(&g_kLdrModPEOps, pRdr, offHdr, ppMod); 186 186 else if (u.u32 == IMAGE_ELF_SIGNATURE) 187 187 rc = KLDR_ERR_ELF_NOT_SUPPORTED; -
trunk/kLdr/kLdrModPE.c
r2857 r2858 204 204 */ 205 205 cchFilename = kLdrHlpStrLen(kLdrRdrName(pRdr)); 206 cb = sizeof(KLDRMOD) 207 + s.FileHdr.NumberOfSections * sizeof(KLDRSEG) 208 + sizeof(KLDRMODPE) - sizeof(IMAGE_SECTION_HEADER) 209 + s.FileHdr.NumberOfSections * sizeof(IMAGE_SECTION_HEADER) 206 cb = KLDR_ALIGN_Z(KLDR_OFFSETOF(KLDRMODPE, aShdrs[s.FileHdr.NumberOfSections]), 16) 207 + KLDR_OFFSETOF(KLDRMOD, aSegments[s.FileHdr.NumberOfSections + 1]) 210 208 + cchFilename + 1; 211 209 pModPE = (PKLDRMODPE)kldrHlpAlloc(cb); 212 210 if (!pModPE) 213 211 return KLDR_ERR_NO_MEMORY; 212 *ppModPE = pModPE; 214 213 215 214 /* KLDRMOD */ 216 pMod = (PKLDRMOD)((uint8_t *)pModPE + sizeof(KLDRMOD) + (s.FileHdr.NumberOfSections + 1) * sizeof(KLDRSEG));215 pMod = (PKLDRMOD)((uint8_t *)pModPE + KLDR_ALIGN_Z(KLDR_OFFSETOF(KLDRMODPE, aShdrs[s.FileHdr.NumberOfSections]), 16)); 217 216 pMod->pvData = pModPE; 218 217 pMod->pRdr = pRdr; … … 252 251 pModPE->Hdrs.Signature = s.Signature; 253 252 pModPE->Hdrs.FileHeader = s.FileHdr; 254 *ppModPE = pModPE;255 253 256 254 /* … … 811 809 812 810 /** @copydoc kLdrModEnumSymbols */ 813 static int kldrModPEEnumSymbols(PKLDRMOD pMod, uint32_t fFlags,const void *pvBits, KLDRADDR BaseAddress,814 PFNKLDRMODENUMSYMS pfnCallback, void *pvUser)811 static int kldrModPEEnumSymbols(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, 812 uint32_t fFlags, PFNKLDRMODENUMSYMS pfnCallback, void *pvUser) 815 813 { 816 814 PKLDRMODPE pModPE = (PKLDRMODPE)pMod->pvData; … … 890 888 891 889 /** @copydoc kLdrModGetImport */ 892 static int kldrModPEGetImport(PKLDRMOD pMod, void *pvBits, uint32_t iImport, char *pszName, size_t cchName)890 static int kldrModPEGetImport(PKLDRMOD pMod, const void *pvBits, uint32_t iImport, char *pszName, size_t cchName) 893 891 { 894 892 PKLDRMODPE pModPE = (PKLDRMODPE)pMod->pvData; … … 1940 1938 } 1941 1939 1940 1941 /** 1942 * The PE module interpreter method table. 1943 */ 1944 KLDRMODOPS g_kLdrModPEOps = 1945 { 1946 "PE", 1947 NULL, 1948 kldrModPECreate, 1949 kldrModPEDestroy, 1950 kldrModPEQuerySymbol, 1951 kldrModPEEnumSymbols, 1952 kldrModPEGetImport, 1953 kldrModPENumberOfImports, 1954 NULL /* can execute one is optional */, 1955 kldrModPEGetStackInfo, 1956 kldrModPEQueryMainEntrypoint, 1957 kldrModPEEnumDbgInfo, 1958 kldrModPEHasDbgInfo, 1959 kldrModPEMap, 1960 kldrModPEUnmap, 1961 kldrModPEAllocTLS, 1962 kldrModPEFreeTLS, 1963 kldrModPEReload, 1964 kldrModPEFixupMapping, 1965 kldrModPECallInit, 1966 kldrModPECallTerm, 1967 kldrModPECallThread, 1968 kldrModPESize, 1969 kldrModPEGetBits, 1970 kldrModPERelocateBits, 1971 42 /* the end */ 1972 }; -
trunk/kLdr/kLdrRdrFile.c
r2857 r2858 232 232 233 233 SetLastError(0); 234 offLow = SetFilePointer(pRdrFile->File, 0, &offHigh, FILE_ BEGIN);234 offLow = SetFilePointer(pRdrFile->File, 0, &offHigh, FILE_CURRENT); 235 235 rc = GetLastError(); 236 236 if (rc) … … 325 325 #ifdef __OS2__ 326 326 ULONG ulNew; 327 APIRET rc = DosSetFilePtr(pRdrFile->File, off, FILE_BEGIN, &ulNew); 327 APIRET rc; 328 329 rc = DosSetFilePtr(pRdrFile->File, off, FILE_BEGIN, &ulNew); 328 330 if (rc) 329 331 { … … 333 335 334 336 #elif defined(__WIN__) 335 LONG offHigh = (LONG)(off >> 32); 336 LONG offLow = SetFilePointer(pRdrFile->File, (LONG)off, &offHigh, FILE_BEGIN); 337 LONG offHigh; 338 LONG offLow; 339 340 offHigh = sizeof(off_t) == 4 ? 0 : (off >> 32); 341 offLow = SetFilePointer(pRdrFile->File, (LONG)off, &offHigh, FILE_BEGIN); 337 342 if ( offLow != (LONG)off 338 && offHigh != (LONG)(off >> 32))343 || offHigh != (LONG)(sizeof(off_t) == 4 ? 0 : (off >> 32))) 339 344 { 340 345 int rc = GetLastError(); … … 405 410 406 411 #elif defined(__WIN__) 412 rc = 0; 407 413 if (!CloseHandle(pRdrFile->File)) 408 414 rc = GetLastError(); … … 433 439 */ 434 440 #ifdef __OS2__ 435 ULONG ulAction = 0; 436 FILESTATUS3 Info; 437 APIRET rc; 438 HFILE File = 0; 439 off_t cb; 441 ULONG ulAction = 0; 442 FILESTATUS3 Info; 443 APIRET rc; 444 HFILE File = 0; 445 off_t cb; 446 char szFilename[CCHMAXPATH]; 440 447 441 448 if ((uintptr_t)pszFilename >= 0x20000000) … … 451 458 if (rc) 452 459 return rc; 460 461 rc = DosQueryPathInfo(pszFilename, FIL_QUERYFULLNAME, szFilename, sizeof(szFilename)); 462 if (rc) 463 { 464 DosClose(File); 465 return rc; 466 } 453 467 454 468 rc = DosQueryFileInfo(File, FIL_STANDARD, &Info, sizeof(Info)); … … 467 481 HANDLE File; 468 482 off_t cb; 483 char szFilename[MAX_PATH]; 469 484 470 485 SecAttr.bInheritHandle = FALSE; … … 475 490 return GetLastError(); 476 491 492 if (!GetFullPathName(pszFilename, sizeof(szFilename), szFilename, NULL)) 493 { 494 rc = GetLastError(); 495 CloseHandle(File); 496 return rc; 497 } 498 477 499 SetLastError(0); 478 500 Low = GetFileSize(File, &High); … … 483 505 return rc; 484 506 } 485 cb = ((off_t)High << 32) | Low; 507 if (sizeof(off_t) == 4) 508 cb = High ? 0x7fffffff : Low; 509 else 510 cb = ((off_t)High << 32) | Low; 486 511 487 512 #else … … 493 518 * Allocate the reader instance. 494 519 */ 495 cchFilename = kLdrHlpStrLen( pszFilename);520 cchFilename = kLdrHlpStrLen(szFilename); 496 521 pRdrFile = (PKLDRRDRFILE)kldrHlpAlloc(sizeof(*pRdrFile) + cchFilename); 497 522 if (!pRdrFile) … … 513 538 * Initialize it and return successfully. 514 539 */ 540 pRdrFile->Core.u32Magic = KLDRRDR_MAGIC; 515 541 pRdrFile->Core.pOps = &g_kLdrRdrFileOps; 516 542 pRdrFile->File = File; 543 pRdrFile->cb = cb; 517 544 pRdrFile->off = 0; 518 kLdrHlpMemCopy(&pRdrFile->szFilename[0], pszFilename, cchFilename + 1);545 kLdrHlpMemCopy(&pRdrFile->szFilename[0], szFilename, cchFilename + 1); 519 546 520 547 *ppRdr = &pRdrFile->Core;
Note:
See TracChangeset
for help on using the changeset viewer.