Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

221 lines
4.7 KiB

DOSDATA Segment
;
; first and second DOS patches
; Non-console device read/write (system calls 3Fh and 40h)
;
; Code in disk.asm, 2 locations, one for read, one for write
; DVRDLP:
; DVWRTLP:
;
;
; 036h lds si,SS:[????] ; ThisSFT
; lds si,si+7 ; sf_devptr
; 0E8h call ???? <- "simulate" int28 event ; DSKSTATCHK
;
;
DOSP1_ID db 036h,0C5h,036h
DOSP1_THISSFT db 036h,005h,0C5h,074h,007h,0E8h
DOSP1_ID_LEN equ $-DOSP1_ID
db 90h, 90h
DOSP12_ID db 036h,0C5h,036h
DOSP12_THISSFT db 036h,005h,0C5h,074h,007h,0E8h
DOSP12_ID_LEN equ $-DOSP1_ID
;
; Third/Fourth DOS patch - System call 3Fh (Read) from console
;
; Code in disk.asm, 1 location
; GETBUF:
;
; 051h push cx <- begin special int28 mode
; push es
; push di
; mov dx,???? ; offset dosgroup:CONBUF
; call ???? ; $STD_CON_STRING_INPUT
; pop di
; pop es
; 059h pop cx <- end special int28 mode
;
DOSP3_ID db 051h,006h,057h,0BAh
DOSP3_CONBUF db 029h,002h,0E8h
DOSP3_ID_LEN equ $-DOSP3_ID
db 09Ah,0E3h,05Fh,007h ; ???? , pop di, pop es
DOSP4_ID db 059h ; pop cx
DOSP4_ID_OFF equ (DOSP4_ID - DOSP3_ID)
;
; Fifth DOS patch - System call 40h (Write) to console
;
;
; Code in disk.asm, 1 location
;
; push cx
; WRCONLP: lodsb
; cmp al,1Ah
; jz ????
; call ???? <- "simulate" int28 event
; loop WRCONLP
; CONEOF: pop ax
;
DOSP5_ID db 051h ; push cx
db 0ACh,03Ch,01Ah,074h,005h
db 0E8h ; call
DOSP5_ID_LEN equ $-DOSP5_ID
;
; Seventh DOS patch - System call entry, patch USER_ID with VMid for share
;
; Code in disp.asm, 1 location
;
;
; mov [SaveDS],ds
; mov [SaveBX],bx
; mov bx,cs
; mov ds,bx
; inc [indos]
; xor ax,ax
; mov [USER_ID],AX <- Patch to set USER_ID to VMID
;
;
DOSP7_ID db 02Eh,08Ch,01Eh
DOSP7_SAVEDS db 07Eh,05h ; mov [SaveDS],ds
db 02Eh,089h,01Eh
DOSP7_SAVEBX db 07Ch,05h ; mov [SaveBX],bx
db 08Ch,0CBh ; mov bx,cs
db 08Eh,0DBh ; mov ds,bx
db 0FEh,006h
DOSP7_INDOS db 0CFh,002h ; inc [indos]
db 033h,0C0h ; xor ax,ax
DOSP7_ID_LEN equ $-DOSP7_ID
;
; Eighth DOS patch - OWNER check in handle calls. For share, need to NOP test
;
; Code in handle.asm, 1 location in routine CheckOwner
;
;
;
; push ax
; mov ax,ss:[USER_ID] <- patch to XOR AX,AX to set zero
; cmp ax,es:[di.sf_UID] <- NOP
; pop ax
; jz ????
;
;
;
DOSP8_ID db 050h ; push ax
db 036h,0A1h
DOSP8_USER_ID db 0EAh,002h ; mov ax,ss:[USER_ID]
db 026h,03Bh,045h ; cmp ax,es:[di+2F]
DOSP8_ID_LEN equ $-DOSP8_ID
db 02Fh,058h ; pop ax
;
; 10th, 11th, 12th DOS patch - System call 3Fh (Read) in raw mode
;
; Take RAW read to STDIN SFT and turn it into a polling loop doing
; a yeild when a character is not ready to be read.
;
; Code in disk.asm, 3 locations
;
; DVRDRAW:
; PUSH ES
; POP DS
; ReadRawRetry: <- Patch 10
; MOV BX,DI
; XOR AX,AX <- Reenter #2
; MOV DX,AX
; call SETREAD
; PUSH DS <- Reenter #1
; LDS SI,[THISSFT]
; call DEVIOCALL
; MOV DX,DI
; MOV AH,86H
; MOV DI,[DEVCALL.REQSTAT]
; TEST DI,STERR
; JZ CRDROK
; call CHARHARD
; MOV DI,DX
; OR AL,AL
; JZ CRDROK
; CMP AL,3
; JZ CRDFERR
; POP DS
; JMP ReadRawRetry
;
; CRDFERR:
; POP DI <- Patch 11
; DEVIOFERR:
; LES DI,[THISSFT]
; jmp SET_ACC_ERR_DS
;
; CRDROK:
; POP DI <- Patch 12
; MOV DI,DX
; ADD DI,[CALLSCNT]
; JMP SHORT ENDRDDEVJ3
;
;
DOSP10_ID db 006H,01FH
DOSP10_LOC_OFFSET equ $-DOSP10_ID
DOSP10_LOC db 08BH,0DFH
DOSP10_REENT2_OFFSET equ $-DOSP10_LOC
db 033H,0C0H,08BH,0D0H,0E8H
DOSP10_ID_LEN equ $-DOSP10_ID
db 0DFH,00EH
DOSP10_REENT1_OFFSET equ $-DOSP10_LOC
db 01EH,036H,0C5H,036H,036H,005H,0E8H,0AFH,00EH
db 08BH,0D7H,0B4H,086H,036H,08BH,03EH
DOSP10_PACKVAL_OFFSET equ $-DOSP10_ID
db 009H,003H
db 0F7H,0C7H,000H,080H,074H,019H,0E8H,047H,017H
db 08BH,0FAH,00AH,0C0H,074H,010H,03CH,003H,074H,003H
db 01FH,0EBH,0CFH
DOSP11_LOC_OFFSET equ $-DOSP10_ID
db 05FH
DOSP11_REENT_OFFSET equ $-DOSP10_LOC
db 036H,0C4H,03EH,036H,005H,0E9H,0A1H,004H
DOSP12_LOC_OFFSET equ $-DOSP10_ID
db 05FH,08BH,0FAH
;
; 13th DOS patch - Actually a SYSINIT patch. Patches the stack fault code
; which prints the fatal stack fault error on DOS >= 3.20.
;
; Sets focus to current VM so user can see fatal message.
;
;
; l0: lodsb <- Setfocus here
; cmp al, '$'
; je l1
; mov bl, 7
; mov ah, 0Eh
; int 10h
; jmp l0
; l1: jmp $
;
;
;
DOSP13_ID db 0ACh ; l0: lodsb
db 03Ch,024h ; cmp al, '$'
db 074h,008h ; je l1
db 0B3h,007h ; mov bl, 7
db 0B4h,00Eh ; mov ah, 0Eh
db 0CDh,010h ; int 10h
db 0EBh,0F3h ; jmp l0
db 0EBh,0FEh ; l1: jmp $
DOSP13_ID_LEN equ $-DOSP13_ID
DOSDATA ends