1 TITLE EXTATTR
- Extended Attributes
4 ; Get or Set Extended Attributes by handle
19 ; A000 version 4.00 Jan. 1988
31 ; get the appropriate segment definitions
33 include dosseg
.asm
;AN000;
35 CODE SEGMENT BYTE PUBLIC 'CODE' ;AN000;
36 ASSUME
SS:DOSGROUP
,CS:DOSGROUP
;AN000;
39 INCLUDE DOSSYM
.INC ;AN000;
40 INCLUDE DEVSYM
.INC ;AN000;
41 include EA
.inc ;AN000;
47 ; I_need XA_from,BYTE ;AN000;
49 ; I_need XA_TABLE,BYTE ;AN000;
50 ; I_need XA_TEMP,WORD ;AN000;
51 ; I_need XA_COUNT,WORD ;AN000;
52 ; I_need XA_DEVICE,BYTE ;AN000;
53 I_need XA_TYPE
,BYTE ;AN000;
54 I_need SAVE_ES
,WORD ;AN000;
55 I_need SAVE_DI
,WORD ;AN000;
56 I_need SAVE_DS
,WORD ;AN000;
57 I_need SAVE_SI
,WORD ;AN000;
58 I_need SAVE_CX
,WORD ;AN000;
59 I_need SAVE_BX
,WORD ;AN000;
60 ; I_need XA_handle,WORD ;AN000;
61 ; I_need CPSWFLAG,BYTE ;AN000;
62 ; I_need XA_PACKET,BYTE ;AN000;
63 ; I_need MAX_EA_SIZE,WORD ;AN000;
64 ; I_need MAX_EANAME_SIZE,WORD ;AN000;
65 ; I_need THISSFT,DWORD ;AN000;
67 ; I_need DBCS_PACKET,BYTE ;AN000; ;AN000;
68 ;ENDIF ;AN000; ;AN000;
74 BREAK <GetSet_EA get
or set extended attributes by handle
> ;AN000;
76 ; Input: [XA_type] = function code, (e.g., get,set) ;AN000;
77 ; [ThisSFT] points to SFT ;AN000;
78 ; ES:BP points to drive parameter block ;AN000;
79 ; [XA_from] = By_Create or By_EA ;AN000;
80 ; [SAVE_ES]:[SAVE_DI] points to get/set list ;AN000;
81 ; [SAVE_DS]:[SAVE_SI] points to get query list ;AN000;
82 ; [SAVE_CX] = size of buffer
83 ; [XA_device]= 1 device, 0 file ;AN000;
84 ; [XA_handle] for device ;AN000;
85 ; Function: Get or Set extended attributes by handle ;AN000;
86 ; Output: carry set: error ;AN000;
87 ; carry clear: extended attributes are successfully get/set ;AN000;
88 ; extended attribute cluster may be created ;AN000;
94 procedure GetSet_XA
,near ;AN000;
95 ASSUME
CS:DOSGROUP
,DS:NOTHING
,ES:NOTHING
,SS:DOSGROUP
;AN000;
98 LES DI,DWORD PTR [SAVE_DI
] ;AN000;;FT. ES:DI -> query list
99 ;; MOV [SAVE_BX],2 ;AN000;;FT. size returned
100 ;; XOR DX,DX ;AN000;;FT. dx=0, codepage id
102 CMP [XA_type
],2 ;AN000;;FT. get EA ?
103 JNZ eaname
;AN000;;FT. no
105 CMP [SAVE_CX
],0 ;AN000;;FT. get max data size
106 JNZ notmax
;AN000;;FT. no
107 ;; CALL Get_max_EA_size ;AN000;;FT.
109 MOV CX,2 ;AN000;;FT. FAKE FAKE..............
110 JNC set_user_cx
;AN000;;FT.
111 JMP OKexit
;AN000;;FT. error
113 CMP [SAVE_CX
],1 ;AN000;;FT. buffer size =1 ?
114 JNZ goodsiz
;AN000;;FT. no
116 JMP insuff_space
;AN000;;FT. no error
118 MOV WORD PTR ES:[DI],0 ;AN000;FT. FAKE FAKE ...............
119 MOV CX,2 ;AN000;FT. FAKE FAKE ...............
120 JMP set_user_cx
;AN000;FT. FAKE FAKE ...............
122 ; SUB [SAVE_CX],2 ;AN000;;FT. minus count size
123 ; CMP [SAVE_SI],-1 ;AN000;;FT. get all ?
124 ; JNZ getsome ;AN000;;FT. no
125 ; PUSH CS ;AN000;;FT. ds:si-> EA entry addr
128 ; INC DI ;AN000;;FT. es:di -> address after count
129 ; MOV SI,OFFSET DOSGROUP:XA_TABLE ;AN000;FT.
130 ; MOV CX,XA_COUNT ;AN000;;FT. cx= number of EA entries
133 ; CALL GET_ONE_EA ;AN000;;FT. get EA
134 ; JC setout ;AN000;;FT. insufficient memory
135 ; INC DX ;AN000;;FT. next EA ID
136 ; LOOP getone ;AN000;;FT. next one
138 ; CALL Set_Output ;AN000;;FT.
139 ; OR CX,CX ;AN000;;FT.
140 ; JNZ errout ;AN000;;FT.
142 ; JMP OKexit ;AN000;;FT.
144 CMP [XA_type
],3 ;AN000;;FT. get EA name?`
145 JZ geteaname
;AN000;;FT. yes
146 JMP setea
;AN000;;FT.
148 ; MOV [SAVE_SI],-1 ;AN000;;FT. make get all
149 CMP [SAVE_CX
],0 ;AN000;;FT. get max data size
150 JNZ notmax
;AN000;;FT. no
151 MOV CX,2 ;AN000;;FT. FAKE FAKE ......................
152 ;; MOV CX,[MAX_EANAME_SIZE] ;AN000;;FT. get name size
154 invoke get_user_stack
;AN000;;FT. get user stack
155 MOV [SI.user_CX
],CX ;AN000;;FT.
156 JMP OKexit
;AN000;;FT. exit
159 ; LDS SI,DWORD PTR [SAVE_SI] ;AN000;;FT.
161 ; MOV CX,AX ;AN000;;FT. cx=number of query entries
162 ; JCXZ setout ;AN000;;FT. yes
163 ; STOSW ;AN000;;FT. es:di -> EA
164 ;get_next_EA: ;AN000;
165 ; PUSH DS ;AN000;;FT. save ds:si
166 ; PUSH SI ;AN000;;FT. es:di
167 ; PUSH ES ;AN000;;FT.
168 ; PUSH DI ;AN000;;FT.
169 ; CALL Search_EA ;AN000;;FT. search query EA from table
170 ; JC EAnotFound ;AN000;;FT. EA not found
171 ; PUSH ES ;AN000;;FT.
173 ; MOV SI,DI ;AN000;;FT. ds:si -> found EA
174 ; POP DI ;AN000;;FT. es:di -> buffer
176 ; CALL GET_ONE_EA ;AN000;;FT. copy to buffer
179 ; JC setfinal ;AN000;;FT. memory not enough
180 ; MOV AL,[SI.QEA_NAMELEN] ;AN000;;FT.
181 ; XOR AH,AH ;AN000;;FT.
182 ; ADD AX,QEA_NAME ;AN000;;FT.
183 ; ADD SI,AX ;AN000;;FT. ds:si -> next query entry
185 ; LOOP get_next_EA ;AN000;;FT. do next
187 ; LDS SI,DWORD PTR [SAVE_SI] ;AN000;;FT.
188 ; MOV DX,[SI] ;AN000;;FT.
189 ; SUB DX,CX ;AN000;;FT. dx= returned count
190 ; JMP setout ;AN000;;FT.
192 ; POP DI ;AN000;;FT. restore regs
197 ; CALL COPY_QEA ;AN000;;FT. copy query EA to buffer
198 ; JC setfinal ;AN000;;FT. not enough memory
199 ; JMP testend ;AN000;;FT.
201 JMP OKexit
;AN000;;FT. FAKE FAKE ..........
202 ; LDS SI,DWORD PTR [SAVE_DI] ;AN000;;FT.
204 ; MOV CX,AX ;AN000;;FT. cx=number of query entries
205 ; OR CX,CX ;AN000;;FT. cx=0 ?
206 ; JZ OKexit ;AN000;;FT. yes
208 ; CALL Search_EA ;AN000;;FT.
209 ; JNC toset ;AN000;;FT.
211 ; CLC ;AN000;;FT. clear acrry
212 ; MOV [SI.EA_RC],AL ;AN000;;FT. set reason code
213 ; DEC CX ;AN000;;FT. end of set ?
214 ; JZ OKexit ;AN000;;FT. yes
216 ; MOV AL,[SI.EA_NAMELEN] ;AN000;;FT.
217 ; XOR AH,AH ;AN000;;FT.
218 ; ADD AX,[SI.EA_VALLEN] ;AN000;;FT.
219 ; ADD SI,EA_NAME ;AN000;;FT.
220 ; ADD SI,AX ;AN000;;FT. es:di -> next EA entry
221 ; JMP set_next ;AN000;;FT.
223 ; CALL SET_ONE_EA ;AN000;;FT. set it
224 ; JMP set_reason ;AN000;;FT.
225 insuff_space: ;AN000;;FT.
226 ; MOV AX,error_not_enough_memory ;AN000;FT. insufficient memory err
231 EndProc GetSet_XA
;AN000;
234 ; Input: [SAVE_ES]:[SAVE_DI] points to buffer
235 ; [SAVE_BX]= returned size
237 ; Function: set returned size and count ;AN000;
240 ;procedure Set_Output,NEAR ;AN000;
241 ; ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000;
243 ; LES DI,DWORD PTR [SAVE_DI] ;FT. es:di -> count ;AN000;
244 ; MOV ES:[DI],DX ;FT. ;AN000;
245 ; MOV BX,[SAVE_BX] ;FT. cx=size returned ;AN000;
246 ; invoke get_user_stack ;FT. get user stack ;AN000;
247 ; MOV [SI.user_CX],BX ;FT. ;AN000;
248 ; return ;FT. ;AN000;
250 ;EndProc Set_Output ;AN000;
253 ; Input: DS:SI= query EA addr ;AN000;
254 ; Function: search the EA ;AN000;
255 ; Output: carry clear
256 ; DX= EA ID (0 codpage, 1 Filetype, etc.)
257 ; ES:DI points to found entry
258 ; carry set, not found, AL= reason code ;AN000;
260 ;procedure Search_EA,NEAR ;AN000;
261 ; ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000;
263 ; PUSH CX ;FT. save entry count ;AN000;
264 ; MOV AL,EARCNOTFOUND ;FT. preset error code ;AN000;
265 ; MOV BL,[SI.QEA_NAMELEN] ;FT. ? ;AN000;
266 ; CMP [XA_TYPE],4 ;FT. set ? ;AN000;
267 ; JNZ gettyp ;FT. no ;AN000;
268 ; MOV BL,[SI.EA_NAMELEN] ;FT. ? ;AN000;
270 ; OR BL,BL ;FT. ;AN000;
271 ; JZ not_found ;FT. ;AN000;
272 ; PUSH CS ;FT. ds:si-> EA entry addr ;AN000;
273 ; POP ES ;FT. ;AN000;
274 ; MOV DI,OFFSET DOSGROUP:XA_TABLE ;FT. ;AN000;
275 ; MOV CX,XA_COUNT ;FT. cx= number of EA entries ;AN000;
276 ; XOR DX,DX ;FT. dx=0, codepage id ;AN000;
279 ; PUSH CX ;FT. save entry count ;AN000;
280 ; MOV CL,BL ;FT. ;AN000;
281 ; XOR CH,CH ;FT. get name len ;AN000;
282 ; PUSH SI ;FT. ;AN000;
283 ; PUSH DI ;FT. ;AN000;
284 ; CMP [XA_TYPE],4 ;FT. set ? ;AN000;
285 ; JNZ gettyp2 ;FT. no ;AN000;
286 ; ADD SI,EA_NAME ;FT. ;AN000;
287 ; JMP short updi ;FT. ;AN000;
289 ; ADD SI,QEA_NAME ;FT. compare EA names ;AN000;
291 ; ADD DI,EA_NAME ;FT. ;AN000;
292 ; REP CMPSB ;FT. ;AN000;
293 ; POP DI ;FT. ;AN000;
294 ; POP SI ;FT. ;AN000;
295 ; POP CX ;FT. ;AN000;
296 ; JNZ not_matched ;FT. name not matched ;AN000;
297 ; MOV AL,EARCDEFBAD ;FT. preset error code ;AN000;
298 ; PUSH SI ;FT. ;AN000;
299 ; PUSH DI ;FT. ;AN000;
300 ; CMPSB ;FT. compare type ;AN000;
301 ; JNZ not_matched2 ;FT. type not matched ;AN000;
302 ; CMPSW ;FT. compare flags ;AN000;
303 ; JNZ not_matched2 ;FT. flag not matched ;AN000;
304 ; POP DI ;FT. ;AN000;
305 ; POP SI ;FT. found one ;AN000;
306 ; JMP SHORT found_one ;FT. ;AN000;
308 ; DEC CX ;FT. end of table ;AN000;
309 ; JZ not_found ;FT. yes ;AN000;
310 ; MOV AL,ES:[DI.EA_NAMELEN] ;FT. ;AN000;
311 ; XOR AH,AH ;FT. ;AN000;
313 ; ADD DI,EA_NAME ;FT. ;AN000;
314 ; ADD DI,AX ;FT. es:di -> next EA entry ;AN000;
315 ; INC DX ;FT. increment EA ID ;AN000;
316 ; JMP start_find ;FT. ;AN000;
318 ; POP DI ;FT. ;AN000;
319 ; POP SI ;FT. ;AN000;
320 ; JMP not_matched ;FT. ;AN000;
324 ; POP CX ;FT. ;AN000;
325 ; return ;FT. ;AN000;
327 ;EndProc Search_EA ;AN000;
329 ; Input: ES:DI= buffer address ;AN000;
330 ; DS:SI= EA entry address
331 ; [SAVE_CX]= buffer size
333 ; Function: move one query entry to buffer ;AN000;
334 ; Output: carry clear
335 ; DS:SI points to next entry
336 ; ES:DI points to next entry
337 ; [SAVE_CX],[SAVE_BX], updated ;AN000;
338 ; carry set, insufficient memory error ;AN000;
340 ;procedure COPY_QEA,NEAR ;AN000;
341 ; ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000;
343 ; PUSH CX ;FT. ;AN000;
344 ; MOV DL,AL ;FT. ;AN000;
345 ; MOV CX,EA_NAME -EA_TYPE ;FT. ;AN000;
347 ; MOV BL,[SI.QEA_NAMELEN] ;FT. ;AN000;
348 ; XOR BH,BH ;FT. ;AN000;
349 ; ADD CX,BX ;FT. cx= query EA size ;AN000;
350 ; CMP CX,[SAVE_CX] ;FT. > buffer size ;AN000;
351 ; JA sizeshort2 ;FT. yes ;AN000;
352 ; PUSH CX ;FT. ;AN000;
353 ; LODSB ;FT. move type ;AN000;
356 ; STOSW ;FT. move flag ;AN000;
357 ; MOV AL,DL ;FT. move RC ;AN000;
360 ; LODSB ;FT. move name len ;AN000;
361 ; MOV CL,AL ;FT. ;AN000;
363 ; XOR AX,AX ;FT. zero value length ;AN000;
365 ; OR CL,CL ;FT. ;AN000;
366 ; JZ zeroname ;FT. ;AN000;
367 ; XOR CH,CH ;FT. ;AN000;
369 ; REP MOVSB ;FT. move EA to buffer ;AN000;
371 ; POP CX ;FT. ;AN000;
372 ; ADD [SAVE_BX],CX ;FT. bx=bx+entry size ;AN000;
373 ; SUB [SAVE_CX],CX ;FT. update buffer size ;AN000;
375 ; JMP SHORT okget2 ;FT. ;AN000;
378 ; MOV AX,error_not_enough_memory ;FT. error ;AN000;
381 ; POP CX ;FT. ;AN000;
382 ; return ;FT. ;AN000;
384 ;EndProc COPY_QEA ;AN000;
386 ; Input: ES:DI= found EA entry addr ;AN000;
387 ; DS:SI= source EA entry address
388 ; DX= EA ID (0 codpage, 1 Filetype, etc.)
389 ; Function: set one EA ;AN000;
390 ; Output: carry clear
392 ; carry set, AL= reason code ;AN000;
394 ;procedure SET_ONE_EA,NEAR ;AN000;
395 ; ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000;
397 ; PUSH CX ;FT. ;AN000;
398 ; MOV AL,EARCDEFBAD ;FT. prseet error code ;AN000;
399 ; MOV BX,[SI.EA_VALLEN] ;FT. ;AN000;
400 ; CMP BX,ES:[DI.EA_VALLEN] ;FT. length equal ? ;AN000;
401 ; JNZ notset ;FT. no ;AN000;
402 ; PUSH DS ;FT. ;AN000;
403 ; PUSH SI ;FT. ;AN000;
404 ; MOV AL,[SI.EA_NAMELEN] ;FT. ;AN000;
405 ; XOR AH,AH ;FT. ;AN000;
406 ; ADD SI,EA_NAME ;FT. ;AN000;
407 ; ADD SI,AX ;FT. ;AN000;
408 ; CMP DX,0 ;FT. ;AN000;
409 ; JNZ set_filetyp ;FT. ;AN000;
411 ; CMP [XA_DEVICE],0 ;FT. device ? ;AN000;
412 ; JZ notdevice ;FT. no ;AN000;
413 ; OR AX,AX ;FT. code page 0 ? ;AN000;
414 ; JZ NORM0 ;FT. yes ;AN000;
416 ; CALL GSetDevCdPg ;FT. ;AN000;
417 ; JNC welldone ;FT. ;AN000;
418 ; CMP [CPSWFLAG],0 ;FT. code page matching on ;AN000;
419 ; JZ NORM0 ;FT. no ;AN000;
420 ; invoke SAVE_WORLD ;FT. save all regs ;AN000;
421 ; LDS SI,[THISSFT] ;FT. ds:si -> sft ;AN000;
422 ; LDS SI,[SI.sf_devptr] ;FT. ds:si -> device header ;AN000;
423 ; MOV BP,DS ;FT. save all regs ;AN000;
424 ; invoke Code_Page_Mismatched_Error ;FT. ;AN000;
425 ; CMP AL,0 ;FT. ignore ? ;AN000;
426 ; JZ NORM1 ;FT. ;AN000;
427 ; invoke RESTORE_WORLD ;FT. save all regs ;AN000;
429 ; MOV AL,EARCDEVERROR ;FT. ;AN000;
431 ; JMP SHORT sdone ;FT. ;AN000;
433 ; invoke RESTORE_WORLD ;FT. save all regs ;AN000;
434 ; JMP SHORT welldone ;FT. ;AN000;
436 ; LDS SI,[THISSFT] ;FT. ;AN000;
437 ; MOV [SI.sf_CodePage],AX ;FT. set codepege ;AN000;
438 ; JMP SHORT welldone ;FT.
441 ; LDS SI,[THISSFT] ;FT. set filtype ;AN000;
442 ; MOV [SI.sf_ATTR_HI],AL ;FT. ;AN000;
445 ; XOR AL,AL ;FT. success ;AN000;
447 ; POP SI ;FT. ;AN000;
448 ; POP DS ;FT. ;AN000;
450 ; POP CX ;FT. ;AN000;
451 ; return ;FT. ;AN000;
453 ;EndProc SET_ONE_EA ;AN000;
455 ; Input: ES:DI= buffer address ;AN000;
456 ; DS:SI= EA entry address
457 ; [SAVE_CX]= buffer size available
458 ; [SAVE_BX]= size returned
459 ; DX= EA ID (0 codpage, 1 Filetype, etc.)
460 ; Function: move one EA entry to the buffer ;AN000;
461 ; Output: carry clear
462 ; DS:SI points to next entry
463 ; ES:DI points to next entry
464 ; [SAVE_CX],BX, updated ;AN000;
465 ; carry set, insufficient memory error ;AN000;
467 ;procedure GET_ONE_EA,NEAR ;AN000;
468 ; ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000;
470 ; PUSH CX ;FT. ;AN000;
471 ; CMP [XA_TYPE],2 ;FT. type 2 ? ;AN000;
472 ; JZ gtyp2 ;FT. yes ;AN000;
473 ; MOV CX,QEA_NAME - QEA_TYPE ;FT. ;AN000;
474 ; JMP SHORT addnmlen ;FT.
476 ; MOV CX,EA_NAME - EA_TYPE ;FT. cx = EA entry size ;AN000;
477 ; ADD CX,[SI.EA_VALLEN] ;FT. ;AN000;
479 ; MOV AL,[SI.EA_NAMELEN] ;FT.
480 ; XOR AH,AH ;FT. ;AN000;
481 ; ADD CX,AX ;FT. ;AN000;
482 ; CMP CX,[SAVE_CX] ;FT. > buffer size ;AN000;
483 ; JA sizeshort ;FT. yes ;AN000;
484 ; PUSH CX ;FT. ;AN000;
485 ; LODSB ;FT. move type ;AN000;
488 ; STOSW ;FT. move flag ;AN000;
489 ; LODSB ;FT. EA list need RC ;AN000;
490 ; CMP [XA_TYPE],2 ;FT. ;AN000;
491 ; JNZ norc ;FT. ;AN000;
494 ; LODSB ;FT. move name len ;AN000;
496 ; MOV CL,AL ;FT. ;AN000;
497 ; XOR CH,CH ;FT. ;AN000;
498 ; LODSW ;FT. EA list need value len ;AN000;
499 ; CMP [XA_TYPE],2 ;FT. ;AN000;
500 ; JNZ novalen ;FT. ;AN000;
504 ; REP MOVSB ;FT. move EA to buffer ;AN000;
505 ; CMP [XA_TYPE],2 ;FT. ;AN000;
506 ; JNZ novalue ;FT. ;AN000;
507 ; CALL GET_VALUE ;FT. get value for type 2 ;AN000;
509 ; POP CX ;FT. ;AN000;
510 ; ADD [SAVE_BX],CX ;FT. add entry size ;AN000;
511 ; LES DI,DWORD PTR [SAVE_DI] ;FT. ;AN000;
512 ; ADD DI,[SAVE_BX] ;FT. es:di -> next entry ;AN000;
513 ; SUB [SAVE_CX],CX ;FT. update buffer size ;AN000;
515 ; JMP SHORT okget ;FT. ;AN000;
518 ; MOV AX,error_not_enough_memory ;FT. error ;AN000;
521 ; POP CX ;FT. ;AN000;
522 ; return ;FT. ;AN000;
524 ;EndProc GET_ONE_EA ;AN000;
527 ; Input: DX= EA ID (0 codpage, 1 Filetype, etc.)
528 ; [THISSFT]= points to SFT
529 ; ES:DI= buffer address of EA value
530 ; [XA_DEVICE]=0 file, 1 device
531 ; Function: get attribute ;AN000;
532 ; Output: none ;AN000;
535 ;procedure GET_VALUE,NEAR ;AN000;
536 ; ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000;
538 ; PUSH DS ;FT. save ds:si ;AN000;
539 ; PUSH SI ;FT. ;AN000;
540 ; LDS SI,[ThisSFT] ;FT. ds:si -> SFT ;AN000;
542 ; CMP DX,0 ;FT. code page ? ;AN000;
543 ; JNZ eafiltyp ;FT. no ;AN000;
544 ; CMP [XA_DEVICE],0 ;FT. device ? ;AN000;
545 ; JZ notdev ;FT. no ;AN000;
546 ; CALL GSetDevCdPg ;FT. do ioctl invoke ;AN000;
547 ; JNC okcdpg ;FT. error ? ;AN000;
548 ; PUSH DI ;FT. ;AN000;
549 ; XOR AX,AX ;FT. make code page 0 ;AN000;
550 ; LES DI,DWORD PTR [SAVE_DI] ;FT. ;AN000;
551 ; ADD DI,[SAVE_BX] ;FT. es:di -> beginning of entry ;AN000;
552 ; MOV ES:[DI.EA_RC],EARCNOTFOUND ;FT. ;AN000;
553 ; POP DI ;FT. ;AN000;
554 ; JMP SHORT okcdpg ;FT. ;AN000;
556 ; MOV AX,[SI.sf_CodePage] ;FT. get code page from sft ;AN000;
558 ; STOSW ;FT. put in buffer ;AN000;
559 ; JMP SHORT gotea ;FT. ;AN000;
561 ; MOV AL,[SI.sf_ATTR_HI] ;FT. get high attribute ;AN000;
562 ; STOSB ;FT. put in buffer ;AN000;
565 ; POP SI ;FT. retore regs ;AN000;
566 ; POP DS ;FT. ;AN000;
567 ; return ;FT. ;AN000;
568 ;EndProc GET_VALUE ;AN000;
571 ; Input: [XA_handle] = device handle ;AN000;
572 ; [XA_type] = 4 , set ;AN000;
573 ; AX= code page (set)
575 ; Function: get or set device code page ;AN000;
576 ; Output: carry clear, AX= device code page (get) ;AN000;
577 ; carry set, error ;AN000;
579 ;procedure GSetDevCdPg,near ;AN000;
580 ; ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000;
582 ; invoke SAVE_WORLD ;FT. save all regs ;AN000;
583 ; CMP [XA_type],4 ;FT. set ? ;AN000;
584 ; JZ setpg ;FT. yes ;AN000;
585 ; MOV CX,6AH ;FT. get selected code page ;AN000;
586 ; JMP SHORT dogset ;FT. ;AN000;
588 ; MOV CX,4AH ;FT. set code page ;AN000;
591 ; invoke Save_World ;FT. save all regs ;AN000;
592 ; MOV BX,AX ;FT. bx= code page id ;AN000;
593 ; MOV AL,7 ;FT. get DBCS vectors ;AN000;
594 ; MOV DX,-1 ;FT. get current country ;AN000;
595 ; MOV CX,5 ;FT. minimum size ;AN000;
596 ; MOV DI,OFFSET DOSGROUP:DBCS_PACKET ;FT. ;AN000;
597 ; PUSH CS ;FT. ;AN000;
598 ; POP ES ;FT. ;AN000;
599 ; invoke $GetExtCntry ;FT. get DBCS vectors ;AN000;
600 ; JC nlsfunc_err ;FT. error ;AN000;
601 ; LDS SI,DWORD PTR DBCS_PACKET+1 ;FT. ;AN000;
602 ; LODSW ;FT. get vector length ;AN000;
603 ; MOV CX,AX ;FT. cx=length ;AN000;
605 ; MOV DI,OFFSET DOSGROUP:XA_PACKET+4 ;FT. ;AN000;
606 ; PUSH CS ;FT. ;AN000;
607 ; POP ES ;FT. ;AN000;
608 ; REP MOVSB ;FT. ;AN000;
611 ; invoke RESTORE_WORLD ;FT. restore all regs ;AN000;
612 ; JC deverr ;FT. ;AN000;
615 ; MOV WORD PTR [XA_PACKET+2],AX ;FT. ;AN000;
617 ; MOV BX,[XA_handle] ;FT. set up handle ;AN000;
618 ; PUSH CS ;FT. ds:dx -> packet ;AN000;
619 ; POP DS ;FT. ;AN000;
620 ; MOV DX,OFFSET DOSGROUP:XA_PACKET ;FT. ;AN000;
621 ; MOV AX,440CH ;FT. IOCTL to char device by handle ;AN000;
622 ; invoke $IOCTL ;FT. issue get code page ;AN000;
623 ; JC deverr ;FT. error ;AN000;
624 ; invoke RESTORE_WORLD ;FT. restore all regs ;AN000;
625 ; MOV AX,WORD PTR [XA_PACKET+2] ;FT. get code page ;AN000;
626 ; return ;FT. ;AN000;
628 ; invoke RESTORE_WORLD ;FT. restore all regs ;AN000;
629 ; return ;FT. exit ;AN000;
631 ;EndProc GSetDevCdPg ;AN000;
634 ; Input: DS:SI -> query list
636 ; Function: get max size ;AN000;
640 ;procedure Get_max_EA_size,NEAR ;AN000;
641 ; ASSUME CS:DOSGROUP,DS:NOTHING,ES:NOTHING,SS:DOSGROUP ;AN000;
643 ; CMP [SAVE_SI],0FFFFH ;FT. get all ? ;AN000;
644 ; JNZ scan_query ;FT. no ;AN000;
645 ; MOV CX,[MAX_EA_SIZE] ;FT. get max EA size ;AN000;
646 ; JMP SHORT gotit ;FT.
648 ; LDS SI,DWORD PTR [SAVE_SI] ;FT. ds:si -> query list ;AN000;
649 ; LODSW ;FT. ax= number of entries ;AN000;
650 ; MOV [SAVE_CX],AX ;FT. ;AN000;
651 ; XOR CX,CX ;FT. set initial size to 0 ;AN000;
652 ; OR AX,AX ;FT. if no entris ;AN000;
653 ; JZ gotit ;FT. then return ;AN000;
654 ; MOV CX,2 ;FT. at lesat 2 ;AN000;
656 ; CALL Search_EA ;FT. search EA ;AN000;
657 ; JC serror ;FT. wrong EA ;AN000;
658 ; ADD CX,size EA ;FT. get EA size ;AN000;
659 ; ADD CL,ES:[DI.EA_NAMELEN] ;FT. ;AN000;
660 ; ADC CH,0 ;FT. ;AN000;
661 ; ADD CX,ES:[DI.EA_VALLEN] ;FT. ;AN000;
662 ; DEC CX ;FT. ;AN000;
663 ; DEC [SAVE_CX] ;FT. end of entris ;AN000;
664 ; JZ gotit ;FT. no ;AN000;
665 ; MOV AL,[SI.QEA_NAMELEN] ;FT. update to next QEA ;AN000;
666 ; XOR AH,AH ;FT. update to next QEA ;AN000;
667 ; ADD SI,AX ;FT. update to next QEA ;AN000;
668 ; ADD SI,size QEA ;FT. ;AN000;
669 ; DEC SI ;FT. ;AN000;
670 ; JMP next_QEA ;FT. do next ;AN000;
672 ; MOV AX,error_invalid_data ;FT. set initial size to 0 ;AN000;
674 ; return ;FT. exit ;AN000;;FT. exit ;AN000;
676 ;EndProc Get_max_EA_size ;FT. exit ;AN000; ;AN000;