; File : $IOCTL.A86$ ; ; Description : ; ; Original Author : DIGITAL RESEARCH ; ; Last Edited By : $CALDERA$ ; ;-----------------------------------------------------------------------; ; Copyright Work of Caldera, Inc. All Rights Reserved. ; ; THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL, ; PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC. ; ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES ; WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF ; THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO ; HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE ; AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE ; AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED, ; COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED, ; CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST, ; TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF ; CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT ; AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND ; CIVIL LIABILITY. ;-----------------------------------------------------------------------; ; ; *** Current Edit History *** ; *** End of Current Edit History *** ; $Log: $ ; IOCTL.A86 1.17 94/11/28 15:42:19 ; f440B now does not modify net_retry if DX=0 ; IOCTL.A86 1.16 93/11/08 19:15:18 ; SETVER to subversion 0xFF disabled int 21/4452 ; IOCTL.A86 1.15 93/07/26 18:16:16 ; add some code which disables drdos check if app is SETVER'd ; leave said code disabled unless required ; IOCTL.A86 1.14 93/07/22 19:29:54 ; get/set serial number now the correct way round ; IOCTL.A86 1.11 93/06/17 22:14:34 ; support for ioctl 10/11 query ioctl support ; ENDLOG ; ; 7 Nov 87 Removal of development flags ; 17 Dec 87 Return "Single device Supported" for IOCTL sub-functions ; 0Eh and 0Fh. ; 24 Feb 88 Return 1060h from IOCTL sub-function 51h under DOS PLUS ; instead of the Concurrent DOS OS version. ; 24 Feb 88 Correct Generic IOCTL function and prevent the generation ; of critical errors. ; 24 May 88 sub-function 53h returns the address of the INT24 handler ; for the command processor. ; 01 Jun 88 Add sub-function 4454 to support setting the default password ; 03 Nov 88 Add History Buffer Sub-Command f4456 for DOSPLUS ; 02 Feb 89 Add code page switching sub-function 0Ch ; 19 Feb 89 Support Sub-Command f4457 to control SHARE ; 15 Mar 89 Do not generate critical errors from 4402 and 4403. ; 18 Apr 89 Sub-function 53 only suported for Concurrect DOS ; 19 Apr 89 Don't clobber error code on 440D and 440E (pc-cache) ; 31 May 89 New function f4458 to return pointer to private data. ; 31 May 89 f440B sets up DOS internal data ; 15 Jun 89 Don't throw away inheritance bit when masking Share Mode Flags ; 11 Oct 89 f4407/07 set AX on return, not just AL ; 26 Oct 89 for a few bytes more... ; 18 Jan 90 HILOAD interface added onto f4457 ; 25 Jan 90 INT21/4458 returns a pointer to IDLE_DATA in ES:AX ; 13 Jan 90 private_data exported in CDOS for DEBUG systems ; 27 Feb 90 4459 provides Int21 function that does Int224 calls ; 7 Mar 90 Convert to register preserved function calls ; 14 Mar 90 No critical error generated in IOCTL functions ; 3 May 90 stop forcing ioctl 4403/3/4/5 errors to ED_ACCESS ; 4 Jun 90 445A provides user group support on CDOS ; 3 jun 92 Add 4456/2+3 to examine history state, toggle history enable ; 30 jul 92 HILOAD now uses official memory strategy calls ; include pcmode.equ include fdos.def include i:msdos.equ include i:mserror.equ include i:cmdline.equ include i:driver.equ include i:reqhdr.equ include i:psp.def PCM_CODE CSEG BYTE extrn os_version:word extrn patch_version:word extrn invalid_function:near extrn error_ret:near extrn fdos_nocrit:near extrn fdos_crit:near extrn fdos_ax_crit:near extrn return_AX_CLC:near extrn return_DX:near extrn return_DSBX_as_ESBX:near extrn set_retry_RF:near extrn patch_version:word ; ***************************** ; *** DOS Function 69 *** ; *** set/get serial num *** ; ***************************** ; Public func69 func69: call set_retry_RF ; Prepare for an FDOS function mov FD_FUNC,MS_X_IOCTL mov cx,866h ; assume a get serial num cmp al,1 ; check for 0/1 mov al,0Dh ; ready for ioctl 0D jb func44common ; go ahead with get serial num mov cl,46h ; maybe it's a set je func44common ; go ahead with set serial num ; jmp invalid_function ; ah well, it's an invalid one jmps f44_30 ; ***************************** ; *** DOS Function 44 *** ; *** I/O Control *** ; ***************************** ; Public func44 func44: call set_retry_RF ; Prepare for an FDOS function func44common: mov FD_IOCTLFUNC,ax ; save subfunction for FDOS mov ioctlRH,22 ; assume RH will be wanted mov ioctlRH+13,0 ; init len and media byte mov word ptr ioctlRH+14,dx ; point at buffer segment mov word ptr ioctlRH+16,es mov word ptr ioctlRH+18,cx ; the Byte Count cmp ax,dosf44_ftl ; Check for a valid PC-DOS jae f44_20 ; sub-functions f44_10: xchg ax,si shl si,1 mov si,func44_ft[si] xchg ax,si jmp ax f44_20: sub al,52h-dosf44_ftl ; adjust to our base of 52h jc f44_30 ; bail out if too low cmp ax,ourf44_ftl ; is it too high ? jb f44_10 f44_30: jmp invalid_function ; *********************************************** ; *** Sub Function 00 - Get Device Info *** ; *********************************************** f4400: call fdos_handle ; execute the function mov dx,ax ; return in DX too return_AX_and_DX: call return_DX ; return to caller in DX jmp return_AX_CLC ; return AX too ; *********************************************** ; *** Sub Function 01 - Set Device Info *** ; *** Sub Function 06 - Get Input Status *** ; *** Sub Function 07 - Get Output Status *** ; *********************************************** f4401: f4406: f4407: call fdos_handle ; Execute the Function jmp return_AX_CLC ; ************************************************ ; *** Sub Function 04 - Read Blk Device *** ; *** Sub Function 05 - Write Blk Device *** ; *** Sub Function 11 - Query ioctl Blk *** ; ************************************************ ; f4404: f4405: f4411: xor bh,bh ; BX = drive number ; ************************************************ ; *** Sub Function 02 - Read Character Dev *** ; *** Sub Function 03 - Write Character Dev *** ; *** Sub Function 10 - Query ioctl Char *** ; ************************************************ ; f4402: f4403: f4410: mov dx,DA_QUERY ; assume we will query support mov al,CMD_QUERY_IOCTL ; and be ready to go mov cx,FD_IOCTLFUNC ; re-read the function number test cl,10h ; is it function 10 of 11? jnz f44ioctl ; yes, we are ready mov dx,DA_IOCTL ; no, we actually want to do it mov al,CMD_INPUT_IOCTL ; even functions are input test cl,1 ; test for input functions jz f44ioctl mov al,CMD_OUTPUT_IOCTL ; odd functions are output f44ioctl: mov FD_IOCTLSTAT,dx ; this device driver support is required mov ioctlRH+2,al ; this is the function call fdos_handle ; Execute the Function mov ax,word ptr ioctlRH+18 ; return # xfered jmp return_AX_CLC ; ***************************** ; *** Sub Function 09 *** ; *** Networked Media *** ; ***************************** ; f4409: call fdos_drive ; Execute the Function mov dx,ax ; Get the Return Information mov ax,0300h jmps return_AX_and_DX ; ***************************** ; *** Sub Function 0A *** ; *** Networked Handle *** ; ***************************** ; f440A: call fdos_handle ; Execute the Function mov dx,ax ; Get the Return Information jmp return_DX ; and return in DX ; ***************************** ; *** Sub Function 0B *** ; *** Update Share Retry *** ; ***************************** ; ; dos_CX [1] Number of times to execute the delay loop ; which consists of xor cx,cx ! loop $ ; ; dos_DX [3] Number of times to retry ; ; f440B: mov net_delay,cx test dx,dx jz f440B_10 mov net_retry,dx f440b_10: ret ; ***************************** ; *** Sub Function 0D *** ; *** Device Driver Req *** ; ***************************** ; f440D: xor bh,bh ; jmp f440C ; ***************************** ; *** Sub Function 0C *** ; *** Code Page Switching *** ; ***************************** ; f440C: mov FD_IOCTLSTAT,DA_GETSET ; device driver support required mov FD_HANDLE,bx ; Save the Handle Number mov ioctlRH,23 ; different RH length mov ioctlRH+2,CMD_GENERIC_IOCTL xchg cl,ch ; swap minor/major functions mov word ptr ioctlRH+13,cx ; and store in request header mov word ptr ioctlRH+15,si mov word ptr ioctlRH+17,di mov word ptr ioctlRH+19,dx ; point at buffer segment mov word ptr ioctlRH+21,es call fdos_ax_crit ; Execute the Function and jc fdos_error ; return all error codes ret ; *********************************************** ; *** Sub Function 08 - Removable Media *** ; *** Sub Function 0E - Get Logical Drive *** ; *** Sub Function 0F - Set Logical Drive *** ; *********************************************** ; f4408: f440E: f440F: call fdos_drive ; Execute the Function jmp return_AX_CLC ; return result in AX fdos_drive: ;---------- xor bh,bh ; BX = the drive number fdos_handle: ;---------- mov FD_HANDLE,bx call fdos_crit ; then execute the FDOS jnc fdos_OK ; exit on Error add sp,WORD ; discard near return address fdos_error: jmp error_ret ; and return the error fdos_OK: mov ax,FD_IOCTLSTAT ; get the return information ret eject ; ***************************** ; *** CCP/M Extension *** ; *** Sub Function 52 *** ; *** Return CCP/M Version *** ; ***************************** ; f4452: if DOS5 mov es,current_psp ; version is kept in the PSP cmp PSP_VERSION,0FF00h ; sub-version of 255 ? jae f4452_10 ; then say we ain't DRDOS endif mov ax,cs:os_version ; Get OS ver number mov dx,cs:patch_version call return_DX ; return in DX jmp return_AX_CLC ; return in AX if DOS5 f4452_10: jmp invalid_function endif if PASSWORD ; ***************************** ; *** CCP/M Extension *** ; *** Sub Function 54 *** ; *** Set Default PASSWORD *** ; ***************************** ; f4454: mov FD_IOCTLFUNC,0Bh ; save subfunction for FDOS jmp fdos_nocrit ; Execute the Function endif ; ***************************** ; *** CCP/M Extension *** ; *** Sub Function 56 *** ; *** History Buffer Cntrl *** ; ***************************** ; ; This function changes the default history buffer used for func0A: ; ; On Entry: ; DL = 0 -> Standard Process Buffer ; DL = 1 -> Command.com history Buffer ; DL = 2 -> Toggle history enable/disable ; DL = 3 -> Get current state of history buffers ; DL = 4 -> Toggle insert mode ; ; On Exit: ; AL = previous history state (Bit 0 set if history on) ; Bit 0 -> set if history enabled ; Bit 1 -> set if insert enabled ; Bit 7 -> set if command history buffer ; f4456: mov ax,cle_state ; Get the current History Status cmp dl,2 ; are we disabling/enabling ? jb f4456_10 ; below, switch buffers je f4456_05 ; yes, try and do it cmp dl,4 ; toggle insert state ? jne f4456_20 ; no, return existing state xor al,RLF_INS ; toggle insert state jmps f4456_20 ; set and return prev state f4456_05: mov cl,RLF_ENHANCED ; we are interested in enhancements test @hist_flg,cl ; only if history possible jz f4456_20 ; just return existing state xor al,cl ; invert current setting ; and fall thru' to enable/disable ; standard buffer (never called ; by COMMAND...) f4456_10: or al,RLF_INROOT ; assume we are in the root if IDLE_DETECT or idle_flags,IDLE_COMMAND endif test dl,1 ; Get new state and mask bit jnz f4456_20 and al,not RLF_INROOT ; we are in application buffer if IDLE_DETECT and idle_flags,not IDLE_COMMAND endif f4456_20: xchg ax,cle_state ; set state, returning old state ret ; ***************************** ; *** CCP/M Extension *** ; *** Sub Function 58 *** ; *** Private Data Func *** ; ***************************** ; ; On Exit ES:BX points to our DRDOS private data. ; ES:AX points to the IDLE Data Area f4458: mov bx,offset @private_data call return_DSBX_as_ESBX ; return ES:BX pointing to private data mov ax,offset idle_data jmp return_AX_CLC PCM_RODATA CSEG WORD ; ; PCDOS Sub-Functions Only ; func44_ft dw f4400 dw f4401 dw f4402 dw f4403 dw f4404 dw f4405 dw f4406 dw f4407 dw f4408 dw f4409 dw f440A dw f440B dw f440C dw f440D dw f440E dw f440F dw f4410 dw f4411 dosf44_ftl equ (offset $ - offset func44_ft)/2 ; ; CCP/M Sub-Functions Only ; dw f4452 ; 4452 OS version no dw invalid_function ; 4453 Invalid Function if PASSWORD dw f4454 ; 4454 set default password else dw invalid_function ; 4454 was set default password endif dw invalid_function ; 4455 Invalid Function dw f4456 ; 4456 history buffer support dw invalid_function ; 4457 was share enable/disable dw f4458 ; 4458 pointer to private data ourf44_ftl equ (offset $ - offset func44_ft)/2 PCMODE_DATA DSEG WORD extrn net_delay:word, net_retry:word extrn @hist_flg:byte extrn @private_data:byte if IDLE_DETECT extrn idle_data:word extrn idle_flags:word endif extrn cle_state:word extrn ioctlRH:byte extrn dos_version:word extrn current_psp:word end