INT 2F - EXTENDED MEMORY SPECIFICATION (XMS) v2+ - GET DRIVER ADDRESS Classification: memory management AX = 4310h Returns: ES:BX -> driver entry point (see #1303,#1304,#1314,#1333) Note: HIMEM.SYS v2.77 chains to previous handler if AH is not 00h or 10h HIMEM.SYS requires at least 256 bytes free stack space when calling the driver entry point See also: AX=4300h Format of XMS driver entry point: Offset Size Description (Table 1303) 00h 5 BYTEs jump to actual handler either short jump (EBh XXh) followed by three NOPs or far jump (EAh XXXX:XXXX) to a program which has hooked itself into the XMS driver chain Note: to hook into the XMS driver chain, a program should follow the chain of far jumps until it reaches the short jump of the driver at the end of the chain; this short jump is to be replaced with a far jump to the new handler's entry point, which should contain a short jump followed by three NOPs. The new handler must return to the address pointed at by the short jump which was overwritten. Using this method, the new handler becomes the first to see every XMS request. (Table 1304) Call the XMS driver "Get XMS version number" function with: AH = 00h Returns: AX = XMS version (in BCD, AH=major, AL=minor) BX = internal revision number (in BCD for HIMEM.SYS) DX = High Memory Area (HMA) state 0001h HMA (1M to 1M + 64K) exists 0000h HMA does not exist (Table 1305) Call the XMS driver "Request High Memory Area" function with: AH = 01h DX = memory in bytes (for TSR or device drivers) FFFFh if application program Returns: AX = status 0001h success 0000h failure BL = error code (80h,81h,90h,91h,92h) (see #1334) Note: HIMEM.SYS will fail function 01h with error code 91h if AL=40h and DX=KB free extended memory returned by last call of function 08h (Table 1306) Call the XMS driver "Release High Memory Area" function with: AH = 02h Returns: AX = status 0001h success 0000h failure BL = error code (80h,81h,90h,93h) (see #1334) (Table 1307) Call the XMS driver "Global enable A20, for using the HMA" function with: AH = 03h Returns: AX = status 0001h success 0000h failure BL = error code (80h,81h,82h) (see #1334) (Table 1308) Call the XMS driver "Global disable A20" function with: AH = 04h Returns: AX = status 0001h success 0000h failure BL = error code (80h,81h,82h,94h) (see #1334) (Table 1309) Call the XMS driver "Local enable A20" function with: AH = 05h Returns: AX = status 0001h success 0000h failure BL = error code (80h,81h,82h) (see #1334) Note: this function is used for direct access to extended memory (Table 1310) Call the XMS driver "Local disable A20" function with: AH = 06h Returns: AX = status 0001h success 0000h failure BL = error code (80h,81h,82h,94h) (see #1334) (Table 1311) Call the XMS driver "Query A20 state" function with: AH = 07h Returns: AX = status 0001h enabled 0000h disabled BL = error code (00h,80h,81h) (see #1334) (Table 1312) Call the XMS driver "Query free extended memory" function with: AH = 08h BL = 00h (some implementations leave BL unchanged on success) Returns: AX = size of largest extended memory block in KB DX = total extended memory in KB BL = error code (00h,80h,81h,A0h) (see #1334) Note: this function does not include the HMA in the returned memory sizes (Table 1313) Call the XMS driver "Allocate extended memory block" function with: AH = 09h DX = Kbytes needed Returns: AX = status 0001h success DX = handle for memory block 0000h failure BL = error code (80h,81h,A0h) (see #1334) See also: #1331 (Table 1314) Call the XMS driver "Free extended memory block" function with: AH = 0Ah DX = handle of block to free Returns: AX = status 0001h success 0000h failure BL = error code (80h,81h,A2h,ABh) (see #1334) See also: #1313 #1331 (Table 1315) Call the XMS driver "Move extended memory block" function with: AH = 0Bh DS:SI -> EMM structure (see #1335) Returns: AX = status 0001h success 0000h failure BL = error code (80h-82h,A3h-A9h) (see #1334) Note: if either handle in the EMM structure is 0000h, the corresponding offset is considered to be an absolute segment:offset address in directly addressable memory (Table 1316) Call the XMS driver "Lock extended memory block" function with: AH = 0Ch DX = handle of block to lock Returns: AX = status 0001h success DX:BX = 32-bit linear address of locked block 0000h failure BL = error code (80h,81h,A2h,ACh,ADh) (see #1334) Note: MS Windows 3.x rejects this function for handles allocated after Windows started (Table 1317) Call the XMS driver "Unlock extended memory block" function with: AH = 0Dh DX = handle of block to unlock Returns: AX = status 0001h success 0000h failure BL = error code (80h,81h,A2h,AAh) (see #1334) (Table 1318) Call the XMS driver "Get handle information" function with: AH = 0Eh DX = handle for which to get info Returns: AX = status 0001h success BH = block's lock count BL = number of free handles left DX = block size in KB 0000h failure BL = error code (80h,81h,A2h) (see #1334) BUG: MS Windows 3.10 acts as though unallocated handles are in use Note: MS Windows 3.00 has problems with this call (Table 1319) Call the XMS driver "Reallocate extended memory block" function with: AH = 0Fh DX = handle of block BX = new size of block in KB Returns: AX = status 0001h success 0000h failure BL = error code (80h,81h,A0h-A2h,ABh) (see #1334) (Table 1320) Call the XMS driver "Request upper memory block" function with: AH = 10h DX = size of block in paragraphs Returns: AX = status 0001h success BX = segment address of UMB DX = actual size of block 0000h failure BL = error code (80h,B0h,B1h) (see #1334) DX = largest available block Note: Upper Memory consists of non-EMS memory between 640K and 1024K The XMS driver need not implement functions 10h through 12h to be considered compliant with the standard (Table 1321) Call the XMS driver "Release upper memory block" function with: AH = 11h DX = segment address of UMB to release Returns: AX = status 0001h success 0000h failure BL = error code (80h,B2h) (see #1334) Note: the XMS driver need not implement functions 10h through 12h to be considered compliant with the standard (Table 1322) Call the XMS v3.0+ driver "Reallocate upper memory block" function with: AH = 12h DX = segment address of UMB to resize BX = new size of block in paragraphs Returns: AX = status 0001h success 0000h failure BL = error code (80h,B0h,B2h) (see #1334) DX = maximum available size (RM386) Note: the XMS driver need not implement functions 10h through 12h to be considered compliant with the standard (Table 1323) Call the QEMM v5.11 "???" function with: AH = 34h (QEMM 5.11 only, undocumented) ??? Returns: ??? (Table 1324) Call the QEMM v5.11 "???" function with: AH = 44h (QEMM 5.11 only, undocumented) ??? Returns: ??? (Table 1325) Call the Netroom RM386 v6.00 "Reallocate upper memory block" function with: AH = 80h DX = segment address of UMB to resize BX = new size of block in paragraphs Returns: AX = status 0001h success 0000h failure BL = error code (80h,B0h,B2h) (see #1334) DX = maximum available size Note: this function is identical to function 12h (Table 1326) Call the Netroom RM386 v6.00 "re-enable HMA allocation" function with: AH = 81h Returns: AX = 0001h (success) (Table 1327) Call the Netroom RM386 v6.00 "Cloaking API" function with: AH = 82h DX = XMS handle of block containing protected-mode code CL = code size (00h 16-bit, else 32-bit) ESI, EDI = parameters to pass to protected-mode code Returns: AX = status 0001h success 0000h failed BL = error code (A2h,B0h) (see #1334) Note: this function calls offset 0 in the XMS memory block with EBX = physical address of block's start CS = code selector for XMS block at EBX (16-bit or 32-bit) DS = data selector for XMS block, starting at EBX ES = selector for V86 memory access to full real-mode 1088K GS = selector for full flat address space ESI, EDI from V86 mode (Table 1328) Call the Netroom RM386 v6.00 "Create new UMB entry" function with: AH = 83h BX = segment of high-memory block DX = first page of start of block CX = number of consecutive pages in block DI = start of UMB in block Returns: AX = 0001h (success) DI = segment of first high-DOS block Note: the new UMB is not linked into the high-memory chain (Table 1329) Call the Netroom RM386 v6.00 "Get all XMS handles info" function with: AH = 84h CX = size of buffer for handle info ES:DI -> buffer for handle info (see #1336) Returns: AX = 0001h (success) DX = current number of allocated XMS handles (Table 1330) Call the XMS v3.0 driver "Query free extended memory" function with: AH = 88h Returns: EAX = largest block of extended memory, in KB BL = status (00h,80h,81h,A0h) (see #1334) ECX = physical address of highest byte of memory (valid even on error codes 81h and A0h) EDX = total Kbytes of extended memory (0 if status A0h) BUG: HIMEM v3.03-3.07 crash on an 80286 machine if any of the 8Xh functions are called See also: #1312 #1331 (Table 1331) Call the XMS v3.0 driver "Allocate any extended memory" function with: AH = 89h EDX = Kbytes needed Returns: AX = status 0001h success DX = handle for allocated block (free with AH=0Ah) (see #1314) 0000h failure BL = status (80h,81h,A0h,A1h,A2h) (see #1334) See also: #1313 #1330 (Table 1332) Call the XMS v3.0 driver "Get extended EMB handle information" function with: AH = 8Eh DX = handle Returns: AX = status 0001h success BH = block's lock count CX = number of free handles left EDX = block size in KB 0000h failure BL = status (80h,81h,A2h) (see #1334) BUG: MS-DOS 6.0 HIMEM.SYS leaves CX unchanged (Table 1333) Call the XMS v3.0 driver "Reallocate any extended memory block" function with: AH = 8Fh DX = unlocked handle EBX = new size in KB Returns: AX = status 0001h success 0000h failure BL = status (80h,81h,A0h-A2h,ABh) (see #1334) BUG: HIMEM v3.03-3.07 crash on an 80286 machine if any of the 8Xh functions are called (Table 1334) Values for XMS error code returned in BL: 00h successful 80h function not implemented 81h Vdisk was detected 82h an A20 error occurred 8Eh a general driver error 8Fh unrecoverable driver error 90h HMA does not exist or is not managed by XMS provider 91h HMA is already in use 92h DX is less than the /HMAMIN= parameter 93h HMA is not allocated 94h A20 line still enabled A0h all extended memory is allocated A1h all available extended memory handles are allocated A2h invalid handle A3h source handle is invalid A4h source offset is invalid A5h destination handle is invalid A6h destination offset is invalid A7h length is invalid A8h move has an invalid overlap A9h parity error occurred AAh block is not locked ABh block is locked ACh block lock count overflowed ADh lock failed B0h only a smaller UMB is available B1h no UMB's are available B2h UMB segment number is invalid Format of EMM structure: Offset Size Description (Table 1335) 00h DWORD number of bytes to move (must be even) 04h WORD source handle 06h DWORD offset into source block 0Ah WORD destination handle 0Ch DWORD offset into destination block Note: if source and destination overlap, only forward moves (source base less than destination base) are guaranteed to work properly If either handle is zero, the corresponding offset is interpreted as a real-mode address referring to memory directly addressable by the processor Format of XMS handle info [array]: Offset Size Description (Table 1336) 00h BYTE handle 01h BYTE lock count 02h DWORD handle size 06h DWORD handle physical address (only valid if lock count nonzero) See also: #1301