IOCTL.A86
上传用户:xiaogehua
上传日期:2007-01-08
资源大小:1183k
文件大小:14k
源码类别:

操作系统开发

开发平台:

Asm

  1. ;    File              : $IOCTL.A86$
  2. ;
  3. ;    Description       :
  4. ;
  5. ;    Original Author   : DIGITAL RESEARCH
  6. ;
  7. ;    Last Edited By    : $CALDERA$
  8. ;
  9. ;-----------------------------------------------------------------------;
  10. ;    Copyright Work of Caldera, Inc. All Rights Reserved.
  11. ;      
  12. ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
  13. ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
  14. ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
  15. ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
  16. ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
  17. ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
  18. ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
  19. ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
  20. ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
  21. ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
  22. ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
  23. ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
  24. ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
  25. ;    CIVIL LIABILITY.
  26. ;-----------------------------------------------------------------------;
  27. ;
  28. ;    *** Current Edit History ***
  29. ;    *** End of Current Edit History ***
  30. ;    $Log: $
  31. ;    IOCTL.A86 1.17 94/11/28 15:42:19 
  32. ;    f440B now does not modify net_retry if DX=0    
  33. ;    IOCTL.A86 1.16 93/11/08 19:15:18
  34. ;    SETVER to subversion 0xFF disabled int 21/4452
  35. ;    IOCTL.A86 1.15 93/07/26 18:16:16
  36. ;    add some code which disables drdos check if app is SETVER'd
  37. ;    leave said code disabled unless required
  38. ;    IOCTL.A86 1.14 93/07/22 19:29:54
  39. ;    get/set serial number now the correct way round
  40. ;    IOCTL.A86 1.11 93/06/17 22:14:34
  41. ;    support for ioctl 10/11 query ioctl support
  42. ;    ENDLOG
  43. ;
  44. ;  7 Nov 87 Removal of development flags
  45. ; 17 Dec 87 Return "Single device Supported" for IOCTL sub-functions
  46. ;           0Eh and 0Fh.
  47. ; 24 Feb 88 Return 1060h from IOCTL sub-function 51h under DOS PLUS
  48. ;           instead of the Concurrent DOS OS version.
  49. ; 24 Feb 88 Correct Generic IOCTL function and prevent the generation
  50. ;           of critical errors.
  51. ; 24 May 88 sub-function 53h returns the address of the INT24 handler
  52. ;           for the command processor.
  53. ; 01 Jun 88 Add sub-function 4454 to support setting the default password
  54. ; 03 Nov 88 Add History Buffer Sub-Command f4456 for DOSPLUS
  55. ; 02 Feb 89 Add code page switching sub-function 0Ch
  56. ; 19 Feb 89 Support Sub-Command f4457 to control SHARE
  57. ; 15 Mar 89 Do not generate critical errors from 4402 and 4403.
  58. ; 18 Apr 89 Sub-function 53 only suported for Concurrect DOS
  59. ; 19 Apr 89 Don't clobber error code on 440D and 440E (pc-cache)
  60. ; 31 May 89 New function f4458 to return pointer to private data.
  61. ; 31 May 89 f440B sets up DOS internal data
  62. ; 15 Jun 89 Don't throw away inheritance bit when masking Share Mode Flags
  63. ; 11 Oct 89 f4407/07 set AX on return, not just AL
  64. ; 26 Oct 89 for a few bytes more...
  65. ; 18 Jan 90 HILOAD interface added onto f4457
  66. ; 25 Jan 90 INT21/4458 returns a pointer to IDLE_DATA in ES:AX
  67. ; 13 Jan 90 private_data exported in CDOS for DEBUG systems
  68. ; 27 Feb 90 4459 provides Int21 function that does Int224 calls
  69. ;  7 Mar 90 Convert to register preserved function calls
  70. ; 14 Mar 90 No critical error generated in IOCTL functions
  71. ;  3 May 90 stop forcing ioctl 4403/3/4/5 errors to ED_ACCESS
  72. ;  4 Jun 90 445A provides user group support on CDOS
  73. ;  3 jun 92 Add 4456/2+3 to examine history state, toggle history enable
  74. ; 30 jul 92 HILOAD now uses official memory strategy calls
  75. ;
  76. include pcmode.equ
  77. include fdos.def
  78. include i:msdos.equ
  79. include i:mserror.equ
  80. include i:cmdline.equ
  81. include i:driver.equ
  82. include i:reqhdr.equ
  83. include i:psp.def
  84. PCM_CODE CSEG BYTE
  85. extrn os_version:word
  86. extrn patch_version:word
  87. extrn invalid_function:near
  88. extrn error_ret:near
  89. extrn fdos_nocrit:near
  90. extrn fdos_crit:near
  91. extrn fdos_ax_crit:near
  92. extrn return_AX_CLC:near
  93. extrn return_DX:near
  94. extrn return_DSBX_as_ESBX:near
  95. extrn set_retry_RF:near
  96. extrn patch_version:word
  97. ; *****************************
  98. ; ***    DOS Function 69    ***
  99. ; ***   set/get serial num  ***
  100. ; *****************************
  101. ;
  102. Public func69
  103. func69:
  104. call set_retry_RF ; Prepare for an FDOS function
  105. mov FD_FUNC,MS_X_IOCTL
  106. mov cx,866h ; assume a get serial num
  107. cmp al,1 ; check for 0/1
  108. mov al,0Dh ; ready for ioctl 0D
  109.  jb func44common ; go ahead with get serial num
  110. mov cl,46h ; maybe it's a set
  111.  je func44common ; go ahead with set serial num
  112. ; jmp invalid_function ; ah well, it's an invalid one
  113. jmps f44_30
  114. ; *****************************
  115. ; ***    DOS Function 44    ***
  116. ; ***       I/O Control     ***
  117. ; *****************************
  118. ;
  119. Public func44
  120. func44:
  121. call set_retry_RF ; Prepare for an FDOS function
  122. func44common:
  123. mov FD_IOCTLFUNC,ax ; save subfunction for FDOS
  124. mov ioctlRH,22 ; assume RH will be wanted
  125. mov ioctlRH+13,0 ;  init len and media byte
  126. mov word ptr ioctlRH+14,dx ; point at buffer segment
  127. mov word ptr ioctlRH+16,es
  128. mov word ptr ioctlRH+18,cx ; the Byte Count
  129. cmp ax,dosf44_ftl ; Check for a valid PC-DOS
  130.  jae f44_20 ; sub-functions
  131. f44_10:
  132. xchg ax,si
  133. shl si,1
  134. mov si,func44_ft[si]
  135. xchg ax,si
  136. jmp ax
  137. f44_20:
  138. sub al,52h-dosf44_ftl ; adjust to our base of 52h
  139.  jc f44_30 ; bail out if too low
  140. cmp ax,ourf44_ftl ; is it too high ?
  141.  jb f44_10
  142. f44_30:
  143. jmp invalid_function
  144. ; ***********************************************
  145. ; ***    Sub Function 00 - Get Device Info    ***
  146. ; ***********************************************
  147. f4400:
  148. call fdos_handle ; execute the function
  149. mov dx,ax ; return in DX too
  150. return_AX_and_DX:
  151. call return_DX ; return to caller in DX
  152. jmp return_AX_CLC ; return AX too
  153. ; ***********************************************
  154. ; ***    Sub Function 01 - Set Device Info    ***
  155. ; ***    Sub Function 06 - Get Input Status   ***
  156. ; ***    Sub Function 07 - Get Output Status  ***
  157. ; ***********************************************
  158. f4401:
  159. f4406:
  160. f4407:
  161. call fdos_handle ; Execute the Function
  162. jmp return_AX_CLC
  163. ; ************************************************
  164. ; ***    Sub Function 04 -  Read Blk Device    ***
  165. ; ***    Sub Function 05 -  Write Blk Device   ***
  166. ; ***    Sub Function 11 -  Query ioctl Blk    ***
  167. ; ************************************************
  168. ;
  169. f4404:
  170. f4405:
  171. f4411:
  172. xor bh,bh ; BX = drive number
  173. ; ************************************************
  174. ; ***    Sub Function 02 - Read Character Dev  ***
  175. ; ***    Sub Function 03 - Write Character Dev ***
  176. ; ***    Sub Function 10 - Query ioctl Char    ***
  177. ; ************************************************
  178. ;
  179. f4402:
  180. f4403:
  181. f4410:
  182. mov dx,DA_QUERY ; assume we will query support
  183. mov al,CMD_QUERY_IOCTL ;  and be ready to go
  184. mov cx,FD_IOCTLFUNC ; re-read the function number
  185. test cl,10h ; is it function 10 of 11?
  186.  jnz f44ioctl ; yes, we are ready
  187. mov dx,DA_IOCTL ; no, we actually want to do it
  188. mov al,CMD_INPUT_IOCTL ; even functions are input
  189. test cl,1 ; test for input functions
  190.  jz f44ioctl
  191. mov al,CMD_OUTPUT_IOCTL ; odd functions are output
  192. f44ioctl:
  193. mov FD_IOCTLSTAT,dx ; this device driver support is required
  194. mov ioctlRH+2,al ;  this is the function
  195. call fdos_handle ; Execute the Function
  196. mov ax,word ptr ioctlRH+18 ; return # xfered
  197. jmp return_AX_CLC
  198. ; *****************************
  199. ; ***    Sub Function 09    ***
  200. ; ***    Networked Media    ***
  201. ; *****************************
  202. ;
  203. f4409:
  204. call fdos_drive ; Execute the Function
  205. mov dx,ax ; Get the Return Information
  206.     mov ax,0300h            
  207. jmps return_AX_and_DX
  208. ; *****************************
  209. ; ***    Sub Function 0A    ***
  210. ; ***    Networked Handle   ***
  211. ; *****************************
  212. ;
  213. f440A:
  214. call fdos_handle ; Execute the Function
  215. mov dx,ax ; Get the Return Information
  216. jmp return_DX ;  and return in DX
  217. ; *****************************
  218. ; ***    Sub Function 0B    ***
  219. ; ***   Update Share Retry  ***
  220. ; *****************************
  221. ;
  222. ; dos_CX [1] Number of times to execute the delay loop
  223. ; which consists of xor cx,cx ! loop $
  224. ;
  225. ; dos_DX [3] Number of times to retry
  226. ;
  227. ;
  228. f440B:
  229. mov net_delay,cx
  230. test dx,dx
  231.  jz f440B_10
  232. mov net_retry,dx
  233. f440b_10:
  234. ret
  235. ; *****************************
  236. ; ***    Sub Function 0D    ***
  237. ; ***   Device Driver Req   ***
  238. ; *****************************
  239. ;
  240. f440D:
  241. xor bh,bh
  242. ; jmp f440C
  243. ; *****************************
  244. ; ***    Sub Function 0C    ***
  245. ; ***  Code Page Switching  ***
  246. ; *****************************
  247. ;
  248. f440C:
  249. mov FD_IOCTLSTAT,DA_GETSET ; device driver support required
  250. mov FD_HANDLE,bx ; Save the Handle Number
  251. mov ioctlRH,23 ; different RH length
  252. mov ioctlRH+2,CMD_GENERIC_IOCTL
  253. xchg cl,ch ; swap minor/major functions
  254. mov word ptr ioctlRH+13,cx ;  and store in request header
  255. mov word ptr ioctlRH+15,si
  256. mov word ptr ioctlRH+17,di
  257. mov word ptr ioctlRH+19,dx ; point at buffer segment
  258. mov word ptr ioctlRH+21,es
  259. call fdos_ax_crit ; Execute the Function and
  260.  jc fdos_error ; return all error codes
  261. ret
  262. ; ***********************************************
  263. ; ***    Sub Function 08 - Removable Media    ***
  264. ; ***    Sub Function 0E - Get Logical Drive  ***
  265. ; ***    Sub Function 0F - Set Logical Drive  ***
  266. ; ***********************************************
  267. ;
  268. f4408:
  269. f440E:
  270. f440F:
  271. call fdos_drive ; Execute the Function
  272. jmp return_AX_CLC ; return result in AX
  273. fdos_drive:
  274. ;----------
  275. xor bh,bh ; BX = the drive number
  276. fdos_handle:
  277. ;----------
  278. mov FD_HANDLE,bx
  279. call fdos_crit ; then execute the FDOS
  280.  jnc fdos_OK ; exit on Error
  281. add sp,WORD ; discard near return address
  282. fdos_error:
  283. jmp error_ret ; and return the error
  284. fdos_OK:
  285. mov ax,FD_IOCTLSTAT ; get the return information
  286. ret
  287. eject
  288. ; *****************************
  289. ; ***    CCP/M Extension    ***
  290. ; ***    Sub Function 52    ***
  291. ; ***  Return CCP/M Version ***
  292. ; *****************************
  293. ;
  294. f4452:
  295. if DOS5
  296. mov es,current_psp ; version is kept in the PSP
  297. cmp PSP_VERSION,0FF00h ; sub-version of 255 ?
  298.  jae f4452_10 ; then say we ain't DRDOS
  299. endif
  300. mov ax,cs:os_version ; Get OS ver number
  301. mov dx,cs:patch_version
  302. call return_DX ; return in DX
  303. jmp return_AX_CLC ; return in AX
  304. if DOS5
  305. f4452_10:
  306.     jmp invalid_function    
  307. endif
  308. if PASSWORD
  309. ; *****************************
  310. ; ***    CCP/M Extension    ***
  311. ; ***    Sub Function 54    ***
  312. ; *** Set Default PASSWORD  ***
  313. ; *****************************
  314. ;
  315. f4454:
  316. mov FD_IOCTLFUNC,0Bh ; save subfunction for FDOS
  317. jmp fdos_nocrit ; Execute the Function
  318. endif
  319. ; *****************************
  320. ; ***    CCP/M Extension    ***
  321. ; ***    Sub Function 56    ***
  322. ; *** History Buffer Cntrl  ***
  323. ; *****************************
  324. ;
  325. ; This function changes the default history buffer used for func0A:
  326. ;
  327. ; On Entry:
  328. ; DL = 0 -> Standard Process Buffer
  329. ; DL = 1 -> Command.com history Buffer
  330. ; DL = 2 -> Toggle history enable/disable
  331. ; DL = 3 -> Get current state of history buffers
  332. ; DL = 4 -> Toggle insert mode
  333. ;
  334. ; On Exit:
  335. ; AL = previous history state (Bit 0 set if history on)
  336. ; Bit 0 -> set if history enabled
  337. ; Bit 1 -> set if insert enabled
  338. ; Bit 7 -> set if command history buffer
  339. ;
  340. f4456:
  341. mov ax,cle_state ; Get the current History Status
  342. cmp dl,2 ; are we disabling/enabling ?
  343.  jb f4456_10 ; below, switch buffers
  344.  je f4456_05 ; yes, try and do it
  345. cmp dl,4 ; toggle insert state ?
  346.  jne f4456_20 ; no, return existing state
  347. xor al,RLF_INS ; toggle insert state
  348. jmps f4456_20 ;  set and return prev state
  349. f4456_05:
  350. mov cl,RLF_ENHANCED ; we are interested in enhancements
  351. test @hist_flg,cl ;  only if history possible
  352.  jz f4456_20 ; just return existing state
  353. xor al,cl ; invert current setting
  354. ; and fall thru' to enable/disable
  355. ; standard buffer (never called
  356. ; by COMMAND...)
  357. f4456_10:
  358. or al,RLF_INROOT ; assume we are in the root
  359. if IDLE_DETECT
  360. or idle_flags,IDLE_COMMAND
  361. endif
  362. test dl,1 ; Get new state and mask bit
  363.  jnz f4456_20
  364. and al,not RLF_INROOT ; we are in application buffer
  365. if IDLE_DETECT
  366. and idle_flags,not IDLE_COMMAND
  367. endif
  368. f4456_20:
  369. xchg ax,cle_state ; set state, returning old state
  370. ret
  371. ; *****************************
  372. ; ***    CCP/M Extension    ***
  373. ; ***    Sub Function 58    ***
  374. ; ***   Private Data Func   ***
  375. ; *****************************
  376. ;
  377. ; On Exit ES:BX points to our DRDOS private data.
  378. ;         ES:AX points to the IDLE Data Area
  379. f4458:
  380. mov bx,offset @private_data
  381. call return_DSBX_as_ESBX ; return ES:BX pointing to private data
  382. mov ax,offset idle_data
  383. jmp return_AX_CLC
  384. PCM_RODATA CSEG WORD
  385. ;
  386. ; PCDOS Sub-Functions Only
  387. ;
  388. func44_ft dw f4400
  389. dw f4401
  390. dw f4402
  391. dw f4403
  392. dw f4404
  393. dw f4405
  394. dw f4406
  395. dw f4407
  396. dw f4408
  397. dw f4409
  398. dw f440A
  399. dw f440B
  400. dw f440C
  401. dw f440D
  402. dw f440E
  403. dw f440F
  404. dw f4410
  405. dw f4411
  406. dosf44_ftl equ (offset $ - offset func44_ft)/2
  407. ;
  408. ; CCP/M Sub-Functions Only
  409. ;
  410. dw f4452 ; 4452 OS version no
  411. dw invalid_function ; 4453 Invalid Function
  412. if PASSWORD
  413. dw f4454 ; 4454 set default password
  414. else
  415. dw invalid_function ; 4454 was set default password
  416. endif
  417. dw invalid_function ; 4455 Invalid Function
  418. dw f4456 ; 4456 history buffer support
  419. dw invalid_function ; 4457 was share enable/disable
  420. dw f4458 ; 4458 pointer to private data
  421. ourf44_ftl equ (offset $ - offset func44_ft)/2
  422. PCMODE_DATA DSEG WORD
  423. extrn net_delay:word, net_retry:word
  424. extrn @hist_flg:byte
  425. extrn @private_data:byte
  426. if IDLE_DETECT
  427. extrn idle_data:word
  428. extrn idle_flags:word
  429. endif
  430. extrn cle_state:word
  431. extrn ioctlRH:byte
  432. extrn dos_version:word
  433. extrn current_psp:word
  434. end