DevHelp PhysToUVirt

This service converts a 32-bit physical address to a valid selector:offset pair addressable out of the current Local Descriptor Table (LDT). Additional information about the selector can be retained by the memory manager, if special processing, based on the tag type, is required.

C
 USHORT APIENTRY DevHelp_PhysToUVirt( ULONG PhysAddr,                                     USHORT Length,                                     USHORT Flags,                                     USHORT TagType,                                     PVOID  SelOffset) 

Assembler
 MOV  AX,address_high  ; 32-bit physical address (or selector, if request type 2) MOV  BX,address_low   ; MOV  CX,length        ; Length of area (less than or equal to 65535, 0 = 65536) MOV  DH,request_type  ; Type of Request ; 0 = get virtual address, make segment ;    readable/executable, with Application ;    Program Privilege ; 1 = get virtual address, make segment readable/writable, ;    with Application Program Privilege ; 2 = free virtual address (OS/2 mode only) ; 3 = get virtual address, make segment ;    readable/executable, with I/O Privilege ; 4 = get virtual address, make segment readable/writable, ;    with I/O Privilege ; 5 = get virtual address, make segment readable/writable, ;    with Application Program Privilege and assign it                       ;     with a tag MOV  SI,tag type      ; Type of tag (used only on request type 5, preserved on                       ;     all others) ; 0 = foreground only video selector MOV  DL,DevHlp_PhysToUVirt

CALL [Device_Help] 

C

 * PhysAddr (ULONG): 32-bit physical address (or selector if request type2).


 * Length (USHORT) : Length of area (less than or equal to 65535, 0=65536).


 * Flags (USHORT) : Type of request:


 * SELTYPE_R3CODE : get virtual address, make segment readable/executable with application program privilege.


 * SELTYPE_R3DATA: get virtual address, make segment readable writable with application program privilege.


 * SELTYPE_FREE : free virtual address (OS/2 mode only)


 * SELTYPE_R2CODE : get virtual address, make segment readable/executable with I/O privilege.


 * SELTYPE_R2DATA : get virtual address, make segment readable/writable with I/O privilege.


 * SELTYPE_R3VIDEO : get virtual address, make segment readable/writable with Application Program Privilege and assign it with a tag.


 * TagType (USHORT :  Type of tag (used only on request type 5, preserved on all others).
 * 0 = foreground only video selector.


 * SelOffset (PVOID) : Segment/selector:offset pair to be returned for request types 0, 1, 3, and 4.

Assembler
 MOV  AX,address_high  ; 32-bit physical address (or selector, if request type 2) MOV  BX,address_low   ; MOV  CX,length        ; Length of area (less than or equal to 65535, 0 = 65536) MOV  DH,request_type  ; Type of Request ; 0 = get virtual address, make segment ;    readable/executable, with Application ;    Program Privilege ; 1 = get virtual address, make segment readable/writable, ;    with Application Program Privilege ; 2 = free virtual address (OS/2 mode only) ; 3 = get virtual address, make segment ;    readable/executable, with I/O Privilege ; 4 = get virtual address, make segment readable/writable, ;    with I/O Privilege ; 5 = get virtual address, make segment readable/writable, ;    with Application Program Privilege and assign it                       ;     with a tag MOV  SI,tag type      ; Type of tag (used only on request type 5, preserved on                       ;     all others) ; 0 = foreground only video selector 

C
Success Indicator: 0 - returns segment/selector:offset.

Assembler
 'C' Clear if successful. ES:BX = segment/selector:offset pair (for request types 0, 1, 3, and 4).

'C' Set if error. 

Remarks
This service is typically used to provide a caller of a physical device driver with addressability to a fixed memory area, such as ROM code and data. The physical device driver must know the physical address of the memory area to be addressed. PhysToUVirt leaves its result in ES:BX. This service also can be used to free a selector returned on a prior call to PhysToUVirt. For request type 2, AX contains a selector on entry to PhysToUVirt. BX and CX are ignored.

Note: If the input physical address is not on a 4KB boundary, then the length of the result segment will be limited to 64KB minus the offset from 4KB of the input physical address.

PhysToUVirt creates selector:offset LDT addressability for a 32-bit physical address. This function is provided so a physical device driver can give an application process addressability to a fixed memory area, such as in the BIOS-reserved range from 640KB to 1MB. It can also be used to give a client application addressability to a data segment of the physical device driver. The selector created, however, does not represent a normal memory segment such as those usually managed by the operating system, and is more of a fabricated segment for private use between a physical device driver and an application. Data within such a segment cannot be passed on system calls, and can be used by the receiving application only to return data variables.

C

 * 1) include "dhcalls.h"

USHORT APIENTRY DevHelp_PhysToUVirt( ULONG PhysAddr,                                     USHORT Length,                                     USHORT Flags,                                     USHORT TagType,                                     PVOID  SelOffset) 