IOCTL.A86
资源名称:drdossrc.zip [点击查看]
上传用户:xiaogehua
上传日期:2007-01-08
资源大小:1183k
文件大小:14k
源码类别:
操作系统开发
开发平台:
Asm
- ; 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