home *** CD-ROM | disk | FTP | other *** search
- /*
- SELLIMIT.C -- Demonstration of GetSelectorLimit
-
- From Chapter 5 of "Undocumented Windows" (Addison-Wesley 1992)
- by Andrew Schulman, Dave Maxey and Matt Pietrek
-
- Build using: WINIOBC SELLIMIT (for Borland C++ v3.00)
- WINIOMS SELLIMIT (for Microsoft C/SDK)
- */
-
- #include <windows.h>
- #include <stdlib.h>
- #include <dos.h>
- #include "winio.h"
-
- extern DWORD FAR PASCAL GetSelectorLimit(WORD wSel);
- extern DWORD FAR PASCAL GetSelectorBase(WORD wSel);
- WORD (FAR PASCAL *GetTaskQueue)(WORD hTask);
- extern WORD FAR PASCAL SelectorAccessRights(WORD wSel,
- WORD wFlag, WORD wParam);
-
- WORD lar(WORD wSel) // load access rights
- {
- _asm lar ax, wSel
- _asm jnz error
- _asm shr ax, 8
- _asm jmp short done; // value in AX
- error:
- return 0;
- done:;
- }
-
- DWORD MyGetSelectorSize(WORD wSel)
- {
- DWORD dwSize;
- WORD wRights;
-
- /* The Windows Get/SetSelectorBase/Limit functions can't
- handle selectors in the GDT */
- if ((wSel & 4) == 0)
- return 0L; // not an LDT selector
-
- /* Unfortunately, SelectorAccessRights() does not check the Zero
- flag after doing a LAR, so it can't be used to check if a
- selector is valid -- we'll use LAR outselves to check */
- if ((wRights = lar(wSel)) == 0)
- return 0L; // invalid selector
-
- /* Add one to limit to get size */
- dwSize = GetSelectorLimit(wSel) + 1;
-
- /* Now we can use SelectorAccessRights to see if this (valid)
- selector has Page granularity */
- wRights = SelectorAccessRights(wSel, 0, 0);
- if (wRights & (1 << 15)) // page granularity bit set
- dwSize *= 4096; // size was pages; turn into bytes
-
- return dwSize;
- }
-
- void show_size(char *msg, HANDLE h)
- {
- DWORD dwSize;
- if ((dwSize = MyGetSelectorSize(h)) == 0)
- printf("%s INVALID OR NOT IN LDT\n", msg);
- else
- {
- DWORD dwBase = GetSelectorBase(h);
- printf("%s size=%lu bytes @ %lxh\n", msg, dwSize, dwBase);
- }
- }
-
- main(int argc, char *argv[])
- {
- extern WORD __hInst;
-
- HANDLE h = GlobalAlloc(GMEM_MOVEABLE, 1);
- char far *fp = GlobalLock(h);
-
- winio_about("SELLIMIT"
- "\nDemonstration of GetSelectorLimit"
- "\n\nFrom Chapter 5 of"
- "\n\"Undocumented Windows\" (Addison-Wesley, 1992)"
- "\nby Andrew Schulman, David Maxey and Matt Pietrek"
- );
-
- show_size("GlobalAlloc=1 byte; actually", FP_SEG(fp));
- GlobalUnlock(h);
- GlobalFree(h);
-
- show_size("Task Database", GetCurrentTask());
-
- show_size("PSP (PDB)", GetCurrentPDB());
-
- GetTaskQueue = GetProcAddress(GetModuleHandle("KERNEL"), "GETTASKQUEUE");
- show_size("Task Queue", GetTaskQueue(0)); // q for current task
-
- show_size("Module Table",
- GetModuleHandle(MK_FP(0, __hInst))); // hModule from hInstance
-
- return 0;
- }
-
-