home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l430 / 1.ddi / CHAP5.ZIP / SELARRAY.C < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-11  |  1.9 KB  |  70 lines

  1. /*
  2.     SELARRAY.C -- Demonstrates AllocSelectorArray
  3.  
  4.     From Chapter 5 of "Undocumented Windows" (Addison-Wesley 1992)
  5.     by Andrew Schulman, Dave Maxey and Matt Pietrek
  6.  
  7.     Build using: WINIOBC SELARRAY (for Borland C++ v3.00)
  8.                  WINIOMS SELARRAY (for Microsoft C/SDK)
  9. */
  10.  
  11. #include <windows.h>
  12. #include <dos.h>
  13. #include "winio.h"
  14.  
  15. #ifndef __BORLANDC__ 
  16. #define MK_FP(a,b)  ((void far *)(((unsigned long)(a) << 16) | (b))) 
  17. #endif 
  18.  
  19. #define NUM_SEL     (1024 / 64)
  20.  
  21. extern WORD FAR PASCAL AllocSelectorArray(WORD wSel);
  22. extern DWORD FAR PASCAL GetSelectorBase(HANDLE h);
  23. extern DWORD FAR PASCAL GetSelectorLimit(HANDLE h);
  24. extern void FAR PASCAL SetSelectorBase(HANDLE h, DWORD dwBase);
  25. extern void FAR PASCAL SetSelectorLimit(HANDLE h, DWORD dwLimit);
  26.  
  27. main()
  28. {
  29.     BYTE far *meg1[NUM_SEL];
  30.     HANDLE first_sel, sel;
  31.     WORD __AHINCR;
  32.     int i;
  33.     
  34.     winio_about("SELARRAY"
  35.         "\nDemonstrates AllocSelectorArray"
  36.         "\n\nFrom Chapter 5 of"
  37.         "\n\"Undocumented Windows\" (Addison-Wesley, 1992)"
  38.         "\nby Andrew Schulman, David Maxey and Matt Pietrek"
  39.         );
  40.     
  41.     if ((first_sel = AllocSelectorArray(NUM_SEL)) == 0)
  42.         fail("ran out of selectors");
  43.     
  44.     __AHINCR = LOWORD((DWORD) GetProcAddress(GetModuleHandle("KERNEL"), 
  45.         "__AHINCR"));
  46.     
  47.     for (i=0; i<NUM_SEL; i++)
  48.     {
  49.         sel = first_sel + (i * __AHINCR);
  50.         SetSelectorBase(sel, 64L * 1024L * i);
  51.         SetSelectorLimit(sel, 0xFFFFL);
  52.         meg1[i] = MK_FP(sel, 0);
  53.     }
  54.     
  55.     for (i=0; i<NUM_SEL; i++)
  56.         printf("%Fp\t%08lx\t%08lx\n",
  57.             meg1[i],
  58.             GetSelectorBase(FP_SEG(meg1[i])),
  59.             GetSelectorLimit(FP_SEG(meg1[i])));
  60.                 
  61.     /* here, could browse memory */
  62.  
  63.     for (i=0; i<NUM_SEL; i++)
  64.         if (FreeSelector(FP_SEG(meg1[i])) != NULL)
  65.             fail("FreeSelector failed");
  66.     
  67.     return 0;
  68. }
  69.  
  70.