home *** CD-ROM | disk | FTP | other *** search
- /*
- SELARRAY.C -- Demonstrates AllocSelectorArray
-
- From Chapter 5 of "Undocumented Windows" (Addison-Wesley 1992)
- by Andrew Schulman, Dave Maxey and Matt Pietrek
-
- Build using: WINIOBC SELARRAY (for Borland C++ v3.00)
- WINIOMS SELARRAY (for Microsoft C/SDK)
- */
-
- #include <windows.h>
- #include <dos.h>
- #include "winio.h"
-
- #ifndef __BORLANDC__
- #define MK_FP(a,b) ((void far *)(((unsigned long)(a) << 16) | (b)))
- #endif
-
- #define NUM_SEL (1024 / 64)
-
- extern WORD FAR PASCAL AllocSelectorArray(WORD wSel);
- extern DWORD FAR PASCAL GetSelectorBase(HANDLE h);
- extern DWORD FAR PASCAL GetSelectorLimit(HANDLE h);
- extern void FAR PASCAL SetSelectorBase(HANDLE h, DWORD dwBase);
- extern void FAR PASCAL SetSelectorLimit(HANDLE h, DWORD dwLimit);
-
- main()
- {
- BYTE far *meg1[NUM_SEL];
- HANDLE first_sel, sel;
- WORD __AHINCR;
- int i;
-
- winio_about("SELARRAY"
- "\nDemonstrates AllocSelectorArray"
- "\n\nFrom Chapter 5 of"
- "\n\"Undocumented Windows\" (Addison-Wesley, 1992)"
- "\nby Andrew Schulman, David Maxey and Matt Pietrek"
- );
-
- if ((first_sel = AllocSelectorArray(NUM_SEL)) == 0)
- fail("ran out of selectors");
-
- __AHINCR = LOWORD((DWORD) GetProcAddress(GetModuleHandle("KERNEL"),
- "__AHINCR"));
-
- for (i=0; i<NUM_SEL; i++)
- {
- sel = first_sel + (i * __AHINCR);
- SetSelectorBase(sel, 64L * 1024L * i);
- SetSelectorLimit(sel, 0xFFFFL);
- meg1[i] = MK_FP(sel, 0);
- }
-
- for (i=0; i<NUM_SEL; i++)
- printf("%Fp\t%08lx\t%08lx\n",
- meg1[i],
- GetSelectorBase(FP_SEG(meg1[i])),
- GetSelectorLimit(FP_SEG(meg1[i])));
-
- /* here, could browse memory */
-
- for (i=0; i<NUM_SEL; i++)
- if (FreeSelector(FP_SEG(meg1[i])) != NULL)
- fail("FreeSelector failed");
-
- return 0;
- }
-
-