DevHelp PhysToGDTSel

This service maps a given GDT selector to a specified physical address, setting the access byte of the descriptor to the desired privilege value. The specified segment size must be less than or equal to 64KB.

C
 USHORT APIENTRY DevHelp_PhysToGDTSel( ULONG PhysAddr,                                     ULONG Count,                                      SEL   Selector,                                      UCHAR Access) 

Assembler
 MOV  EAX,PhysAddress     ; 32-bit physical address that the ;   GDT selector is to be mapped to MOV   ECX,Size            ; Size of segment mapped; ;   must be less than or equal to 64KB ;   (a 0 value will map a 64KB segment) MOV  SI,Selector         ; GDT selector (allocated using AllocateGDTSelector) MOV  DH,Access           ; Descriptor's type and privilege level ; = 0 The selector is mapped as Ring 3, readable code ;     with 16-bit addressing/operand ;     size (286 format). ; = 1 (binary 0001) The selector is mapped as Ring 3, ;    writable data. ; = 3 (binary 0011) The selector is mapped as Ring 2, ;    IOPL, readable code with 16-bit ;    addressing/operand size. ; = 4 (binary 0100) The selector is mapped as Ring 2, ;    IOPL, writable data. ; = 5 (binary 0101) The selector is mapped as Ring 0, ;    readable code with 16-bit addressing/operand size. ; = 6 (binary 0110) The selector is mapped as Ring 0, ;    writable data. ; = 128 (binary 10000000) The selector will be mapped ;    as Ring 3, readable code with 32-bit ;    addressing/operand size. ; = 131 (binary 10000011) The selector will be mapped ;      as Ring 2, IOPL, readable code with 32-bit ;      addressing/operand size. ; = 133 (binary 10000101) The selector will be mapped ;      as Ring 0, readable code with 32-bit ;      addressing/operand size. ; All other values are invalid.

MOV  DL,DevHlp_PhysToGDTSel

CALL [Device_Help] 

C

 * PhysAddr (ULONG): 32-bit physical address that the GDT selector is to be mapped to.
 * Count (ULONG): Count of bytes to be mapped, must be less than or equal to 64KB.
 * Selector (SEL): GDT selector (allocated using AllocateGDTSelector)
 * Access (UCHAR): Descriptor's type and privilege level:
 * GDTSEL_R3CODE - The selector is mapped as ring 3, readable code with 16-bit addressing/operand size (286 format).
 * GDTSEL_R3DATA - (binary 0001) The selector is mapped as ring 3 writable data.
 * GDTSEL_R2CODE - (binary 0011) The selector is mapped as ring 2, IOPL, readable code with 16-bit addressing/operand size.
 * GDTSEL_R2DATA - (binary 0100) The selector is mapped as ring 2, IOPL, writable data.
 * GDTSEL_R0CODE - (binary 0101) The selector is mapped as ring 0, readable code with 16-bit addressing/operand size.
 * GDTSEL_R0DATA - (binary 0110) The selector is mapped as ring 0, writable data.
 * GDTSEL_ADDR32 - (binary 10000000) The selector will be mapped as ring 3 readable code with 32-bit addressing/operand size.
 * GDTSEL_R2CODE/GDTSEL_ADDR32 - (binary 10000011) The selector will be mapped as ring 2, IOPL, readable code with 32-bit addressing/operand size.
 * GDTSEL_R0CODE/GDTSEL_ADDR32 - (binary 10000101) The selector will be mapped as ring 0 readable code with 32-bit addressing/operand size.
 * All other values are invalid.

Assembler
 MOV  EAX,PhysAddress     ; 32-bit physical address that the ;   GDT selector is to be mapped to MOV   ECX,Size            ; Size of segment mapped; ;   must be less than or equal to 64KB ;   (a 0 value will map a 64KB segment) MOV  SI,Selector         ; GDT selector (allocated using AllocateGDTSelector) MOV  DH,Access           ; Descriptor's type and privilege level ; = 0 The selector is mapped as Ring 3, readable code ;     with 16-bit addressing/operand ;     size (286 format). ; = 1 (binary 0001) The selector is mapped as Ring 3, ;    writable data. ; = 3 (binary 0011) The selector is mapped as Ring 2, ;    IOPL, readable code with 16-bit ;    addressing/operand size. ; = 4 (binary 0100) The selector is mapped as Ring 2, ;    IOPL, writable data. ; = 5 (binary 0101) The selector is mapped as Ring 0, ;    readable code with 16-bit addressing/operand size. ; = 6 (binary 0110) The selector is mapped as Ring 0, ;    writable data. ; = 128 (binary 10000000) The selector will be mapped ;    as Ring 3, readable code with 32-bit ;    addressing/operand size. ; = 131 (binary 10000011) The selector will be mapped ;      as Ring 2, IOPL, readable code with 32-bit ;      addressing/operand size. ; = 133 (binary 10000101) The selector will be mapped ;      as Ring 0, readable code with 32-bit ;      addressing/operand size. ; All other values are invalid. 

Return Code
Success Indicator: 0 if pages locked, returns selector with modified Request Privilege Level (RPL) bits.
 * C

 'C' Clear if pages locked. SI = Selector with the modified RPL (Requested Privilege Level) bits. 'C' Set if segment unavailable. EAX = Error code. 
 * Assembler


 * Possible errors:
 * ERROR_INVALID_ADDRESS  (487)
 * ERROR_INVALID_SELECTOR (490)
 * ERROR_INVALID_PARAMETER (87)

Remarks
The physical memory that is being mapped must be fixed or locked prior to the call to this service. After the call has been issued for a particular selector, the addressability remains valid until the physical device driver changes its content with a subsequent call to the DevHlp services PhysToGDTSel, PhysToGDTSelector, PageListToGDTSelector, or LinToGDTSelector.

C

 * 1) include "dhcalls.h"

USHORT APIENTRY DevHelp_PhysToGDTSel( ULONG PhysAddr,                                     ULONG Count,                                      SEL   Selector,                                      UCHAR Access) 