Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
sel.c
Abstract:
WinDbg Extension Api
Author:
Ramon J San Andres (ramonsa) 5-Nov-1993
Environment:
User Mode.
Revision History:
--*/
#include "precomp.h"
#include "i386.h"
#pragma hdrstop
DECLARE_API( sel )
/*++
Routine Description:
Dumps a selector (or range of selectors) from the GDT or LDT and displays relevant information about that selector.
Arguments:
arg - Supplies the selector to examine. If this is NULL, it dumps a range of selectors.
Return Value:
None
--*/
{
DESCRIPTOR_TABLE_ENTRY_X86 Entry; static ULONG StartSelector=8; static ULONG EndSelector; NTSTATUS Result; ULONG dwProcessor=0; if (!GetCurrentProcessor(Client, &dwProcessor, NULL)) { dwProcessor = 0; }
if (*args != '\0') { Entry.Selector = (ULONG) GetExpression(args); StartSelector=EndSelector=Entry.Selector; } else { EndSelector=StartSelector+0x80; Entry.Selector=StartSelector; } do { Result=LookupSelector((USHORT)dwProcessor,&Entry); dprintf("%04x ",(USHORT)Entry.Selector); if (Result == STATUS_SUCCESS) { dprintf("Bas=%08lx ", (ULONG)Entry.Descriptor.BaseLow + ((ULONG)Entry.Descriptor.HighWord.Bytes.BaseMid << 16) + ((ULONG)Entry.Descriptor.HighWord.Bytes.BaseHi << 24) ); dprintf("Lim=%08lx ", (ULONG)Entry.Descriptor.LimitLow + (ULONG)(Entry.Descriptor.HighWord.Bits.LimitHi << 16) ); dprintf((Entry.Descriptor.HighWord.Bits.Granularity) ? "Pages" : "Bytes"); dprintf(" DPL=%i ",Entry.Descriptor.HighWord.Bits.Dpl); dprintf((Entry.Descriptor.HighWord.Bits.Pres) ? " P " : "NP ");
if (Entry.Descriptor.HighWord.Bits.Type & 0x10) { //
// Code or Data segment descriptor
//
if (Entry.Descriptor.HighWord.Bits.Type & 0x8) { //
// Code segment descriptor
//
dprintf("Code "); if (Entry.Descriptor.HighWord.Bits.Type & 0x2) { //
// Read/Execute
//
dprintf("RE "); } else { dprintf("EO "); } } else { //
// Data segment descriptor
//
dprintf("Data "); if (Entry.Descriptor.HighWord.Bits.Type & 0x2) { //
// Read/Write
//
dprintf("RW "); } else { dprintf("RO "); } } if (Entry.Descriptor.HighWord.Bits.Type & 0x1) { //
// Accessed
//
dprintf("A "); } } else { //
// System Segment or Gate Descriptor
//
switch (Entry.Descriptor.HighWord.Bits.Type) { case 2: //
// LDT
//
dprintf("LDT "); break; case 1: case 3: case 9: case 0xB: //
// TSS
//
if (Entry.Descriptor.HighWord.Bits.Type & 0x8) { dprintf("TSS32 "); } else { dprintf("TSS16 "); } if (Entry.Descriptor.HighWord.Bits.Type & 0x2) { dprintf("B "); } else { dprintf("A "); } break;
case 4: dprintf("C-GATE16 "); break; case 5: dprintf("TSK-GATE "); break; case 6: dprintf("I-GATE16 "); break; case 7: dprintf("TRP-GATE16 "); break; case 0xC: dprintf("C-GATE32 "); break; case 0xF: dprintf("T-GATE32 "); break;
}
}
dprintf("\n");
} else { if (Result == STATUS_UNSUCCESSFUL) { dprintf("LDT page is invalid\n"); } else { dprintf("Selector is invalid\n"); } }
Entry.Selector += 8; } while ( Entry.Selector < EndSelector ); StartSelector = EndSelector; return S_OK; }
|