k32exp.c
上传用户:ason123
上传日期:2010-03-31
资源大小:177k
文件大小:3k
源码类别:

并口编程

开发平台:

C++ Builder

  1. /*
  2. K32EXP.C -- Get32ProcAddress
  3. Win32 code to import by ordinal from KERNEL32.DLL in Windows 95
  4. Andrew Schulman
  5. andrew@ora.com
  6. http://www.ora.com/windows/
  7. ftp://ftp.ora.com/pub/examples/windows/win95.update/schulman.html
  8. August 1995
  9. After I wrote Unauthorized Windows 95 (IDG Books, 1994), KERNEL32.DLL
  10. stopped exporting undocumented Win32 functions such as VxDCall() and
  11. GetpWin16Lock() by name. The functions discussed in *Unauthorized*
  12. continue to be exported by ordinal (for example, VxDCall is
  13. KERNEL32.1 and GetpWin16Lock is KERNEL.93). However, KERNEL32 does
  14. not allow imports by ordinal (Message from debug version:
  15. "GetProcAddress: kernel32 by id not supported").
  16. This module provides GetK32ProcAddress() to support import by ordinal
  17. from KERNEL32. There's nothing undocumented in here, except for the
  18. ordinal numbers themselves. GetModuleHandle() returns the address of
  19. the executable image (see Matt Pietrek in *Microsoft Systems Journal*,
  20. September 1995, p. 20), and the image is documented in the PE (Portable
  21. Executable) file format.
  22. */ 
  23.  
  24. #include <stdlib.h> 
  25. #include <stdio.h> 
  26. #include <windows.h>
  27. #include "k32exp.h"
  28. #define ENEWHDR     0x003CL         /* offset of new EXE header */
  29. #define EMAGIC      0x5A4D          /* old EXE magic id:  'MZ'  */
  30. #define PEMAGIC     0x4550          /* NT portable executable */
  31. #define GET_DIR(x)  (hdr->OptionalHeader.DataDirectory[x].VirtualAddress)
  32.     
  33. DWORD WINAPI GetK32ProcAddress(int ord)
  34. {
  35.     static HANDLE hmod = 0;
  36.     IMAGE_NT_HEADERS *hdr;
  37.     IMAGE_EXPORT_DIRECTORY *exp;
  38.     DWORD *AddrFunc;
  39.     WORD enewhdr, *pw;
  40.     int did_load = 0, i;
  41.     BYTE *moddb;
  42.     if (hmod == 0)      // one-time static init
  43.         hmod = GetModuleHandle("KERNEL32");
  44.     if (hmod == 0)      // still
  45.         return 0;
  46.     
  47.     moddb = (BYTE *) hmod;
  48.     pw = (WORD *) &moddb[0];
  49.     if (*pw != EMAGIC)              
  50.         return 0;
  51.     pw = (WORD *) &moddb[ENEWHDR];
  52.     enewhdr = *pw;
  53.     pw = (WORD *) &moddb[enewhdr];
  54.     if (*pw != PEMAGIC)             
  55.         return 0;
  56.     hdr = (IMAGE_NT_HEADERS *) pw;
  57.     
  58.     // Note: offset from moddb, *NOT* from hdr!
  59.     exp = (IMAGE_EXPORT_DIRECTORY *) (((DWORD) moddb) +
  60.         ((DWORD) GET_DIR(IMAGE_DIRECTORY_ENTRY_EXPORT)));
  61.     AddrFunc = (DWORD *) (moddb + (DWORD) exp->AddressOfFunctions);
  62.     // should verify that e.g.:
  63.     // GetProcAddress(hmod, "VirtualAlloc") == GetK32ProcAddress(710);
  64.     
  65.     ord--;  // table is 0-based, ordinals are 1-based
  66.     if (ord < exp->NumberOfFunctions)
  67.         return ((DWORD) (moddb + AddrFunc[ord]));
  68.     else
  69.         return 0;
  70. }
  71. #ifdef STANDALONE
  72. void fail(const char *s) { puts(s); exit(1); }
  73. main(int argc, char *argv[])
  74. {
  75.     printf("KERNEL32!VxDCall = %08lXn", 
  76.         GetK32ProcAddress(VXDCALL_ORD));
  77.     printf("KERNEL32!GetpWin16Lock = %08lXn",
  78.         GetK32ProcAddress(GETPWIN16LOCK_ORD));
  79. }
  80. #endif