add hd_load to russian livecd
git-svn-id: svn://kolibrios.org@2783 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
202
programs/hd_load/9x2klbr/9x2klbr.asm
Normal file
202
programs/hd_load/9x2klbr/9x2klbr.asm
Normal file
@@ -0,0 +1,202 @@
|
||||
format PE GUI 4.0
|
||||
section '.text' code readable executable
|
||||
entry start
|
||||
start:
|
||||
push ebp
|
||||
mov ebp, info
|
||||
xor ebx, ebx
|
||||
; set current directory to exe dir
|
||||
push 300
|
||||
push ebp
|
||||
push ebx
|
||||
call [GetModuleFileNameA]
|
||||
lea edi, [ebp+eax]
|
||||
xchg eax, ecx
|
||||
mov al, '\'
|
||||
std
|
||||
repnz scasb
|
||||
cld
|
||||
jz @f
|
||||
pop ebp
|
||||
ret
|
||||
@@:
|
||||
mov byte [edi+1], bl
|
||||
push ebp
|
||||
call [SetCurrentDirectoryA]
|
||||
; parse command line
|
||||
call [GetCommandLineA]
|
||||
xchg eax, esi
|
||||
; skip leading spaces
|
||||
@@:
|
||||
lodsb
|
||||
cmp al, 0
|
||||
jz cmdlineend
|
||||
cmp al, ' '
|
||||
jbe @b
|
||||
cmp al, '"'
|
||||
jz p
|
||||
; skip EXE name
|
||||
@@:
|
||||
lodsb
|
||||
cmp al, ' '
|
||||
ja @b
|
||||
dec esi
|
||||
jmp q
|
||||
p:
|
||||
lodsb
|
||||
cmp al, 0
|
||||
jz cmdlineend
|
||||
cmp al, '"'
|
||||
jnz p
|
||||
q:
|
||||
; skip leading spaces
|
||||
lodsb
|
||||
cmp al, 0
|
||||
jz cmdlineend
|
||||
cmp al, ' '
|
||||
jbe q
|
||||
dec esi
|
||||
; now esi points to 1st argument
|
||||
jmp @f
|
||||
cmdlineend:
|
||||
mov esi, def
|
||||
@@:
|
||||
mov al, 'c'
|
||||
cmp byte [esi+1], ':'
|
||||
jnz @f
|
||||
lodsb
|
||||
inc esi
|
||||
@@:
|
||||
mov [ebp], al
|
||||
lodsb
|
||||
cmp al, '\'
|
||||
jz paramsok
|
||||
usage:
|
||||
mov esi, usagemsg
|
||||
jmp failmsg
|
||||
paramsok:
|
||||
cmp byte [esi], '\'
|
||||
jz usage
|
||||
mov edi, esi
|
||||
mov al, 0
|
||||
xor ecx, ecx
|
||||
dec ecx
|
||||
repnz scasb
|
||||
not ecx
|
||||
cmp ecx, 290
|
||||
jae usage
|
||||
lea edi, [ebp+1]
|
||||
cmp ecx, 1
|
||||
rep movsb
|
||||
jz copydefname
|
||||
cmp byte [edi-2], '\'
|
||||
jnz namegiven
|
||||
copydefname:
|
||||
dec edi
|
||||
mov ecx, defnamesz
|
||||
mov esi, defname
|
||||
rep movsb
|
||||
namegiven:
|
||||
push ebx ; hTemplateFile
|
||||
; push 0x04000000 ; dwFlagsAndAttributes = FILE_FLAG_DELETE_ON_CLOSE
|
||||
push ebx
|
||||
push ebx ; dwCreationDisposition
|
||||
push ebx ; lpSecurityAttributes
|
||||
push ebx ; dwShareMode
|
||||
push ebx ; dwDesiredAccess
|
||||
push name ; lpFileName
|
||||
call [CreateFileA]
|
||||
inc eax
|
||||
mov esi, errmsg
|
||||
jz failmsg
|
||||
dec eax
|
||||
push ebx
|
||||
push ebx
|
||||
push ebx
|
||||
push ebx
|
||||
sub edi, ebp
|
||||
push edi
|
||||
push ebp
|
||||
push 0Fh
|
||||
push eax
|
||||
call [DeviceIoControl]
|
||||
test eax, eax
|
||||
mov esi, errmsg2
|
||||
jz failmsg
|
||||
push ebx
|
||||
push 2 ; EWX_REBOOT
|
||||
call [ExitWindowsEx]
|
||||
pop ebp
|
||||
ret
|
||||
failmsg:
|
||||
push ebx
|
||||
push ebx
|
||||
push esi
|
||||
push ebx
|
||||
call [MessageBoxA]
|
||||
pop ebp
|
||||
ret
|
||||
|
||||
align 4
|
||||
data import
|
||||
dd 0,0,0
|
||||
dd rva kernel32_name
|
||||
dd rva kernel32_thunks
|
||||
dd 0,0,0
|
||||
dd rva user32_name
|
||||
dd rva user32_thunks
|
||||
dd 0,0,0,0,0
|
||||
kernel32_thunks:
|
||||
CreateFileA dd rva CreateFileA_thunk
|
||||
CloseHandle dd rva CloseHandle_thunk
|
||||
DeviceIoControl dd rva DeviceIoControl_thunk
|
||||
GetCommandLineA dd rva GetCommandLineA_thunk
|
||||
SetCurrentDirectoryA dd rva SetCurrentDirectoryA_thunk
|
||||
GetModuleFileNameA dd rva GetModuleFileNameA_thunk
|
||||
dd 0
|
||||
user32_thunks:
|
||||
MessageBoxA dd rva MessageBoxA_thunk
|
||||
ExitWindowsEx dd rva ExitWindowsEx_thunk
|
||||
dw 0
|
||||
CreateFileA_thunk:
|
||||
dw 0
|
||||
db 'CreateFileA'
|
||||
CloseHandle_thunk:
|
||||
dw 0
|
||||
db 'CloseHandle'
|
||||
DeviceIoControl_thunk:
|
||||
dw 0
|
||||
db 'DeviceIoControl'
|
||||
GetCommandLineA_thunk:
|
||||
dw 0
|
||||
db 'GetCommandLineA'
|
||||
SetCurrentDirectoryA_thunk:
|
||||
dw 0
|
||||
db 'SetCurrentDirectoryA'
|
||||
GetModuleFileNameA_thunk:
|
||||
dw 0
|
||||
db 'GetModuleFileNameA'
|
||||
MessageBoxA_thunk:
|
||||
dw 0
|
||||
db 'MessageBoxA'
|
||||
ExitWindowsEx_thunk:
|
||||
dw 0
|
||||
db 'ExitWindowsEx',0
|
||||
kernel32_name db 'kernel32.dll',0
|
||||
user32_name db 'user32.dll',0
|
||||
end data
|
||||
|
||||
section '.data' data readable writable
|
||||
data resource from 'klbrico.res'
|
||||
end data
|
||||
|
||||
name db '\\.\'
|
||||
vxdfilename db 'ldklbr.vxd',0
|
||||
errmsg db 'Cannot load driver',0
|
||||
errmsg2 db 'Invalid parameter',0
|
||||
usagemsg db 'Usage: 9x2klbr [[drive:]\[path\][imagename]]',0
|
||||
def db '\'
|
||||
defname db 'kolibri.img',0
|
||||
defnamesz = $ - defname
|
||||
|
||||
info rb 300
|
23
programs/hd_load/9x2klbr/DEFFILE.DEF
Normal file
23
programs/hd_load/9x2klbr/DEFFILE.DEF
Normal file
@@ -0,0 +1,23 @@
|
||||
VXD LDKLBR DYNAMIC
|
||||
|
||||
SEGMENTS
|
||||
_LPTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
|
||||
_LTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
|
||||
_LDATA CLASS 'LCODE' PRELOAD NONDISCARDABLE
|
||||
_TEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
|
||||
_DATA CLASS 'LCODE' PRELOAD NONDISCARDABLE
|
||||
CONST CLASS 'LCODE' PRELOAD NONDISCARDABLE
|
||||
_TLS CLASS 'LCODE' PRELOAD NONDISCARDABLE
|
||||
_BSS CLASS 'LCODE' PRELOAD NONDISCARDABLE
|
||||
_ITEXT CLASS 'ICODE' DISCARDABLE
|
||||
_IDATA CLASS 'ICODE' DISCARDABLE
|
||||
_PTEXT CLASS 'PCODE' NONDISCARDABLE
|
||||
_PDATA CLASS 'PDATA' NONDISCARDABLE SHARED
|
||||
_STEXT CLASS 'SCODE' RESIDENT
|
||||
_SDATA CLASS 'SCODE' RESIDENT
|
||||
_16ICODE CLASS '16ICODE' PRELOAD DISCARDABLE
|
||||
_RCODE CLASS 'RCODE'
|
||||
|
||||
EXPORTS
|
||||
|
||||
LDKLBR_DDB @1
|
BIN
programs/hd_load/9x2klbr/Klbrico.res
Normal file
BIN
programs/hd_load/9x2klbr/Klbrico.res
Normal file
Binary file not shown.
178
programs/hd_load/9x2klbr/V86MMGR.INC
Normal file
178
programs/hd_load/9x2klbr/V86MMGR.INC
Normal file
@@ -0,0 +1,178 @@
|
||||
;******************************************************************************
|
||||
;
|
||||
; (C) Copyright MICROSOFT Corp., 1988-1990
|
||||
;
|
||||
; Title: V86MMGR.Inc - Public services for V86MMGR
|
||||
;
|
||||
; Version: 2.00
|
||||
;
|
||||
; Date: 29-Nov-88
|
||||
;
|
||||
; Author: ARR
|
||||
;
|
||||
;------------------------------------------------------------------------------
|
||||
;
|
||||
; Change log:
|
||||
;
|
||||
; DATE REV DESCRIPTION
|
||||
; ----------- --- -----------------------------------------------------------
|
||||
; 29-Nov-1988 ARR Original
|
||||
; 26-Apr-1989 RAL New mapper services
|
||||
;
|
||||
;==============================================================================
|
||||
|
||||
Begin_Service_Table V86MMGR
|
||||
|
||||
V86MMGR_Service V86MMGR_Get_Version, LOCAL
|
||||
V86MMGR_Service V86MMGR_Allocate_V86_Pages, LOCAL
|
||||
V86MMGR_Service V86MMGR_Set_EMS_XMS_Limits, LOCAL
|
||||
V86MMGR_Service V86MMGR_Get_EMS_XMS_Limits, LOCAL
|
||||
;
|
||||
; Services used for API mapping.
|
||||
;
|
||||
V86MMGR_Service V86MMGR_Set_Mapping_Info, VxD_ICODE
|
||||
V86MMGR_Service V86MMGR_Get_Mapping_Info
|
||||
V86MMGR_Service V86MMGR_Xlat_API
|
||||
V86MMGR_Service V86MMGR_Load_Client_Ptr
|
||||
V86MMGR_Service V86MMGR_Allocate_Buffer
|
||||
V86MMGR_Service V86MMGR_Free_Buffer
|
||||
V86MMGR_Service V86MMGR_Get_Xlat_Buff_State
|
||||
V86MMGR_Service V86MMGR_Set_Xlat_Buff_State
|
||||
V86MMGR_Service V86MMGR_Get_VM_Flat_Sel
|
||||
V86MMGR_Service V86MMGR_Map_Pages
|
||||
V86MMGR_Service V86MMGR_Free_Page_Map_Region
|
||||
;***********************************************************
|
||||
; END OF 3.00 level services
|
||||
;
|
||||
V86MMGR_Service V86MMGR_LocalGlobalReg
|
||||
V86MMGR_Service V86MMGR_GetPgStatus, LOCAL
|
||||
V86MMGR_Service V86MMGR_SetLocalA20, VxD_ICODE
|
||||
V86MMGR_Service V86MMGR_ResetBasePages, LOCAL
|
||||
V86MMGR_Service V86MMGR_SetAvailMapPgs, VxD_ICODE
|
||||
V86MMGR_Service V86MMGR_NoUMBInitCalls, VxD_ICODE
|
||||
|
||||
IFNDEF WIN31COMPAT
|
||||
|
||||
; Services added post Win 3.1
|
||||
V86MMGR_Service V86MMGR_Get_EMS_XMS_Avail, LOCAL
|
||||
V86MMGR_Service V86MMGR_Toggle_HMA
|
||||
V86MMGR_Service V86MMGR_Dev_Init, LOCAL
|
||||
V86MMGR_Service V86MMGR_Alloc_UM_Page, LOCAL
|
||||
|
||||
ENDIF ; WIN31COMPAT
|
||||
|
||||
ifdef NEC_98
|
||||
;;V86MMGR_Service V86MMGR_EMM_B0Bank_CHK
|
||||
V86MMGR_Service V86MMGR_Check_NHSupport, LOCAL
|
||||
endif
|
||||
|
||||
End_Service_Table V86MMGR
|
||||
|
||||
;
|
||||
; BITS of returned EAX flags for V86MMGR_GetPgStatus
|
||||
;
|
||||
V86PS_ROM equ 0000000000000001b ; Page contains global ROM
|
||||
V86PS_RAM equ 0000000000000010b ; Page contains global RAM
|
||||
V86PS_EMM equ 0000000010000000b ; Page belongs to EMM driver
|
||||
V86PS_XMS equ 0000000100000000b ; Page belongs to XMS driver
|
||||
V86PS_MAP equ 0000001000000000b ; Page belongs to mapper
|
||||
V86PS_UMB equ 0001000000000000b ; Page contains imported UMB
|
||||
; (Note that V86PS_XMS is not
|
||||
; necessarily set)
|
||||
|
||||
;
|
||||
; BITS of ECX flags for V86MMGR_Allocate_V86_Pages
|
||||
;
|
||||
AV86PLocked EQU 00000000000000000000000000000001B
|
||||
AV86PLockedBit EQU 0 ; VM memory is to be
|
||||
; ALWAYS LOCKED regardless of
|
||||
; pager type or whether VM
|
||||
; is suspended.
|
||||
;
|
||||
; BITS of ECX flags for V86MMGR_Set_EMS_XMS_Limits
|
||||
;
|
||||
; NOTE: If neither Limit_DisableHMA or Limit_EnableHMA is set, the HMA
|
||||
; state is not altered.
|
||||
;
|
||||
EMS_XMS_Limit_DisableHMA EQU 00000000000000000000000000000001B
|
||||
EMS_XMS_Limit_DisableHMABit EQU 0
|
||||
EMS_XMS_Limit_EnableHMA EQU 00000000000000000000000000000010B
|
||||
EMS_XMS_Limit_EnableHMABit EQU 1
|
||||
EMS_XMS_Limit_XMS_Is_Locked EQU 00000000000000000000000000000100B
|
||||
EMS_XMS_Limit_XMS_Is_LockedBit EQU 2
|
||||
EMS_XMS_Limit_EMS_Is_Locked EQU 00000000000000000000000000001000B
|
||||
EMS_XMS_Limit_EMS_Is_LockedBit EQU 3
|
||||
|
||||
|
||||
|
||||
;
|
||||
; API mapper equates and macros
|
||||
;
|
||||
|
||||
Xlat_Exec_Int EQU 000h
|
||||
Xlat_Fixed_Len EQU 001h
|
||||
Xlat_Var_Len EQU 002h
|
||||
Xlat_Calc_Len EQU 003h
|
||||
Xlat_ASCIIZ EQU 004h
|
||||
Xlat_Jmp_To_Proc EQU 005h
|
||||
Xlat_Return_Ptr EQU 006h
|
||||
Xlat_Return_Seg EQU 007h
|
||||
Xlat_ASCIIZ_InOut EQU 008h
|
||||
|
||||
|
||||
Xlat_API_Exec_Int MACRO Int_Number
|
||||
db Xlat_Exec_Int
|
||||
db Int_Number
|
||||
ENDM
|
||||
|
||||
Xlat_API_Fixed_Len MACRO Ptr_Seg, Ptr_Off, Length
|
||||
db Xlat_Fixed_Len
|
||||
dw Length
|
||||
dw (Client_&Ptr_Seg*100h)+Client_&Ptr_Off
|
||||
ENDM
|
||||
|
||||
Xlat_API_Var_Len MACRO Ptr_Seg, Ptr_Off, Len_Reg
|
||||
db Xlat_Var_Len
|
||||
db Client_&Len_Reg
|
||||
dw (Client_&Ptr_Seg*100h)+Client_&Ptr_Off
|
||||
ENDM
|
||||
|
||||
Xlat_API_Calc_Len MACRO Ptr_Seg, Ptr_Off, Calc_Proc_Addr
|
||||
db Xlat_Calc_Len
|
||||
dd OFFSET32 Calc_Proc_Addr
|
||||
dw (Client_&Ptr_Seg*100h)+Client_&Ptr_Off
|
||||
ENDM
|
||||
|
||||
Xlat_API_ASCIIZ MACRO Ptr_Seg, Ptr_Off
|
||||
db Xlat_ASCIIZ
|
||||
dw (Client_&Ptr_Seg*100h)+Client_&Ptr_Off
|
||||
ENDM
|
||||
|
||||
Xlat_API_ASCIIZ_InOut MACRO Ptr_Seg, Ptr_Off
|
||||
db Xlat_ASCIIZ_InOut
|
||||
dw (Client_&Ptr_Seg*100h)+Client_&Ptr_Off
|
||||
ENDM
|
||||
|
||||
Xlat_API_Jmp_To_Proc MACRO Proc_Name
|
||||
db Xlat_Jmp_To_Proc
|
||||
dd OFFSET32 Proc_Name
|
||||
ENDM
|
||||
|
||||
|
||||
Xlat_API_Return_Ptr MACRO Ptr_Seg, Ptr_Off
|
||||
db Xlat_Return_Ptr
|
||||
dw (Client_&Ptr_Seg*100h)+Client_&Ptr_Off
|
||||
ENDM
|
||||
|
||||
Xlat_API_Return_Seg MACRO Ptr_Seg
|
||||
db Xlat_Return_Seg
|
||||
db Client_&Ptr_Seg
|
||||
ENDM
|
||||
|
||||
;
|
||||
; The V86MMGR does W386_Device_Broadcast call outs. The 'subfunction' number
|
||||
; for these call outs is contained in the CX register. These are the equates
|
||||
; for the subfunction numbers.
|
||||
;
|
||||
V86CallOut_LclA20forGlblHMA equ 0 ; Should A20 state be local
|
||||
; even if HMA is GLOBAL?
|
4522
programs/hd_load/9x2klbr/VMM.INC
Normal file
4522
programs/hd_load/9x2klbr/VMM.INC
Normal file
File diff suppressed because it is too large
Load Diff
1
programs/hd_load/9x2klbr/comp_ldr.bat
Normal file
1
programs/hd_load/9x2klbr/comp_ldr.bat
Normal file
@@ -0,0 +1 @@
|
||||
fasm 9x2klbr.asm 9x2klbr.exe
|
12
programs/hd_load/9x2klbr/compile.txt
Normal file
12
programs/hd_load/9x2klbr/compile.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> mtldr <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> VxD.
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> VxD <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> VxD.
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> exe-<2D><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> exe-<2D><><EFBFBD><EFBFBD><EFBFBD>.
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mtldr <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mtldr <20> inc-<2D><><EFBFBD><EFBFBD>,
|
||||
<09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> masm'<27>. <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> bintodb (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> masm):
|
||||
File->Open->mtldr, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
||||
File->Save->mtldr.inc.
|
||||
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mtldr <20> 9x2klbr.exe <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> fasm, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ldklbr.vxd
|
||||
<09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> masm.
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> bat-<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
diamond
|
||||
mailto: diamondz@land.ru
|
2
programs/hd_load/9x2klbr/make_vxd.bat
Normal file
2
programs/hd_load/9x2klbr/make_vxd.bat
Normal file
@@ -0,0 +1,2 @@
|
||||
ml /coff /c /Cx /DMASM6 /DBLD_COFF /DIS_32 vxd.asm
|
||||
link /vxd /stub:masmstub /def:deffile.def vxd.obj
|
BIN
programs/hd_load/9x2klbr/masmstub
Normal file
BIN
programs/hd_load/9x2klbr/masmstub
Normal file
Binary file not shown.
BIN
programs/hd_load/9x2klbr/mtldr
Normal file
BIN
programs/hd_load/9x2klbr/mtldr
Normal file
Binary file not shown.
204
programs/hd_load/9x2klbr/mtldr.inc
Normal file
204
programs/hd_load/9x2klbr/mtldr.inc
Normal file
@@ -0,0 +1,204 @@
|
||||
mtldr_size = 3224
|
||||
mtldr:
|
||||
db 255,255,255,255,128,208,12,250,176,17,230,32,227,0,230,160
|
||||
db 227,0,176,8,230,33,227,0,176,112,230,161,227,0,176,4
|
||||
db 230,33,227,0,176,2,230,161,227,0,176,1,230,33,227,0
|
||||
db 230,161,227,0,176,0,230,33,227,0,230,161,227,0,184,3
|
||||
db 0,205,16,176,52,230,67,227,0,176,255,230,64,227,0,230
|
||||
db 64,227,0,184,1,194,205,21,233,184,1,172,132,192,116,9
|
||||
db 180,14,187,7,0,205,16,235,242,195,102,3,6,0,208,102
|
||||
db 96,102,59,6,152,220,114,55,128,62,228,208,0,116,93,102
|
||||
db 104,0,0,0,0,102,80,6,83,102,104,16,0,1,0,184
|
||||
db 0,66,138,22,4,208,137,230,30,22,31,205,19,31,131,196
|
||||
db 16,102,97,114,55,129,195,0,2,102,64,73,117,193,195,102
|
||||
db 49,210,102,15,183,14,158,220,102,247,241,254,194,136,209,102
|
||||
db 15,164,194,16,247,54,156,220,136,214,136,197,192,228,6,8
|
||||
db 225,184,1,2,138,22,4,208,205,19,235,197,190,229,208,232
|
||||
db 121,255,235,254,0,68,105,115,107,32,114,101,97,100,32,101
|
||||
db 114,114,111,114,33,0,2,32,75,111,108,105,98,114,105,79
|
||||
db 83,32,98,111,111,116,108,111,97,100,101,114,44,32,114,117
|
||||
db 110,110,105,110,103,32,111,110,32,0,117,110,107,110,111,119
|
||||
db 110,32,102,105,108,101,115,121,115,116,101,109,44,32,99,97
|
||||
db 110,110,111,116,32,99,111,110,116,105,110,117,101,0,70,65
|
||||
db 84,49,50,47,70,65,84,49,54,32,45,32,117,110,115,117
|
||||
db 112,112,111,114,116,101,100,13,10,0,70,65,84,51,50,13
|
||||
db 10,0,78,84,70,83,13,10,0,69,114,114,111,114,58,32
|
||||
db 0,77,70,84,0,92,0,36,73,78,68,69,88,95,82,79
|
||||
db 79,84,32,110,111,116,32,102,111,117,110,100,0,99,97,110
|
||||
db 110,111,116,32,114,101,97,100,32,97,116,116,114,105,98,117
|
||||
db 116,101,0,36,68,65,84,65,32,110,111,116,32,102,111,117
|
||||
db 110,100,0,105,115,32,97,32,100,105,114,101,99,116,111,114
|
||||
db 121,0,110,111,116,32,97,32,100,105,114,101,99,116,111,114
|
||||
db 121,0,116,111,111,32,102,114,97,103,109,101,110,116,101,100
|
||||
db 32,102,105,108,101,0,101,120,116,101,110,100,101,100,32,109
|
||||
db 101,109,111,114,121,32,101,114,114,111,114,0,98,97,100,32
|
||||
db 99,108,117,115,116,101,114,0,100,97,116,97,32,101,114,114
|
||||
db 111,114,0,49,192,142,216,142,192,142,208,102,188,254,255,0
|
||||
db 0,252,251,138,22,4,208,180,8,205,19,115,5,185,255,255
|
||||
db 136,206,15,182,198,64,163,156,220,136,202,131,226,63,137,22
|
||||
db 158,220,247,226,134,205,192,237,6,65,137,14,160,220,247,225
|
||||
db 163,152,220,137,22,154,220,138,22,4,208,180,65,187,170,85
|
||||
db 205,19,114,15,129,251,85,170,117,9,246,193,1,116,4,254
|
||||
db 6,228,208,190,246,208,232,226,253,102,161,0,208,102,131,248
|
||||
db 255,117,20,102,49,192,185,1,0,187,0,5,232,224,253,102
|
||||
db 161,198,6,102,163,0,208,185,1,0,187,0,5,232,207,253
|
||||
db 15,182,6,13,5,163,172,220,102,129,62,54,5,70,65,84
|
||||
db 49,116,29,102,129,62,82,5,70,65,84,51,116,26,102,129
|
||||
db 62,3,5,78,84,70,83,15,132,231,0,232,141,253,235,254
|
||||
db 190,62,209,232,133,253,235,254,190,90,209,232,125,253,102,15
|
||||
db 183,6,11,5,102,15,182,30,13,5,102,247,227,102,163,180
|
||||
db 220,102,15,183,30,14,5,102,137,30,200,220,102,15,182,6
|
||||
db 16,5,102,247,38,36,5,102,1,216,102,15,182,30,13,5
|
||||
db 102,41,216,102,41,216,102,163,166,220,129,6,5,208,0,208
|
||||
db 102,161,44,5,199,6,164,220,117,209,80,139,54,5,208,86
|
||||
db 172,60,92,116,4,60,0,117,247,103,135,68,36,2,198,68
|
||||
db 255,0,137,54,5,208,232,114,3,89,132,201,116,13,246,69
|
||||
db 11,16,190,194,209,15,132,58,3,235,207,246,69,11,16,190
|
||||
db 179,209,15,133,45,3,191,5,0,104,0,32,7,38,198,69
|
||||
db 251,1,38,102,199,69,252,1,0,0,0,102,171,6,30,7
|
||||
db 232,242,3,7,115,36,38,102,139,77,248,38,102,3,77,252
|
||||
db 102,57,200,116,14,38,102,199,5,1,0,0,0,102,175,102
|
||||
db 171,235,218,38,102,255,69,248,235,211,102,49,192,102,171,233
|
||||
db 184,0,190,98,209,232,163,252,102,15,183,6,11,5,102,80
|
||||
db 102,15,182,30,13,5,102,247,227,102,163,180,220,102,199,6
|
||||
db 166,220,0,0,0,0,102,139,14,64,5,128,249,0,127,12
|
||||
db 246,217,102,49,192,102,64,102,211,224,235,3,102,247,225,102
|
||||
db 163,184,220,102,91,102,49,210,102,247,243,163,188,220,199,6
|
||||
db 164,220,113,209,102,15,182,6,13,5,102,247,38,48,5,139
|
||||
db 14,188,220,187,0,64,137,223,83,232,78,252,232,152,3,95
|
||||
db 184,128,0,187,0,7,232,39,4,190,163,209,15,130,99,2
|
||||
db 137,30,162,220,129,6,5,208,0,208,102,184,5,0,0,0
|
||||
db 199,6,164,220,117,209,80,139,54,5,208,86,172,60,92,116
|
||||
db 4,60,0,117,247,103,135,68,36,2,198,68,255,0,137,54
|
||||
db 5,208,232,121,6,89,132,201,117,220,49,246,6,15,161,100
|
||||
db 172,60,0,190,141,209,15,132,25,2,190,1,0,102,49,255
|
||||
db 104,0,16,7,49,219,100,102,173,102,145,103,227,66,100,102
|
||||
db 173,102,96,102,15,182,14,13,5,102,247,225,102,3,6,166
|
||||
db 220,232,198,251,180,135,102,139,14,180,220,102,81,209,233,190
|
||||
db 83,214,6,30,7,205,21,7,132,228,190,230,209,15,133,210
|
||||
db 1,102,89,102,1,14,109,214,102,97,102,64,226,195,235,182
|
||||
db 30,7,199,6,164,220,141,220,102,49,192,187,0,5,185,1
|
||||
db 0,232,46,1,161,14,5,3,6,28,5,163,200,220,147,15
|
||||
db 182,6,16,5,247,38,22,5,1,216,187,0,7,139,14,17
|
||||
db 5,131,193,15,193,233,4,232,8,1,1,200,163,170,220,193
|
||||
db 225,9,137,223,1,203,198,7,0,128,61,0,190,169,209,15
|
||||
db 132,112,1,190,141,220,232,237,1,116,8,131,231,224,131,199
|
||||
db 32,235,230,131,231,224,190,179,209,246,69,11,16,15,133,82
|
||||
db 1,139,69,26,80,72,72,15,182,14,13,5,247,225,3,6
|
||||
db 170,220,163,174,220,247,54,172,220,102,15,183,192,104,0,32
|
||||
db 31,190,1,0,102,43,4,114,17,102,131,60,0,104,141,209
|
||||
db 15,132,32,1,89,131,198,8,235,234,102,3,4,102,3,68
|
||||
db 4,106,0,31,102,15,183,14,172,220,82,102,247,225,90,102
|
||||
db 15,183,210,102,1,208,102,3,6,166,220,102,163,176,220,88
|
||||
db 104,0,16,7,80,49,219,232,87,0,193,225,5,140,192,1
|
||||
db 200,142,192,88,232,13,0,114,235,184,75,76,190,130,220,234
|
||||
db 0,0,0,16,187,0,7,80,209,232,103,3,4,36,137,194
|
||||
db 193,232,9,3,6,200,220,185,2,0,6,30,7,232,50,0
|
||||
db 7,129,226,255,1,1,211,139,7,89,247,193,1,0,116,3
|
||||
db 193,232,4,37,255,15,190,252,209,61,247,15,15,132,147,0
|
||||
db 195,72,72,15,182,14,13,5,247,225,3,6,170,220,102,15
|
||||
db 183,192,102,96,102,15,183,219,190,83,214,102,193,224,9,102
|
||||
db 5,0,0,16,147,102,137,68,18,102,184,0,0,48,9,140
|
||||
db 192,102,193,224,4,102,1,216,102,137,68,26,180,135,193,225
|
||||
db 8,6,106,0,7,205,21,7,128,252,0,190,230,209,117,67
|
||||
db 102,97,195,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
db 0,0,0,255,255,0,0,1,147,0,0,255,255,0,0,16
|
||||
db 147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
db 0,0,0,86,190,105,209,232,193,249,139,54,164,220,232,186
|
||||
db 249,190,110,209,232,180,249,94,232,176,249,235,254,103,139,116
|
||||
db 36,2,137,54,164,220,104,169,209,235,217,187,0,9,137,223
|
||||
db 102,80,232,153,0,139,14,180,220,193,233,5,102,88,128,61
|
||||
db 0,116,218,103,139,116,36,2,102,80,232,57,0,116,17,131
|
||||
db 231,224,131,199,32,226,229,102,88,232,137,0,115,191,114,203
|
||||
db 102,88,103,139,116,36,2,137,54,164,220,131,231,224,190,179
|
||||
db 209,139,69,20,102,193,224,16,139,69,26,102,133,192,190,163
|
||||
db 209,116,128,194,2,0,81,185,9,0,172,60,46,116,21,60
|
||||
db 0,116,35,60,97,114,7,60,122,119,3,128,13,32,174,225
|
||||
db 233,65,89,195,176,32,73,243,174,117,246,247,199,1,0,117
|
||||
db 240,185,4,0,235,212,176,32,73,243,174,117,228,247,199,1
|
||||
db 0,117,7,185,3,0,243,174,117,215,49,201,89,195,102,37
|
||||
db 255,255,255,15,102,15,182,14,13,5,102,247,225,102,3,6
|
||||
db 166,220,233,245,248,187,0,7,102,80,102,193,232,7,102,59
|
||||
db 6,137,220,116,15,102,163,137,220,102,3,6,200,220,185,1
|
||||
db 0,232,214,248,102,88,102,131,224,127,103,102,139,4,133,0
|
||||
db 7,0,0,102,37,255,255,255,15,102,61,247,255,255,15,190
|
||||
db 252,209,15,132,221,254,195,139,93,4,139,77,6,67,1,251
|
||||
db 67,129,199,254,1,73,139,7,171,67,67,129,199,254,1,226
|
||||
db 245,195,3,125,20,131,61,255,116,20,57,5,117,11,61,128
|
||||
db 0,117,13,128,125,9,0,116,7,3,125,4,235,231,49,255
|
||||
db 195,3,116,32,102,49,219,172,132,192,116,78,104,141,209,15
|
||||
db 182,200,193,233,4,15,132,139,254,146,131,226,15,15,132,131
|
||||
db 254,1,206,1,214,88,86,78,102,15,190,4,73,116,9,78
|
||||
db 102,193,224,8,138,4,226,247,102,149,78,102,15,190,4,137
|
||||
db 209,73,116,9,78,102,193,224,8,138,4,226,247,94,102,1
|
||||
db 235,102,171,102,137,216,102,171,235,173,102,49,192,102,171,195
|
||||
db 87,80,38,198,7,1,67,83,137,30,196,220,3,125,20,232
|
||||
db 115,255,133,255,116,42,128,125,8,0,117,22,137,254,95,79
|
||||
db 176,0,170,139,68,16,171,145,3,116,20,243,164,137,251,88
|
||||
db 95,195,102,131,125,16,0,117,214,137,254,95,232,98,255,87
|
||||
db 103,131,124,36,2,32,15,132,173,0,103,139,124,36,4,184
|
||||
db 32,0,232,45,255,133,255,15,132,156,0,6,187,0,192,103
|
||||
db 139,124,36,6,83,255,54,196,220,30,7,232,146,255,143,6
|
||||
db 196,220,94,187,0,128,83,86,232,136,0,94,91,1,218,103
|
||||
db 139,68,36,4,7,57,7,117,103,61,128,0,117,6,128,127
|
||||
db 6,0,117,92,102,131,127,16,0,116,85,102,131,127,8,0
|
||||
db 117,13,80,103,139,68,36,2,59,6,196,220,88,117,65,102
|
||||
db 96,102,139,71,16,137,211,255,54,196,220,6,30,7,232,142
|
||||
db 0,7,143,6,196,220,102,97,102,96,137,215,3,125,20,232
|
||||
db 179,254,102,139,71,8,102,59,69,16,117,243,137,254,103,139
|
||||
db 124,36,32,131,239,4,232,184,254,103,137,124,36,32,102,97
|
||||
db 3,95,4,57,211,114,142,91,88,95,59,30,196,220,117,2
|
||||
db 75,249,195,172,60,0,117,11,173,102,15,183,208,145,137,223
|
||||
db 243,164,195,102,49,210,102,173,102,145,103,227,47,102,173,102
|
||||
db 151,102,81,102,139,14,180,220,102,137,248,102,247,225,83,232
|
||||
db 232,246,91,102,89,102,71,102,161,180,220,102,1,194,102,193
|
||||
db 232,4,140,197,1,197,142,197,226,215,235,202,142,193,195,190
|
||||
db 0,7,102,139,14,184,220,102,247,225,83,255,54,164,220,199
|
||||
db 6,164,220,113,209,232,9,0,143,6,164,220,95,232,247,253
|
||||
db 195,104,141,209,128,60,0,117,53,102,133,210,15,133,196,252
|
||||
db 102,61,0,0,1,0,15,131,186,252,102,129,249,0,0,1
|
||||
db 0,15,131,175,252,59,68,2,15,131,168,252,59,76,2,15
|
||||
db 135,161,252,131,198,3,1,198,137,223,243,164,88,195,102,139
|
||||
db 62,180,220,102,247,247,137,22,196,220,1,209,102,80,102,145
|
||||
db 102,49,210,102,72,102,247,247,102,64,102,145,102,88,131,198
|
||||
db 1,102,49,210,83,102,139,28,102,133,219,15,132,169,0,102
|
||||
db 1,218,131,198,8,102,57,208,115,235,102,139,124,252,102,82
|
||||
db 102,87,102,41,194,102,1,223,102,41,215,102,57,202,114,3
|
||||
db 102,137,202,131,62,196,220,0,117,47,102,96,102,15,182,30
|
||||
db 13,5,146,247,227,145,102,151,102,247,227,103,139,92,36,40
|
||||
db 232,247,245,103,137,92,36,40,102,97,102,1,208,102,41,209
|
||||
db 102,95,102,90,117,159,91,88,195,102,81,102,15,182,14,13
|
||||
db 5,102,137,248,102,82,102,247,225,104,0,16,7,49,219,232
|
||||
db 200,245,137,217,86,87,139,54,196,220,103,139,124,36,20,41
|
||||
db 241,30,6,31,7,243,164,103,137,124,36,20,6,31,95,94
|
||||
db 102,90,102,89,102,71,199,6,196,220,0,0,102,64,102,73
|
||||
db 116,174,102,74,117,132,235,162,190,141,209,233,181,251,139,30
|
||||
db 162,220,137,30,198,220,83,232,181,254,161,184,220,1,6,162
|
||||
db 220,95,184,144,0,87,139,30,162,220,137,30,192,220,232,79
|
||||
db 253,190,119,209,15,130,139,251,137,30,162,220,95,184,160,0
|
||||
db 139,30,162,220,137,30,194,220,232,53,253,115,6,199,6,194
|
||||
db 220,0,0,137,30,162,220,139,54,192,220,139,30,162,220,232
|
||||
db 33,254,102,139,111,8,131,195,16,3,31,246,71,12,2,117
|
||||
db 44,103,139,116,36,2,15,182,79,80,141,127,82,49,192,172
|
||||
db 60,97,114,7,60,122,119,3,128,13,32,175,225,241,114,13
|
||||
db 119,6,103,128,62,0,116,64,3,95,8,235,206,246,71,12
|
||||
db 1,15,132,56,251,131,62,194,220,0,15,132,47,251,3,95
|
||||
db 8,102,139,71,248,102,247,38,180,220,139,54,194,220,102,137
|
||||
db 233,139,30,162,220,232,41,254,139,62,162,220,232,24,252,139
|
||||
db 30,162,220,131,195,24,235,145,103,139,116,36,2,137,54,164
|
||||
db 220,103,128,124,36,4,0,116,25,190,194,209,246,71,75,16
|
||||
db 15,132,207,250,102,139,7,139,30,198,220,137,30,162,220,194
|
||||
db 2,0,190,179,209,246,71,75,16,15,133,182,250,102,139,7
|
||||
db 139,30,198,220,137,30,162,220,187,0,64,83,232,176,253,95
|
||||
db 184,128,0,104,0,32,7,49,219,232,84,252,190,163,209,15
|
||||
db 132,144,250,137,30,162,220,194,2,0,14,31,14,7,187,0
|
||||
db 5,137,222,185,1,0,81,102,161,176,220,102,80,232,74,244
|
||||
db 104,0,16,7,49,255,185,8,0,243,167,190,8,210,15,133
|
||||
db 97,250,128,14,145,208,1,128,14,211,208,1,49,219,102,88
|
||||
db 89,232,38,244,128,38,144,208,254,128,38,211,208,253,102,199
|
||||
db 6,101,214,0,0,1,147,102,15,183,6,174,220,102,193,224
|
||||
db 9,102,5,0,0,16,147,102,163,109,214,190,83,214,30,7
|
||||
db 180,135,185,0,1,205,21,128,252,0,190,230,209,15,133,18
|
||||
db 250,203,1,1,0,10,220,0,0,255,255,255,255,107,101,114
|
||||
db 110,101,108,46,109,110,116,0
|
4
programs/hd_load/9x2klbr/mtldr_code/compile.bat
Normal file
4
programs/hd_load/9x2klbr/mtldr_code/compile.bat
Normal file
@@ -0,0 +1,4 @@
|
||||
fasm mtldr.asm ..\mtldr
|
||||
cd ..
|
||||
bintodb
|
||||
cd mtldr_code
|
112
programs/hd_load/9x2klbr/mtldr_code/fat32.inc
Normal file
112
programs/hd_load/9x2klbr/mtldr_code/fat32.inc
Normal file
@@ -0,0 +1,112 @@
|
||||
fat32_parse_dir:
|
||||
; in: eax=directory cluster
|
||||
; out: eax=entry cluster
|
||||
mov bx, 900h
|
||||
mov di, bx
|
||||
push eax
|
||||
call read_cluster
|
||||
mov cx, word [cluster_size]
|
||||
shr cx, 5 ; div 20h
|
||||
.scan_cluster:
|
||||
pop eax
|
||||
cmp byte [di], 0
|
||||
jz file_not_found
|
||||
mov si, [esp+2]
|
||||
push eax
|
||||
call fat_compare_name
|
||||
jz .file_found
|
||||
and di, not 1Fh
|
||||
add di, 20h
|
||||
loop .scan_cluster
|
||||
pop eax
|
||||
call next_cluster
|
||||
jnc file_not_found
|
||||
jc fat32_parse_dir
|
||||
.file_found:
|
||||
pop eax
|
||||
mov si, [esp+2]
|
||||
mov [cur_obj], si
|
||||
and di, not 1Fh
|
||||
mov si, directory_string
|
||||
mov ax, [di+14h]
|
||||
shl eax, 10h
|
||||
mov ax, [di+1Ah]
|
||||
test eax, eax
|
||||
mov si, nodata_string
|
||||
jz find_error_si
|
||||
ret 2
|
||||
|
||||
fat_compare_name:
|
||||
push cx
|
||||
mov cx, 9
|
||||
.scan:
|
||||
lodsb
|
||||
cmp al, '.'
|
||||
jz .ext
|
||||
cmp al, 0
|
||||
jz .nameend
|
||||
cmp al, 'a'
|
||||
jb .notletter
|
||||
cmp al, 'z'
|
||||
ja .notletter
|
||||
or byte [di], 20h
|
||||
.notletter:
|
||||
scasb
|
||||
loopz .scan
|
||||
.notfound:
|
||||
inc cx ; to clear ZF flag
|
||||
pop cx
|
||||
ret
|
||||
.ext:
|
||||
mov al, ' '
|
||||
dec cx
|
||||
repz scasb
|
||||
jnz .notfound
|
||||
test di, 1
|
||||
jnz .notfound
|
||||
mov cx, 4
|
||||
jmp .scan
|
||||
.nameend:
|
||||
mov al, ' '
|
||||
dec cx
|
||||
repz scasb
|
||||
jnz .notfound
|
||||
test di, 1
|
||||
jnz .file_found
|
||||
mov cx, 3
|
||||
repz scasb
|
||||
jnz .notfound
|
||||
.file_found:
|
||||
xor cx, cx ; to set ZF flag
|
||||
pop cx
|
||||
ret
|
||||
|
||||
read_cluster:
|
||||
; in: eax=cluster,bx->buffer
|
||||
and eax, 0FFFFFFFh
|
||||
movzx ecx, byte [50Dh] ; sects_per_clust
|
||||
mul ecx
|
||||
add eax, [data_start]
|
||||
; call read
|
||||
; ret
|
||||
jmp relative_read
|
||||
next_cluster:
|
||||
mov bx, 700h
|
||||
; sector is 200h bytes long, one entry in FAT occupies 4 bytes => 80h entries in sector
|
||||
push eax
|
||||
shr eax, 7 ; div 80h
|
||||
cmp eax, [fat_cur_sector]
|
||||
jz @f
|
||||
mov [fat_cur_sector], eax
|
||||
add eax, [fat_start]
|
||||
mov cx, 1
|
||||
call relative_read
|
||||
@@:
|
||||
pop eax
|
||||
and eax, 7Fh
|
||||
mov eax, [700h+eax*4]
|
||||
and eax, 0FFFFFFFh
|
||||
cmp eax, 0FFFFFF7h
|
||||
mov si, bad_cluster_string
|
||||
jz find_error_si
|
||||
ret
|
733
programs/hd_load/9x2klbr/mtldr_code/mtldr.asm
Normal file
733
programs/hd_load/9x2klbr/mtldr_code/mtldr.asm
Normal file
@@ -0,0 +1,733 @@
|
||||
; KolibriOS bootloader
|
||||
; this code has been written by diamond in 2005,2006 specially for KolibriOS
|
||||
|
||||
format binary
|
||||
use16
|
||||
|
||||
org 0xD000
|
||||
|
||||
; may be changed from ldklbr.vxd
|
||||
partition_start dd -1
|
||||
boot_drive db 80h
|
||||
imgnameofs dw menuet_img_name - 0xD000
|
||||
|
||||
macro out_delay port
|
||||
{
|
||||
out port, al
|
||||
jcxz $+2
|
||||
}
|
||||
|
||||
cli
|
||||
; reprogram IRQs
|
||||
mov al, 11h
|
||||
out_delay 20h
|
||||
out_delay 0A0h
|
||||
mov al, 8
|
||||
out_delay 21h
|
||||
mov al, 70h
|
||||
out_delay 0A1h
|
||||
mov al, 4
|
||||
out_delay 21h
|
||||
mov al, 2
|
||||
out_delay 0A1h
|
||||
mov al, 1
|
||||
out_delay 21h
|
||||
out_delay 0A1h
|
||||
|
||||
mov al, 0
|
||||
out_delay 21h
|
||||
out_delay 0A1h
|
||||
|
||||
; set videomode
|
||||
mov ax, 3
|
||||
int 10h
|
||||
; reprogram timer
|
||||
mov al, 00110100b
|
||||
out_delay 43h
|
||||
mov al, 0FFh
|
||||
out_delay 40h
|
||||
out_delay 40h
|
||||
|
||||
; reset mouse
|
||||
mov ax, 0C201h
|
||||
int 15h
|
||||
|
||||
jmp start
|
||||
|
||||
out_string:
|
||||
lodsb
|
||||
test al, al
|
||||
jz .xxx
|
||||
mov ah, 0Eh
|
||||
mov bx, 7
|
||||
int 10h
|
||||
jmp out_string
|
||||
.xxx: ret
|
||||
|
||||
relative_read:
|
||||
add eax, [partition_start]
|
||||
|
||||
; read from hard disk
|
||||
; drive_size must be already initialized
|
||||
; in: eax = absolute sector
|
||||
; cx = number of sectors
|
||||
; es:bx -> buffer
|
||||
read:
|
||||
pushad
|
||||
cmp eax, [drive_size]
|
||||
jb .old_style
|
||||
; new style - LBA, function 42
|
||||
cmp [has_lba], 0
|
||||
jz disk_error
|
||||
; allocate disk address packet on the stack
|
||||
; qword +8: absolute block number
|
||||
push dword 0 ; dword +C is high dword
|
||||
push eax ; dword +8 is low dword
|
||||
; dword +4: buffer address
|
||||
push es ; word +6 is segment
|
||||
push bx ; word +4 is offset
|
||||
; word +2: number of blocks = 1
|
||||
; word +0: size of packet = 10h
|
||||
push dword 10010h
|
||||
; now pair ss:sp contain address of disk address packet
|
||||
.patch1:
|
||||
mov ax, 4200h
|
||||
mov dl, [boot_drive]
|
||||
mov si, sp
|
||||
push ds
|
||||
push ss
|
||||
pop ds
|
||||
int 13h
|
||||
pop ds
|
||||
add sp, 10h
|
||||
.end:
|
||||
popad
|
||||
jc disk_error
|
||||
add bx, 200h
|
||||
inc eax
|
||||
dec cx
|
||||
jnz read
|
||||
ret
|
||||
.old_style:
|
||||
; old style - CHS, function 2
|
||||
; convert absolute sector in eax to cylinder-head-sector coordinates
|
||||
; calculate sector
|
||||
xor edx, edx
|
||||
movzx ecx, [sectors]
|
||||
div ecx
|
||||
; sectors are counted from 1
|
||||
inc dl
|
||||
mov cl, dl ; low 6 bits of cl = sector number
|
||||
; calculate head number
|
||||
shld edx, eax, 10h ; convert eax to dx:ax
|
||||
div [heads]
|
||||
mov dh, dl ; dh = head
|
||||
mov ch, al ; ch = low 8 bits of cylinder
|
||||
shl ah, 6
|
||||
or cl, ah ; high 2 bits of cl = high 2 bits of cylinder
|
||||
.patch2:
|
||||
mov ax, 201h ; function 2, al=1 - number of sectors
|
||||
mov dl, [boot_drive]
|
||||
int 13h
|
||||
jmp .end
|
||||
|
||||
disk_error:
|
||||
mov si, disk_error_msg
|
||||
call out_string
|
||||
jmp $
|
||||
|
||||
has_lba db 0
|
||||
|
||||
disk_error_msg db 'Disk read error!',0
|
||||
start_msg db 2,' KolibriOS bootloader, running on ',0
|
||||
errfs_msg db 'unknown filesystem, cannot continue',0
|
||||
fat16_msg db 'FAT12/FAT16 - unsupported',13,10,0
|
||||
fat32_msg db 'FAT32',13,10,0
|
||||
ntfs_msg db 'NTFS',13,10,0
|
||||
error_msg db 'Error'
|
||||
colon db ': ',0
|
||||
mft_string db 'MFT',0
|
||||
root_string db '\',0
|
||||
noindex_string db '$INDEX_ROOT not found',0
|
||||
invalid_read_request_string db 'cannot read attribute',0
|
||||
nodata_string db '$DATA '
|
||||
notfound_string db 'not found',0
|
||||
directory_string db 'is a directory',0
|
||||
notdir_string db 'not a directory',0
|
||||
fragmented_string db 'too fragmented file',0
|
||||
exmem_string db 'extended memory error',0
|
||||
bad_cluster_string db 'bad cluster',0
|
||||
data_error_msg db 'data error',0
|
||||
|
||||
start:
|
||||
xor ax, ax
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
; our stack is 4Kb-2b!!! (0xFFE)
|
||||
mov ss, ax
|
||||
mov esp, 0FFFEh
|
||||
cld
|
||||
sti
|
||||
; calculate drive size
|
||||
mov dl, [boot_drive]
|
||||
mov ah, 8 ; 8 = get drive parameters
|
||||
int 13h
|
||||
; now: CF is set on error;
|
||||
; ch = low 8 bits of maximum cylinder number
|
||||
; cl : low 6 bits makes maximum sector number, high 2 bits are high 2 bits of maximum cylinder number
|
||||
; dh = maximum head number
|
||||
jnc @f
|
||||
mov cx, -1
|
||||
mov dh, cl
|
||||
@@:
|
||||
movzx ax, dh
|
||||
inc ax
|
||||
; ax = number of heads
|
||||
mov [heads], ax
|
||||
mov dl, cl
|
||||
and dx, 3Fh
|
||||
; dx = number of sectors
|
||||
; (note that sectors are counted from 1, and maximum sector number = number of sectors)
|
||||
mov [sectors], dx
|
||||
mul dx
|
||||
xchg cl, ch
|
||||
shr ch, 6
|
||||
inc cx
|
||||
; cx = number of cylinders
|
||||
mov [cyls], cx
|
||||
mul cx
|
||||
mov word [drive_size], ax
|
||||
mov word [drive_size+2], dx
|
||||
; this drive supports LBA?
|
||||
mov dl, [boot_drive]
|
||||
mov ah, 41h
|
||||
mov bx, 55AAh
|
||||
int 13h
|
||||
jc .no_lba
|
||||
cmp bx, 0AA55h
|
||||
jnz .no_lba
|
||||
test cl, 1
|
||||
jz .no_lba
|
||||
inc [has_lba]
|
||||
.no_lba:
|
||||
; say hi to user
|
||||
mov si, start_msg
|
||||
call out_string
|
||||
mov eax, [partition_start]
|
||||
cmp eax, -1
|
||||
jnz @f
|
||||
; now read first sector to determine file system type
|
||||
; first sector of disk is MBR sector
|
||||
xor eax, eax
|
||||
mov cx, 1
|
||||
mov bx, 500h
|
||||
call read
|
||||
mov eax, [6C6h] ; first disk
|
||||
mov [partition_start], eax
|
||||
@@:
|
||||
mov cx, 1
|
||||
mov bx, 500h
|
||||
call read
|
||||
movzx ax, byte [50Dh]
|
||||
mov [sect_per_clust], ax
|
||||
; determine file system
|
||||
cmp dword [536h], 'FAT1'
|
||||
jz fat1x
|
||||
cmp dword [552h], 'FAT3'
|
||||
jz fat32
|
||||
cmp dword [503h], 'NTFS'
|
||||
jz ntfs
|
||||
; mov si, errfs_msg ; already is
|
||||
call out_string
|
||||
jmp $
|
||||
fat1x:
|
||||
mov si, fat16_msg
|
||||
call out_string
|
||||
jmp $
|
||||
fat32:
|
||||
mov si, fat32_msg
|
||||
call out_string
|
||||
movzx eax, word [50Bh] ; bytes_per_sect
|
||||
movzx ebx, byte [50Dh] ; sects_per_clust
|
||||
mul ebx
|
||||
mov [cluster_size], eax
|
||||
movzx ebx, word [50Eh] ; reserved_sect
|
||||
mov [fat_start], ebx
|
||||
movzx eax, byte [510h] ; num_fats
|
||||
mul dword [524h] ; sect_fat
|
||||
add eax, ebx
|
||||
; cluster 2 begins from sector eax
|
||||
movzx ebx, byte [50Dh] ; sects_per_clust
|
||||
sub eax, ebx
|
||||
sub eax, ebx
|
||||
mov [data_start], eax
|
||||
; parse image name
|
||||
add [imgnameofs], 0xD000
|
||||
mov eax, [52Ch] ; root_cluster
|
||||
mov [cur_obj], root_string
|
||||
.parsedir:
|
||||
push ax
|
||||
mov si, [imgnameofs]
|
||||
push si
|
||||
@@:
|
||||
lodsb
|
||||
cmp al, '\'
|
||||
jz @f
|
||||
cmp al, 0
|
||||
jnz @b
|
||||
@@:
|
||||
xchg ax, [esp+2]
|
||||
mov byte [si-1], 0
|
||||
mov [imgnameofs], si
|
||||
call fat32_parse_dir
|
||||
pop cx
|
||||
test cl, cl
|
||||
jz .end
|
||||
test byte [di+0Bh], 10h
|
||||
mov si, notdir_string
|
||||
jz find_error_si
|
||||
jmp .parsedir
|
||||
.end:
|
||||
test byte [di+0Bh], 10h
|
||||
mov si, directory_string
|
||||
jnz find_error_si
|
||||
; parse FAT chunk
|
||||
; runlist at 2000:0000
|
||||
mov di, 5
|
||||
push 2000h
|
||||
pop es
|
||||
mov byte [es:di-5], 1 ; of course, non-resident
|
||||
mov dword [es:di-4], 1
|
||||
stosd
|
||||
.parsefat:
|
||||
push es
|
||||
push ds
|
||||
pop es
|
||||
call next_cluster
|
||||
pop es
|
||||
jnc .done
|
||||
mov ecx, [es:di-8]
|
||||
add ecx, [es:di-4]
|
||||
cmp eax, ecx
|
||||
jz .contc
|
||||
mov dword [es:di], 1
|
||||
scasd
|
||||
stosd
|
||||
jmp .parsefat
|
||||
.contc:
|
||||
inc dword [es:di-8]
|
||||
jmp .parsefat
|
||||
.done:
|
||||
xor eax, eax
|
||||
stosd
|
||||
jmp read_img_file
|
||||
|
||||
ntfs:
|
||||
mov si, ntfs_msg
|
||||
call out_string
|
||||
movzx eax, word [50Bh] ; bpb_bytes_per_sect
|
||||
push eax
|
||||
movzx ebx, byte [50Dh] ; bpb_sects_per_clust
|
||||
mul ebx
|
||||
mov [cluster_size], eax
|
||||
mov [data_start], 0
|
||||
mov ecx, [540h] ; frs_size
|
||||
cmp cl, 0
|
||||
jg .1
|
||||
neg cl
|
||||
xor eax, eax
|
||||
inc eax
|
||||
shl eax, cl
|
||||
jmp .2
|
||||
.1:
|
||||
mul ecx
|
||||
.2:
|
||||
mov [frs_size], eax
|
||||
pop ebx
|
||||
xor edx, edx
|
||||
div ebx
|
||||
mov [frs_sectors], ax
|
||||
; read first MFT record - description of MFT itself
|
||||
mov [cur_obj], mft_string
|
||||
movzx eax, byte [50Dh] ; bpb_sects_per_clust
|
||||
mul dword [530h] ; mft_cluster
|
||||
mov cx, [frs_sectors]
|
||||
mov bx, 4000h
|
||||
mov di, bx
|
||||
push bx
|
||||
call relative_read
|
||||
call restore_usa
|
||||
; scan for unnamed $DATA attribute
|
||||
pop di
|
||||
mov ax, 80h ; $DATA
|
||||
mov bx, 700h
|
||||
call load_attr
|
||||
mov si, nodata_string
|
||||
jc find_error_si
|
||||
mov [free], bx
|
||||
; load menuet.img
|
||||
; parse image name
|
||||
add [imgnameofs], 0xD000
|
||||
mov eax, 5 ; root cluster
|
||||
mov [cur_obj], root_string
|
||||
.parsedir:
|
||||
push ax
|
||||
mov si, [imgnameofs]
|
||||
push si
|
||||
@@:
|
||||
lodsb
|
||||
cmp al, '\'
|
||||
jz @f
|
||||
cmp al, 0
|
||||
jnz @b
|
||||
@@:
|
||||
xchg ax, [esp+2]
|
||||
mov byte [si-1], 0
|
||||
mov [imgnameofs], si
|
||||
call ntfs_parse_dir
|
||||
pop cx
|
||||
test cl, cl
|
||||
jnz .parsedir
|
||||
read_img_file:
|
||||
xor si, si
|
||||
push es
|
||||
pop fs
|
||||
; yes! Now read file to 0x100000
|
||||
lods byte [fs:si]
|
||||
cmp al, 0 ; assume nonresident attr
|
||||
mov si, invalid_read_request_string
|
||||
jz find_error_si
|
||||
mov si, 1
|
||||
xor edi, edi
|
||||
; read buffer to 1000:0000 and move it to extended memory
|
||||
push 1000h
|
||||
pop es
|
||||
xor bx, bx
|
||||
.img_read_block:
|
||||
lods dword [fs:si] ; eax=length
|
||||
xchg eax, ecx
|
||||
jecxz .img_read_done
|
||||
lods dword [fs:si] ; eax=disk cluster
|
||||
.img_read_cluster:
|
||||
pushad
|
||||
; read part of file
|
||||
movzx ecx, byte [50Dh]
|
||||
mul ecx
|
||||
add eax, [data_start]
|
||||
call relative_read
|
||||
; move it to extended memory
|
||||
mov ah, 87h
|
||||
mov ecx, [cluster_size]
|
||||
push ecx
|
||||
shr cx, 1
|
||||
mov si, movedesc
|
||||
push es
|
||||
push ds
|
||||
pop es
|
||||
int 15h
|
||||
pop es
|
||||
test ah, ah
|
||||
mov si, exmem_string
|
||||
jnz find_error_si
|
||||
pop ecx
|
||||
add [dest_addr], ecx
|
||||
popad
|
||||
inc eax
|
||||
loop .img_read_cluster
|
||||
jmp .img_read_block
|
||||
.img_read_done:
|
||||
; menuet.img loaded; now load kernel.mnt
|
||||
load_kernel:
|
||||
push ds
|
||||
pop es
|
||||
mov [cur_obj], kernel_mnt_name
|
||||
; read boot sector
|
||||
xor eax, eax
|
||||
mov bx, 500h
|
||||
mov cx, 1
|
||||
call read_img
|
||||
; init vars
|
||||
mov ax, [50Eh] ; reserved_sect
|
||||
add ax, [51Ch] ; hidden
|
||||
mov word [fat_start], ax
|
||||
xchg ax, bx
|
||||
movzx ax, byte [510h] ; num_fats
|
||||
mul word [516h] ; fat_length
|
||||
add ax, bx
|
||||
; read root dir
|
||||
mov bx, 700h
|
||||
mov cx, [511h] ; dir_entries
|
||||
add cx, 0Fh
|
||||
shr cx, 4
|
||||
call read_img
|
||||
add ax, cx
|
||||
mov [img_data_start], ax
|
||||
shl cx, 9
|
||||
mov di, bx
|
||||
add bx, cx
|
||||
mov byte [bx], 0
|
||||
.scan_loop:
|
||||
cmp byte [di], 0
|
||||
mov si, notfound_string
|
||||
jz find_error_si
|
||||
mov si, kernel_mnt_name
|
||||
call fat_compare_name
|
||||
jz .found
|
||||
and di, not 1Fh
|
||||
add di, 20h
|
||||
jmp .scan_loop
|
||||
.found:
|
||||
and di, not 1Fh
|
||||
mov si, directory_string
|
||||
test byte [di+0Bh], 10h
|
||||
jnz find_error_si
|
||||
; found, now load it to 1000h:0000h
|
||||
mov ax, [di+1Ah]
|
||||
; first cluster of kernel.mnt in ax
|
||||
; translate it to sector on disk in menuet.img
|
||||
push ax
|
||||
dec ax
|
||||
dec ax
|
||||
movzx cx, byte [50Dh]
|
||||
mul cx
|
||||
add ax, [img_data_start]
|
||||
; now ax is sector in menuet.img
|
||||
mov [kernel_mnt_in_img], ax
|
||||
div [sect_per_clust]
|
||||
; now ax is cluster in menuet.img and
|
||||
; dx is offset from the beginning of cluster
|
||||
movzx eax, ax
|
||||
push 2000h
|
||||
pop ds
|
||||
mov si, 1
|
||||
.scani:
|
||||
sub eax, [si]
|
||||
jb .scanidone
|
||||
; sanity check
|
||||
cmp dword [si], 0
|
||||
push invalid_read_request_string
|
||||
jz find_error_sp
|
||||
pop cx
|
||||
; next chunk
|
||||
add si, 8
|
||||
jmp .scani
|
||||
.scanidone:
|
||||
add eax, [si] ; undo last subtract
|
||||
add eax, [si+4] ; get cluster
|
||||
push 0
|
||||
pop ds
|
||||
movzx ecx, [sect_per_clust]
|
||||
push dx
|
||||
mul ecx ; get sector
|
||||
pop dx
|
||||
movzx edx, dx
|
||||
add eax, edx
|
||||
add eax, [data_start]
|
||||
mov [kernel_mnt_1st], eax
|
||||
pop ax
|
||||
push 1000h
|
||||
pop es
|
||||
.read_loop:
|
||||
push ax
|
||||
xor bx, bx
|
||||
call img_read_cluster
|
||||
shl cx, 9-4
|
||||
mov ax, es
|
||||
add ax, cx
|
||||
mov es, ax
|
||||
pop ax
|
||||
call img_next_cluster
|
||||
jc .read_loop
|
||||
mov ax, 'KL'
|
||||
mov si, loader_block
|
||||
jmp 1000h:0000h
|
||||
|
||||
img_next_cluster:
|
||||
mov bx, 700h
|
||||
push ax
|
||||
shr ax, 1
|
||||
add ax, [esp]
|
||||
mov dx, ax
|
||||
shr ax, 9
|
||||
add ax, word [fat_start]
|
||||
mov cx, 2
|
||||
push es
|
||||
push ds
|
||||
pop es
|
||||
call read_img
|
||||
pop es
|
||||
and dx, 1FFh
|
||||
add bx, dx
|
||||
mov ax, [bx]
|
||||
pop cx
|
||||
test cx, 1
|
||||
jz .1
|
||||
shr ax, 4
|
||||
.1:
|
||||
and ax, 0FFFh
|
||||
mov si, bad_cluster_string
|
||||
cmp ax, 0FF7h
|
||||
jz find_error_si
|
||||
ret
|
||||
img_read_cluster:
|
||||
dec ax
|
||||
dec ax
|
||||
movzx cx, byte [50Dh] ; sects_per_clust
|
||||
mul cx
|
||||
add ax, [img_data_start]
|
||||
movzx eax, ax
|
||||
; call read_img
|
||||
; ret
|
||||
read_img:
|
||||
; in: ax = sector, es:bx->buffer, cx=length in sectors
|
||||
pushad
|
||||
movzx ebx, bx
|
||||
mov si, movedesc
|
||||
shl eax, 9
|
||||
add eax, 93100000h
|
||||
mov dword [si+sou_addr-movedesc], eax
|
||||
mov eax, 9300000h
|
||||
mov ax, es
|
||||
shl eax, 4
|
||||
add eax, ebx
|
||||
mov [si+dest_addr-movedesc], eax
|
||||
mov ah, 87h
|
||||
shl cx, 8 ; mul 200h/2
|
||||
push es
|
||||
push 0
|
||||
pop es
|
||||
int 15h
|
||||
pop es
|
||||
cmp ah, 0
|
||||
mov si, exmem_string
|
||||
jnz find_error_si
|
||||
popad
|
||||
ret
|
||||
|
||||
movedesc:
|
||||
times 16 db 0
|
||||
; source
|
||||
dw 0xFFFF ; segment length
|
||||
sou_addr dw 0000h ; linear address
|
||||
db 1 ; linear address
|
||||
db 93h ; access rights
|
||||
dw 0
|
||||
; destination
|
||||
dw 0xFFFF ; segment length
|
||||
dest_addr dd 93100000h ; high byte contains access rights
|
||||
; three low bytes contains linear address (updated when reading)
|
||||
dw 0
|
||||
times 32 db 0
|
||||
|
||||
find_error_si:
|
||||
push si
|
||||
find_error_sp:
|
||||
mov si, error_msg
|
||||
call out_string
|
||||
mov si, [cur_obj]
|
||||
call out_string
|
||||
mov si, colon
|
||||
call out_string
|
||||
pop si
|
||||
call out_string
|
||||
jmp $
|
||||
|
||||
file_not_found:
|
||||
mov si, [esp+2]
|
||||
mov [cur_obj], si
|
||||
push notfound_string
|
||||
jmp find_error_sp
|
||||
|
||||
include 'fat32.inc'
|
||||
include 'ntfs.inc'
|
||||
|
||||
write1st:
|
||||
; callback from kernel.mnt
|
||||
; write first sector of kernel.mnt from 1000:0000 back to disk
|
||||
push cs
|
||||
pop ds
|
||||
push cs
|
||||
pop es
|
||||
; sanity check
|
||||
mov bx, 500h
|
||||
mov si, bx
|
||||
mov cx, 1
|
||||
push cx
|
||||
mov eax, [kernel_mnt_1st]
|
||||
push eax
|
||||
call relative_read
|
||||
push 1000h
|
||||
pop es
|
||||
xor di, di
|
||||
mov cx, 8
|
||||
repz cmpsw
|
||||
mov si, data_error_msg
|
||||
jnz find_error_si
|
||||
; ok, now write back to disk
|
||||
or byte [read.patch1+2], 1
|
||||
or byte [read.patch2+2], 1
|
||||
xor bx, bx
|
||||
pop eax
|
||||
pop cx
|
||||
call relative_read
|
||||
and byte [read.patch1+1], not 1
|
||||
and byte [read.patch2+2], not 2
|
||||
; and to image in memory (probably this may be done by kernel.mnt itself?)
|
||||
mov dword [sou_addr], 93010000h
|
||||
movzx eax, [kernel_mnt_in_img]
|
||||
shl eax, 9
|
||||
add eax, 93100000h
|
||||
mov dword [dest_addr], eax
|
||||
mov si, movedesc
|
||||
push ds
|
||||
pop es
|
||||
mov ah, 87h
|
||||
mov cx, 100h
|
||||
int 15h
|
||||
cmp ah, 0
|
||||
mov si, exmem_string
|
||||
jnz find_error_si
|
||||
retf
|
||||
|
||||
loader_block:
|
||||
db 1 ; version
|
||||
dw 1 ; flags - image is loaded
|
||||
dw write1st ; offset
|
||||
dw 0 ; segment
|
||||
|
||||
fat_cur_sector dd -1
|
||||
|
||||
; -----------------------------------------------
|
||||
; ------------------ Settings -------------------
|
||||
; -----------------------------------------------
|
||||
|
||||
; must be in lowercase, see ntfs_parse_dir.scan, fat32_parse_dir.scan
|
||||
kernel_mnt_name db 'kernel.mnt',0
|
||||
|
||||
; uninitialized data follows
|
||||
drive_size dd ? ; in sectors
|
||||
heads dw ?
|
||||
sectors dw ?
|
||||
cyls dw ?
|
||||
free dw ?
|
||||
cur_obj dw ?
|
||||
data_start dd ?
|
||||
img_data_start dw ?
|
||||
sect_per_clust dw ?
|
||||
kernel_mnt_in_img dw ?
|
||||
kernel_mnt_1st dd ?
|
||||
; NTFS data
|
||||
cluster_size dd ? ; in bytes
|
||||
frs_size dd ? ; in bytes
|
||||
frs_sectors dw ? ; in sectors
|
||||
mft_data_attr dw ?
|
||||
index_root dw ?
|
||||
index_alloc dw ?
|
||||
ofs dw ?
|
||||
dir dw ?
|
||||
; FAT32 data
|
||||
fat_start dd ?
|
||||
cur_cluster dd ?
|
||||
|
||||
; will be initialized by ldklbr.vxd
|
||||
menuet_img_name rb 300
|
519
programs/hd_load/9x2klbr/mtldr_code/ntfs.inc
Normal file
519
programs/hd_load/9x2klbr/mtldr_code/ntfs.inc
Normal file
@@ -0,0 +1,519 @@
|
||||
restore_usa:
|
||||
; Update Sequence Array restore
|
||||
mov bx, [di+4]
|
||||
mov cx, [di+6]
|
||||
inc bx
|
||||
add bx, di
|
||||
inc bx
|
||||
add di, 1feh
|
||||
dec cx
|
||||
@@:
|
||||
mov ax, [bx]
|
||||
stosw
|
||||
inc bx
|
||||
inc bx
|
||||
add di, 1feh
|
||||
loop @b
|
||||
ret
|
||||
|
||||
find_attr:
|
||||
; in: di->file record, ax=attribute
|
||||
; out: di->attribute or di=0 if not found
|
||||
add di, [di+14h]
|
||||
.1:
|
||||
; attributes codes are formally dwords, but all they fit in word
|
||||
cmp word [di], -1
|
||||
jz .notfound
|
||||
cmp word [di], ax
|
||||
jnz .continue
|
||||
; for $DATA attribute, scan only unnamed
|
||||
cmp ax, 80h
|
||||
jnz .found
|
||||
cmp byte [di+9], 0
|
||||
jz .found
|
||||
.continue:
|
||||
add di, [di+4]
|
||||
jmp .1
|
||||
.notfound:
|
||||
xor di, di
|
||||
.found:
|
||||
ret
|
||||
|
||||
process_mcb_nonres:
|
||||
; in: si->attribute, es:di->buffer
|
||||
; out: di->buffer end
|
||||
add si, [si+20h]
|
||||
xor ebx, ebx
|
||||
.loop:
|
||||
lodsb
|
||||
test al, al
|
||||
jz .done
|
||||
push invalid_read_request_string
|
||||
movzx cx, al
|
||||
shr cx, 4
|
||||
jz find_error_sp
|
||||
xchg ax, dx
|
||||
and dx, 0Fh
|
||||
jz find_error_sp
|
||||
add si, cx
|
||||
add si, dx
|
||||
pop ax
|
||||
push si
|
||||
dec si
|
||||
movsx eax, byte [si]
|
||||
dec cx
|
||||
jz .l1e
|
||||
.l1:
|
||||
dec si
|
||||
shl eax, 8
|
||||
mov al, [si]
|
||||
loop .l1
|
||||
.l1e:
|
||||
xchg ebp, eax
|
||||
dec si
|
||||
movsx eax, byte [si]
|
||||
mov cx, dx
|
||||
dec cx
|
||||
jz .l2e
|
||||
.l2:
|
||||
dec si
|
||||
shl eax, 8
|
||||
mov al, byte [si]
|
||||
loop .l2
|
||||
.l2e:
|
||||
pop si
|
||||
add ebx, ebp
|
||||
; eax=length, ebx=disk block
|
||||
stosd
|
||||
mov eax, ebx
|
||||
stosd
|
||||
jmp .loop
|
||||
.done:
|
||||
xor eax, eax
|
||||
stosd
|
||||
ret
|
||||
|
||||
load_attr:
|
||||
; in: ax=attribute, es:bx->buffer, di->base record
|
||||
; out: bx->buffer end; CF set if not found
|
||||
push di
|
||||
push ax
|
||||
mov byte [es:bx], 1
|
||||
inc bx
|
||||
push bx
|
||||
mov [ofs], bx
|
||||
; scan for attrubute
|
||||
add di, [di+14h]
|
||||
@@:
|
||||
call find_attr.1
|
||||
test di, di
|
||||
jz .notfound1
|
||||
cmp byte [di+8], 0
|
||||
jnz .nonresident
|
||||
; resident attribute
|
||||
mov si, di
|
||||
pop di
|
||||
dec di
|
||||
mov al, 0
|
||||
stosb
|
||||
mov ax, [si+10h]
|
||||
stosw
|
||||
xchg ax, cx
|
||||
add si, [si+14h]
|
||||
rep movsb
|
||||
mov bx, di
|
||||
pop ax
|
||||
pop di
|
||||
ret
|
||||
.nonresident:
|
||||
; nonresident attribute
|
||||
cmp dword [di+10h], 0
|
||||
jnz @b
|
||||
; read start of data
|
||||
mov si, di
|
||||
pop di
|
||||
call process_mcb_nonres
|
||||
push di
|
||||
.notfound1:
|
||||
; $ATTRIBUTE_LIST is always in base file record
|
||||
cmp word [esp+2], 20h
|
||||
jz .nofragmented
|
||||
; scan for $ATTRIBUTE_LIST = 20h
|
||||
mov di, [esp+4]
|
||||
mov ax, 20h
|
||||
call find_attr
|
||||
test di, di
|
||||
jz .nofragmented
|
||||
; load $ATTRIBUTE_LIST itself
|
||||
push es
|
||||
mov bx, 0C000h
|
||||
mov di, [esp+6]
|
||||
push bx
|
||||
push [ofs]
|
||||
push ds
|
||||
pop es
|
||||
call load_attr
|
||||
pop [ofs]
|
||||
pop si
|
||||
mov bx, 8000h
|
||||
push bx
|
||||
push si
|
||||
call read_attr_full
|
||||
pop si
|
||||
pop bx
|
||||
add dx, bx
|
||||
mov ax, [esp+4]
|
||||
pop es
|
||||
.1:
|
||||
cmp [bx], ax
|
||||
jnz .continue1
|
||||
; only unnamed $DATA attributes!
|
||||
cmp ax, 80h
|
||||
jnz @f
|
||||
cmp byte [bx+6], 0
|
||||
jnz .continue1
|
||||
@@:
|
||||
cmp dword [bx+10h], 0
|
||||
jz .continue1
|
||||
cmp dword [bx+8], 0
|
||||
jnz @f
|
||||
push ax
|
||||
mov ax, [esp+2]
|
||||
cmp ax, [ofs]
|
||||
pop ax
|
||||
jnz .continue1
|
||||
@@:
|
||||
pushad
|
||||
mov eax, [bx+10h]
|
||||
mov bx, dx
|
||||
push [ofs]
|
||||
push es
|
||||
push ds
|
||||
pop es
|
||||
call read_file_record
|
||||
pop es
|
||||
pop [ofs]
|
||||
popad
|
||||
pushad
|
||||
mov di, dx
|
||||
add di, [di+14h]
|
||||
.2:
|
||||
call find_attr.1
|
||||
mov eax, [bx+8]
|
||||
cmp eax, [di+10h]
|
||||
jnz .2
|
||||
mov si, di
|
||||
mov di, [esp+20h]
|
||||
sub di, 4
|
||||
call process_mcb_nonres
|
||||
mov [esp+20h], di
|
||||
popad
|
||||
.continue1:
|
||||
add bx, [bx+4]
|
||||
cmp bx, dx
|
||||
jb .1
|
||||
.nofragmented:
|
||||
pop bx
|
||||
pop ax
|
||||
pop di
|
||||
cmp bx, [ofs]
|
||||
jnz @f
|
||||
dec bx
|
||||
stc
|
||||
@@:
|
||||
ret
|
||||
|
||||
read_attr_full:
|
||||
; in: si->decoded attribute data, bx->buffer
|
||||
; out: edx=length in bytes
|
||||
lodsb
|
||||
cmp al, 0
|
||||
jnz .nonresident
|
||||
; resident
|
||||
lodsw
|
||||
movzx edx, ax
|
||||
xchg ax, cx
|
||||
mov di, bx
|
||||
rep movsb
|
||||
ret
|
||||
.nonresident:
|
||||
; nonresident :-)
|
||||
xor edx, edx
|
||||
.loop:
|
||||
lodsd
|
||||
xchg ecx, eax
|
||||
jecxz .loopend
|
||||
lodsd
|
||||
xchg edi, eax
|
||||
; read ecx clusters from cluster edi to es:bx
|
||||
.intloop:
|
||||
push ecx
|
||||
; read 1 cluster from physical cluster edi to es:bx
|
||||
mov ecx, [cluster_size]
|
||||
mov eax, edi
|
||||
mul ecx
|
||||
push bx
|
||||
call relative_read
|
||||
pop bx
|
||||
pop ecx
|
||||
inc edi
|
||||
mov eax, [cluster_size]
|
||||
add edx, eax
|
||||
shr eax, 4
|
||||
mov bp, es
|
||||
add bp, ax
|
||||
mov es, bp
|
||||
loop .intloop
|
||||
jmp .loop
|
||||
.loopend:
|
||||
mov es, cx
|
||||
ret
|
||||
|
||||
read_file_record:
|
||||
; in: eax=index of record, bx=buffer
|
||||
mov si, 700h
|
||||
mov ecx, [frs_size]
|
||||
mul ecx
|
||||
push bx
|
||||
push [cur_obj]
|
||||
mov [cur_obj], mft_string
|
||||
call read_attr
|
||||
pop [cur_obj]
|
||||
pop di
|
||||
call restore_usa
|
||||
ret
|
||||
read_attr:
|
||||
; in: edx:eax=offset in bytes, ecx=size in bytes, bx=buffer, si=attribute
|
||||
push invalid_read_request_string
|
||||
cmp byte [si], 0
|
||||
jnz .nonresident
|
||||
test edx, edx
|
||||
jnz find_error_sp
|
||||
cmp eax, 10000h
|
||||
jae find_error_sp
|
||||
cmp ecx, 10000h
|
||||
jae find_error_sp
|
||||
cmp ax, [si+2]
|
||||
jae find_error_sp
|
||||
cmp cx, [si+2]
|
||||
ja find_error_sp
|
||||
add si, 3
|
||||
add si, ax
|
||||
mov di, bx
|
||||
rep movsb
|
||||
pop ax
|
||||
ret
|
||||
.nonresident:
|
||||
mov edi, [cluster_size]
|
||||
div edi
|
||||
mov [ofs], dx
|
||||
add cx, dx
|
||||
push eax
|
||||
xchg eax, ecx
|
||||
xor edx, edx
|
||||
dec eax
|
||||
div edi
|
||||
inc eax
|
||||
xchg eax, ecx
|
||||
pop eax
|
||||
add si, 1
|
||||
xor edx, edx
|
||||
push bx
|
||||
; eax=offset in clusters, ecx=size in clusters
|
||||
.scan:
|
||||
mov ebx, [si]
|
||||
test ebx, ebx
|
||||
jz .notfound
|
||||
add edx, ebx
|
||||
add si, 8
|
||||
cmp eax, edx
|
||||
jae .scan
|
||||
mov edi, [si-4]
|
||||
; now edx=end of block, ebx=length of block, edi=start of block on disk
|
||||
; eax=required offset, ecx=required length
|
||||
push edx
|
||||
push edi
|
||||
sub edx, eax
|
||||
add edi, ebx
|
||||
sub edi, edx
|
||||
cmp edx, ecx
|
||||
jb @f
|
||||
mov edx, ecx
|
||||
@@:
|
||||
; read (edx) clusters from (edi=disk offset in clusters) to ([esp+8])
|
||||
cmp [ofs], 0
|
||||
jnz .ofs_read
|
||||
.cont:
|
||||
pushad
|
||||
movzx ebx, byte [50Dh]
|
||||
; xchg eax, edx
|
||||
; mul ebx
|
||||
xchg ax, dx
|
||||
mul bx
|
||||
xchg cx, ax
|
||||
xchg eax, edi
|
||||
mul ebx
|
||||
mov bx, [esp+8+20h]
|
||||
call relative_read
|
||||
mov [esp+8+20h], bx
|
||||
popad
|
||||
.cont2:
|
||||
add eax, edx
|
||||
sub ecx, edx
|
||||
.cont3:
|
||||
pop edi
|
||||
pop edx
|
||||
jnz .scan
|
||||
pop bx
|
||||
pop ax
|
||||
ret
|
||||
.ofs_read:
|
||||
push ecx
|
||||
movzx ecx, byte [50Dh] ; bpb_sects_per_clust
|
||||
mov eax, edi
|
||||
push edx
|
||||
mul ecx
|
||||
push 1000h
|
||||
pop es
|
||||
xor bx, bx
|
||||
call relative_read
|
||||
mov cx, bx
|
||||
push si
|
||||
push di
|
||||
mov si, [ofs]
|
||||
mov di, [esp+8+12]
|
||||
sub cx, si
|
||||
push ds
|
||||
push es
|
||||
pop ds
|
||||
pop es
|
||||
rep movsb
|
||||
mov [esp+8+12], di
|
||||
push es
|
||||
pop ds
|
||||
pop di
|
||||
pop si
|
||||
pop edx
|
||||
pop ecx
|
||||
inc edi
|
||||
mov [ofs], 0
|
||||
inc eax
|
||||
dec ecx
|
||||
jz .cont3
|
||||
dec edx
|
||||
jnz .cont
|
||||
jmp .cont2
|
||||
.notfound:
|
||||
mov si, invalid_read_request_string
|
||||
jmp find_error_si
|
||||
|
||||
ntfs_parse_dir:
|
||||
; in: eax=directory iRecord, [word sp+2]=filename
|
||||
; out: si=$DATA attribute of file
|
||||
mov bx, [free]
|
||||
mov [dir], bx
|
||||
push bx
|
||||
call read_file_record
|
||||
mov ax, word [frs_size]
|
||||
add [free], ax
|
||||
pop di
|
||||
; find attributes $INDEX_ROOT, $INDEX_ALLOCATION, $BITMAP
|
||||
mov ax, 90h ; $INDEX_ROOT
|
||||
push di
|
||||
mov bx, [free]
|
||||
mov [index_root], bx
|
||||
call load_attr
|
||||
mov si, noindex_string
|
||||
jc find_error_si
|
||||
mov [free], bx
|
||||
pop di
|
||||
mov ax, 0A0h ; $INDEX_ALLOCATION
|
||||
mov bx, [free]
|
||||
mov [index_alloc], bx
|
||||
call load_attr
|
||||
jnc @f
|
||||
mov [index_alloc], 0
|
||||
@@:
|
||||
mov [free], bx
|
||||
; search for entry
|
||||
mov si, [index_root]
|
||||
mov bx, [free]
|
||||
call read_attr_full
|
||||
mov ebp, [bx+8] ; subnode_size
|
||||
add bx, 10h
|
||||
.scan_record:
|
||||
add bx, [bx]
|
||||
.scan:
|
||||
test byte [bx+0Ch], 2
|
||||
jnz .not_found
|
||||
mov si, [esp+2]
|
||||
movzx cx, byte [bx+50h] ; namelen
|
||||
lea di, [bx+52h] ; name
|
||||
xor ax, ax
|
||||
@@:
|
||||
lodsb
|
||||
cmp al, 'a'
|
||||
jb .notletter
|
||||
cmp al, 'z'
|
||||
ja .notletter
|
||||
or byte [di], 20h
|
||||
.notletter:
|
||||
scasw
|
||||
loopz @b
|
||||
jb .not_found
|
||||
ja @f
|
||||
cmp byte [esi], 0
|
||||
jz .file_found
|
||||
@@:
|
||||
add bx, [bx+8]
|
||||
jmp .scan
|
||||
.not_found:
|
||||
test byte [bx+0Ch], 1
|
||||
jz file_not_found
|
||||
cmp [index_alloc], 0
|
||||
jz file_not_found
|
||||
add bx, [bx+8]
|
||||
mov eax, [bx-8]
|
||||
mul [cluster_size]
|
||||
mov si, [index_alloc]
|
||||
mov ecx, ebp
|
||||
mov bx, [free]
|
||||
call read_attr
|
||||
mov di, [free]
|
||||
call restore_usa
|
||||
mov bx, [free]
|
||||
add bx, 18h
|
||||
jmp .scan_record
|
||||
.file_found:
|
||||
mov si, [esp+2]
|
||||
mov [cur_obj], si
|
||||
cmp byte [esp+4], 0
|
||||
jz .need_file
|
||||
mov si, notdir_string
|
||||
test byte [bx+48h+3], 10h
|
||||
jz find_error_si
|
||||
mov eax, [bx]
|
||||
mov bx, [dir]
|
||||
mov [free], bx
|
||||
ret 2
|
||||
.need_file:
|
||||
mov si, directory_string
|
||||
test byte [bx+48h+3], 10h ; directory?
|
||||
jnz find_error_si
|
||||
; read entry
|
||||
mov eax, [bx]
|
||||
mov bx, [dir]
|
||||
mov [free], bx
|
||||
mov bx, 4000h
|
||||
push bx
|
||||
call read_file_record
|
||||
pop di
|
||||
mov ax, 80h
|
||||
push 2000h
|
||||
pop es
|
||||
xor bx, bx
|
||||
call load_attr
|
||||
mov si, nodata_string
|
||||
jz find_error_si
|
||||
mov [free], bx
|
||||
ret 2
|
33
programs/hd_load/9x2klbr/readme_dos.txt
Normal file
33
programs/hd_load/9x2klbr/readme_dos.txt
Normal file
@@ -0,0 +1,33 @@
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>祭<EFBFBD><EFBFBD>: <20><><EFBFBD> <20><><EFBFBD><EFBFBD>᪥ (<28><><EFBFBD> Win95/98/ME) (<28><><EFBFBD>४⭮) <20><><EFBFBD><EFBFBD>㦠<EFBFBD><E3A6A0> Windows <20>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>㦠<EFBFBD><E3A6A0> KolibriOS.
|
||||
|
||||
<EFBFBD><EFBFBD>⠭<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ॡ<EFBFBD><E0A5A1><EFBFBD><EFBFBD><EFBFBD>.
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
||||
9x2klbr [[<5B><><EFBFBD><EFBFBD>:]\[<5B><><EFBFBD><EFBFBD>\][<5B><><EFBFBD>_<EFBFBD><5F>ࠧ<EFBFBD>]]
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ࠧ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ᯮ<EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>⪮<EFBFBD> <20><>᪥.
|
||||
<EFBFBD><EFBFBD><EFBFBD>祭<EFBFBD><EFBFBD> <20><> 㬮<>砭<EFBFBD><E7A0AD>: <20><><EFBFBD><EFBFBD> C:, <20><>⠫<EFBFBD><E2A0AB> <20><><EFBFBD><E0ADA5><EFBFBD>, <20><>ࠧ kolibri.img
|
||||
<EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><>ࠧ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ⮫쪮 ᨬ<><E1A8AC><EFBFBD><EFBFBD> <20><> <20><>ࢮ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
ASCII-⠡<><E2A0A1><EFBFBD><EFBFBD>. <20> <20><><EFBFBD>⭮<EFBFBD><E2ADAE><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>᪨<EFBFBD> <20>㪢.
|
||||
|
||||
FAT: <20>ਭ<EFBFBD><E0A8AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ⮫쪮 <20><><EFBFBD><EFBFBD>⪨<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> 䠩<><E4A0A9>, <20>.<2E>. progra~1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Program Files; <20><><EFBFBD> <20><><EFBFBD><EFBFBD> ⨯<> kolibri <20> menuet.075 (<28><> <20><><EFBFBD><EFBFBD><EFBFBD> 8 <20>㪢 <20> <20><><EFBFBD><EFBFBD><EFBFBD>,
|
||||
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> 3 <20>㪢 <20> <20><><EFBFBD><EFBFBD><EFBFBD>७<EFBFBD><E0A5AD>, <20><><EFBFBD> ᯥ樠<E1AFA5><E6A8A0><EFBFBD><EFBFBD><EFBFBD> ᨬ<><E1A8AC><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD> <20>믮<EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD>⮬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>᪨, <20> <20><>饬 <20><><EFBFBD>砥 <20><><EFBFBD><EFBFBD>⪮<EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> 㧭<><E3A7AD><EFBFBD>, <20><><EFBFBD>ਬ<EFBFBD><E0A8AC>,
|
||||
<EFBFBD> Explorer'<27><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "Properties" (<28><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "MS-DOS name").
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>祬, <20> <20><><EFBFBD> <20>ॡ<EFBFBD><E0A5A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20>믮<EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>稪 <20><> <20>⠭<EFBFBD><E2A0AD>
|
||||
<EFBFBD><EFBFBD>ଠ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> :-), <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᮮ<><E1AEAE><EFBFBD><EFBFBD>, <20><><EFBFBD>, <20><><EFBFBD>, 'not found'.
|
||||
|
||||
<EFBFBD>ਬ<EFBFBD><EFBFBD><EFBFBD>:
|
||||
9x2klbr d:\download\kolibri\kolibri1.img
|
||||
9x2klbr c:\progra~1\kolibri\
|
||||
9x2klbr \progra~1\kolibri\
|
||||
(<28>㤥<EFBFBD> <20><>㧨<EFBFBD><E3A7A8> <20><> kolibri.img)
|
||||
9x2klbr e:\
|
||||
(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⭮ 9x2klbr e:\kolibri.img)
|
||||
9x2klbr
|
||||
(<28><><EFBFBD> <20><>ࠬ<EFBFBD><E0A0AC>; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⭮ 9x2klbr c:\kolibri.img)
|
||||
|
||||
diamond
|
||||
mailto: diamondz@land.ru
|
33
programs/hd_load/9x2klbr/readme_win.txt
Normal file
33
programs/hd_load/9x2klbr/readme_win.txt
Normal file
@@ -0,0 +1,33 @@
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD> Win95/98/ME) (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Windows <20>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> KolibriOS.
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
||||
9x2klbr [[<5B><><EFBFBD><EFBFBD>:]\[<5B><><EFBFBD><EFBFBD>\][<5B><><EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>]]
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD> C:, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> kolibri.img
|
||||
<EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
ASCII-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
|
||||
FAT: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>, <20>.<2E>. progra~1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Program Files; <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> kolibri <20> menuet.075 (<28><> <20><><EFBFBD><EFBFBD><EFBFBD> 8 <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>,
|
||||
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> 3 <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
||||
<EFBFBD> Explorer'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "Properties" (<28><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "MS-DOS name").
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> :-), <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>, <20><><EFBFBD>, 'not found'.
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
||||
9x2klbr d:\download\kolibri\kolibri1.img
|
||||
9x2klbr c:\progra~1\kolibri\
|
||||
9x2klbr \progra~1\kolibri\
|
||||
(<28><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> kolibri.img)
|
||||
9x2klbr e:\
|
||||
(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 9x2klbr e:\kolibri.img)
|
||||
9x2klbr
|
||||
(<28><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 9x2klbr c:\kolibri.img)
|
||||
|
||||
diamond
|
||||
mailto: diamondz@land.ru
|
234
programs/hd_load/9x2klbr/vxd.asm
Normal file
234
programs/hd_load/9x2klbr/vxd.asm
Normal file
@@ -0,0 +1,234 @@
|
||||
.386p
|
||||
WIN40COMPAT = 1
|
||||
include vmm.inc
|
||||
include v86mmgr.inc
|
||||
DECLARE_VIRTUAL_DEVICE LDKLBR,1,0,LDKLBR_Control,UNDEFINED_DEVICE_ID,1
|
||||
|
||||
;Begin_control_dispatch LDKLBR
|
||||
;Control_Dispatch w32_DeviceIoControl, OnDeviceIoControl
|
||||
;Control_Dispatch Sys_Dynamic_Device_Exit, OnExit
|
||||
;End_control_dispatch LDKLBR
|
||||
|
||||
VxD_LOCKED_DATA_SEG
|
||||
VkdControlProc dd 0
|
||||
vkdddb dd 0
|
||||
diskinfobuf:
|
||||
db 10h,0,0,0FFh
|
||||
db 0Ch dup (0)
|
||||
|
||||
oldidt label fword
|
||||
dw 03FFh
|
||||
dd 0
|
||||
|
||||
include mtldr.inc
|
||||
|
||||
imgname dd 0
|
||||
|
||||
VxD_LOCKED_DATA_ENDS
|
||||
|
||||
VxD_LOCKED_CODE_SEG
|
||||
|
||||
BeginProc NewControlProc
|
||||
cmp eax, Reboot_Processor
|
||||
jz short MyReboot
|
||||
jmp [VkdControlProc]
|
||||
EndProc NewControlProc
|
||||
|
||||
BeginProc MyReboot
|
||||
VMMCall _MapPhysToLinear,<0D000h,2000h,0>
|
||||
push eax
|
||||
VMMCall _MapPhysToLinear,<0,1000h,0>
|
||||
xchg eax, ebx
|
||||
cli
|
||||
lea esi, [ebx+53Ch]
|
||||
lodsd
|
||||
mov [ebx+413h], ax
|
||||
shr eax, 10h
|
||||
mov [ebx+40Eh], ax
|
||||
; restore BIOS IDT - vectors 00..1F
|
||||
mov edi, ebx
|
||||
mov ecx, 20h
|
||||
rep movsd
|
||||
; int 19
|
||||
mov eax, [ebx+810h]
|
||||
mov [ebx+64h], eax
|
||||
; vectors 40,41,42,43,46,4B,4F
|
||||
lea edi, [ebx+40h*4]
|
||||
movsd
|
||||
movsd
|
||||
movsd
|
||||
movsd
|
||||
scasd
|
||||
scasd
|
||||
movsd
|
||||
add edi, 10h
|
||||
movsd
|
||||
add edi, 0Ch
|
||||
movsd
|
||||
; vectors 70..77
|
||||
; lea esi, [ebx+5DCh]
|
||||
lea edi, [ebx+70h*4]
|
||||
mov ecx, 8
|
||||
rep movsd
|
||||
|
||||
; reboot to mtldr
|
||||
mov dword ptr [ebx+467h], 0D000007h ; 0D00:0007
|
||||
mov al, 0Fh
|
||||
out 70h, al
|
||||
jecxz $+2
|
||||
jecxz $+2
|
||||
mov al, 5
|
||||
out 71h, al
|
||||
; copy mtldr code
|
||||
mov esi, offset mtldr
|
||||
; mov edi, 0D000h
|
||||
pop edi
|
||||
push edi
|
||||
mov ecx, mtldr_size
|
||||
rep movsb
|
||||
; copy mtldr parameters
|
||||
mov esi, [imgname]
|
||||
mov edi, esi
|
||||
mov al, 0
|
||||
xor ecx, ecx
|
||||
dec ecx
|
||||
repnz scasb
|
||||
pop edi
|
||||
not ecx
|
||||
movzx eax, word ptr [edi+5]
|
||||
add edi, eax
|
||||
rep movsb
|
||||
; load old IDT
|
||||
lidt [oldidt]
|
||||
; reboot
|
||||
mov al, 0FEh
|
||||
out 64h, al
|
||||
hlt
|
||||
EndProc MyReboot
|
||||
|
||||
BeginProc LDKLBR_Control
|
||||
cmp eax, w32_DeviceIoControl
|
||||
jz short OnDeviceIoControl
|
||||
cmp eax, Sys_Dynamic_Device_Exit
|
||||
jz short OnExit
|
||||
cmp eax, Reboot_Processor
|
||||
jz MyReboot
|
||||
clc
|
||||
ret
|
||||
|
||||
OnExit:
|
||||
; allow unload if and only if we are not hooking
|
||||
cmp [VkdControlProc], 1
|
||||
cmc
|
||||
ret
|
||||
|
||||
OnDeviceIoControl:
|
||||
cmp dword ptr [esi+12], DIOC_Open
|
||||
jz @@open
|
||||
cmp dword ptr [esi+12], 0Fh
|
||||
jnz _exit
|
||||
; request to set path of image
|
||||
mov ecx, [esi+20] ; cbInBuffer
|
||||
cmp ecx, 300
|
||||
ja short @@paramerr
|
||||
test ecx, ecx
|
||||
jnz short @@param1ok
|
||||
@@paramerr:
|
||||
xor eax, eax
|
||||
inc eax
|
||||
@@errret:
|
||||
mov ecx, [vkdddb]
|
||||
mov edx, [VkdControlProc]
|
||||
mov [ecx + VxD_Desc_Block.DDB_Control_Proc], edx
|
||||
mov [VkdControlProc], 0
|
||||
ret
|
||||
@@param1ok:
|
||||
mov eax, [esi+16] ; lpvInBuffer
|
||||
; set drive
|
||||
mov dl, [eax]
|
||||
or dl, 20h
|
||||
sub dl, 60h
|
||||
jz short @@paramerr
|
||||
cmp dl, 'z'-60h
|
||||
ja short @@paramerr
|
||||
push esi
|
||||
Push_Client_State Uses_edi
|
||||
mov ecx, 10h
|
||||
stc
|
||||
push ds
|
||||
pop fs
|
||||
mov esi, offset diskinfobuf
|
||||
VMMCall Get_Cur_VM_Handle
|
||||
VxDCall V86MMGR_Allocate_Buffer
|
||||
VMMCall Begin_Nest_V86_Exec
|
||||
assume ebp:ptr Client_Reg_Struc
|
||||
mov [ebp.Client_AX], 440Dh
|
||||
mov [ebp.Client_BL], dl
|
||||
mov [ebp.Client_CX], 086Fh
|
||||
mov [ebp.Client_DX], di
|
||||
mov eax, edi
|
||||
shr eax, 10h
|
||||
mov [ebp.Client_DS], ax
|
||||
mov eax, 21h
|
||||
VMMCall Exec_Int
|
||||
VMMCall End_Nest_Exec
|
||||
mov ecx, 10h
|
||||
stc
|
||||
push ds
|
||||
pop fs
|
||||
VxDCall V86MMGR_Free_Buffer
|
||||
Pop_Client_State Uses_esi
|
||||
pop esi
|
||||
mov al, byte ptr [diskinfobuf+3]
|
||||
cmp al, 0FFh
|
||||
jz @@errret
|
||||
cmp al, 80h
|
||||
jb @@paramerr
|
||||
mov byte ptr [mtldr+4], al
|
||||
mov eax, dword ptr [diskinfobuf+8]
|
||||
mov dword ptr [mtldr], eax
|
||||
; set path
|
||||
mov ecx, [imgname]
|
||||
jecxz @f
|
||||
VMMCall _HeapFree, <ecx,0>
|
||||
@@:
|
||||
mov ecx, [esi+20]
|
||||
dec ecx
|
||||
push ecx
|
||||
VMMCall _HeapAllocate, <ecx,0>
|
||||
pop ecx
|
||||
mov [imgname], eax
|
||||
xchg edi, eax
|
||||
mov esi, [esi+16]
|
||||
inc esi
|
||||
@@1:
|
||||
lodsb
|
||||
cmp al, 'A'
|
||||
jb short @f
|
||||
cmp al, 'Z'
|
||||
ja short @f
|
||||
or al, 20h
|
||||
@@:
|
||||
stosb
|
||||
loop @@1
|
||||
xor eax, eax
|
||||
ret
|
||||
@@open:
|
||||
; don't hook if already hooked
|
||||
cmp [VkdControlProc], 0
|
||||
jnz short @f
|
||||
mov eax, 0Dh
|
||||
VMMCall Get_DDB
|
||||
mov [vkdddb], ecx
|
||||
mov eax, [ecx + VxD_Desc_Block.DDB_Control_Proc]
|
||||
mov [VkdControlProc], eax
|
||||
mov [ecx + VxD_Desc_Block.DDB_Control_Proc], NewControlProc
|
||||
@@:
|
||||
xor eax, eax
|
||||
_exit:
|
||||
ret
|
||||
EndProc LDKLBR_Control
|
||||
|
||||
VxD_LOCKED_CODE_ENDS
|
||||
|
||||
end
|
28
programs/hd_load/meosload/AUTOEXEC.BAT
Normal file
28
programs/hd_load/meosload/AUTOEXEC.BAT
Normal file
@@ -0,0 +1,28 @@
|
||||
goto %config%
|
||||
:dos1
|
||||
rem c:\vc401\vc
|
||||
lh keyrus
|
||||
lh mmouse
|
||||
lh C:\WINDOWS\COMMAND\mscdex /d:12345678
|
||||
lh \dn\dn
|
||||
bootgui=0
|
||||
:dos2
|
||||
rem essolo.com
|
||||
lh keyrus
|
||||
lh mmouse
|
||||
lh \dn\dn
|
||||
bootgui=0
|
||||
:win
|
||||
rem c:\essolo.com
|
||||
set path=C:\WINDOWS;C:\WINDOWS\COMMAND;c:\;c:\windows\;c:\windows\comand\;c:\arc\;c:\dn\
|
||||
C:\WINDOWS\COMMAND\DELTREE /y C:\WINDOWS\TEMP\*.*
|
||||
mode con codepage prepare=((866) C:\WINDOWS\COMMAND\ega3.cpi)
|
||||
mode con codepage select=866
|
||||
keyb ru,,C:\WINDOWS\COMMAND\keybrd3.sys
|
||||
goto continue
|
||||
:meos
|
||||
c:\kolibri\meosload.com
|
||||
:l:\meosload.com
|
||||
:continue
|
||||
rem bootgui=1
|
||||
|
27
programs/hd_load/meosload/CONFIG.SYS
Normal file
27
programs/hd_load/meosload/CONFIG.SYS
Normal file
@@ -0,0 +1,27 @@
|
||||
[menu]
|
||||
menucolor=7
|
||||
menuitem=win,Windows 98SE
|
||||
menuitem=dos1,Dos Navigator+CD
|
||||
menuitem=dos2,Dos Navigator
|
||||
menuitem=kos,KolibriOS
|
||||
menudefault=win,15
|
||||
[dos1]
|
||||
rem DEVICE=essolo.sys
|
||||
DEVICE=C:\WINDOWS\himem.sys
|
||||
device=C:\WINDOWS\COMMAND\display.sys con=(ega,,1)
|
||||
DEVICE=C:\WINDOWS\emm386.exe noems
|
||||
device=osi105p.sys
|
||||
dos=high,umb
|
||||
[dos2]
|
||||
rem DEVICE=essolo.sys
|
||||
DEVICE=C:\WINDOWS\himem.sys
|
||||
device=C:\WINDOWS\COMMAND\display.sys con=(ega,,1)
|
||||
DEVICE=C:\WINDOWS\emm386.exe noems
|
||||
dos=high,umb
|
||||
[win]
|
||||
rem DEVICE=c:\essolo.sys
|
||||
DEVICE=C:\WINDOWS\himem.sys
|
||||
device=C:\WINDOWS\COMMAND\display.sys con=(ega,,1)
|
||||
Country=007,866,C:\WINDOWS\COMMAND\country.sys
|
||||
[kos]
|
||||
[common]
|
9
programs/hd_load/meosload/History.txt
Normal file
9
programs/hd_load/meosload/History.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
14.02.2003
|
||||
Version 1.0 - Base version
|
||||
|
||||
11.06.2003
|
||||
Version 1.1 - Added support of loading from IMAGE-file.
|
||||
(see of Ivan Poddubny kernel modification)
|
||||
|
||||
28.10.2006
|
||||
menuet.img renamed to kolibri.img
|
18
programs/hd_load/meosload/L_readme.txt
Normal file
18
programs/hd_load/meosload/L_readme.txt
Normal file
@@ -0,0 +1,18 @@
|
||||
<EFBFBD><EFBFBD><EFBFBD> <20>⨬ <20><><EFBFBD>짮<EFBFBD><ECA7AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1ABA5><EFBFBD><EFBFBD> <20><><EFBFBD>㠫쭮 ⮫쪮 <20><><EFBFBD> <20><><EFBFBD>, <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <><E1ABA5><EFBFBD>騥 <20><>:
|
||||
MS-DOS, Windows95, Windows98 <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>䨪<EFBFBD>樨. <20><><EFBFBD> <20><><EFBFBD>, <20> <20><><EFBFBD><EFBFBD> Windows2000
|
||||
<EFBFBD><EFBFBD><EFBFBD> WindowsXP <20><><EFBFBD><EFBFBD>室<EFBFBD><E5AEA4><EFBFBD> <20><><EFBFBD>짮<EFBFBD><ECA7AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>稪<EFBFBD><E7A8AA> mtldr (<28><><EFBFBD><EFBFBD><EFBFBD> Diamond),
|
||||
⠪<EFBFBD><EFBFBD> <20>室<EFBFBD>騬 <20> <20><><EFBFBD><EFBFBD>ਡ<EFBFBD>⨢.
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>᪥:
|
||||
C:\KOLIBRI <20><><EFBFBD> D:\KOLIBRI <20><><EFBFBD> E:\KOLIBRI <20><><EFBFBD> <20><EFBFBD> <20><>㣮<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD> <20>ᬮ<EFBFBD>७<EFBFBD><E0A5AD>.
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>頥<EFBFBD> <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> MeOSload.com, <20><><EFBFBD><EFBFBD> <20><> <20>०<EFBFBD><E0A5A6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><>⠢<EFBFBD><E2A0A2><EFBFBD> <20> <20>
|
||||
<EFBFBD><EFBFBD> ⮣<> <20><>᪠, <20> <20><><EFBFBD><EFBFBD> <20><>室<EFBFBD><E5AEA4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> KOLIBRI.
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>頥<EFBFBD> KOLIBRI.IMG <20> <20><><EFBFBD><EFBFBD><EFBFBD> KOLIBRI, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>頥<EFBFBD>, <20><><EFBFBD> <20>
|
||||
࠭<EFBFBD><EFBFBD><EFBFBD>, <20><>⠢<EFBFBD><E2A0A2><EFBFBD> <20><><EFBFBD> <20> <20><> <20><>᪠.
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Autoexec.bat <20> Config.sys <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ࠡ<EFBFBD>⠭<EFBFBD> <20><><EFBFBD> <20>롮<EFBFBD><EBA1AE> <20><><EFBFBD><EFBFBD>㧪<EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20>ਬ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><>㦨<EFBFBD><E3A6A8> 䠩<><E4A0A9>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD>ன <20><>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>뫨 <20><><EFBFBD> <20><><EFBFBD>㬥<EFBFBD><E3ACA5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>頩<EFBFBD><E9A0A9><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
http://meos.sysbin.com
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!
|
18
programs/hd_load/meosload/L_readme_Win.txt
Normal file
18
programs/hd_load/meosload/L_readme_Win.txt
Normal file
@@ -0,0 +1,18 @@
|
||||
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD>, <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>:
|
||||
MS-DOS, Windows95, Windows98 <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD> <20><><EFBFBD>, <20> <20><><EFBFBD><EFBFBD> Windows2000
|
||||
<EFBFBD><EFBFBD><EFBFBD> WindowsXP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mtldr (<28><><EFBFBD><EFBFBD><EFBFBD> Diamond),
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>:
|
||||
C:\KOLIBRI <20><><EFBFBD> D:\KOLIBRI <20><><EFBFBD> E:\KOLIBRI <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> MeOSload.com, <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> KOLIBRI.
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> KOLIBRI.IMG <20> <20><><EFBFBD><EFBFBD><EFBFBD> KOLIBRI, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Autoexec.bat <20> Config.sys <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
http://meos.sysbin.com
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!
|
364
programs/hd_load/meosload/MeOSload.asm
Normal file
364
programs/hd_load/meosload/MeOSload.asm
Normal file
@@ -0,0 +1,364 @@
|
||||
;
|
||||
; MenuesOS Boot Loader
|
||||
;
|
||||
; Author: Trans
|
||||
; Date: 14.02.03
|
||||
; Version: 1.0
|
||||
;
|
||||
; Current Version: 1.1
|
||||
; Date of modification: 11.06.03
|
||||
;
|
||||
; Compile with FASM
|
||||
;
|
||||
|
||||
;--------Code------------
|
||||
org 100h
|
||||
start:
|
||||
push cs
|
||||
pop ds
|
||||
mov ax,0003h
|
||||
int 10h
|
||||
|
||||
mov dx,title
|
||||
call print
|
||||
mov dx,mes1
|
||||
call print
|
||||
|
||||
mov dx,img0
|
||||
call file_open
|
||||
test ax,ax
|
||||
jnz loader_continue
|
||||
mov dx,img2
|
||||
call file_open
|
||||
test ax,ax
|
||||
jne loader_continue
|
||||
mov dx,img3
|
||||
call file_open
|
||||
test ax,ax
|
||||
je loader_not_find_file
|
||||
loader_continue:
|
||||
mov [handle],ax
|
||||
|
||||
;---------Read boot-sector-----------
|
||||
mov bx,ax
|
||||
mov dx,buffer
|
||||
mov cx,512
|
||||
call file_read
|
||||
|
||||
;--------Read parametrs--------------
|
||||
mov ax,[buffer+0bh]
|
||||
mov [SectSize],ax
|
||||
mov al,[buffer+0dh]
|
||||
mov [ClustSect],al
|
||||
mov ax,[buffer+0eh]
|
||||
mov [ResSect],ax
|
||||
add ax,[ResRgn]
|
||||
mov [FATRgn],ax
|
||||
mov al,[buffer+10h]
|
||||
mov [FATCnt],al
|
||||
xor bx,bx
|
||||
mov bl,al
|
||||
mov ax,[buffer+11h]
|
||||
mov [RootEnt],ax
|
||||
shr ax,4 ; ax=ax*32/512
|
||||
mov [RootDirRgnSz],ax
|
||||
mov ax,[buffer+16h]
|
||||
mov [FATSect],ax
|
||||
mul bx
|
||||
mov [FATRgnSz],ax
|
||||
add ax,[FATRgn]
|
||||
mov [RootDirRgn],ax
|
||||
add ax,[RootDirRgnSz]
|
||||
mov [DataRgn],ax
|
||||
|
||||
;------Read FATs and RootDir---------
|
||||
xor eax,eax
|
||||
xor edx,edx
|
||||
mov ax,[FATRgn]
|
||||
mul [SectSize]
|
||||
mov cx,dx
|
||||
mov dx,ax
|
||||
mov bx,[handle]
|
||||
call file_offset
|
||||
mov ax,[FATRgnSz]
|
||||
mul [SectSize]
|
||||
mov cx,ax
|
||||
mov dx,buffer
|
||||
mov bx,[handle]
|
||||
call file_read
|
||||
mov cx,[RootEnt]
|
||||
shl cx,5
|
||||
mov dx,Root
|
||||
mov bx,[handle]
|
||||
call file_read
|
||||
|
||||
;-------Search entry pointer in RootDir---------
|
||||
push ds
|
||||
pop es
|
||||
mov cx,[RootEnt]
|
||||
mov bx,Root
|
||||
loader_loc_00:
|
||||
push cx
|
||||
mov cx,11
|
||||
mov di,bx
|
||||
mov si,kernel
|
||||
repe cmpsb
|
||||
jnz loader_notfound
|
||||
pop cx
|
||||
jmp loader_find
|
||||
loader_notfound:
|
||||
pop cx
|
||||
add bx,32
|
||||
loop loader_loc_00
|
||||
loader_find:
|
||||
|
||||
mov ax,[bx+1ah]
|
||||
mov [FirstClust],ax
|
||||
mov eax,[bx+1ch]
|
||||
mov [filesize],eax
|
||||
|
||||
;------Read Kernel----------------------
|
||||
call read_kernel
|
||||
|
||||
;---------------------------------------
|
||||
|
||||
mov bx,[handle]
|
||||
call file_close
|
||||
;;;;;;;;;;;;;;;;;;;;;;
|
||||
jmp loader_yes
|
||||
;;;;;;;;;;;;;;;;;;;;;;
|
||||
; mov dx,mes2
|
||||
; call print
|
||||
;loader_key:
|
||||
; mov ah,00h
|
||||
; int 16h
|
||||
; cmp al,1bh ;ESC
|
||||
; je loader_no
|
||||
; cmp al,6eh ;'n'
|
||||
; je loader_no
|
||||
; cmp al,4eh ;'N'
|
||||
; je loader_no
|
||||
; cmp al,79h ;'y'
|
||||
; je loader_yes
|
||||
; cmp al,59h ;'Y'
|
||||
; je loader_yes
|
||||
; jmp loader_key
|
||||
|
||||
loader_not_find_file:
|
||||
mov dx,mes4
|
||||
call print
|
||||
jmp loader_exit
|
||||
|
||||
loader_yes:
|
||||
mov dx,yes
|
||||
call print
|
||||
mov ax,7000h
|
||||
mov es,ax
|
||||
mov si,move_kernel
|
||||
xor di,di
|
||||
mov cx,len_mk
|
||||
rep movsb
|
||||
jmp far 7000h:0000h
|
||||
; jmp loader_exit
|
||||
loader_no:
|
||||
mov dx,no
|
||||
call print
|
||||
|
||||
loader_exit:
|
||||
mov dx,mes3
|
||||
call print
|
||||
retn
|
||||
;----Subprogramms--------
|
||||
|
||||
print:
|
||||
; in: dx - offset of ASCII string
|
||||
; out:
|
||||
mov ah,09h
|
||||
int 21h
|
||||
retn
|
||||
|
||||
file_open:
|
||||
; in: ds:dx - offset of ASCIIZ filename string
|
||||
; out: ax - file handle (ax=0 - not found)
|
||||
mov ax,3d00h
|
||||
int 21h
|
||||
jnc fo_exit
|
||||
xor ax,ax
|
||||
fo_exit:
|
||||
retn
|
||||
|
||||
file_close:
|
||||
; in: bx - file handle
|
||||
; out:
|
||||
mov ah,3eh
|
||||
int 21h
|
||||
retn
|
||||
|
||||
file_read:
|
||||
; in: bx - file handle
|
||||
; ds:dx - buffer
|
||||
; cx - numbers of bytes
|
||||
; out:
|
||||
mov ah,3fh
|
||||
int 21h
|
||||
retn
|
||||
|
||||
file_offset:
|
||||
; in: bx - file handle
|
||||
; cx:dx - offset in bytes (cx*65535+dx)
|
||||
; out:
|
||||
mov ax,4200h
|
||||
int 21h
|
||||
retn
|
||||
|
||||
sector_find:
|
||||
; in: ax - No of Cluster
|
||||
; out: ax - 1st sector of Cluster
|
||||
dec ax
|
||||
dec ax
|
||||
push bx
|
||||
xor bx,bx
|
||||
mov bl,[ClustSect]
|
||||
mul bx
|
||||
pop bx
|
||||
add ax,[DataRgn]
|
||||
retn
|
||||
|
||||
read_cluster:
|
||||
; in: ax - No of Cluster
|
||||
; ds:dx - buffer
|
||||
; out:
|
||||
push dx
|
||||
call sector_find
|
||||
push ax
|
||||
xor eax,eax
|
||||
xor ebx,ebx
|
||||
pop ax
|
||||
mov bx,[SectSize]
|
||||
mul ebx
|
||||
mov dx,ax
|
||||
shr eax,16
|
||||
mov cx,ax
|
||||
mov bx,[handle]
|
||||
call file_offset
|
||||
xor ax,ax
|
||||
mov al,[ClustSect]
|
||||
mul [SectSize]
|
||||
mov cx,ax
|
||||
mov bx,[handle]
|
||||
pop dx
|
||||
call file_read
|
||||
retn
|
||||
|
||||
read_kernel:
|
||||
; in:
|
||||
; out:
|
||||
mov ax,8000h
|
||||
mov es,ax ;8000:0000 = 80000h - Temporal location of kernel
|
||||
xor di,di ;
|
||||
mov ax,[FirstClust]
|
||||
mov bp,ax
|
||||
rk_loc_00:
|
||||
push es
|
||||
mov dx,Root
|
||||
call read_cluster
|
||||
xor ax,ax ; Moving cluster to area of location kernel
|
||||
mov al,[ClustSect] ;
|
||||
mul [SectSize] ;
|
||||
mov cx,ax ;
|
||||
pop es ;
|
||||
mov si,Root ;
|
||||
rep movsb ;
|
||||
cmp di,00h
|
||||
jne rk_continue
|
||||
mov ax,es
|
||||
add ax,1000h
|
||||
mov es,ax
|
||||
rk_continue:
|
||||
mov ax,bp
|
||||
cmp ax,0ff8h
|
||||
jae rk_done
|
||||
shl ax,1 ; Val=Clustrer*1,5 //(Cluster*3)/2
|
||||
add ax,bp ;
|
||||
shr ax,1 ;
|
||||
mov bx,ax
|
||||
add bx,buffer
|
||||
mov ax,[bx]
|
||||
bt bp,0
|
||||
jc rk_nechet
|
||||
and ax,0fffh
|
||||
jmp rk_chet
|
||||
rk_nechet:
|
||||
shr ax,4
|
||||
rk_chet:
|
||||
mov bp,ax
|
||||
jmp rk_loc_00
|
||||
rk_done:
|
||||
retn
|
||||
|
||||
move_kernel:
|
||||
; in:
|
||||
; out:
|
||||
mov ax,8000h
|
||||
mov ds,ax
|
||||
mov ax,1000h
|
||||
mov es,ax
|
||||
xor si,si
|
||||
xor di,di
|
||||
mov cx,8000h
|
||||
rep movsb
|
||||
mov cx,8000h
|
||||
rep movsb
|
||||
mov bx,es
|
||||
add bx,1000h
|
||||
mov es,bx
|
||||
mov bx,ds
|
||||
add bx,1000h
|
||||
mov ds,bx
|
||||
mov cx,8000h
|
||||
rep movsb
|
||||
mov cx,8000h
|
||||
rep movsb
|
||||
mov ax,1000h
|
||||
mov ds,ax
|
||||
mov es,ax
|
||||
jmp far 1000h:0000h
|
||||
retn
|
||||
len_mk=$-move_kernel
|
||||
|
||||
;--------Data------------
|
||||
title db 'MenuetOS/KolibriOS Boot Loader. Ver.1.1 Copyright(C) 2003, Trans.',0ah,0dh,0ah,0dh,'$'
|
||||
mes1 db 'It is alternative of boot from floppy.',0ah,0dh
|
||||
db 'You MUST select HD booting !!!',0ah,0dh,0ah,0dh,'$'
|
||||
mes2 db 'Are you sure loading KolibriOS? (Y/N):','$'
|
||||
yes db 'Y','$'
|
||||
no db 'N','$'
|
||||
mes3 db 0ah,0dh,0ah,0dh,'See you later ...',0ah,0dh,'$'
|
||||
mes4 db 0ah,0dh,0ah,0dh,'Not Found: '
|
||||
img0 db 'kolibri\kolibri.img',0,', '
|
||||
img2 db 'kolibri.img',0,', '
|
||||
img3 db 'menuet.img',0,' :($'
|
||||
kernel db 'KERNEL MNT',0
|
||||
handle dw ?
|
||||
SectSize dw ? ; +0bh
|
||||
ClustSect db ? ; +0dh
|
||||
ResSect dw ? ; +0eh
|
||||
FATCnt db ? ; +10h
|
||||
RootEnt dw ? ; +11h
|
||||
FATSect dw ? ; +16h
|
||||
filesize dd ? ; +1ch
|
||||
FirstClust dw ? ; +1ah
|
||||
|
||||
ResRgn dw 0 ; = VolumeStart
|
||||
FATRgn dw ? ; = ResRgn+ResSect
|
||||
RootDirRgn dw ? ; = FATRgn+(FATCnt*FATSect)
|
||||
DataRgn dw ? ; = RootDirRgn+((RootEnt*32)/SectSize)
|
||||
ResRgnSz dw ? ; = ResSect
|
||||
FATRgnSz dw ? ; = FATCnt*FATSect
|
||||
RootDirRgnSz dw ? ; = (RootEnt*32)/SectSize
|
||||
;First sector of cluster N = DataRgn+((N-2)*ClustSect)
|
||||
|
||||
buffer:
|
||||
org 3000h
|
||||
Root:
|
||||
|
112
programs/hd_load/mtldr/fat32.inc
Normal file
112
programs/hd_load/mtldr/fat32.inc
Normal file
@@ -0,0 +1,112 @@
|
||||
fat32_parse_dir:
|
||||
; in: eax=directory cluster
|
||||
; out: eax=entry cluster
|
||||
mov bx, 900h
|
||||
mov di, bx
|
||||
push eax
|
||||
call read_cluster
|
||||
mov cx, word [cluster_size]
|
||||
shr cx, 5 ; div 20h
|
||||
.scan_cluster:
|
||||
pop eax
|
||||
cmp byte [di], 0
|
||||
jz file_not_found
|
||||
mov si, [esp+2]
|
||||
push eax
|
||||
call fat_compare_name
|
||||
jz .file_found
|
||||
and di, not 1Fh
|
||||
add di, 20h
|
||||
loop .scan_cluster
|
||||
pop eax
|
||||
call next_cluster
|
||||
jnc file_not_found
|
||||
jc fat32_parse_dir
|
||||
.file_found:
|
||||
pop eax
|
||||
mov si, [esp+2]
|
||||
mov [cur_obj], si
|
||||
and di, not 1Fh
|
||||
mov si, directory_string
|
||||
mov ax, [di+14h]
|
||||
shl eax, 10h
|
||||
mov ax, [di+1Ah]
|
||||
test eax, eax
|
||||
mov si, nodata_string
|
||||
jz find_error_si
|
||||
ret 2
|
||||
|
||||
fat_compare_name:
|
||||
push cx
|
||||
mov cx, 9
|
||||
.scan:
|
||||
lodsb
|
||||
cmp al, '.'
|
||||
jz .ext
|
||||
cmp al, 0
|
||||
jz .nameend
|
||||
cmp al, 'a'
|
||||
jb .notletter
|
||||
cmp al, 'z'
|
||||
ja .notletter
|
||||
or byte [di], 20h
|
||||
.notletter:
|
||||
scasb
|
||||
loopz .scan
|
||||
.notfound:
|
||||
inc cx ; to clear ZF flag
|
||||
pop cx
|
||||
ret
|
||||
.ext:
|
||||
mov al, ' '
|
||||
dec cx
|
||||
repz scasb
|
||||
jnz .notfound
|
||||
test di, 1
|
||||
jnz .notfound
|
||||
mov cx, 4
|
||||
jmp .scan
|
||||
.nameend:
|
||||
mov al, ' '
|
||||
dec cx
|
||||
repz scasb
|
||||
jnz .notfound
|
||||
test di, 1
|
||||
jnz .file_found
|
||||
mov cx, 3
|
||||
repz scasb
|
||||
jnz .notfound
|
||||
.file_found:
|
||||
xor cx, cx ; to set ZF flag
|
||||
pop cx
|
||||
ret
|
||||
|
||||
read_cluster:
|
||||
; in: eax=cluster,bx->buffer
|
||||
and eax, 0FFFFFFFh
|
||||
movzx ecx, byte [50Dh] ; sects_per_clust
|
||||
mul ecx
|
||||
add eax, [data_start]
|
||||
; call read
|
||||
; ret
|
||||
jmp relative_read
|
||||
next_cluster:
|
||||
mov bx, 700h
|
||||
; sector is 200h bytes long, one entry in FAT occupies 4 bytes => 80h entries in sector
|
||||
push eax
|
||||
shr eax, 7 ; div 80h
|
||||
cmp eax, [fat_cur_sector]
|
||||
jz @f
|
||||
mov [fat_cur_sector], eax
|
||||
add eax, [fat_start]
|
||||
mov cx, 1
|
||||
call relative_read
|
||||
@@:
|
||||
pop eax
|
||||
and eax, 7Fh
|
||||
mov eax, [700h+eax*4]
|
||||
and eax, 0FFFFFFFh
|
||||
cmp eax, 0FFFFFF7h
|
||||
mov si, bad_cluster_string
|
||||
jz find_error_si
|
||||
ret
|
101
programs/hd_load/mtldr/install.txt
Normal file
101
programs/hd_load/mtldr/install.txt
Normal file
@@ -0,0 +1,101 @@
|
||||
<EFBFBD><EFBFBD>⠭<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢫<EFBFBD><E2A2AB><EFBFBD><EFBFBD><EFBFBD> <><E1ABA5><EFBFBD>騬 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᯮᮡ<E1AFAE><E1AEA1>:
|
||||
<EFBFBD><EFBFBD><EFBFBD> 1. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 䠩<><E4A0A9> mtldr <20> kolibri.img <20> C:\
|
||||
(<28><> <20>ࠢ<EFBFBD><E0A0A2><EFBFBD><EFBFBD> C:\? <20><><EFBFBD><EFBFBD><EFBFBD>⠩<EFBFBD><E2A0A9> <20><><EFBFBD><EFBFBD>砭<EFBFBD><E7A0AD> <20><><EFBFBD><EFBFBD>.)
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD> 2<>) <20><><EFBFBD> <20><><EFBFBD>짮<EFBFBD><ECA7AE>⥫<EFBFBD><E2A5AB> NT-ᥬ<><E1A5AC><EFBFBD>⢠ <20><> Vista (NT/2k/XP/2003 Server (?)):
|
||||
<09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> boot.ini <20> ࠧ<><E0A0A7><EFBFBD> [operating systems] <20><>ப<EFBFBD>
|
||||
c:\mtldr="KolibriOS"
|
||||
(<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> ⥪<>⮢<EFBFBD><E2AEA2> ।<><E0A5A4><EFBFBD><EFBFBD> c:\boot.ini,
|
||||
<20><><EFBFBD><EFBFBD> <20><>१ Control Panel -> System -> Advanced -> Startup and Recovery
|
||||
-> Edit). <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>窠<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD> <20>ࠢ<EFBFBD><E0A0A2><EFBFBD><EFBFBD>,
|
||||
<09><><EFBFBD> <20>⨬ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⥬<EFBFBD> <20>㤥<EFBFBD> <20><><EFBFBD><EFA2AB><EFBFBD><EFBFBD><EFBFBD> <20> ᯨ᪥ <20><><EFBFBD><EFBFBD>㧪<EFBFBD>.
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>㧪<EFBFBD> <20>㤥<EFBFBD> <20>뤠<EFBFBD><EBA4A0><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>࠭ <20>롮<EFBFBD><EBA1AE> <20><><EFBFBD><EFBFBD><EFBFBD>樮<EFBFBD><E6A8AE><EFBFBD><EFBFBD> <20><><EFBFBD>⥬<EFBFBD>.
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD> 2<>) <20><><EFBFBD> <20><><EFBFBD>짮<EFBFBD><ECA7AE>⥫<EFBFBD><E2A5AB> 9x-ᥬ<><E1A5AC><EFBFBD>⢠ (95/98)
|
||||
(<28> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD> <20>㤥<EFBFBD> ࠡ<><E0A0A1><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DOS):
|
||||
<09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> config.sys <20><>ப<EFBFBD>
|
||||
install=c:\mtldr
|
||||
<09><>ࢮ<EFBFBD> <20><>ப<EFBFBD><E0AEAA>, <20> <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>⮩ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> config.sys,
|
||||
<09><>ࢮ<EFBFBD> <20><>ப<EFBFBD><E0AEAA> <20> ᮮ⢥<E1AEAE><E2A2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>饩 ᥪ樨, <20> config.sys
|
||||
ࠧ<><E0A0A7><EFBFBD> <20><> ᥪ樨 (<28> <20><>稭<EFBFBD><E7A8AD><EFBFBD><EFBFBD><EFBFBD> <20> [menu])
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>㧪<EFBFBD> mtldr <20>㤥<EFBFBD> <20><><EFBFBD><EFBFBD>訢<EFBFBD><E8A8A2><EFBFBD>: "Load KolibriOS? [y/n]: " <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 'y','Y','n','N'.
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD> Windows Millenium <20><><EFBFBD> <20><> ࠡ<>⠥<EFBFBD>, <20>.<2E>. Me'<27><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>稪 <20><>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>㦠<EFBFBD><EFBFBD> <20><><EFBFBD>譥<EFBFBD><E8ADA5> <20><><EFBFBD><EFBFBD> <20><> config.sys. (<28><><EFBFBD>ᨡ<EFBFBD> camper'<27> <20><> 㪠<><E3AAA0><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><E1AAAE><E0A1AD> 䠪<>.) <20>ᯮ<EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 9x2klbr.
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD> 2<>) <20><><EFBFBD> <20><><EFBFBD>짮<EFBFBD><ECA7AE>⥫<EFBFBD><E2A5AB> Vista:
|
||||
<09><><EFBFBD>ன<EFBFBD><E0AEA9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ப<EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>᪨<EFBFBD><E1AAA8> <20>ਢ<EFBFBD><E0A8A2><EFBFBD><EFBFBD><EFBFBD>ﬨ
|
||||
(<28>㭪<EFBFBD> "Run as administrator" <20> <20><><EFBFBD>⥪<EFBFBD>⭮<EFBFBD> <20><><EFBFBD><EFBFBD>);
|
||||
<09> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>⠭<EFBFBD><E2A0AD><EFBFBD><EFBFBD> <20><><EFBFBD>쪨<EFBFBD> <20><>ਠ<EFBFBD>⮢ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<09><><EFBFBD> <20><><EFBFBD>ᠭ<EFBFBD> <20> <20><><EFBFBD><EFBFBD>砭<EFBFBD><E7A0AD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ਫ<EFBFBD><E0A8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> vista_install.bat;
|
||||
<09><><EFBFBD><EFBFBD><EFBFBD> <20>믮<EFBFBD><EBAFAE><EFBFBD><EFBFBD><EFBFBD> <><E1ABA5><EFBFBD>騥 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
||||
bcdedit /create /d "KolibriOS" /application BOOTSECTOR
|
||||
(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>窠<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD> <20>ࠢ<EFBFBD><E0A0A2><EFBFBD><EFBFBD>,
|
||||
<09><><EFBFBD> <20>⨬ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⥬<EFBFBD> <20>㤥<EFBFBD> <20><><EFBFBD><EFA2AB><EFBFBD><EFBFBD><EFBFBD> <20> ᯨ᪥ <20><><EFBFBD><EFBFBD>㧪<EFBFBD>.)
|
||||
<09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFA2A8><EFBFBD><EFBFBD> ᮮ<>饭<EFBFBD><E9A5AD> ⨯<>
|
||||
"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} <20>ᯥ譮 ᮧ<><E1AEA7><EFBFBD><EFBFBD>."
|
||||
<09><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>⠢<EFBFBD><E2A0A2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>祭<EFBFBD><E7A5AD><EFBFBD> <20><><EFBFBD>祭<EFBFBD><E7A5AD> (<28><><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
||||
ࠧ<><E0A0A7><EFBFBD> <20><> ࠧ<><E0A0A7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>).
|
||||
bcdedit /set {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} DEVICE PARTITION=C:
|
||||
bcdedit /set {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} PATH \mtldr
|
||||
bcdedit /displayorder {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} /addlast
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2<>) <20> 2<>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢫<EFBFBD><E2A2AB><EFBFBD><EFBFBD><EFBFBD> 㤠<><E3A4A0><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>
|
||||
boot.ini <20> config.sys ᮮ⢥<E1AEAE><E2A2A5>⢥<EFBFBD><E2A2A5><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD>砥 2<>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ⠪:
|
||||
|
||||
vista_remove.bat, <20> <20><>⠭<EFBFBD><E2A0AD><EFBFBD><EFBFBD> <20>뫠 <20><>१ vista_install.bat;
|
||||
bcdedit /delete {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} <20> <20><>饬 <20><><EFBFBD>砥
|
||||
|
||||
<EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>祭<EFBFBD><E7A5AD><EFBFBD> <20><><EFBFBD> <20><>⠭<EFBFBD><E2A0AD><EFBFBD><EFBFBD> GUID (<28><><EFBFBD> <20><>ଠ<EFBFBD>쭮<EFBFBD> <><EFA2AB><EFBFBD><EFBFBD>),
|
||||
<EFBFBD><EFBFBD> 㧭<><E3A7AD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20>믮<EFBFBD><EBAFAE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> bcdedit <20><><EFBFBD> <20><><EFBFBD>㬥<EFBFBD>⮢ <20> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD> <20>뢥<EFBFBD><EBA2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᯨ᪥ ᮮ⢥<E1AEAE><E2A2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>騩 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
|
||||
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><>࠭<EFBFBD> <20>롮<EFBFBD><EBA1AE> <20><>ࠬ<EFBFBD><E0A0AC> KolibriOS <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
||||
<EFBFBD><EFBFBD><EFBFBD>㤠 <20><>㧨<EFBFBD><E3A7A8> <20><>ࠧ (<28>㭪<EFBFBD> d, "<22><>ࠧ <20><>᪥<EFBFBD><E1AAA5>"),
|
||||
<EFBFBD>⢥<EFBFBD><EFBFBD><EFBFBD><EFBFBD> "3" (<28>ᯮ<EFBFBD>짮<EFBFBD><ECA7AE><EFBFBD><EFBFBD> 㦥 <20><><EFBFBD><EFBFBD>㦥<EFBFBD><E3A6A5><EFBFBD><EFBFBD> <20><>ࠧ).
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>砭<EFBFBD><EFBFBD>:
|
||||
|
||||
1. <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> ࠡ<>⠥<EFBFBD> <20><><EFBFBD> 䠩<><E4A0A9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⥬ NTFS <20> FAT32, <20><><EFBFBD><EFBFBD><EFBFBD>প<EFBFBD> FAT16
|
||||
<EFBFBD><EFBFBD> ॠ<><E0A5A0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><>裡 <20> <20><><EFBFBD><EFBFBD> <20><>㡮<EFBFBD><E3A1AE><EFBFBD> 㡥<><E3A1A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> ᥩ<><E1A5A9><EFBFBD> FAT16 - <20><>ꥪ<EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>᪨<EFBFBD>. <20> <20><> <20>ᯮ<EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FAT16, <20> <20><><EFBFBD> <20>⮨<EFBFBD> Windows <20> <20><> <20><>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><> <20><><EFBFBD>稭<EFBFBD><E7A8AD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>室<EFBFBD><E5AEA4><EFBFBD> <20><> FAT32 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
- <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD> 㤠<><E3A4A0><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>㡥<EFBFBD><E3A1A5><EFBFBD><EFBFBD>.
|
||||
|
||||
2. <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>稪 mtldr <20><><EFBFBD><EFBFBD>易⥫쭮 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> C:\. <20><><EFBFBD> 9x <20> Vista <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
ࠧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> 㣮<><E3A3AE><EFBFBD>, <20> NT/2k/XP - <20><> <20><>᪥ C:, <20><> <20><><EFBFBD><EFBFBD>易⥫쭮
|
||||
<EFBFBD> <20><><EFBFBD><E0ADA5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>. (<28><><EFBFBD>㬥<EFBFBD><E3ACA5><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><>⠭<EFBFBD><E2A0AD><EFBFBD><EFBFBD> <20>㦭<EFBFBD> 㪠<>뢠<EFBFBD><EBA2A0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
c:\mtldr ॠ<><E0A5A0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> ॠ<>쭮<EFBFBD> <20><><EFBFBD> 䠩<><E4A0A9>.)
|
||||
|
||||
3. <20><>ࠧ kolibri.img ⮦<> <20><><EFBFBD><EFBFBD>易⥫쭮 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> C:\. <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><>直<EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><>⠭<EFBFBD><E2A0AD><EFBFBD><EFBFBD> <20>ᯮ<EFBFBD>짮<EFBFBD><ECA7AE><EFBFBD><EFBFBD> <20><><EFBFBD><E0ADA5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EEA1AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1AAAE> <20><>᪠,
|
||||
ࠧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>饣<EFBFBD><EFBFBD><EFBFBD> <20><> <20><>ࢮ<EFBFBD> 䨧<><E4A8A7><EFBFBD><EFBFBD>.
|
||||
|
||||
4. <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ᯮ<EFBFBD>짮<EFBFBD><ECA7AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>᪨<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>㣮<EFBFBD> 䨧<><E4A8A7><EFBFBD><EFBFBD> <20><>᪥?
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20><> <><E1ABA5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ਠ<EFBFBD>⮢:
|
||||
a) (<28> <20><> 㬥<><E3ACA5><EFBFBD> ࠡ<><E0A0A1><EFBFBD><EFBFBD><EFBFBD> <20> FASM'<27><>) <20> <20><>室<EFBFBD><E5AEA4><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> ᪠<><E1AAA0><EFBFBD><EFBFBD>
|
||||
<20><> http://diamondz.land.ru, ⠬ <20><>, <20><><EFBFBD> <20> ᠬ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>稪) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<20><><EFBFBD><EFBFBD>⠭<EFBFBD><E2A0AD> boot_drive (<28> <20><><EFBFBD><EFBFBD><EFBFBD> mtldr.asm) <20> 80h <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䨪<EFBFBD><E4A8AA><EFBFBD><EFBFBD> <20><>᪠,
|
||||
80h ᮮ⢥<E1AEAE><E2A2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ࢮ<EFBFBD><E0A2AE>, 81h - <20><><EFBFBD><EFBFBD> <20> <20>.<2E>. <20><>४<EFBFBD><E0A5AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
<EFBFBD>) (<28> <20><> 㬥<><E3ACA5><EFBFBD> ࠡ<><E0A0A1><EFBFBD><EFBFBD><EFBFBD> <20> hex-।<><E0A5A4><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> ᬥ饭<E1ACA5><E9A5AD> 0xD98
|
||||
<20> 80h <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䨪<EFBFBD><E4A8AA><EFBFBD><EFBFBD> <20><>᪠ (<28><><EFBFBD> <20> <20>㭪<EFBFBD><E3ADAA> <20>).
|
||||
<EFBFBD>) <20>ᯮ<EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>⠭<EFBFBD><E2A0AD>騪 mtldr_install (᪠<><E1AAA0><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> ⠬ <20><>).
|
||||
<20><> <20><><EFBFBD><EFBFBD>ந<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>稪 <20> ᠬ <20><> <20><><EFBFBD> <20> <20><>⠭<EFBFBD><E2A0AD><EFBFBD><EFBFBD>.
|
||||
|
||||
5. <20> 祬-<2D><> <20><> <20>ࠢ<EFBFBD><E0A0A2><EFBFBD><EFBFBD> <20><><EFBFBD><E0ADA5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>? <20><><EFBFBD> <20><><EFBFBD><EFA2AB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><>ਠ<EFBFBD><E0A8A0><EFBFBD>:
|
||||
<EFBFBD>) <20> <20><>室<EFBFBD><E5AEA4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ப<EFBFBD> kolibri_img_name (<28> <20><><EFBFBD><EFBFBD><EFBFBD> mtldr.asm)
|
||||
<20><> <20><><EFBFBD><EFBFBD> <20> 䠩<><E4A0A9>. <20><><EFBFBD>ਬ<EFBFBD><E0A8AC>, <20><><EFBFBD> C:\Program Files\kolibri\kolibri.img <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
'progra~1\kolibri\kolibri.img' (<28><><EFBFBD> <20>⮬ <20>㦭<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> 8.3). <20><>४<EFBFBD><E0A5AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
<EFBFBD>) <20>ᯮ<EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>⠭<EFBFBD><E2A0AD>騪 mtldr_install.
|
||||
|
||||
6. <20> <20><>ᯮ<EFBFBD>짮<EFBFBD><ECA7AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ४<><E0A5AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ﬨ <20>㭪⮢ 2 <20> 5 <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>⠭<EFBFBD><E2A0AD><EFBFBD><EFBFBD>
|
||||
<20><><EFBFBD>쪮 ࠧ <20><><EFBFBD> ࠧ<><E0A0A7><EFBFBD> <20><>ᯮ<EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>離<EFBFBD> mtldr+kolibri.img,
|
||||
<20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>㧮筮<E3A7AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>쪮 <20>室<EFBFBD><E5AEA4> <20><><EFBFBD> ࠧ<><E0A0A7><EFBFBD> <20><><EFBFBD>ᨩ
|
||||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD>ᨩ <20> ࠧ<>묨 <20><><EFBFBD><EFBFBD>ன<EFBFBD><E0AEA9><EFBFBD><EFBFBD>).
|
||||
|
||||
7. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>砭<EFBFBD><E7A0AD>, <20>।<EFBFBD><E0A5A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>뫠<EFBFBD><EBABA0><EFBFBD> <20><> <20>뫮, 㪠<><E3AAA0><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
|
||||
diamond
|
||||
mailto: diamondz@land.ru
|
852
programs/hd_load/mtldr/mtldr.asm
Normal file
852
programs/hd_load/mtldr/mtldr.asm
Normal file
@@ -0,0 +1,852 @@
|
||||
; KolibriOS bootloader
|
||||
; this code has been written by diamond in 2005,2006,2008 specially for KolibriOS
|
||||
|
||||
; this code is loaded by ntldr to 0D00:0000
|
||||
; and by io.sys from config.sys to xxxx:0100
|
||||
; and by bootmgr in vista to 0000:7C00
|
||||
format binary
|
||||
use16
|
||||
|
||||
org 0xD000
|
||||
; entry point for 9x and Vista booting
|
||||
call @f
|
||||
; db 'd' xor 'i' xor 'a' xor 'm' xor 'o' xor 'n' xor 'd'
|
||||
db 'NTFS'
|
||||
@@:
|
||||
pop si
|
||||
sub si, 3
|
||||
cmp si, 7C00h
|
||||
jz boot_vista
|
||||
mov si, load_question + 100h - 0D000h
|
||||
call out_string
|
||||
; mov si, answer + 100h - 0D000h ; already is
|
||||
xxy: mov ah, 0
|
||||
int 16h
|
||||
or al, 20h
|
||||
mov [si], al
|
||||
cmp al, 'y'
|
||||
jz xxz
|
||||
cmp al, 'n'
|
||||
jnz xxy
|
||||
; continue load Windows
|
||||
; call out_string
|
||||
; ret
|
||||
out_string:
|
||||
lodsb
|
||||
test al, al
|
||||
jz .xxx
|
||||
mov ah, 0Eh
|
||||
mov bx, 7
|
||||
int 10h
|
||||
jmp out_string
|
||||
.xxx: ret
|
||||
xxz:
|
||||
; boot KolibriOS
|
||||
call out_string
|
||||
push 0
|
||||
pop ds
|
||||
mov word [4], new01handler + 100h - 0D000h
|
||||
mov [6], cs
|
||||
pushf
|
||||
pop ax
|
||||
or ah, 1
|
||||
push ax
|
||||
popf
|
||||
; int 19h
|
||||
; pushf ; there will be no iret
|
||||
call far [19h*4]
|
||||
xxt:
|
||||
; TF has been cleared when entered new01handler
|
||||
; pushf
|
||||
; pop ax
|
||||
; and ah, not 1
|
||||
; push ax
|
||||
; popf
|
||||
xor di, di
|
||||
mov ds, di
|
||||
cmp word [8*4+2], 0F000h
|
||||
jz @f
|
||||
les bx, [8*4]
|
||||
mov eax, [es:bx+1]
|
||||
mov [8*4], eax
|
||||
@@:
|
||||
mov si, 100h
|
||||
boot_vista:
|
||||
push cs
|
||||
pop ds
|
||||
push 0D00h
|
||||
pop es
|
||||
mov cx, 2000h/2
|
||||
rep movsw
|
||||
jmp 0D00h:0256h
|
||||
load_question db 'Load KolibriOS? [y/n]: ',0
|
||||
answer db ?
|
||||
db 13,10,0
|
||||
|
||||
new01handler:
|
||||
; [sp]=ip, [sp+2]=cs, [sp+4]=flags
|
||||
push bp
|
||||
mov bp, sp
|
||||
push bx
|
||||
push ds
|
||||
lds bx, [bp+2]
|
||||
cmp word [bx], 19cdh
|
||||
jz xxt
|
||||
pop ds
|
||||
pop bx
|
||||
pop bp
|
||||
iret
|
||||
|
||||
relative_read:
|
||||
add eax, [partition_start]
|
||||
|
||||
; read from hard disk
|
||||
; drive_size must be already initialized
|
||||
; in: eax = absolute sector
|
||||
; cx = number of sectors
|
||||
; es:bx -> buffer
|
||||
read:
|
||||
pushad
|
||||
cmp eax, [drive_size]
|
||||
jb .old_style
|
||||
; new style - LBA, function 42
|
||||
cmp [has_lba], 0
|
||||
jz disk_error
|
||||
; allocate disk address packet on the stack
|
||||
; qword +8: absolute block number
|
||||
push dword 0 ; dword +C is high dword
|
||||
push eax ; dword +8 is low dword
|
||||
; dword +4: buffer address
|
||||
push es ; word +6 is segment
|
||||
push bx ; word +4 is offset
|
||||
; word +2: number of blocks = 1
|
||||
; word +0: size of packet = 10h
|
||||
push dword 10010h
|
||||
; now pair ss:sp contain address of disk address packet
|
||||
.patch1:
|
||||
mov ax, 4200h
|
||||
mov dl, [boot_drive]
|
||||
mov si, sp
|
||||
push ds
|
||||
push ss
|
||||
pop ds
|
||||
int 13h
|
||||
pop ds
|
||||
add sp, 10h
|
||||
.end:
|
||||
popad
|
||||
jc disk_error
|
||||
add bx, 200h
|
||||
inc eax
|
||||
dec cx
|
||||
jnz read
|
||||
ret
|
||||
.old_style:
|
||||
; old style - CHS, function 2
|
||||
; convert absolute sector in eax to cylinder-head-sector coordinates
|
||||
; calculate sector
|
||||
xor edx, edx
|
||||
movzx ecx, [sectors]
|
||||
div ecx
|
||||
; sectors are counted from 1
|
||||
inc dx
|
||||
mov cl, dl ; low 6 bits of cl = sector number
|
||||
; calculate head number
|
||||
shld edx, eax, 10h ; convert eax to dx:ax
|
||||
div [heads]
|
||||
mov dh, dl ; dh = head
|
||||
mov ch, al ; ch = low 8 bits of cylinder
|
||||
shl ah, 6
|
||||
or cl, ah ; high 2 bits of cl = high 2 bits of cylinder
|
||||
.patch2:
|
||||
mov ax, 201h ; function 2, al=1 - number of sectors
|
||||
mov dl, [boot_drive]
|
||||
int 13h
|
||||
jmp .end
|
||||
|
||||
disk_error:
|
||||
mov si, disk_error_msg
|
||||
call out_string
|
||||
jmp $
|
||||
|
||||
has_lba db 0
|
||||
|
||||
disk_error_msg db 'Disk read error!',0
|
||||
start_msg db 2,' KolibriOS bootloader',13,10,0
|
||||
part_msg db 'looking at partition '
|
||||
part_char db '0' ; will be incremented before writing message
|
||||
db ' ... ',0
|
||||
errfs_msg db 'unknown filesystem',13,10,0
|
||||
fat16_msg db 'FAT12/FAT16 - unsupported',13,10,0
|
||||
fat32_msg db 'FAT32'
|
||||
newline db 13,10,0
|
||||
ntfs_msg db 'NTFS',13,10,0
|
||||
error_msg db 'Error'
|
||||
colon db ': ',0
|
||||
mft_string db 'MFT',0
|
||||
root_string db '\',0
|
||||
noindex_string db '$INDEX_ROOT not found',0
|
||||
invalid_read_request_string db 'cannot read attribute',0
|
||||
nodata_string db '$DATA '
|
||||
notfound_string db 'not found',0
|
||||
directory_string db 'is a directory',0
|
||||
notdir_string db 'not a directory',0
|
||||
fragmented_string db 'too fragmented file',0
|
||||
exmem_string db 'extended memory error',0
|
||||
bad_cluster_string db 'bad cluster',0
|
||||
data_error_msg db 'data error',0
|
||||
|
||||
; init procedure - ntldr jmps here
|
||||
repeat 0D256h - $
|
||||
db 1
|
||||
end repeat
|
||||
start:
|
||||
; cs=es=0D00, ds=07C0, ss=0
|
||||
; esi=edi=ebp=0, esp=7C00
|
||||
xor ax, ax
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
; our stack is 4Kb-512b-2b!!! (0xDFE)
|
||||
mov ss, ax
|
||||
mov esp, 0FFFEh
|
||||
|
||||
; we are booting from hard disk identified by [boot_drive]
|
||||
mov dl, [boot_drive]
|
||||
cld
|
||||
sti
|
||||
; calculate drive size
|
||||
mov ah, 8 ; 8 = get drive parameters
|
||||
int 13h
|
||||
; now: CF is set on error;
|
||||
; ch = low 8 bits of maximum cylinder number
|
||||
; cl : low 6 bits makes maximum sector number, high 2 bits are high 2 bits of maximum cylinder number
|
||||
; dh = maximum head number
|
||||
jnc @f
|
||||
mov cx, -1
|
||||
mov dh, cl
|
||||
@@:
|
||||
movzx ax, dh
|
||||
inc ax
|
||||
; ax = number of heads
|
||||
mov [heads], ax
|
||||
mov dl, cl
|
||||
and dx, 3Fh
|
||||
; dx = number of sectors
|
||||
; (note that sectors are counted from 1, and maximum sector number = number of sectors)
|
||||
mov [sectors], dx
|
||||
mul dx
|
||||
xchg cl, ch
|
||||
shr ch, 6
|
||||
inc cx
|
||||
; cx = number of cylinders
|
||||
mov [cyls], cx
|
||||
mul cx
|
||||
mov word [drive_size], ax
|
||||
mov word [drive_size+2], dx
|
||||
; this drive supports LBA?
|
||||
mov dl, [boot_drive]
|
||||
mov ah, 41h
|
||||
mov bx, 55AAh
|
||||
int 13h
|
||||
jc .no_lba
|
||||
cmp bx, 0AA55h
|
||||
jnz .no_lba
|
||||
test cl, 1
|
||||
jz .no_lba
|
||||
inc [has_lba]
|
||||
.no_lba:
|
||||
; say hi to user
|
||||
mov si, start_msg
|
||||
call out_string
|
||||
; now read first sector to determine file system type
|
||||
; first sector of disk is MBR sector
|
||||
xor eax, eax
|
||||
new_partition_ex:
|
||||
mov cx, 1
|
||||
mov bx, 0F000h
|
||||
call read
|
||||
new_partition:
|
||||
mov bx, [cur_partition_ofs]
|
||||
mov al, [bx+4] ; partition type
|
||||
test al, al
|
||||
jz next_partition
|
||||
cmp al, 5
|
||||
jz @f
|
||||
cmp al, 0xF
|
||||
jnz not_extended
|
||||
@@:
|
||||
; extended partition
|
||||
mov eax, [bx+8] ; partition start
|
||||
add eax, [extended_part_start]
|
||||
mov [extended_part_cur], eax
|
||||
next_partition:
|
||||
add [cur_partition_ofs], 10h
|
||||
cmp [cur_partition_ofs], 0xF1FE
|
||||
jb new_partition
|
||||
mov eax, [extended_part_cur]
|
||||
test eax, eax
|
||||
jz partitions_done
|
||||
cmp [extended_part_start], 0
|
||||
jnz @f
|
||||
mov [extended_part_start], eax
|
||||
@@:
|
||||
mov [extended_parent], eax
|
||||
and [extended_part_cur], 0
|
||||
mov [cur_partition_ofs], 0xF1BE
|
||||
jmp new_partition_ex
|
||||
partitions_done:
|
||||
mov si, total_kaput
|
||||
call out_string
|
||||
jmp $
|
||||
not_extended:
|
||||
mov eax, [bx+8]
|
||||
add eax, [extended_parent]
|
||||
mov [partition_start], eax
|
||||
push ax
|
||||
mov si, part_msg
|
||||
inc [si+part_char-part_msg]
|
||||
call out_string
|
||||
pop ax
|
||||
mov cx, 1
|
||||
mov bx, 500h
|
||||
call read
|
||||
movzx ax, byte [50Dh]
|
||||
mov [sect_per_clust], ax
|
||||
; determine file system
|
||||
cmp dword [536h], 'FAT1'
|
||||
jz fat1x
|
||||
cmp dword [552h], 'FAT3'
|
||||
jz fat32
|
||||
cmp dword [503h], 'NTFS'
|
||||
jz ntfs
|
||||
mov si, errfs_msg
|
||||
call out_string
|
||||
jmp next_partition
|
||||
fat1x:
|
||||
mov si, fat16_msg
|
||||
call out_string
|
||||
jmp next_partition
|
||||
fat32:
|
||||
mov si, fat32_msg
|
||||
call out_string
|
||||
movzx eax, word [50Bh] ; bytes_per_sect
|
||||
movzx ebx, byte [50Dh] ; sects_per_clust
|
||||
mul ebx
|
||||
mov [cluster_size], eax
|
||||
movzx ebx, word [50Eh] ; reserved_sect
|
||||
mov [fat_start], ebx
|
||||
movzx eax, byte [510h] ; num_fats
|
||||
mul dword [524h] ; sect_fat
|
||||
add eax, ebx
|
||||
; cluster 2 begins from sector eax
|
||||
movzx ebx, byte [50Dh] ; sects_per_clust
|
||||
sub eax, ebx
|
||||
sub eax, ebx
|
||||
mov [data_start], eax
|
||||
; parse image name
|
||||
mov eax, [52Ch] ; root_cluster
|
||||
mov [cur_obj], root_string
|
||||
.parsedir:
|
||||
push ax
|
||||
mov si, [imgnameofs]
|
||||
push si
|
||||
@@:
|
||||
lodsb
|
||||
cmp al, 0
|
||||
jz @f
|
||||
cmp al, '\'
|
||||
jnz @b
|
||||
dec si
|
||||
mov [missing_slash], si
|
||||
inc si
|
||||
@@:
|
||||
xchg ax, [esp+2]
|
||||
mov byte [si-1], 0
|
||||
mov [imgnameofs], si
|
||||
call fat32_parse_dir
|
||||
call restore_slash
|
||||
pop cx
|
||||
test cl, cl
|
||||
jz .end
|
||||
test byte [di+0Bh], 10h
|
||||
mov si, notdir_string
|
||||
jz find_error_si
|
||||
jmp .parsedir
|
||||
.end:
|
||||
test byte [di+0Bh], 10h
|
||||
mov si, directory_string
|
||||
jnz find_error_si
|
||||
; parse FAT chunk
|
||||
; runlist at 2000:0000
|
||||
mov di, 5
|
||||
push 2000h
|
||||
pop es
|
||||
mov byte [es:di-5], 1 ; of course, non-resident
|
||||
mov dword [es:di-4], 1
|
||||
stosd
|
||||
.parsefat:
|
||||
push es
|
||||
push ds
|
||||
pop es
|
||||
call next_cluster
|
||||
pop es
|
||||
jnc .done
|
||||
mov ecx, [es:di-8]
|
||||
add ecx, [es:di-4]
|
||||
cmp eax, ecx
|
||||
jz .contc
|
||||
mov dword [es:di], 1
|
||||
scasd
|
||||
stosd
|
||||
jmp .parsefat
|
||||
.contc:
|
||||
inc dword [es:di-8]
|
||||
jmp .parsefat
|
||||
.done:
|
||||
xor eax, eax
|
||||
stosd
|
||||
jmp read_img_file
|
||||
|
||||
ntfs:
|
||||
mov si, ntfs_msg
|
||||
call out_string
|
||||
movzx eax, word [50Bh] ; bpb_bytes_per_sect
|
||||
push eax
|
||||
movzx ebx, byte [50Dh] ; bpb_sects_per_clust
|
||||
mul ebx
|
||||
mov [cluster_size], eax
|
||||
mov [data_start], 0
|
||||
mov ecx, [540h] ; frs_size
|
||||
cmp cl, 0
|
||||
jg .1
|
||||
neg cl
|
||||
xor eax, eax
|
||||
inc eax
|
||||
shl eax, cl
|
||||
jmp .2
|
||||
.1:
|
||||
mul ecx
|
||||
.2:
|
||||
mov [frs_size], eax
|
||||
pop ebx
|
||||
xor edx, edx
|
||||
div ebx
|
||||
mov [frs_sectors], ax
|
||||
; read first MFT record - description of MFT itself
|
||||
mov [cur_obj], mft_string
|
||||
movzx eax, byte [50Dh] ; bpb_sects_per_clust
|
||||
mul dword [530h] ; mft_cluster
|
||||
mov cx, [frs_sectors]
|
||||
mov bx, 4000h
|
||||
mov di, bx
|
||||
push bx
|
||||
call relative_read
|
||||
call restore_usa
|
||||
; scan for unnamed $DATA attribute
|
||||
pop di
|
||||
mov ax, 80h ; $DATA
|
||||
mov bx, 700h
|
||||
call load_attr
|
||||
mov si, nodata_string
|
||||
jc find_error_si
|
||||
mov [free], bx
|
||||
; load kolibri.img
|
||||
; parse image name
|
||||
mov eax, 5 ; root cluster
|
||||
mov [cur_obj], root_string
|
||||
.parsedir:
|
||||
push ax
|
||||
mov si, [imgnameofs]
|
||||
push si
|
||||
@@:
|
||||
lodsb
|
||||
cmp al, 0
|
||||
jz @f
|
||||
cmp al, '\'
|
||||
jnz @b
|
||||
dec si
|
||||
mov [missing_slash], si
|
||||
inc si
|
||||
@@:
|
||||
xchg ax, [esp+2]
|
||||
mov byte [si-1], 0
|
||||
mov [imgnameofs], si
|
||||
call ntfs_parse_dir
|
||||
call restore_slash
|
||||
pop cx
|
||||
test cl, cl
|
||||
jnz .parsedir
|
||||
read_img_file:
|
||||
xor si, si
|
||||
push es
|
||||
pop fs
|
||||
; yes! Now read file to 0x100000
|
||||
lods byte [fs:si]
|
||||
cmp al, 0 ; assume nonresident attr
|
||||
mov si, invalid_read_request_string
|
||||
jz find_error_si
|
||||
mov si, 1
|
||||
xor edi, edi
|
||||
; read buffer to 1000:0000 and move it to extended memory
|
||||
push 1000h
|
||||
pop es
|
||||
xor bx, bx
|
||||
.img_read_block:
|
||||
lods dword [fs:si] ; eax=length
|
||||
xchg eax, ecx
|
||||
jecxz .img_read_done
|
||||
lods dword [fs:si] ; eax=disk cluster
|
||||
.img_read_cluster:
|
||||
pushad
|
||||
; read part of file
|
||||
movzx ecx, byte [50Dh]
|
||||
mul ecx
|
||||
add eax, [data_start]
|
||||
call relative_read
|
||||
; move it to extended memory
|
||||
mov ah, 87h
|
||||
mov ecx, [cluster_size]
|
||||
push ecx
|
||||
shr cx, 1
|
||||
mov si, movedesc
|
||||
push es
|
||||
push ds
|
||||
pop es
|
||||
int 15h
|
||||
pop es
|
||||
test ah, ah
|
||||
mov si, exmem_string
|
||||
jnz find_error_si
|
||||
pop ecx
|
||||
add [dest_addr], ecx
|
||||
popad
|
||||
inc eax
|
||||
loop .img_read_cluster
|
||||
jmp .img_read_block
|
||||
.img_read_done:
|
||||
; kolibri.img loaded; now load kernel.mnt
|
||||
load_kernel:
|
||||
push ds
|
||||
pop es
|
||||
mov [cur_obj], kernel_mnt_name
|
||||
; read boot sector
|
||||
xor eax, eax
|
||||
mov bx, 500h
|
||||
mov cx, 1
|
||||
call read_img
|
||||
; init vars
|
||||
mov ax, [50Eh] ; reserved_sect
|
||||
add ax, [51Ch] ; hidden
|
||||
mov word [fat_start], ax
|
||||
xchg ax, bx
|
||||
movzx ax, byte [510h] ; num_fats
|
||||
mul word [516h] ; fat_length
|
||||
add ax, bx
|
||||
; read root dir
|
||||
mov bx, 700h
|
||||
mov cx, [511h] ; dir_entries
|
||||
add cx, 0Fh
|
||||
shr cx, 4
|
||||
call read_img
|
||||
add ax, cx
|
||||
mov [img_data_start], ax
|
||||
shl cx, 9
|
||||
mov di, bx
|
||||
add bx, cx
|
||||
mov byte [bx], 0
|
||||
.scan_loop:
|
||||
cmp byte [di], 0
|
||||
mov si, notfound_string
|
||||
jz find_error_si
|
||||
mov si, kernel_mnt_name
|
||||
call fat_compare_name
|
||||
jz .found
|
||||
and di, not 1Fh
|
||||
add di, 20h
|
||||
jmp .scan_loop
|
||||
.found:
|
||||
and di, not 1Fh
|
||||
mov si, directory_string
|
||||
test byte [di+0Bh], 10h
|
||||
jnz find_error_si
|
||||
; found, now load it to 1000h:0000h
|
||||
mov ax, [di+1Ah]
|
||||
; first cluster of kernel.mnt in ax
|
||||
; translate it to sector on disk in kolibri.img
|
||||
push ax
|
||||
dec ax
|
||||
dec ax
|
||||
movzx cx, byte [50Dh]
|
||||
mul cx
|
||||
add ax, [img_data_start]
|
||||
; now ax is sector in kolibri.img
|
||||
mov [kernel_mnt_in_img], ax
|
||||
div [sect_per_clust]
|
||||
; now ax is cluster in kolibri.img and
|
||||
; dx is offset from the beginning of cluster
|
||||
movzx eax, ax
|
||||
push 2000h
|
||||
pop ds
|
||||
mov si, 1
|
||||
.scani:
|
||||
sub eax, [si]
|
||||
jb .scanidone
|
||||
; sanity check
|
||||
cmp dword [si], 0
|
||||
push invalid_read_request_string
|
||||
jz find_error_sp
|
||||
pop cx
|
||||
; next chunk
|
||||
add si, 8
|
||||
jmp .scani
|
||||
.scanidone:
|
||||
add eax, [si] ; undo last subtract
|
||||
add eax, [si+4] ; get cluster
|
||||
push 0
|
||||
pop ds
|
||||
movzx ecx, [sect_per_clust]
|
||||
push dx
|
||||
mul ecx ; get sector
|
||||
pop dx
|
||||
movzx edx, dx
|
||||
add eax, edx
|
||||
add eax, [data_start]
|
||||
mov [kernel_mnt_1st], eax
|
||||
pop ax
|
||||
push 1000h
|
||||
pop es
|
||||
.read_loop:
|
||||
push ax
|
||||
xor bx, bx
|
||||
call img_read_cluster
|
||||
shl cx, 9-4
|
||||
mov ax, es
|
||||
add ax, cx
|
||||
mov es, ax
|
||||
pop ax
|
||||
call img_next_cluster
|
||||
jc .read_loop
|
||||
mov ax, 'KL'
|
||||
mov si, loader_block
|
||||
jmp 1000h:0000h
|
||||
|
||||
img_next_cluster:
|
||||
mov bx, 700h
|
||||
push ax
|
||||
shr ax, 1
|
||||
add ax, [esp]
|
||||
mov dx, ax
|
||||
shr ax, 9
|
||||
add ax, word [fat_start]
|
||||
mov cx, 2
|
||||
push es
|
||||
push ds
|
||||
pop es
|
||||
call read_img
|
||||
pop es
|
||||
and dx, 1FFh
|
||||
add bx, dx
|
||||
mov ax, [bx]
|
||||
pop cx
|
||||
test cx, 1
|
||||
jz .1
|
||||
shr ax, 4
|
||||
.1:
|
||||
and ax, 0FFFh
|
||||
mov si, bad_cluster_string
|
||||
cmp ax, 0FF7h
|
||||
jz find_error_si
|
||||
ret
|
||||
img_read_cluster:
|
||||
dec ax
|
||||
dec ax
|
||||
movzx cx, byte [50Dh] ; sects_per_clust
|
||||
mul cx
|
||||
add ax, [img_data_start]
|
||||
movzx eax, ax
|
||||
; call read_img
|
||||
; ret
|
||||
read_img:
|
||||
; in: ax = sector, es:bx->buffer, cx=length in sectors
|
||||
pushad
|
||||
movzx ebx, bx
|
||||
mov si, movedesc
|
||||
shl eax, 9
|
||||
add eax, 93100000h
|
||||
mov dword [si+sou_addr-movedesc], eax
|
||||
mov eax, 9300000h
|
||||
mov ax, es
|
||||
shl eax, 4
|
||||
add eax, ebx
|
||||
mov [si+dest_addr-movedesc], eax
|
||||
mov ah, 87h
|
||||
shl cx, 8 ; mul 200h/2
|
||||
push es
|
||||
push 0
|
||||
pop es
|
||||
int 15h
|
||||
pop es
|
||||
cmp ah, 0
|
||||
mov si, exmem_string
|
||||
jnz find_error_si
|
||||
popad
|
||||
ret
|
||||
|
||||
movedesc:
|
||||
times 16 db 0
|
||||
; source
|
||||
dw 0xFFFF ; segment length
|
||||
sou_addr dw 0000h ; linear address
|
||||
db 1 ; linear address
|
||||
db 93h ; access rights
|
||||
dw 0
|
||||
; destination
|
||||
dw 0xFFFF ; segment length
|
||||
dest_addr dd 93100000h ; high byte contains access rights
|
||||
; three low bytes contains linear address (updated when reading)
|
||||
dw 0
|
||||
times 32 db 0
|
||||
|
||||
find_error_si:
|
||||
push si
|
||||
find_error_sp:
|
||||
mov si, error_msg
|
||||
call out_string
|
||||
mov si, [cur_obj]
|
||||
call out_string
|
||||
mov si, colon
|
||||
call out_string
|
||||
pop si
|
||||
call out_string
|
||||
mov si, newline
|
||||
call out_string
|
||||
or [fat_cur_sector], -1
|
||||
mov [imgnameofs], kolibri_img_name
|
||||
call restore_slash
|
||||
mov sp, 0xFFFE
|
||||
jmp next_partition
|
||||
|
||||
file_not_found:
|
||||
mov si, [esp+2]
|
||||
mov [cur_obj], si
|
||||
push notfound_string
|
||||
jmp find_error_sp
|
||||
|
||||
restore_slash:
|
||||
mov si, [missing_slash]
|
||||
test si, si
|
||||
jz @f
|
||||
and [missing_slash], 0
|
||||
mov byte [si], '\'
|
||||
@@: ret
|
||||
|
||||
include 'fat32.inc'
|
||||
include 'ntfs.inc'
|
||||
|
||||
write1st:
|
||||
; callback from kernel.mnt
|
||||
; write first sector of kernel.mnt from 1000:0000 back to disk
|
||||
push cs
|
||||
pop ds
|
||||
push cs
|
||||
pop es
|
||||
; sanity check
|
||||
mov bx, 500h
|
||||
mov si, bx
|
||||
mov cx, 1
|
||||
push cx
|
||||
mov eax, [kernel_mnt_1st]
|
||||
push eax
|
||||
call relative_read
|
||||
push 1000h
|
||||
pop es
|
||||
xor di, di
|
||||
mov cx, 8
|
||||
repz cmpsw
|
||||
mov si, data_error_msg
|
||||
jnz find_error_si
|
||||
; ok, now write back to disk
|
||||
or byte [read.patch1+2], 1
|
||||
or byte [read.patch2+2], 1
|
||||
xor bx, bx
|
||||
pop eax
|
||||
pop cx
|
||||
call relative_read
|
||||
and byte [read.patch1+1], not 1
|
||||
and byte [read.patch2+2], not 2
|
||||
; and to image in memory (probably this may be done by kernel.mnt itself?)
|
||||
mov dword [sou_addr], 93010000h
|
||||
movzx eax, [kernel_mnt_in_img]
|
||||
shl eax, 9
|
||||
add eax, 93100000h
|
||||
mov dword [dest_addr], eax
|
||||
mov si, movedesc
|
||||
push ds
|
||||
pop es
|
||||
mov ah, 87h
|
||||
mov cx, 100h
|
||||
int 15h
|
||||
cmp ah, 0
|
||||
mov si, exmem_string
|
||||
jnz find_error_si
|
||||
retf
|
||||
|
||||
loader_block:
|
||||
db 1 ; version
|
||||
dw 1 ; flags - image is loaded
|
||||
dw write1st ; offset
|
||||
dw 0 ; segment
|
||||
|
||||
fat_cur_sector dd -1
|
||||
imgnameofs dw kolibri_img_name
|
||||
|
||||
; -----------------------------------------------
|
||||
; ------------------ Settings -------------------
|
||||
; -----------------------------------------------
|
||||
|
||||
; must be in lowercase, see ntfs_parse_dir.scan, fat32_parse_dir.scan
|
||||
kernel_mnt_name db 'kernel.mnt',0
|
||||
kolibri_img_name db 'kolibri.img',0
|
||||
|
||||
; change next variable if you want to boot from other physical drive
|
||||
boot_drive db 80h
|
||||
|
||||
total_kaput db 13,10,'Fatal: image is not found.',13,10,0
|
||||
missing_slash dw 0
|
||||
align 2
|
||||
|
||||
cur_partition_ofs dw 0xF1BE
|
||||
extended_part_start dd 0
|
||||
extended_part_cur dd 0
|
||||
extended_parent dd 0
|
||||
|
||||
; uninitialized data follows
|
||||
drive_size dd ? ; in sectors
|
||||
heads dw ?
|
||||
sectors dw ?
|
||||
cyls dw ?
|
||||
partition_start dd ?
|
||||
free dw ?
|
||||
cur_obj dw ?
|
||||
data_start dd ?
|
||||
img_data_start dw ?
|
||||
sect_per_clust dw ?
|
||||
kernel_mnt_in_img dw ?
|
||||
kernel_mnt_1st dd ?
|
||||
; NTFS data
|
||||
cluster_size dd ? ; in bytes
|
||||
frs_size dd ? ; in bytes
|
||||
frs_sectors dw ? ; in sectors
|
||||
mft_data_attr dw ?
|
||||
index_root dw ?
|
||||
index_alloc dw ?
|
||||
ofs dw ?
|
||||
dir dw ?
|
||||
; FAT32 data
|
||||
fat_start dd ?
|
||||
cur_cluster dd ?
|
||||
; file must be 16 sectors long
|
||||
|
||||
repeat 0F000h - $
|
||||
db 2
|
||||
end repeat
|
531
programs/hd_load/mtldr/ntfs.inc
Normal file
531
programs/hd_load/mtldr/ntfs.inc
Normal file
@@ -0,0 +1,531 @@
|
||||
restore_usa:
|
||||
; Update Sequence Array restore
|
||||
mov bx, [di+4]
|
||||
mov cx, [di+6]
|
||||
inc bx
|
||||
add bx, di
|
||||
inc bx
|
||||
add di, 1feh
|
||||
dec cx
|
||||
@@:
|
||||
mov ax, [bx]
|
||||
stosw
|
||||
inc bx
|
||||
inc bx
|
||||
add di, 1feh
|
||||
loop @b
|
||||
ret
|
||||
|
||||
find_attr:
|
||||
; in: di->file record, ax=attribute
|
||||
; out: di->attribute or di=0 if not found
|
||||
add di, [di+14h]
|
||||
.1:
|
||||
; attributes codes are formally dwords, but all they fit in word
|
||||
cmp word [di], -1
|
||||
jz .notfound
|
||||
cmp word [di], ax
|
||||
jnz .continue
|
||||
; for $DATA attribute, scan only unnamed
|
||||
cmp ax, 80h
|
||||
jnz .found
|
||||
cmp byte [di+9], 0
|
||||
jz .found
|
||||
.continue:
|
||||
add di, [di+4]
|
||||
jmp .1
|
||||
.notfound:
|
||||
xor di, di
|
||||
.found:
|
||||
ret
|
||||
|
||||
process_mcb_nonres:
|
||||
; in: si->attribute, es:di->buffer
|
||||
; out: di->buffer end
|
||||
add si, [si+20h]
|
||||
xor ebx, ebx
|
||||
.loop:
|
||||
lodsb
|
||||
test al, al
|
||||
jz .done
|
||||
push invalid_read_request_string
|
||||
movzx cx, al
|
||||
shr cx, 4
|
||||
jz find_error_sp
|
||||
xchg ax, dx
|
||||
and dx, 0Fh
|
||||
jz find_error_sp
|
||||
add si, cx
|
||||
add si, dx
|
||||
pop ax
|
||||
push si
|
||||
dec si
|
||||
movsx eax, byte [si]
|
||||
dec cx
|
||||
jz .l1e
|
||||
.l1:
|
||||
dec si
|
||||
shl eax, 8
|
||||
mov al, [si]
|
||||
loop .l1
|
||||
.l1e:
|
||||
xchg ebp, eax
|
||||
dec si
|
||||
movsx eax, byte [si]
|
||||
mov cx, dx
|
||||
dec cx
|
||||
jz .l2e
|
||||
.l2:
|
||||
dec si
|
||||
shl eax, 8
|
||||
mov al, byte [si]
|
||||
loop .l2
|
||||
.l2e:
|
||||
pop si
|
||||
add ebx, ebp
|
||||
; eax=length, ebx=disk block
|
||||
stosd
|
||||
mov eax, ebx
|
||||
stosd
|
||||
jmp .loop
|
||||
.done:
|
||||
xor eax, eax
|
||||
stosd
|
||||
ret
|
||||
|
||||
load_attr:
|
||||
; in: ax=attribute, es:bx->buffer, di->base record
|
||||
; out: bx->buffer end; CF set if not found
|
||||
push di
|
||||
push ax
|
||||
mov byte [es:bx], 1
|
||||
inc bx
|
||||
push bx
|
||||
mov [ofs], bx
|
||||
; scan for attrubute
|
||||
add di, [di+14h]
|
||||
@@:
|
||||
call find_attr.1
|
||||
test di, di
|
||||
jz .notfound1
|
||||
cmp byte [di+8], 0
|
||||
jnz .nonresident
|
||||
jmp .resident
|
||||
.aux_resident:
|
||||
push di
|
||||
popad
|
||||
; resident attribute
|
||||
.resident:
|
||||
mov si, di
|
||||
pop di
|
||||
dec di
|
||||
mov al, 0
|
||||
stosb
|
||||
mov ax, [si+10h]
|
||||
stosw
|
||||
xchg ax, cx
|
||||
add si, [si+14h]
|
||||
rep movsb
|
||||
mov bx, di
|
||||
pop ax
|
||||
pop di
|
||||
ret
|
||||
.nonresident:
|
||||
; nonresident attribute
|
||||
cmp dword [di+10h], 0
|
||||
jnz @b
|
||||
; read start of data
|
||||
mov si, di
|
||||
pop di
|
||||
call process_mcb_nonres
|
||||
sub di, 4
|
||||
push di
|
||||
.notfound1:
|
||||
; $ATTRIBUTE_LIST is always in base file record
|
||||
cmp word [esp+2], 20h
|
||||
jz .nofragmented
|
||||
; scan for $ATTRIBUTE_LIST = 20h
|
||||
mov di, [esp+4]
|
||||
mov ax, 20h
|
||||
call find_attr
|
||||
test di, di
|
||||
jz .nofragmented
|
||||
; load $ATTRIBUTE_LIST itself
|
||||
push es
|
||||
mov bx, 0C000h
|
||||
mov di, [esp+6]
|
||||
push bx
|
||||
push [ofs]
|
||||
push ds
|
||||
pop es
|
||||
call load_attr
|
||||
pop [ofs]
|
||||
pop si
|
||||
mov bx, 8000h
|
||||
push bx
|
||||
push si
|
||||
call read_attr_full
|
||||
pop si
|
||||
pop bx
|
||||
add dx, bx
|
||||
mov ax, [esp+4]
|
||||
pop es
|
||||
.1:
|
||||
cmp [bx], ax
|
||||
jnz .continue1
|
||||
; only unnamed $DATA attributes!
|
||||
cmp ax, 80h
|
||||
jnz @f
|
||||
cmp byte [bx+6], 0
|
||||
jnz .continue1
|
||||
@@:
|
||||
cmp dword [bx+10h], 0
|
||||
jz .continue1
|
||||
cmp dword [bx+8], 0
|
||||
jnz @f
|
||||
push ax
|
||||
mov ax, [esp+2]
|
||||
cmp ax, [ofs]
|
||||
pop ax
|
||||
jnz .continue1
|
||||
@@:
|
||||
pushad
|
||||
mov eax, [bx+10h]
|
||||
mov bx, dx
|
||||
push [ofs]
|
||||
push es
|
||||
push ds
|
||||
pop es
|
||||
call read_file_record
|
||||
pop es
|
||||
pop [ofs]
|
||||
popad
|
||||
pushad
|
||||
pop di
|
||||
mov di, dx
|
||||
add di, [di+14h]
|
||||
.2:
|
||||
call find_attr.1
|
||||
cmp byte [di+8], 0
|
||||
jz .aux_resident
|
||||
mov eax, [bx+8]
|
||||
cmp eax, [di+10h]
|
||||
jnz .2
|
||||
mov si, di
|
||||
mov di, [esp+1Eh]
|
||||
call process_mcb_nonres
|
||||
sub di, 4
|
||||
mov [esp+1Eh], di
|
||||
push di
|
||||
popad
|
||||
.continue1:
|
||||
add bx, [bx+4]
|
||||
cmp bx, dx
|
||||
jb .1
|
||||
.nofragmented:
|
||||
pop bx
|
||||
pop ax
|
||||
pop di
|
||||
cmp bx, [ofs]
|
||||
jnz @f
|
||||
dec bx
|
||||
stc
|
||||
ret
|
||||
@@:
|
||||
add bx, 4
|
||||
ret
|
||||
|
||||
read_attr_full:
|
||||
; in: si->decoded attribute data, bx->buffer
|
||||
; out: edx=length in bytes
|
||||
lodsb
|
||||
cmp al, 0
|
||||
jnz .nonresident
|
||||
; resident
|
||||
lodsw
|
||||
movzx edx, ax
|
||||
xchg ax, cx
|
||||
mov di, bx
|
||||
rep movsb
|
||||
ret
|
||||
.nonresident:
|
||||
; nonresident :-)
|
||||
xor edx, edx
|
||||
.loop:
|
||||
lodsd
|
||||
xchg ecx, eax
|
||||
jecxz .loopend
|
||||
lodsd
|
||||
xchg edi, eax
|
||||
; read ecx clusters from cluster edi to es:bx
|
||||
.intloop:
|
||||
push ecx
|
||||
; read 1 cluster from physical cluster edi to es:bx
|
||||
mov ecx, [cluster_size]
|
||||
mov eax, edi
|
||||
mul ecx
|
||||
push bx
|
||||
call relative_read
|
||||
pop bx
|
||||
pop ecx
|
||||
inc edi
|
||||
mov eax, [cluster_size]
|
||||
add edx, eax
|
||||
shr eax, 4
|
||||
mov bp, es
|
||||
add bp, ax
|
||||
mov es, bp
|
||||
loop .intloop
|
||||
jmp .loop
|
||||
.loopend:
|
||||
mov es, cx
|
||||
ret
|
||||
|
||||
read_file_record:
|
||||
; in: eax=index of record, bx=buffer
|
||||
mov si, 700h
|
||||
mov ecx, [frs_size]
|
||||
mul ecx
|
||||
push bx
|
||||
push [cur_obj]
|
||||
mov [cur_obj], mft_string
|
||||
call read_attr
|
||||
pop [cur_obj]
|
||||
pop di
|
||||
call restore_usa
|
||||
ret
|
||||
read_attr:
|
||||
; in: edx:eax=offset in bytes, ecx=size in bytes, bx=buffer, si=attribute
|
||||
push invalid_read_request_string
|
||||
cmp byte [si], 0
|
||||
jnz .nonresident
|
||||
test edx, edx
|
||||
jnz find_error_sp
|
||||
cmp eax, 10000h
|
||||
jae find_error_sp
|
||||
cmp ecx, 10000h
|
||||
jae find_error_sp
|
||||
cmp ax, [si+2]
|
||||
jae find_error_sp
|
||||
cmp cx, [si+2]
|
||||
ja find_error_sp
|
||||
add si, 3
|
||||
add si, ax
|
||||
mov di, bx
|
||||
rep movsb
|
||||
pop ax
|
||||
ret
|
||||
.nonresident:
|
||||
mov edi, [cluster_size]
|
||||
div edi
|
||||
mov [ofs], dx
|
||||
add cx, dx
|
||||
push eax
|
||||
xchg eax, ecx
|
||||
xor edx, edx
|
||||
dec eax
|
||||
div edi
|
||||
inc eax
|
||||
xchg eax, ecx
|
||||
pop eax
|
||||
add si, 1
|
||||
xor edx, edx
|
||||
push bx
|
||||
; eax=offset in clusters, ecx=size in clusters
|
||||
.scan:
|
||||
mov ebx, [si]
|
||||
test ebx, ebx
|
||||
jz .notfound
|
||||
add edx, ebx
|
||||
add si, 8
|
||||
cmp eax, edx
|
||||
jae .scan
|
||||
mov edi, [si-4]
|
||||
; now edx=end of block, ebx=length of block, edi=start of block on disk
|
||||
; eax=required offset, ecx=required length
|
||||
push edx
|
||||
push edi
|
||||
sub edx, eax
|
||||
add edi, ebx
|
||||
sub edi, edx
|
||||
cmp edx, ecx
|
||||
jb @f
|
||||
mov edx, ecx
|
||||
@@:
|
||||
; read (edx) clusters from (edi=disk offset in clusters) to ([esp+8])
|
||||
cmp [ofs], 0
|
||||
jnz .ofs_read
|
||||
.cont:
|
||||
pushad
|
||||
movzx ebx, byte [50Dh]
|
||||
; xchg eax, edx
|
||||
; mul ebx
|
||||
xchg ax, dx
|
||||
mul bx
|
||||
xchg cx, ax
|
||||
xchg eax, edi
|
||||
mul ebx
|
||||
mov bx, [esp+8+20h]
|
||||
call relative_read
|
||||
mov [esp+8+20h], bx
|
||||
popad
|
||||
.cont2:
|
||||
add eax, edx
|
||||
sub ecx, edx
|
||||
.cont3:
|
||||
pop edi
|
||||
pop edx
|
||||
jnz .scan
|
||||
pop bx
|
||||
pop ax
|
||||
ret
|
||||
.ofs_read:
|
||||
push ecx
|
||||
movzx ecx, byte [50Dh] ; bpb_sects_per_clust
|
||||
mov eax, edi
|
||||
push edx
|
||||
mul ecx
|
||||
push 1000h
|
||||
pop es
|
||||
xor bx, bx
|
||||
call relative_read
|
||||
mov cx, bx
|
||||
push si
|
||||
push di
|
||||
mov si, [ofs]
|
||||
mov di, [esp+8+12]
|
||||
sub cx, si
|
||||
push ds
|
||||
push es
|
||||
pop ds
|
||||
pop es
|
||||
rep movsb
|
||||
mov [esp+8+12], di
|
||||
push es
|
||||
pop ds
|
||||
pop di
|
||||
pop si
|
||||
pop edx
|
||||
pop ecx
|
||||
inc edi
|
||||
mov [ofs], 0
|
||||
inc eax
|
||||
dec ecx
|
||||
jz .cont3
|
||||
dec edx
|
||||
jnz .cont
|
||||
jmp .cont2
|
||||
.notfound:
|
||||
mov si, invalid_read_request_string
|
||||
jmp find_error_si
|
||||
|
||||
ntfs_parse_dir:
|
||||
; in: eax=directory iRecord, [word sp+2]=filename
|
||||
; out: si=$DATA attribute of file
|
||||
mov bx, [free]
|
||||
mov [dir], bx
|
||||
push bx
|
||||
call read_file_record
|
||||
mov ax, word [frs_size]
|
||||
add [free], ax
|
||||
pop di
|
||||
; find attributes $INDEX_ROOT, $INDEX_ALLOCATION, $BITMAP
|
||||
mov ax, 90h ; $INDEX_ROOT
|
||||
push di
|
||||
mov bx, [free]
|
||||
mov [index_root], bx
|
||||
call load_attr
|
||||
mov si, noindex_string
|
||||
jc find_error_si
|
||||
mov [free], bx
|
||||
pop di
|
||||
mov ax, 0A0h ; $INDEX_ALLOCATION
|
||||
mov bx, [free]
|
||||
mov [index_alloc], bx
|
||||
call load_attr
|
||||
jnc @f
|
||||
mov [index_alloc], 0
|
||||
@@:
|
||||
mov [free], bx
|
||||
; search for entry
|
||||
mov si, [index_root]
|
||||
mov bx, [free]
|
||||
call read_attr_full
|
||||
mov ebp, [bx+8] ; subnode_size
|
||||
add bx, 10h
|
||||
.scan_record:
|
||||
add bx, [bx]
|
||||
.scan:
|
||||
test byte [bx+0Ch], 2
|
||||
jnz .not_found
|
||||
mov si, [esp+2]
|
||||
movzx cx, byte [bx+50h] ; namelen
|
||||
lea di, [bx+52h] ; name
|
||||
xor ax, ax
|
||||
@@:
|
||||
lodsb
|
||||
cmp al, 'a'
|
||||
jb .notletter
|
||||
cmp al, 'z'
|
||||
ja .notletter
|
||||
or byte [di], 20h
|
||||
.notletter:
|
||||
scasw
|
||||
loopz @b
|
||||
jb .not_found
|
||||
ja @f
|
||||
cmp byte [esi], 0
|
||||
jz .file_found
|
||||
@@:
|
||||
add bx, [bx+8]
|
||||
jmp .scan
|
||||
.not_found:
|
||||
test byte [bx+0Ch], 1
|
||||
jz file_not_found
|
||||
cmp [index_alloc], 0
|
||||
jz file_not_found
|
||||
add bx, [bx+8]
|
||||
mov eax, [bx-8]
|
||||
mul [cluster_size]
|
||||
mov si, [index_alloc]
|
||||
mov ecx, ebp
|
||||
mov bx, [free]
|
||||
call read_attr
|
||||
mov di, [free]
|
||||
call restore_usa
|
||||
mov bx, [free]
|
||||
add bx, 18h
|
||||
jmp .scan_record
|
||||
.file_found:
|
||||
mov si, [esp+2]
|
||||
mov [cur_obj], si
|
||||
cmp byte [esp+4], 0
|
||||
jz .need_file
|
||||
mov si, notdir_string
|
||||
test byte [bx+48h+3], 10h
|
||||
jz find_error_si
|
||||
mov eax, [bx]
|
||||
mov bx, [dir]
|
||||
mov [free], bx
|
||||
ret 2
|
||||
.need_file:
|
||||
mov si, directory_string
|
||||
test byte [bx+48h+3], 10h ; directory?
|
||||
jnz find_error_si
|
||||
; read entry
|
||||
mov eax, [bx]
|
||||
mov bx, [dir]
|
||||
mov [free], bx
|
||||
mov bx, 4000h
|
||||
push bx
|
||||
call read_file_record
|
||||
pop di
|
||||
mov ax, 80h
|
||||
push 2000h
|
||||
pop es
|
||||
xor bx, bx
|
||||
call load_attr
|
||||
mov si, nodata_string
|
||||
jz find_error_si
|
||||
mov [free], bx
|
||||
ret 2
|
4
programs/hd_load/mtldr/vista_install.bat
Normal file
4
programs/hd_load/mtldr/vista_install.bat
Normal file
@@ -0,0 +1,4 @@
|
||||
bcdedit /create {AA48ABEF-FF35-4f09-874F-4CFF92467DC4} /d "KolibriOS" /application BOOTSECTOR
|
||||
bcdedit /set {AA48ABEF-FF35-4f09-874F-4CFF92467DC4} DEVICE PARTITION=C:
|
||||
bcdedit /set {AA48ABEF-FF35-4f09-874F-4CFF92467DC4} PATH \mtldr
|
||||
bcdedit /displayorder {AA48ABEF-FF35-4f09-874F-4CFF92467DC4} /addlast
|
1
programs/hd_load/mtldr/vista_remove.bat
Normal file
1
programs/hd_load/mtldr/vista_remove.bat
Normal file
@@ -0,0 +1 @@
|
||||
bcdedit /delete {AA48ABEF-FF35-4f09-874F-4CFF92467DC4}
|
1
programs/hd_load/mtldr_install/compile.bat
Normal file
1
programs/hd_load/mtldr_install/compile.bat
Normal file
@@ -0,0 +1 @@
|
||||
fasm mtldr_install.asm
|
1
programs/hd_load/mtldr_install/mtldr_code/compile.bat
Normal file
1
programs/hd_load/mtldr_install/mtldr_code/compile.bat
Normal file
@@ -0,0 +1 @@
|
||||
fasm mtldr.asm ..\mtldr_for_installer
|
112
programs/hd_load/mtldr_install/mtldr_code/fat32.inc
Normal file
112
programs/hd_load/mtldr_install/mtldr_code/fat32.inc
Normal file
@@ -0,0 +1,112 @@
|
||||
fat32_parse_dir:
|
||||
; in: eax=directory cluster
|
||||
; out: eax=entry cluster
|
||||
mov bx, 900h
|
||||
mov di, bx
|
||||
push eax
|
||||
call read_cluster
|
||||
mov cx, word [cluster_size]
|
||||
shr cx, 5 ; div 20h
|
||||
.scan_cluster:
|
||||
pop eax
|
||||
cmp byte [di], 0
|
||||
jz file_not_found
|
||||
mov si, [esp+2]
|
||||
push eax
|
||||
call fat_compare_name
|
||||
jz .file_found
|
||||
and di, not 1Fh
|
||||
add di, 20h
|
||||
loop .scan_cluster
|
||||
pop eax
|
||||
call next_cluster
|
||||
jnc file_not_found
|
||||
jc fat32_parse_dir
|
||||
.file_found:
|
||||
pop eax
|
||||
mov si, [esp+2]
|
||||
mov [cur_obj], si
|
||||
and di, not 1Fh
|
||||
mov si, directory_string
|
||||
mov ax, [di+14h]
|
||||
shl eax, 10h
|
||||
mov ax, [di+1Ah]
|
||||
test eax, eax
|
||||
mov si, nodata_string
|
||||
jz find_error_si
|
||||
ret 2
|
||||
|
||||
fat_compare_name:
|
||||
push cx
|
||||
mov cx, 9
|
||||
.scan:
|
||||
lodsb
|
||||
cmp al, '.'
|
||||
jz .ext
|
||||
cmp al, 0
|
||||
jz .nameend
|
||||
cmp al, 'a'
|
||||
jb .notletter
|
||||
cmp al, 'z'
|
||||
ja .notletter
|
||||
or byte [di], 20h
|
||||
.notletter:
|
||||
scasb
|
||||
loopz .scan
|
||||
.notfound:
|
||||
inc cx ; to clear ZF flag
|
||||
pop cx
|
||||
ret
|
||||
.ext:
|
||||
mov al, ' '
|
||||
dec cx
|
||||
repz scasb
|
||||
jnz .notfound
|
||||
test di, 1
|
||||
jnz .notfound
|
||||
mov cx, 4
|
||||
jmp .scan
|
||||
.nameend:
|
||||
mov al, ' '
|
||||
dec cx
|
||||
repz scasb
|
||||
jnz .notfound
|
||||
test di, 1
|
||||
jnz .file_found
|
||||
mov cx, 3
|
||||
repz scasb
|
||||
jnz .notfound
|
||||
.file_found:
|
||||
xor cx, cx ; to set ZF flag
|
||||
pop cx
|
||||
ret
|
||||
|
||||
read_cluster:
|
||||
; in: eax=cluster,bx->buffer
|
||||
and eax, 0FFFFFFFh
|
||||
movzx ecx, byte [50Dh] ; sects_per_clust
|
||||
mul ecx
|
||||
add eax, [data_start]
|
||||
; call read
|
||||
; ret
|
||||
jmp relative_read
|
||||
next_cluster:
|
||||
mov bx, 700h
|
||||
; sector is 200h bytes long, one entry in FAT occupies 4 bytes => 80h entries in sector
|
||||
push eax
|
||||
shr eax, 7 ; div 80h
|
||||
cmp eax, [fat_cur_sector]
|
||||
jz @f
|
||||
mov [fat_cur_sector], eax
|
||||
add eax, [fat_start]
|
||||
mov cx, 1
|
||||
call relative_read
|
||||
@@:
|
||||
pop eax
|
||||
and eax, 7Fh
|
||||
mov eax, [700h+eax*4]
|
||||
and eax, 0FFFFFFFh
|
||||
cmp eax, 0FFFFFF7h
|
||||
mov si, bad_cluster_string
|
||||
jz find_error_si
|
||||
ret
|
786
programs/hd_load/mtldr_install/mtldr_code/mtldr.asm
Normal file
786
programs/hd_load/mtldr_install/mtldr_code/mtldr.asm
Normal file
@@ -0,0 +1,786 @@
|
||||
; KolibriOS bootloader
|
||||
; this code has been written by diamond in 2005,2006 specially for KolibriOS
|
||||
|
||||
; this code is loaded by ntldr to 0D00:0000
|
||||
; and by io.sys from config.sys to xxxx:0100
|
||||
; and by bootmgr in vista to 0000:7C00
|
||||
format binary
|
||||
use16
|
||||
|
||||
org 0xD000
|
||||
|
||||
; entry point for 9x booting
|
||||
call @f
|
||||
; db 'd' xor 'i' xor 'a' xor 'm' xor 'o' xor 'n' xor 'd'
|
||||
db 'NTFS'
|
||||
|
||||
; file offset +7
|
||||
; may be changed by installator
|
||||
boot_drive db 80h
|
||||
partition_start dd -1
|
||||
imgnameofs dw menuet_img_name
|
||||
|
||||
@@:
|
||||
pop si
|
||||
sub si, 3
|
||||
cmp si, 7C00h
|
||||
jz boot_vista
|
||||
mov si, load_question + 100h - 0D000h
|
||||
call out_string
|
||||
mov si, answer + 100h - 0D000h
|
||||
xxy: mov ah, 0
|
||||
int 16h
|
||||
or al, 20h
|
||||
mov [si], al
|
||||
cmp al, 'y'
|
||||
jz xxz
|
||||
cmp al, 'n'
|
||||
jnz xxy
|
||||
; continue load Windows
|
||||
; call out_string
|
||||
; ret
|
||||
out_string:
|
||||
lodsb
|
||||
test al, al
|
||||
jz .xxx
|
||||
mov ah, 0Eh
|
||||
mov bx, 7
|
||||
int 10h
|
||||
jmp out_string
|
||||
.xxx: ret
|
||||
xxz:
|
||||
; boot KolibriOS
|
||||
call out_string
|
||||
push 0
|
||||
pop ds
|
||||
mov word [4], new01handler + 100h - 0D000h
|
||||
mov [6], cs
|
||||
pushf
|
||||
pop ax
|
||||
or ah, 1
|
||||
push ax
|
||||
popf
|
||||
; int 19h
|
||||
; pushf ; there will be no iret
|
||||
call far [19h*4]
|
||||
xxt:
|
||||
; TF has been cleared when entered new01handler
|
||||
; pushf
|
||||
; pop ax
|
||||
; and ah, not 1
|
||||
; push ax
|
||||
; popf
|
||||
push 0
|
||||
pop ds
|
||||
cmp word [8*4+2], 0F000h
|
||||
jz @f
|
||||
les bx, [8*4]
|
||||
mov eax, [es:bx+1]
|
||||
mov [8*4], eax
|
||||
@@:
|
||||
mov si, 100h
|
||||
boot_vista:
|
||||
xor di, di
|
||||
push cs
|
||||
pop ds
|
||||
push 0D00h
|
||||
pop es
|
||||
mov cx, 2000h/2
|
||||
rep movsw
|
||||
jmp 0D00h:0256h
|
||||
|
||||
new01handler:
|
||||
; [sp]=ip, [sp+2]=cs, [sp+4]=flags
|
||||
push bp
|
||||
mov bp, sp
|
||||
push bx
|
||||
push ds
|
||||
lds bx, [bp+2]
|
||||
cmp word [bx], 19cdh
|
||||
jz xxt
|
||||
pop ds
|
||||
pop bx
|
||||
pop bp
|
||||
iret
|
||||
|
||||
relative_read:
|
||||
add eax, [partition_start]
|
||||
|
||||
; read from hard disk
|
||||
; drive_size must be already initialized
|
||||
; in: eax = absolute sector
|
||||
; cx = number of sectors
|
||||
; es:bx -> buffer
|
||||
read:
|
||||
pushad
|
||||
cmp eax, [drive_size]
|
||||
jb .old_style
|
||||
xor dx, dx
|
||||
; new style - LBA, function 42
|
||||
cmp [has_lba], dl
|
||||
jz disk_error
|
||||
; allocate disk address packet on the stack
|
||||
; qword +8: absolute block number
|
||||
push dx
|
||||
push dx
|
||||
; push dword 0 ; dword +C is high dword
|
||||
push eax ; dword +8 is low dword
|
||||
; dword +4: buffer address
|
||||
push es ; word +6 is segment
|
||||
push bx ; word +4 is offset
|
||||
; word +2: number of blocks = 1
|
||||
push 1
|
||||
; word +0: size of packet = 10h
|
||||
push 10h
|
||||
; now pair ss:sp contain address of disk address packet
|
||||
.patch1:
|
||||
mov ax, 4200h
|
||||
mov dl, [boot_drive]
|
||||
mov si, sp
|
||||
push ds
|
||||
push ss
|
||||
pop ds
|
||||
int 13h
|
||||
pop ds
|
||||
lea sp, [si+10h]
|
||||
.end:
|
||||
popad
|
||||
jc disk_error
|
||||
add bx, 200h
|
||||
inc eax
|
||||
dec cx
|
||||
jnz read
|
||||
ret
|
||||
.old_style:
|
||||
; old style - CHS, function 2
|
||||
; convert absolute sector in eax to cylinder-head-sector coordinates
|
||||
; calculate sector
|
||||
xor edx, edx
|
||||
movzx ecx, [sectors]
|
||||
div ecx
|
||||
; sectors are counted from 1
|
||||
inc dl
|
||||
mov cl, dl ; low 6 bits of cl = sector number
|
||||
; calculate head number
|
||||
; shld edx, eax, 10h ; convert eax to dx:ax
|
||||
push eax
|
||||
pop ax
|
||||
pop dx
|
||||
div [heads]
|
||||
mov dh, dl ; dh = head
|
||||
mov ch, al ; ch = low 8 bits of cylinder
|
||||
shl ah, 6
|
||||
or cl, ah ; high 2 bits of cl = high 2 bits of cylinder
|
||||
.patch2:
|
||||
mov ax, 201h ; function 2, al=1 - number of sectors
|
||||
mov dl, [boot_drive]
|
||||
int 13h
|
||||
jmp .end
|
||||
|
||||
disk_error:
|
||||
mov si, disk_error_msg
|
||||
call out_string
|
||||
jmp $
|
||||
|
||||
answer db ?
|
||||
db 13,10
|
||||
has_lba db 0
|
||||
|
||||
disk_error_msg db 'Disk read error!',0
|
||||
start_msg db 2,' KolibriOS bootloader, running on ',0
|
||||
errfs_msg db 'unknown filesystem, cannot continue',0
|
||||
fat16_msg db 'FAT12/FAT16 - unsupported',13,10,0
|
||||
fat32_msg db 'FAT32',13,10,0
|
||||
ntfs_msg db 'NTFS',13,10,0
|
||||
error_msg db 'Error'
|
||||
colon db ': ',0
|
||||
mft_string db 'MFT',0
|
||||
root_string db '\',0
|
||||
noindex_string db '$INDEX_ROOT not found',0
|
||||
invalid_read_request_string db 'cannot read attribute',0
|
||||
nodata_string db '$DATA '
|
||||
notfound_string db 'not found',0
|
||||
directory_string db 'is a directory',0
|
||||
notdir_string db 'not a directory',0
|
||||
fragmented_string db 'too fragmented file',0
|
||||
bad_cluster_string db 'bad cluster',0
|
||||
exmem_string db 'extended memory error',0
|
||||
|
||||
load_question db 'Load KolibriOS? [y/n]: ',0
|
||||
|
||||
repeat 0D256h - $
|
||||
db 1
|
||||
end repeat
|
||||
|
||||
start:
|
||||
xor ax, ax
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
; our stack is 4Kb-2b!!! (0xFFE)
|
||||
mov ss, ax
|
||||
mov esp, 0FFFEh
|
||||
cld
|
||||
sti
|
||||
; calculate drive size
|
||||
mov dl, [boot_drive]
|
||||
mov ah, 8 ; 8 = get drive parameters
|
||||
int 13h
|
||||
; now: CF is set on error;
|
||||
; ch = low 8 bits of maximum cylinder number
|
||||
; cl : low 6 bits makes maximum sector number, high 2 bits are high 2 bits of maximum cylinder number
|
||||
; dh = maximum head number
|
||||
jnc @f
|
||||
mov cx, -1
|
||||
mov dh, cl
|
||||
@@:
|
||||
movzx ax, dh
|
||||
inc ax
|
||||
; ax = number of heads
|
||||
mov [heads], ax
|
||||
mov dl, cl
|
||||
and dx, 3Fh
|
||||
; dx = number of sectors
|
||||
; (note that sectors are counted from 1, and maximum sector number = number of sectors)
|
||||
mov [sectors], dx
|
||||
mul dx
|
||||
xchg cl, ch
|
||||
shr ch, 6
|
||||
inc cx
|
||||
; cx = number of cylinders
|
||||
mov [cyls], cx
|
||||
mul cx
|
||||
mov word [drive_size], ax
|
||||
mov word [drive_size+2], dx
|
||||
; this drive supports LBA?
|
||||
mov dl, [boot_drive]
|
||||
mov ah, 41h
|
||||
mov bx, 55AAh
|
||||
int 13h
|
||||
jc .no_lba
|
||||
cmp bx, 0AA55h
|
||||
jnz .no_lba
|
||||
test cl, 1
|
||||
jz .no_lba
|
||||
inc [has_lba]
|
||||
.no_lba:
|
||||
; say hi to user
|
||||
mov si, start_msg
|
||||
call out_string
|
||||
mov eax, [partition_start]
|
||||
cmp eax, -1
|
||||
jnz @f
|
||||
; now read first sector to determine file system type
|
||||
; first sector of disk is MBR sector
|
||||
xor eax, eax
|
||||
mov cx, 1
|
||||
mov bx, 500h
|
||||
call read
|
||||
mov eax, [6C6h] ; first disk
|
||||
mov [partition_start], eax
|
||||
@@:
|
||||
mov cx, 1
|
||||
mov bx, 500h
|
||||
call read
|
||||
movzx ax, byte [50Dh]
|
||||
mov [sect_per_clust], ax
|
||||
; determine file system
|
||||
cmp dword [536h], 'FAT1'
|
||||
jz fat1x
|
||||
cmp dword [552h], 'FAT3'
|
||||
jz fat32
|
||||
cmp dword [503h], 'NTFS'
|
||||
jz ntfs
|
||||
; mov si, errfs_msg ; already is
|
||||
call out_string
|
||||
jmp $
|
||||
fat1x:
|
||||
mov si, fat16_msg
|
||||
call out_string
|
||||
jmp $
|
||||
fat32:
|
||||
mov si, fat32_msg
|
||||
call out_string
|
||||
movzx eax, word [50Bh] ; bytes_per_sect
|
||||
movzx ebx, byte [50Dh] ; sects_per_clust
|
||||
mul ebx
|
||||
mov [cluster_size], eax
|
||||
movzx ebx, word [50Eh] ; reserved_sect
|
||||
mov [fat_start], ebx
|
||||
movzx eax, byte [510h] ; num_fats
|
||||
mul dword [524h] ; sect_fat
|
||||
add eax, ebx
|
||||
; cluster 2 begins from sector eax
|
||||
movzx ebx, byte [50Dh] ; sects_per_clust
|
||||
sub eax, ebx
|
||||
sub eax, ebx
|
||||
mov [data_start], eax
|
||||
; parse image name
|
||||
mov eax, [52Ch] ; root_cluster
|
||||
mov [cur_obj], root_string
|
||||
.parsedir:
|
||||
push ax
|
||||
mov si, [imgnameofs]
|
||||
push si
|
||||
@@:
|
||||
lodsb
|
||||
cmp al, '\'
|
||||
jz @f
|
||||
cmp al, 0
|
||||
jnz @b
|
||||
@@:
|
||||
xchg ax, [esp+2]
|
||||
mov byte [si-1], 0
|
||||
mov [imgnameofs], si
|
||||
call fat32_parse_dir
|
||||
pop cx
|
||||
test cl, cl
|
||||
jz .end
|
||||
test byte [di+0Bh], 10h
|
||||
mov si, notdir_string
|
||||
jz find_error_si
|
||||
jmp .parsedir
|
||||
.end:
|
||||
test byte [di+0Bh], 10h
|
||||
mov si, directory_string
|
||||
jnz find_error_si
|
||||
; parse FAT chunk
|
||||
; runlist at 2000:0000
|
||||
mov di, 5
|
||||
push 2000h
|
||||
pop es
|
||||
mov byte [es:di-5], 1 ; of course, non-resident
|
||||
mov dword [es:di-4], 1
|
||||
stosd
|
||||
.parsefat:
|
||||
push es
|
||||
push ds
|
||||
pop es
|
||||
call next_cluster
|
||||
pop es
|
||||
jnc .done
|
||||
mov ecx, [es:di-8]
|
||||
add ecx, [es:di-4]
|
||||
cmp eax, ecx
|
||||
jz .contc
|
||||
mov dword [es:di], 1
|
||||
scasd
|
||||
stosd
|
||||
jmp .parsefat
|
||||
.contc:
|
||||
inc dword [es:di-8]
|
||||
jmp .parsefat
|
||||
.done:
|
||||
xor eax, eax
|
||||
stosd
|
||||
jmp read_img_file
|
||||
|
||||
ntfs:
|
||||
mov si, ntfs_msg
|
||||
call out_string
|
||||
movzx eax, word [50Bh] ; bpb_bytes_per_sect
|
||||
push eax
|
||||
movzx ebx, byte [50Dh] ; bpb_sects_per_clust
|
||||
mul ebx
|
||||
mov [cluster_size], eax
|
||||
mov [data_start], 0
|
||||
mov ecx, [540h] ; frs_size
|
||||
cmp cl, 0
|
||||
jg .1
|
||||
neg cl
|
||||
xor eax, eax
|
||||
inc eax
|
||||
shl eax, cl
|
||||
jmp .2
|
||||
.1:
|
||||
mul ecx
|
||||
.2:
|
||||
mov [frs_size], eax
|
||||
pop ebx
|
||||
xor edx, edx
|
||||
div ebx
|
||||
mov [frs_sectors], ax
|
||||
; read first MFT record - description of MFT itself
|
||||
mov [cur_obj], mft_string
|
||||
movzx eax, byte [50Dh] ; bpb_sects_per_clust
|
||||
mul dword [530h] ; mft_cluster
|
||||
mov cx, [frs_sectors]
|
||||
mov bx, 4000h
|
||||
mov di, bx
|
||||
push bx
|
||||
call relative_read
|
||||
call restore_usa
|
||||
; scan for unnamed $DATA attribute
|
||||
pop di
|
||||
mov ax, 80h ; $DATA
|
||||
mov bx, 700h
|
||||
call load_attr
|
||||
mov si, nodata_string
|
||||
jc find_error_si
|
||||
mov [free], bx
|
||||
; load menuet.img
|
||||
; parse image name
|
||||
mov eax, 5 ; root cluster
|
||||
mov [cur_obj], root_string
|
||||
.parsedir:
|
||||
push ax
|
||||
mov si, [imgnameofs]
|
||||
push si
|
||||
@@:
|
||||
lodsb
|
||||
cmp al, '\'
|
||||
jz @f
|
||||
cmp al, 0
|
||||
jnz @b
|
||||
@@:
|
||||
xchg ax, [esp+2]
|
||||
mov byte [si-1], 0
|
||||
mov [imgnameofs], si
|
||||
call ntfs_parse_dir
|
||||
pop cx
|
||||
test cl, cl
|
||||
jnz .parsedir
|
||||
read_img_file:
|
||||
xor si, si
|
||||
push es
|
||||
pop fs
|
||||
; yes! Now read file to 0x100000
|
||||
lods byte [fs:si]
|
||||
cmp al, 0 ; assume nonresident attr
|
||||
mov si, invalid_read_request_string
|
||||
jz find_error_si
|
||||
mov si, 1
|
||||
xor edi, edi
|
||||
; read buffer to 1000:0000 and move it to extended memory
|
||||
push 1000h
|
||||
pop es
|
||||
xor bx, bx
|
||||
.img_read_block:
|
||||
lods dword [fs:si] ; eax=length
|
||||
xchg eax, ecx
|
||||
jecxz .img_read_done
|
||||
lods dword [fs:si] ; eax=disk cluster
|
||||
.img_read_cluster:
|
||||
pushad
|
||||
; read part of file
|
||||
movzx ecx, byte [50Dh]
|
||||
mul ecx
|
||||
add eax, [data_start]
|
||||
call relative_read
|
||||
; move it to extended memory
|
||||
mov ah, 87h
|
||||
mov ecx, [cluster_size]
|
||||
push ecx
|
||||
shr cx, 1
|
||||
mov si, movedesc
|
||||
push es
|
||||
push ds
|
||||
pop es
|
||||
int 15h
|
||||
pop es
|
||||
test ah, ah
|
||||
mov si, exmem_string
|
||||
jnz find_error_si
|
||||
pop ecx
|
||||
add [dest_addr], ecx
|
||||
popad
|
||||
inc eax
|
||||
loop .img_read_cluster
|
||||
jmp .img_read_block
|
||||
.img_read_done:
|
||||
; menuet.img loaded; now load kernel.mnt
|
||||
load_kernel:
|
||||
push ds
|
||||
pop es
|
||||
mov [cur_obj], kernel_mnt_name
|
||||
; read boot sector
|
||||
xor eax, eax
|
||||
mov bx, 500h
|
||||
mov cx, 1
|
||||
call read_img
|
||||
; init vars
|
||||
mov ax, [50Eh] ; reserved_sect
|
||||
add ax, [51Ch] ; hidden
|
||||
mov word [fat_start], ax
|
||||
xchg ax, bx
|
||||
movzx ax, byte [510h] ; num_fats
|
||||
mul word [516h] ; fat_length
|
||||
add ax, bx
|
||||
; read root dir
|
||||
mov bx, 700h
|
||||
mov cx, [511h] ; dir_entries
|
||||
add cx, 0Fh
|
||||
shr cx, 4
|
||||
call read_img
|
||||
add ax, cx
|
||||
mov [img_data_start], ax
|
||||
shl cx, 9
|
||||
mov di, bx
|
||||
add bx, cx
|
||||
mov byte [bx], 0
|
||||
.scan_loop:
|
||||
cmp byte [di], 0
|
||||
mov si, notfound_string
|
||||
jz find_error_si
|
||||
mov si, kernel_mnt_name
|
||||
call fat_compare_name
|
||||
jz .found
|
||||
and di, not 1Fh
|
||||
add di, 20h
|
||||
jmp .scan_loop
|
||||
.found:
|
||||
and di, not 1Fh
|
||||
mov si, directory_string
|
||||
test byte [di+0Bh], 10h
|
||||
jnz find_error_si
|
||||
; found, now load it to 1000h:0000h
|
||||
mov ax, [di+1Ah]
|
||||
; first cluster of kernel.mnt in ax
|
||||
; translate it to sector on disk in menuet.img
|
||||
push ax
|
||||
dec ax
|
||||
dec ax
|
||||
movzx cx, byte [50Dh]
|
||||
mul cx
|
||||
add ax, [img_data_start]
|
||||
; now ax is sector in menuet.img
|
||||
mov [kernel_mnt_in_img], ax
|
||||
div [sect_per_clust]
|
||||
; now ax is cluster in menuet.img and
|
||||
; dx is offset from the beginning of cluster
|
||||
movzx eax, ax
|
||||
push 2000h
|
||||
pop ds
|
||||
mov si, 1
|
||||
.scani:
|
||||
sub eax, [si]
|
||||
jb .scanidone
|
||||
; sanity check
|
||||
cmp dword [si], 0
|
||||
push invalid_read_request_string
|
||||
jz find_error_sp
|
||||
pop cx
|
||||
; next chunk
|
||||
add si, 8
|
||||
jmp .scani
|
||||
.scanidone:
|
||||
add eax, [si] ; undo last subtract
|
||||
add eax, [si+4] ; get cluster
|
||||
push 0
|
||||
pop ds
|
||||
movzx ecx, [sect_per_clust]
|
||||
push dx
|
||||
mul ecx ; get sector
|
||||
pop dx
|
||||
movzx edx, dx
|
||||
add eax, edx
|
||||
add eax, [data_start]
|
||||
mov [kernel_mnt_1st], eax
|
||||
pop ax
|
||||
push 1000h
|
||||
pop es
|
||||
.read_loop:
|
||||
push ax
|
||||
xor bx, bx
|
||||
call img_read_cluster
|
||||
shl cx, 9-4
|
||||
mov ax, es
|
||||
add ax, cx
|
||||
mov es, ax
|
||||
pop ax
|
||||
call img_next_cluster
|
||||
jc .read_loop
|
||||
mov ax, 'KL'
|
||||
mov si, loader_block
|
||||
jmp 1000h:0000h
|
||||
|
||||
img_next_cluster:
|
||||
mov bx, 700h
|
||||
push ax
|
||||
shr ax, 1
|
||||
add ax, [esp]
|
||||
mov dx, ax
|
||||
shr ax, 9
|
||||
add ax, word [fat_start]
|
||||
mov cx, 2
|
||||
push es
|
||||
push ds
|
||||
pop es
|
||||
call read_img
|
||||
pop es
|
||||
and dx, 1FFh
|
||||
add bx, dx
|
||||
mov ax, [bx]
|
||||
pop cx
|
||||
test cx, 1
|
||||
jz .1
|
||||
shr ax, 4
|
||||
.1:
|
||||
and ax, 0FFFh
|
||||
mov si, bad_cluster_string
|
||||
cmp ax, 0FF7h
|
||||
jz find_error_si
|
||||
ret
|
||||
img_read_cluster:
|
||||
dec ax
|
||||
dec ax
|
||||
movzx cx, byte [50Dh] ; sects_per_clust
|
||||
mul cx
|
||||
add ax, [img_data_start]
|
||||
movzx eax, ax
|
||||
; call read_img
|
||||
; ret
|
||||
read_img:
|
||||
; in: ax = sector, es:bx->buffer, cx=length in sectors
|
||||
pushad
|
||||
movzx ebx, bx
|
||||
mov si, movedesc
|
||||
shl eax, 9
|
||||
add eax, 93100000h
|
||||
mov dword [si+sou_addr-movedesc], eax
|
||||
mov eax, 9300000h
|
||||
mov ax, es
|
||||
shl eax, 4
|
||||
add eax, ebx
|
||||
mov [si+dest_addr-movedesc], eax
|
||||
mov ah, 87h
|
||||
shl cx, 8 ; mul 200h/2
|
||||
push es
|
||||
push 0
|
||||
pop es
|
||||
int 15h
|
||||
pop es
|
||||
cmp ah, 0
|
||||
mov si, exmem_string
|
||||
jnz find_error_si
|
||||
popad
|
||||
ret
|
||||
|
||||
movedesc:
|
||||
times 16 db 0
|
||||
; source
|
||||
dw 0xFFFF ; segment length
|
||||
sou_addr dw 0000h ; linear address
|
||||
db 1 ; linear address
|
||||
db 93h ; access rights
|
||||
dw 0
|
||||
; destination
|
||||
dw 0xFFFF ; segment length
|
||||
dest_addr dd 93100000h ; high byte contains access rights
|
||||
; three low bytes contains linear address (updated when reading)
|
||||
dw 0
|
||||
times 32 db 0
|
||||
|
||||
find_error_si:
|
||||
push si
|
||||
find_error_sp:
|
||||
mov si, error_msg
|
||||
call out_string
|
||||
mov si, [cur_obj]
|
||||
call out_string
|
||||
mov si, colon
|
||||
call out_string
|
||||
pop si
|
||||
call out_string
|
||||
jmp $
|
||||
|
||||
file_not_found:
|
||||
mov si, [esp+2]
|
||||
mov [cur_obj], si
|
||||
push notfound_string
|
||||
jmp find_error_sp
|
||||
|
||||
include 'fat32.inc'
|
||||
include 'ntfs.inc'
|
||||
|
||||
write1st:
|
||||
; callback from kernel.mnt
|
||||
; write first sector of kernel.mnt from 1000:0000 back to disk
|
||||
push cs
|
||||
pop ds
|
||||
push cs
|
||||
pop es
|
||||
; sanity check
|
||||
mov bx, 500h
|
||||
mov si, bx
|
||||
mov cx, 1
|
||||
push cx
|
||||
mov eax, [kernel_mnt_1st]
|
||||
push eax
|
||||
call relative_read
|
||||
push 1000h
|
||||
pop es
|
||||
xor di, di
|
||||
mov cx, 8
|
||||
repz cmpsw
|
||||
mov si, data_error_msg
|
||||
jnz find_error_si
|
||||
; ok, now write back to disk
|
||||
or byte [read.patch1+2], 1
|
||||
or byte [read.patch2+2], 1
|
||||
xor bx, bx
|
||||
pop eax
|
||||
pop cx
|
||||
call relative_read
|
||||
and byte [read.patch1+1], not 1
|
||||
and byte [read.patch2+2], not 2
|
||||
; and to image in memory (probably this may be done by kernel.mnt itself?)
|
||||
mov dword [sou_addr], 93010000h
|
||||
movzx eax, [kernel_mnt_in_img]
|
||||
shl eax, 9
|
||||
add eax, 93100000h
|
||||
mov dword [dest_addr], eax
|
||||
mov si, movedesc
|
||||
push ds
|
||||
pop es
|
||||
mov ah, 87h
|
||||
mov cx, 100h
|
||||
int 15h
|
||||
cmp ah, 0
|
||||
mov si, exmem_string
|
||||
jnz find_error_si
|
||||
retf
|
||||
|
||||
loader_block:
|
||||
db 1 ; version
|
||||
dw 1 ; flags - image is loaded
|
||||
dw write1st ; offset
|
||||
dw 0 ; segment
|
||||
|
||||
fat_cur_sector dd -1
|
||||
|
||||
data_error_msg db 'data error',0
|
||||
|
||||
; -----------------------------------------------
|
||||
; ------------------ Settings -------------------
|
||||
; -----------------------------------------------
|
||||
|
||||
; must be in lowercase, see ntfs_parse_dir.scan, fat32_parse_dir.scan
|
||||
kernel_mnt_name db 'kernel.mnt',0
|
||||
|
||||
; will be initialized by installer
|
||||
menuet_img_name rb 300
|
||||
|
||||
; uninitialized data follows
|
||||
drive_size dd ? ; in sectors
|
||||
heads dw ?
|
||||
sectors dw ?
|
||||
cyls dw ?
|
||||
free dw ?
|
||||
cur_obj dw ?
|
||||
data_start dd ?
|
||||
img_data_start dw ?
|
||||
sect_per_clust dw ?
|
||||
kernel_mnt_in_img dw ?
|
||||
kernel_mnt_1st dd ?
|
||||
; NTFS data
|
||||
cluster_size dd ? ; in bytes
|
||||
frs_size dd ? ; in bytes
|
||||
frs_sectors dw ? ; in sectors
|
||||
mft_data_attr dw ?
|
||||
index_root dw ?
|
||||
index_alloc dw ?
|
||||
ofs dw ?
|
||||
dir dw ?
|
||||
; FAT32 data
|
||||
fat_start dd ?
|
||||
cur_cluster dd ?
|
531
programs/hd_load/mtldr_install/mtldr_code/ntfs.inc
Normal file
531
programs/hd_load/mtldr_install/mtldr_code/ntfs.inc
Normal file
@@ -0,0 +1,531 @@
|
||||
restore_usa:
|
||||
; Update Sequence Array restore
|
||||
mov bx, [di+4]
|
||||
mov cx, [di+6]
|
||||
inc bx
|
||||
add bx, di
|
||||
inc bx
|
||||
add di, 1feh
|
||||
dec cx
|
||||
@@:
|
||||
mov ax, [bx]
|
||||
stosw
|
||||
inc bx
|
||||
inc bx
|
||||
add di, 1feh
|
||||
loop @b
|
||||
ret
|
||||
|
||||
find_attr:
|
||||
; in: di->file record, ax=attribute
|
||||
; out: di->attribute or di=0 if not found
|
||||
add di, [di+14h]
|
||||
.1:
|
||||
; attributes codes are formally dwords, but all they fit in word
|
||||
cmp word [di], -1
|
||||
jz .notfound
|
||||
cmp word [di], ax
|
||||
jnz .continue
|
||||
; for $DATA attribute, scan only unnamed
|
||||
cmp ax, 80h
|
||||
jnz .found
|
||||
cmp byte [di+9], 0
|
||||
jz .found
|
||||
.continue:
|
||||
add di, [di+4]
|
||||
jmp .1
|
||||
.notfound:
|
||||
xor di, di
|
||||
.found:
|
||||
ret
|
||||
|
||||
process_mcb_nonres:
|
||||
; in: si->attribute, es:di->buffer
|
||||
; out: di->buffer end
|
||||
add si, [si+20h]
|
||||
xor ebx, ebx
|
||||
.loop:
|
||||
lodsb
|
||||
test al, al
|
||||
jz .done
|
||||
push invalid_read_request_string
|
||||
movzx cx, al
|
||||
shr cx, 4
|
||||
jz find_error_sp
|
||||
xchg ax, dx
|
||||
and dx, 0Fh
|
||||
jz find_error_sp
|
||||
add si, cx
|
||||
add si, dx
|
||||
pop ax
|
||||
push si
|
||||
dec si
|
||||
movsx eax, byte [si]
|
||||
dec cx
|
||||
jz .l1e
|
||||
.l1:
|
||||
dec si
|
||||
shl eax, 8
|
||||
mov al, [si]
|
||||
loop .l1
|
||||
.l1e:
|
||||
xchg ebp, eax
|
||||
dec si
|
||||
movsx eax, byte [si]
|
||||
mov cx, dx
|
||||
dec cx
|
||||
jz .l2e
|
||||
.l2:
|
||||
dec si
|
||||
shl eax, 8
|
||||
mov al, byte [si]
|
||||
loop .l2
|
||||
.l2e:
|
||||
pop si
|
||||
add ebx, ebp
|
||||
; eax=length, ebx=disk block
|
||||
stosd
|
||||
mov eax, ebx
|
||||
stosd
|
||||
jmp .loop
|
||||
.done:
|
||||
xor eax, eax
|
||||
stosd
|
||||
ret
|
||||
|
||||
load_attr:
|
||||
; in: ax=attribute, es:bx->buffer, di->base record
|
||||
; out: bx->buffer end; CF set if not found
|
||||
push di
|
||||
push ax
|
||||
mov byte [es:bx], 1
|
||||
inc bx
|
||||
push bx
|
||||
mov [ofs], bx
|
||||
; scan for attrubute
|
||||
add di, [di+14h]
|
||||
@@:
|
||||
call find_attr.1
|
||||
test di, di
|
||||
jz .notfound1
|
||||
cmp byte [di+8], 0
|
||||
jnz .nonresident
|
||||
jmp .resident
|
||||
.aux_resident:
|
||||
push di
|
||||
popad
|
||||
; resident attribute
|
||||
.resident:
|
||||
mov si, di
|
||||
pop di
|
||||
dec di
|
||||
mov al, 0
|
||||
stosb
|
||||
mov ax, [si+10h]
|
||||
stosw
|
||||
xchg ax, cx
|
||||
add si, [si+14h]
|
||||
rep movsb
|
||||
mov bx, di
|
||||
pop ax
|
||||
pop di
|
||||
ret
|
||||
.nonresident:
|
||||
; nonresident attribute
|
||||
cmp dword [di+10h], 0
|
||||
jnz @b
|
||||
; read start of data
|
||||
mov si, di
|
||||
pop di
|
||||
call process_mcb_nonres
|
||||
sub di, 4
|
||||
push di
|
||||
.notfound1:
|
||||
; $ATTRIBUTE_LIST is always in base file record
|
||||
cmp word [esp+2], 20h
|
||||
jz .nofragmented
|
||||
; scan for $ATTRIBUTE_LIST = 20h
|
||||
mov di, [esp+4]
|
||||
mov ax, 20h
|
||||
call find_attr
|
||||
test di, di
|
||||
jz .nofragmented
|
||||
; load $ATTRIBUTE_LIST itself
|
||||
push es
|
||||
mov bx, 0C000h
|
||||
mov di, [esp+6]
|
||||
push bx
|
||||
push [ofs]
|
||||
push ds
|
||||
pop es
|
||||
call load_attr
|
||||
pop [ofs]
|
||||
pop si
|
||||
mov bx, 8000h
|
||||
push bx
|
||||
push si
|
||||
call read_attr_full
|
||||
pop si
|
||||
pop bx
|
||||
add dx, bx
|
||||
mov ax, [esp+4]
|
||||
pop es
|
||||
.1:
|
||||
cmp [bx], ax
|
||||
jnz .continue1
|
||||
; only unnamed $DATA attributes!
|
||||
cmp ax, 80h
|
||||
jnz @f
|
||||
cmp byte [bx+6], 0
|
||||
jnz .continue1
|
||||
@@:
|
||||
cmp dword [bx+10h], 0
|
||||
jz .continue1
|
||||
cmp dword [bx+8], 0
|
||||
jnz @f
|
||||
push ax
|
||||
mov ax, [esp+2]
|
||||
cmp ax, [ofs]
|
||||
pop ax
|
||||
jnz .continue1
|
||||
@@:
|
||||
pushad
|
||||
mov eax, [bx+10h]
|
||||
mov bx, dx
|
||||
push [ofs]
|
||||
push es
|
||||
push ds
|
||||
pop es
|
||||
call read_file_record
|
||||
pop es
|
||||
pop [ofs]
|
||||
popad
|
||||
pushad
|
||||
pop di
|
||||
mov di, dx
|
||||
add di, [di+14h]
|
||||
.2:
|
||||
call find_attr.1
|
||||
cmp byte [di+8], 0
|
||||
jz .aux_resident
|
||||
mov eax, [bx+8]
|
||||
cmp eax, [di+10h]
|
||||
jnz .2
|
||||
mov si, di
|
||||
mov di, [esp+1Eh]
|
||||
call process_mcb_nonres
|
||||
sub di, 4
|
||||
mov [esp+1Eh], di
|
||||
push di
|
||||
popad
|
||||
.continue1:
|
||||
add bx, [bx+4]
|
||||
cmp bx, dx
|
||||
jb .1
|
||||
.nofragmented:
|
||||
pop bx
|
||||
pop ax
|
||||
pop di
|
||||
cmp bx, [ofs]
|
||||
jnz @f
|
||||
dec bx
|
||||
stc
|
||||
ret
|
||||
@@:
|
||||
add bx, 4
|
||||
ret
|
||||
|
||||
read_attr_full:
|
||||
; in: si->decoded attribute data, bx->buffer
|
||||
; out: edx=length in bytes
|
||||
lodsb
|
||||
cmp al, 0
|
||||
jnz .nonresident
|
||||
; resident
|
||||
lodsw
|
||||
movzx edx, ax
|
||||
xchg ax, cx
|
||||
mov di, bx
|
||||
rep movsb
|
||||
ret
|
||||
.nonresident:
|
||||
; nonresident :-)
|
||||
xor edx, edx
|
||||
.loop:
|
||||
lodsd
|
||||
xchg ecx, eax
|
||||
jecxz .loopend
|
||||
lodsd
|
||||
xchg edi, eax
|
||||
; read ecx clusters from cluster edi to es:bx
|
||||
.intloop:
|
||||
push ecx
|
||||
; read 1 cluster from physical cluster edi to es:bx
|
||||
mov ecx, [cluster_size]
|
||||
mov eax, edi
|
||||
mul ecx
|
||||
push bx
|
||||
call relative_read
|
||||
pop bx
|
||||
pop ecx
|
||||
inc edi
|
||||
mov eax, [cluster_size]
|
||||
add edx, eax
|
||||
shr eax, 4
|
||||
mov bp, es
|
||||
add bp, ax
|
||||
mov es, bp
|
||||
loop .intloop
|
||||
jmp .loop
|
||||
.loopend:
|
||||
mov es, cx
|
||||
ret
|
||||
|
||||
read_file_record:
|
||||
; in: eax=index of record, bx=buffer
|
||||
mov si, 700h
|
||||
mov ecx, [frs_size]
|
||||
mul ecx
|
||||
push bx
|
||||
push [cur_obj]
|
||||
mov [cur_obj], mft_string
|
||||
call read_attr
|
||||
pop [cur_obj]
|
||||
pop di
|
||||
call restore_usa
|
||||
ret
|
||||
read_attr:
|
||||
; in: edx:eax=offset in bytes, ecx=size in bytes, bx=buffer, si=attribute
|
||||
push invalid_read_request_string
|
||||
cmp byte [si], 0
|
||||
jnz .nonresident
|
||||
test edx, edx
|
||||
jnz find_error_sp
|
||||
cmp eax, 10000h
|
||||
jae find_error_sp
|
||||
cmp ecx, 10000h
|
||||
jae find_error_sp
|
||||
cmp ax, [si+2]
|
||||
jae find_error_sp
|
||||
cmp cx, [si+2]
|
||||
ja find_error_sp
|
||||
add si, 3
|
||||
add si, ax
|
||||
mov di, bx
|
||||
rep movsb
|
||||
pop ax
|
||||
ret
|
||||
.nonresident:
|
||||
mov edi, [cluster_size]
|
||||
div edi
|
||||
mov [ofs], dx
|
||||
add cx, dx
|
||||
push eax
|
||||
xchg eax, ecx
|
||||
xor edx, edx
|
||||
dec eax
|
||||
div edi
|
||||
inc eax
|
||||
xchg eax, ecx
|
||||
pop eax
|
||||
add si, 1
|
||||
xor edx, edx
|
||||
push bx
|
||||
; eax=offset in clusters, ecx=size in clusters
|
||||
.scan:
|
||||
mov ebx, [si]
|
||||
test ebx, ebx
|
||||
jz .notfound
|
||||
add edx, ebx
|
||||
add si, 8
|
||||
cmp eax, edx
|
||||
jae .scan
|
||||
mov edi, [si-4]
|
||||
; now edx=end of block, ebx=length of block, edi=start of block on disk
|
||||
; eax=required offset, ecx=required length
|
||||
push edx
|
||||
push edi
|
||||
sub edx, eax
|
||||
add edi, ebx
|
||||
sub edi, edx
|
||||
cmp edx, ecx
|
||||
jb @f
|
||||
mov edx, ecx
|
||||
@@:
|
||||
; read (edx) clusters from (edi=disk offset in clusters) to ([esp+8])
|
||||
cmp [ofs], 0
|
||||
jnz .ofs_read
|
||||
.cont:
|
||||
pushad
|
||||
movzx ebx, byte [50Dh]
|
||||
; xchg eax, edx
|
||||
; mul ebx
|
||||
xchg ax, dx
|
||||
mul bx
|
||||
xchg cx, ax
|
||||
xchg eax, edi
|
||||
mul ebx
|
||||
mov bx, [esp+8+20h]
|
||||
call relative_read
|
||||
mov [esp+8+20h], bx
|
||||
popad
|
||||
.cont2:
|
||||
add eax, edx
|
||||
sub ecx, edx
|
||||
.cont3:
|
||||
pop edi
|
||||
pop edx
|
||||
jnz .scan
|
||||
pop bx
|
||||
pop ax
|
||||
ret
|
||||
.ofs_read:
|
||||
push ecx
|
||||
movzx ecx, byte [50Dh] ; bpb_sects_per_clust
|
||||
mov eax, edi
|
||||
push edx
|
||||
mul ecx
|
||||
push 1000h
|
||||
pop es
|
||||
xor bx, bx
|
||||
call relative_read
|
||||
mov cx, bx
|
||||
push si
|
||||
push di
|
||||
mov si, [ofs]
|
||||
mov di, [esp+8+12]
|
||||
sub cx, si
|
||||
push ds
|
||||
push es
|
||||
pop ds
|
||||
pop es
|
||||
rep movsb
|
||||
mov [esp+8+12], di
|
||||
push es
|
||||
pop ds
|
||||
pop di
|
||||
pop si
|
||||
pop edx
|
||||
pop ecx
|
||||
inc edi
|
||||
mov [ofs], 0
|
||||
inc eax
|
||||
dec ecx
|
||||
jz .cont3
|
||||
dec edx
|
||||
jnz .cont
|
||||
jmp .cont2
|
||||
.notfound:
|
||||
mov si, invalid_read_request_string
|
||||
jmp find_error_si
|
||||
|
||||
ntfs_parse_dir:
|
||||
; in: eax=directory iRecord, [word sp+2]=filename
|
||||
; out: si=$DATA attribute of file
|
||||
mov bx, [free]
|
||||
mov [dir], bx
|
||||
push bx
|
||||
call read_file_record
|
||||
mov ax, word [frs_size]
|
||||
add [free], ax
|
||||
pop di
|
||||
; find attributes $INDEX_ROOT, $INDEX_ALLOCATION, $BITMAP
|
||||
mov ax, 90h ; $INDEX_ROOT
|
||||
push di
|
||||
mov bx, [free]
|
||||
mov [index_root], bx
|
||||
call load_attr
|
||||
mov si, noindex_string
|
||||
jc find_error_si
|
||||
mov [free], bx
|
||||
pop di
|
||||
mov ax, 0A0h ; $INDEX_ALLOCATION
|
||||
mov bx, [free]
|
||||
mov [index_alloc], bx
|
||||
call load_attr
|
||||
jnc @f
|
||||
mov [index_alloc], 0
|
||||
@@:
|
||||
mov [free], bx
|
||||
; search for entry
|
||||
mov si, [index_root]
|
||||
mov bx, [free]
|
||||
call read_attr_full
|
||||
mov ebp, [bx+8] ; subnode_size
|
||||
add bx, 10h
|
||||
.scan_record:
|
||||
add bx, [bx]
|
||||
.scan:
|
||||
test byte [bx+0Ch], 2
|
||||
jnz .not_found
|
||||
mov si, [esp+2]
|
||||
movzx cx, byte [bx+50h] ; namelen
|
||||
lea di, [bx+52h] ; name
|
||||
xor ax, ax
|
||||
@@:
|
||||
lodsb
|
||||
cmp al, 'a'
|
||||
jb .notletter
|
||||
cmp al, 'z'
|
||||
ja .notletter
|
||||
or byte [di], 20h
|
||||
.notletter:
|
||||
scasw
|
||||
loopz @b
|
||||
jb .not_found
|
||||
ja @f
|
||||
cmp byte [esi], 0
|
||||
jz .file_found
|
||||
@@:
|
||||
add bx, [bx+8]
|
||||
jmp .scan
|
||||
.not_found:
|
||||
test byte [bx+0Ch], 1
|
||||
jz file_not_found
|
||||
cmp [index_alloc], 0
|
||||
jz file_not_found
|
||||
add bx, [bx+8]
|
||||
mov eax, [bx-8]
|
||||
mul [cluster_size]
|
||||
mov si, [index_alloc]
|
||||
mov ecx, ebp
|
||||
mov bx, [free]
|
||||
call read_attr
|
||||
mov di, [free]
|
||||
call restore_usa
|
||||
mov bx, [free]
|
||||
add bx, 18h
|
||||
jmp .scan_record
|
||||
.file_found:
|
||||
mov si, [esp+2]
|
||||
mov [cur_obj], si
|
||||
cmp byte [esp+4], 0
|
||||
jz .need_file
|
||||
mov si, notdir_string
|
||||
test byte [bx+48h+3], 10h
|
||||
jz find_error_si
|
||||
mov eax, [bx]
|
||||
mov bx, [dir]
|
||||
mov [free], bx
|
||||
ret 2
|
||||
.need_file:
|
||||
mov si, directory_string
|
||||
test byte [bx+48h+3], 10h ; directory?
|
||||
jnz find_error_si
|
||||
; read entry
|
||||
mov eax, [bx]
|
||||
mov bx, [dir]
|
||||
mov [free], bx
|
||||
mov bx, 4000h
|
||||
push bx
|
||||
call read_file_record
|
||||
pop di
|
||||
mov ax, 80h
|
||||
push 2000h
|
||||
pop es
|
||||
xor bx, bx
|
||||
call load_attr
|
||||
mov si, nodata_string
|
||||
jz find_error_si
|
||||
mov [free], bx
|
||||
ret 2
|
1426
programs/hd_load/mtldr_install/mtldr_install.asm
Normal file
1426
programs/hd_load/mtldr_install/mtldr_install.asm
Normal file
File diff suppressed because it is too large
Load Diff
BIN
programs/hd_load/mtldr_install/rsrc.res
Normal file
BIN
programs/hd_load/mtldr_install/rsrc.res
Normal file
Binary file not shown.
183
programs/hd_load/usb_boot/BOOT_F32.ASM
Normal file
183
programs/hd_load/usb_boot/BOOT_F32.ASM
Normal file
@@ -0,0 +1,183 @@
|
||||
; KolibriOS bootloader
|
||||
; bootsector for loading from FAT32 flash (or hard) drive
|
||||
; intended for use with mtldr_f file in root folder
|
||||
; this code has been written by diamond in 2005,2006,2007 specially for KolibriOS
|
||||
|
||||
; this code is loaded by BIOS to 0000:7C00
|
||||
org 0x7C00
|
||||
jmp @f
|
||||
nop
|
||||
; times 57h db 0
|
||||
file 'bt2.dat':3,57h
|
||||
@@:
|
||||
xor eax, eax
|
||||
mov ds, ax
|
||||
mov ss, ax
|
||||
mov sp, 7C00h
|
||||
mov [boot_drive], dl
|
||||
cld
|
||||
sti
|
||||
push 800h
|
||||
pop es
|
||||
movzx ebx, word [7C0Eh] ; reserved_sect
|
||||
mov [fat_start], ebx
|
||||
mov al, byte [7C10h] ; num_fats
|
||||
mul dword [7C24h] ; sect_fat
|
||||
add eax, ebx
|
||||
; cluster 2 begins from sector eax
|
||||
movzx ebx, byte [7C0Dh] ; sects_per_clust
|
||||
add bx, bx
|
||||
sub eax, ebx
|
||||
mov [data_start], eax
|
||||
mov eax, [7C2Ch] ; root_cluster
|
||||
and eax, 0FFFFFFFh
|
||||
fat32_parse_dir:
|
||||
xor bx, bx
|
||||
mov di, bx
|
||||
push eax
|
||||
call read_cluster
|
||||
movzx cx, byte [7C0Dh] ; sects_per_clust
|
||||
shl cx, 4 ; *0x200/0x20
|
||||
scan_cluster:
|
||||
cmp byte [es:di], 0
|
||||
jz file_not_found
|
||||
push cx di
|
||||
mov cx, 11
|
||||
mov si, mtldr_f
|
||||
repz cmpsb
|
||||
pop di cx
|
||||
jz file_found
|
||||
add di, 20h
|
||||
loop scan_cluster
|
||||
pop eax
|
||||
call next_cluster
|
||||
jnc file_not_found
|
||||
jc fat32_parse_dir
|
||||
file_found:
|
||||
pop eax
|
||||
mov ax, [es:di+14h]
|
||||
and ax, 0FFFh
|
||||
shl eax, 10h
|
||||
mov ax, [es:di+1Ah]
|
||||
; eax contains first cluster
|
||||
@@:
|
||||
xor bx, bx
|
||||
push eax
|
||||
call read_cluster
|
||||
mov ax, es
|
||||
movzx cx, byte [7C0Dh]
|
||||
shl cx, 5
|
||||
add ax, cx
|
||||
mov es, ax
|
||||
pop eax
|
||||
call next_cluster
|
||||
jc @b
|
||||
jmp 0:8000h
|
||||
|
||||
file_not_found:
|
||||
mov si, file_not_found_msg
|
||||
sayerr:
|
||||
call out_string
|
||||
jmp $
|
||||
|
||||
read_cluster:
|
||||
; in: eax = cluster, bx->buffer
|
||||
movzx ecx, byte [7C0Dh]
|
||||
mul ecx
|
||||
add eax, [data_start]
|
||||
|
||||
; read procedure
|
||||
; in: eax = absolute sector
|
||||
; cx = number of sectors
|
||||
; es:bx -> buffer
|
||||
read:
|
||||
add eax, [7C1Ch] ; hidden sectors
|
||||
push es
|
||||
read_loop:
|
||||
pushad
|
||||
; allocate disk address packet on the stack
|
||||
; qword +8: absolute block number
|
||||
push 0
|
||||
push 0 ; dword +C is high dword
|
||||
push eax ; dword +8 is low dword
|
||||
; dword +4: buffer address
|
||||
push es ; word +6 is segment
|
||||
push bx ; word +4 is offset
|
||||
; word +2: number of blocks, limited to 7Fh
|
||||
sub cx, 7Fh
|
||||
sbb ax, ax
|
||||
and ax, cx
|
||||
add ax, 7Fh
|
||||
push ax
|
||||
shl ax, 5
|
||||
mov cx, es
|
||||
add cx, ax
|
||||
mov es, cx
|
||||
; word +0: size of packet = 10h
|
||||
push 10h
|
||||
; now pair ss:sp contain address of disk address packet
|
||||
mov ax, 4200h
|
||||
mov dl, [boot_drive]
|
||||
mov si, sp
|
||||
int 13h
|
||||
mov si, disk_read_err
|
||||
jc sayerr
|
||||
popaw
|
||||
popad
|
||||
add eax, 7Fh
|
||||
sub cx, 7Fh
|
||||
ja read_loop
|
||||
pop es
|
||||
ret
|
||||
|
||||
next_cluster:
|
||||
push es
|
||||
push ds
|
||||
pop es
|
||||
mov bx, 7E00h
|
||||
; sector is 200h bytes long, one entry in FAT occupies 4 bytes
|
||||
; => 80h entries in sector
|
||||
push eax
|
||||
shr eax, 7 ; div 80h
|
||||
cmp eax, [fat_cur_sector]
|
||||
jz @f
|
||||
mov [fat_cur_sector], eax
|
||||
add eax, [fat_start]
|
||||
mov cx, 1
|
||||
call read
|
||||
@@:
|
||||
pop eax
|
||||
and eax, 7Fh
|
||||
mov eax, [7E00h+eax*4]
|
||||
and eax, 0FFFFFFFh
|
||||
cmp eax, 0FFFFFF7h
|
||||
mov si, bad_cluster
|
||||
jz sayerr
|
||||
pop es
|
||||
ret
|
||||
|
||||
out_string:
|
||||
lodsb
|
||||
test al, al
|
||||
jz .xxx
|
||||
mov ah, 0Eh
|
||||
mov bx, 7
|
||||
int 10h
|
||||
jmp out_string
|
||||
.xxx: ret
|
||||
|
||||
file_not_found_msg db 'Cannot find file '
|
||||
mtldr_f db 'MTLD_F32 '
|
||||
db 13,10,0
|
||||
disk_read_err db 'Disk read error',13,10,0
|
||||
bad_cluster db 'Bad cluster',13,10,0
|
||||
fat_cur_sector dd -1
|
||||
|
||||
times (7DFEh - $) db 0
|
||||
db 55h, 0AAh
|
||||
|
||||
virtual at 7A00h
|
||||
fat_start dd ?
|
||||
data_start dd ?
|
||||
boot_drive db ?
|
||||
end virtual
|
BIN
programs/hd_load/usb_boot/MBR
Normal file
BIN
programs/hd_load/usb_boot/MBR
Normal file
Binary file not shown.
83
programs/hd_load/usb_boot/fat32.inc
Normal file
83
programs/hd_load/usb_boot/fat32.inc
Normal file
@@ -0,0 +1,83 @@
|
||||
fat32_parse_dir:
|
||||
; in: eax=directory cluster
|
||||
; out: eax=entry cluster
|
||||
xor bx, bx
|
||||
mov di, bx
|
||||
push eax
|
||||
call read_cluster
|
||||
movzx cx, byte [7C0Dh]
|
||||
shl cx, 4
|
||||
.scan_cluster:
|
||||
pop eax
|
||||
cmp byte [es:di], 0
|
||||
jz file_not_found
|
||||
mov si, [esp+2]
|
||||
push eax
|
||||
call fat_compare_name
|
||||
jz .file_found
|
||||
and di, not 1Fh
|
||||
add di, 20h
|
||||
loop .scan_cluster
|
||||
pop eax
|
||||
call next_cluster
|
||||
jnc file_not_found
|
||||
jc fat32_parse_dir
|
||||
.file_found:
|
||||
pop eax
|
||||
mov si, [esp+2]
|
||||
mov [cur_obj], si
|
||||
and di, not 1Fh
|
||||
mov si, directory_string
|
||||
mov ax, [es:di+14h]
|
||||
and ax, 0xFFF
|
||||
shl eax, 10h
|
||||
mov ax, [es:di+1Ah]
|
||||
test eax, eax
|
||||
mov si, nodata_string
|
||||
jz find_error_si
|
||||
ret 2
|
||||
|
||||
fat_compare_name:
|
||||
push cx
|
||||
mov cx, 9
|
||||
.scan:
|
||||
lodsb
|
||||
cmp al, '.'
|
||||
jz .ext
|
||||
cmp al, 0
|
||||
jz .nameend
|
||||
cmp al, 'a'
|
||||
jb .notletter
|
||||
cmp al, 'z'
|
||||
ja .notletter
|
||||
or byte [es:di], 20h
|
||||
.notletter:
|
||||
scasb
|
||||
loopz .scan
|
||||
.notfound:
|
||||
inc cx ; to clear ZF flag
|
||||
pop cx
|
||||
ret
|
||||
.ext:
|
||||
mov al, ' '
|
||||
dec cx
|
||||
repz scasb
|
||||
jnz .notfound
|
||||
test di, 1
|
||||
jnz .notfound
|
||||
mov cx, 4
|
||||
jmp .scan
|
||||
.nameend:
|
||||
mov al, ' '
|
||||
dec cx
|
||||
repz scasb
|
||||
jnz .notfound
|
||||
test di, 1
|
||||
jnz .file_found
|
||||
mov cx, 3
|
||||
repz scasb
|
||||
jnz .notfound
|
||||
.file_found:
|
||||
xor cx, cx ; to set ZF flag
|
||||
pop cx
|
||||
ret
|
492
programs/hd_load/usb_boot/inst.asm
Normal file
492
programs/hd_load/usb_boot/inst.asm
Normal file
@@ -0,0 +1,492 @@
|
||||
format PE GUI 4.0
|
||||
section '.text' code readable executable
|
||||
entry start
|
||||
start:
|
||||
xor ebx, ebx
|
||||
mov esi, a2_src
|
||||
mov edi, a2
|
||||
movsd
|
||||
movsd
|
||||
movsd
|
||||
movsd
|
||||
movsd
|
||||
push 1
|
||||
call [SetErrorMode]
|
||||
push ebx ; lpParam
|
||||
push 400000h ; hInstance
|
||||
push ebx ; hMenu
|
||||
push ebx ; hWndParent
|
||||
push 100 ; nHeight
|
||||
push 200 ; nWidth
|
||||
mov eax, 80000000h
|
||||
push eax ; y
|
||||
push eax ; x
|
||||
push 10EF0140h ; dwStyle
|
||||
push WndName
|
||||
push ClassName
|
||||
push 388h ; dwExStyle
|
||||
call [CreateWindowExA]
|
||||
xchg edi, eax
|
||||
push 0Ah ; OEM_FIXED_FONT
|
||||
call [GetStockObject]
|
||||
push ebx
|
||||
push eax
|
||||
push 30h ; WM_SETFONT
|
||||
call ListCommand
|
||||
call CollectDrivesInfo
|
||||
push MyWndProc
|
||||
push -4 ; GWL_WNDPROC
|
||||
push edi
|
||||
call [SetWindowLongA]
|
||||
mov [OldWndProc], eax
|
||||
sub esp, 20h
|
||||
mov esi, esp
|
||||
@@:
|
||||
push ebx
|
||||
push ebx
|
||||
push ebx
|
||||
push esi
|
||||
call [GetMessageA]
|
||||
test eax, eax
|
||||
jz @f
|
||||
push esi
|
||||
call [TranslateMessage]
|
||||
push esi
|
||||
call [DispatchMessageA]
|
||||
jmp @b
|
||||
@@:
|
||||
add esp, 20h
|
||||
ret
|
||||
|
||||
ListCommand:
|
||||
pop eax
|
||||
push edi
|
||||
push eax
|
||||
jmp [SendMessageA]
|
||||
|
||||
MyWndProc:
|
||||
push edi ebx
|
||||
xor ebx, ebx
|
||||
mov edi, [esp+12]
|
||||
cmp dword [esp+16], 2 ; WM_DESTROY
|
||||
jnz @f
|
||||
push ebx
|
||||
call [PostQuitMessage]
|
||||
@@:
|
||||
cmp dword [esp+16], 219h ; WM_DEVICECHANGE
|
||||
jnz w
|
||||
cmp dword [esp+20], 8000h ; DBT_DEVICEARRIVAL
|
||||
jz @f
|
||||
cmp dword [esp+20], 8004h ; DBT_DEVICEREMOVECOMPLETE
|
||||
jnz w
|
||||
@@:
|
||||
call UpdateDrivesInfo
|
||||
w:
|
||||
cmp dword [esp+16], 203h ; WM_LBUTTONDBLCLK
|
||||
jnz @f
|
||||
push ebx
|
||||
push ebx
|
||||
push 188h ; LB_GETCURSEL
|
||||
call ListCommand
|
||||
cmp eax, -1
|
||||
jz @f
|
||||
push n
|
||||
push eax
|
||||
push 189h ; LB_GETTEXT
|
||||
call ListCommand
|
||||
mov eax, n
|
||||
mov byte [eax+2], bl
|
||||
mov edx, [eax]
|
||||
mov [mtldr_out], dl
|
||||
mov dword [eax], '\\.\'
|
||||
mov dword [eax+4], edx
|
||||
call install
|
||||
@@:
|
||||
pop ebx edi
|
||||
pop eax
|
||||
push [OldWndProc]
|
||||
push eax
|
||||
jmp [CallWindowProcA]
|
||||
|
||||
UpdateDrivesInfo:
|
||||
push ebx
|
||||
push ebx
|
||||
push 184h ; LB_RESETCONTENT
|
||||
call ListCommand
|
||||
|
||||
CollectDrivesInfo:
|
||||
push esi
|
||||
call [GetLogicalDrives]
|
||||
mov esi, eax
|
||||
mov edx, a
|
||||
mov byte [edx], 'A'
|
||||
l:
|
||||
shr esi, 1
|
||||
jnc d
|
||||
mov [edx+2], bl
|
||||
push edx
|
||||
call [GetDriveTypeA]
|
||||
; Uncomment following lines to allow hard drives
|
||||
; cmp eax, 3 ; DRIVE_FIXED
|
||||
; jz @f
|
||||
cmp eax, 2 ; DRIVE_REMOVABLE
|
||||
jnz d
|
||||
push ebx ; hTemplateFile
|
||||
push ebx ; dwFlagsAndAttributes
|
||||
push 3 ; dwCreationDisposition = OPEN_EXISTING
|
||||
push ebx ; lpSecurityAttributes
|
||||
push 3 ; dwShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
|
||||
push ebx ; dwDesiredAccess
|
||||
push a2
|
||||
call [CreateFileA]
|
||||
cmp eax, -1
|
||||
jz d
|
||||
push eax
|
||||
push ebx
|
||||
mov ecx, esp
|
||||
push ebx ; lpOverlapped
|
||||
push ecx ; lpBytesReturned
|
||||
push 1024 ; nOutBufferSize
|
||||
push n ; lpOutBuffer
|
||||
push ebx
|
||||
push ebx
|
||||
push 70C00h ; IOCTL_DISK_GET_MEDIA_TYPES
|
||||
push eax
|
||||
call [DeviceIoControl]
|
||||
pop ecx
|
||||
pop eax
|
||||
push ecx
|
||||
push eax
|
||||
call [CloseHandle]
|
||||
pop ecx
|
||||
jecxz @f ; not supported => OK
|
||||
cmp byte [n+8], 11
|
||||
jnz d
|
||||
@@:
|
||||
mov eax, a
|
||||
mov ecx, n
|
||||
mov byte [eax+2], '\'
|
||||
push ecx
|
||||
push ebx ; nFileSystemNameSize
|
||||
push ebx ; lpFileSystemNameBuffer
|
||||
push ebx ; lpFileSystemFlags
|
||||
push ebx ; lpMaximumComponentLength
|
||||
push ebx ; lpVolumeSerialNumber
|
||||
push 1024 ; nVolumeNameSize
|
||||
mov edx, [eax]
|
||||
mov [ecx], edx
|
||||
mov word [ecx+3], ' ['
|
||||
add ecx, 5
|
||||
mov byte [ecx], bl
|
||||
push ecx ; lpVolumeNameBuffer
|
||||
push eax ; lpRootPathName
|
||||
call [GetVolumeInformationA]
|
||||
pop eax
|
||||
push eax
|
||||
cmp byte [eax+5], bl
|
||||
jz nol
|
||||
@@:
|
||||
inc eax
|
||||
cmp byte [eax-1], bl
|
||||
jnz @b
|
||||
mov word [eax-1], ']'
|
||||
; jmp @f
|
||||
nol:
|
||||
mov byte [eax+3], bl
|
||||
@@:
|
||||
push ebx
|
||||
push 180h ; LB_ADDSTRING
|
||||
call ListCommand
|
||||
d:
|
||||
mov edx, a
|
||||
inc byte [edx]
|
||||
test esi, esi
|
||||
jnz l
|
||||
pop esi
|
||||
ret
|
||||
|
||||
install:
|
||||
push ebx ; hTemplateFile
|
||||
push ebx ; dwFlagsAndAttributes
|
||||
push 3 ; dwCreationDisposition = OPEN_EXISTING
|
||||
push ebx ; lpSecurityAttributes
|
||||
push 3 ; dwShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
|
||||
push 0C0000000h ; dwDesiredAccess = GENERIC_READ|GENERIC_WRITE
|
||||
push eax
|
||||
call [CreateFileA]
|
||||
cmp eax, -1
|
||||
jz deverre
|
||||
push esi ebp
|
||||
mov ebp, bootsect_dev
|
||||
xchg esi, eax
|
||||
push eax
|
||||
mov eax, esp
|
||||
push ebx
|
||||
push eax
|
||||
push 512
|
||||
push ebp
|
||||
push esi
|
||||
call [ReadFile]
|
||||
test eax, eax
|
||||
jnz @f
|
||||
deverrl:
|
||||
push esi
|
||||
call [CloseHandle]
|
||||
pop eax
|
||||
pop ebp esi
|
||||
deverre:
|
||||
push 10h
|
||||
push ebx
|
||||
push deverr
|
||||
push edi
|
||||
call [MessageBoxA]
|
||||
ret
|
||||
@@:
|
||||
; make sure that this is FAT32 volume
|
||||
cmp word [ebp+0Bh], 200h ; bytes per sector
|
||||
jnz bootinv
|
||||
cmp word [ebp+0Eh], bx ; reserved sectors
|
||||
jz bootinv
|
||||
cmp byte [ebp+10h], bl ; number of FATs
|
||||
jz bootinv
|
||||
cmp word [ebp+11h], bx ; root dir entries
|
||||
jnz bootinv ; must be 0 for FAT32
|
||||
cmp word [ebp+16h], bx ; length of one copy of FAT1x
|
||||
jnz bootinv
|
||||
cmp dword [ebp+20h], ebx ; length of one copy of FAT32
|
||||
jz bootinv
|
||||
cmp byte [ebp+42h], ')' ; magic value
|
||||
jz @f
|
||||
bootinv:
|
||||
push 10h
|
||||
push ebx
|
||||
push nofat32
|
||||
jmp re
|
||||
@@:
|
||||
; ok, this is really correct FAT32 volume, so start install
|
||||
; copy file mtldr_f
|
||||
push 80h
|
||||
push mtldr_out
|
||||
call [SetFileAttributesA]
|
||||
push ebx ; bFailIfExists
|
||||
push mtldr_out ; lpNewFileName
|
||||
push mtldr_in ; lpExistingFileName
|
||||
call [CopyFileA]
|
||||
test eax, eax
|
||||
jnz @f
|
||||
push 10h
|
||||
push ebx
|
||||
push mterr
|
||||
re:
|
||||
push edi
|
||||
call [MessageBoxA]
|
||||
jmp r
|
||||
@@:
|
||||
push 7
|
||||
push mtldr_out
|
||||
call [SetFileAttributesA]
|
||||
; load bootsector
|
||||
push ebx ; hTemplateFile
|
||||
push ebx ; dwFlagsAndAttributes
|
||||
push 3 ; dwCreationDisposition = OPEN_EXISTING
|
||||
push ebx ; lpSecurityAttributes
|
||||
push 1 ; dwShareMode = FILE_SHARE_READ
|
||||
push 80000000h ; dwDesiredAccess = GENERIC_READ
|
||||
push btname
|
||||
call [CreateFileA]
|
||||
cmp eax, -1
|
||||
jnz @f
|
||||
bterrc:
|
||||
push 40h
|
||||
push ebx
|
||||
push bterr
|
||||
jmp re
|
||||
@@:
|
||||
mov ecx, esp
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
push 512
|
||||
push bootsect_new
|
||||
push eax
|
||||
call [ReadFile]
|
||||
pop ecx
|
||||
push eax
|
||||
push ecx
|
||||
call [CloseHandle]
|
||||
pop eax
|
||||
test eax, eax
|
||||
jz bterrc
|
||||
cmp dword [esp], 512
|
||||
jnz bterrc
|
||||
; patch bootsector with real values
|
||||
push esi edi
|
||||
mov esi, bootsect_new
|
||||
mov edi, bootsect_dev
|
||||
movsb
|
||||
movsb
|
||||
movsb
|
||||
add esi, 57h
|
||||
add edi, 57h
|
||||
mov ecx, 200h-5Ah
|
||||
rep movsb
|
||||
pop edi esi
|
||||
; write bootsector
|
||||
push ebx
|
||||
push ebx
|
||||
push ebx
|
||||
push esi
|
||||
call [SetFilePointer]
|
||||
test eax, eax
|
||||
jnz deverrl
|
||||
mov eax, esp
|
||||
push ebx
|
||||
push eax
|
||||
push 512
|
||||
push ebp
|
||||
push esi
|
||||
call [WriteFile]
|
||||
test eax, eax
|
||||
jz deverrl
|
||||
cmp dword [esp], 512
|
||||
jnz deverrl
|
||||
; Patch backup copy of boot sector, ignore errors
|
||||
movzx eax, word [ebp+50]
|
||||
test eax, eax
|
||||
jz done_succ
|
||||
; sanity check: it must be in the reserved area, not in data
|
||||
cmp ax, word [ebp+14]
|
||||
jae done_succ
|
||||
shl eax, 9
|
||||
push ebx
|
||||
push ebx
|
||||
push eax
|
||||
push esi
|
||||
call [SetFilePointer]
|
||||
cmp eax, -1
|
||||
jz done_succ
|
||||
mov eax, esp
|
||||
push ebx
|
||||
push eax
|
||||
push 512
|
||||
push ebp
|
||||
push esi
|
||||
call [WriteFile]
|
||||
; done!
|
||||
done_succ:
|
||||
push 40h
|
||||
push ok
|
||||
push succ
|
||||
push edi
|
||||
call [MessageBoxA]
|
||||
push ebx
|
||||
call [PostQuitMessage]
|
||||
r:
|
||||
pop eax
|
||||
push esi
|
||||
call [CloseHandle]
|
||||
pop ebp esi
|
||||
ret
|
||||
|
||||
section '.rdata' data readable
|
||||
|
||||
data resource from 'rsrc.res'
|
||||
end data
|
||||
|
||||
ClassName db 'LISTBOX',0
|
||||
WndName db 'Select drive',0
|
||||
deverr db 'Cannot open physical device or device error (no administrator rights?)',0
|
||||
nofat32 db 'Not FAT32 volume. Sorry, only FAT32 is supported at moment.',0
|
||||
ok db 'Success',0
|
||||
succ db 'Kolibri flash loader was successfully installed!',10
|
||||
db 'Now you can copy the image kolibri.img and boot!',0
|
||||
mterr db 'Cannot copy MTLD_F32',0
|
||||
bterr db 'Cannot load '
|
||||
btname db 'BOOT_F32.BIN',0
|
||||
|
||||
data import
|
||||
macro thunk a
|
||||
{a#_thunk:dw 0
|
||||
db `a,0}
|
||||
dd 0,0,0, rva kernel32_name, rva kernel32_thunks
|
||||
dd 0,0,0, rva user32_name, rva user32_thunks
|
||||
dd 0,0,0, rva gdi32_name, rva gdi32_thunks
|
||||
dd 0,0,0,0,0
|
||||
kernel32_name db 'kernel32.dll',0
|
||||
user32_name db 'user32.dll',0
|
||||
gdi32_name db 'gdi32.dll',0
|
||||
kernel32_thunks:
|
||||
GetLogicalDrives dd rva GetLogicalDrives_thunk
|
||||
GetDriveTypeA dd rva GetDriveTypeA_thunk
|
||||
GetVolumeInformationA dd rva GetVolumeInformationA_thunk
|
||||
CreateFileA dd rva CreateFileA_thunk
|
||||
ReadFile dd rva ReadFile_thunk
|
||||
WriteFile dd rva WriteFile_thunk
|
||||
SetFilePointer dd rva SetFilePointer_thunk
|
||||
CloseHandle dd rva CloseHandle_thunk
|
||||
SetErrorMode dd rva SetErrorMode_thunk
|
||||
CopyFileA dd rva CopyFileA_thunk
|
||||
SetFileAttributesA dd rva SetFileAttributesA_thunk
|
||||
DeviceIoControl dd rva DeviceIoControl_thunk
|
||||
dw 0
|
||||
thunk GetLogicalDrives
|
||||
thunk GetDriveTypeA
|
||||
thunk GetVolumeInformationA
|
||||
thunk CreateFileA
|
||||
thunk ReadFile
|
||||
thunk WriteFile
|
||||
thunk SetFilePointer
|
||||
thunk CloseHandle
|
||||
thunk SetErrorMode
|
||||
thunk CopyFileA
|
||||
thunk SetFileAttributesA
|
||||
thunk DeviceIoControl
|
||||
user32_thunks:
|
||||
CreateWindowExA dd rva CreateWindowExA_thunk
|
||||
GetMessageA dd rva GetMessageA_thunk
|
||||
TranslateMessage dd rva TranslateMessage_thunk
|
||||
DispatchMessageA dd rva DispatchMessageA_thunk
|
||||
PostQuitMessage dd rva PostQuitMessage_thunk
|
||||
CallWindowProcA dd rva CallWindowProcA_thunk
|
||||
SetWindowLongA dd rva SetWindowLongA_thunk
|
||||
SendMessageA dd rva SendMessageA_thunk
|
||||
MessageBoxA dd rva MessageBoxA_thunk
|
||||
dw 0
|
||||
thunk CreateWindowExA
|
||||
thunk GetMessageA
|
||||
thunk TranslateMessage
|
||||
thunk DispatchMessageA
|
||||
thunk PostQuitMessage
|
||||
thunk CallWindowProcA
|
||||
thunk SetWindowLongA
|
||||
thunk SendMessageA
|
||||
thunk MessageBoxA
|
||||
gdi32_thunks:
|
||||
GetStockObject dd rva GetStockObject_thunk
|
||||
dw 0
|
||||
thunk GetStockObject
|
||||
end data
|
||||
|
||||
a2_src:
|
||||
db '\\.\'
|
||||
db '?:',0,0
|
||||
db '?:\'
|
||||
db 'MTLD_F32',0
|
||||
|
||||
section '.data' data readable writable
|
||||
|
||||
;a2 db '\\.\'
|
||||
;a db '?:',0,0
|
||||
;mtldr_out db '?:\'
|
||||
;mtldr_in db 'MTLD_F32',0
|
||||
a2 rb 4
|
||||
a rb 4
|
||||
mtldr_out rb 3
|
||||
mtldr_in rb 9
|
||||
|
||||
align 4
|
||||
OldWndProc dd ?
|
||||
devpath rb 1024
|
||||
n rb 1032
|
||||
bootsect_dev rb 512
|
||||
bootsect_new rb 512
|
453
programs/hd_load/usb_boot/mtldr.asm
Normal file
453
programs/hd_load/usb_boot/mtldr.asm
Normal file
@@ -0,0 +1,453 @@
|
||||
; KolibriOS bootloader
|
||||
; this code has been written by diamond in 2005,2006,2007 specially for KolibriOS
|
||||
|
||||
; this code is loaded by our bootsector to 0000:8000
|
||||
format binary
|
||||
use16
|
||||
|
||||
out_string = 0x7DA2
|
||||
read_cluster = 0x7D0A
|
||||
relative_read = 0x7D18
|
||||
next_cluster = 0x7D5C
|
||||
|
||||
org 0x8000
|
||||
start:
|
||||
; cs=ds=0, es undefined, ss=0, sp=7C00
|
||||
movzx esp, sp
|
||||
push 1000h
|
||||
pop es
|
||||
; say hi to user
|
||||
mov si, start_msg
|
||||
call out_string
|
||||
; parse image name
|
||||
mov eax, [7C2Ch] ; root_cluster
|
||||
and eax, 0xFFFFFFF
|
||||
mov [cur_obj], root_string
|
||||
.parsedir:
|
||||
push ax
|
||||
mov si, [imgnameofs]
|
||||
push si
|
||||
@@:
|
||||
lodsb
|
||||
cmp al, 0
|
||||
jz @f
|
||||
cmp al, '\'
|
||||
jnz @b
|
||||
dec si
|
||||
mov [missing_slash], si
|
||||
inc si
|
||||
@@:
|
||||
xchg ax, [esp+2]
|
||||
mov byte [si-1], 0
|
||||
mov [imgnameofs], si
|
||||
call fat32_parse_dir
|
||||
call restore_slash
|
||||
pop cx
|
||||
test cl, cl
|
||||
jz .end
|
||||
test byte [es:di+0Bh], 10h
|
||||
mov si, notdir_string
|
||||
jz find_error_si
|
||||
jmp .parsedir
|
||||
.end:
|
||||
test byte [es:di+0Bh], 10h
|
||||
mov si, directory_string
|
||||
jnz find_error_si
|
||||
; parse FAT chunk
|
||||
; runlist at 5000:0000
|
||||
mov di, 4
|
||||
push 5000h
|
||||
pop es
|
||||
mov dword [es:di-4], 1
|
||||
stosd
|
||||
.parsefat:
|
||||
call next_cluster
|
||||
jnc .done
|
||||
mov ecx, [es:di-8]
|
||||
add ecx, [es:di-4]
|
||||
cmp eax, ecx
|
||||
jz .contc
|
||||
mov dword [es:di], 1
|
||||
scasd
|
||||
stosd
|
||||
jmp .parsefat
|
||||
.contc:
|
||||
inc dword [es:di-8]
|
||||
jmp .parsefat
|
||||
.done:
|
||||
xor eax, eax
|
||||
stosd
|
||||
read_img_file:
|
||||
xor si, si
|
||||
push es
|
||||
pop fs
|
||||
; yes! Now read file to 0x100000
|
||||
xor edi, edi
|
||||
; read buffer to 1000:0000 and move it to extended memory
|
||||
push 1000h
|
||||
pop es
|
||||
xor bx, bx
|
||||
.img_read_block:
|
||||
lods dword [fs:si] ; eax=length
|
||||
xchg eax, ecx
|
||||
jecxz .img_read_done
|
||||
lods dword [fs:si] ; eax=disk cluster
|
||||
.img_read_cluster:
|
||||
pushad
|
||||
; read part of file
|
||||
movzx esi, byte [7C0Dh]
|
||||
mul esi
|
||||
add eax, [7A04h]
|
||||
push ax
|
||||
mov ax, 0x200
|
||||
div si
|
||||
cmp cx, ax
|
||||
jb @f
|
||||
mov cx, ax
|
||||
@@:
|
||||
pop ax
|
||||
add [esp+1Ch], ecx
|
||||
sub [esp+18h], cx
|
||||
imul cx, si
|
||||
push cx
|
||||
call relative_read
|
||||
pop cx
|
||||
; move it to extended memory
|
||||
mov byte [sou_addr+2], 1
|
||||
.move_loop:
|
||||
push cx
|
||||
cmp cx, 80h
|
||||
jbe @f
|
||||
mov cx, 80h
|
||||
@@:
|
||||
mov ah, 87h
|
||||
xchg cl, ch
|
||||
mov si, movedesc
|
||||
push cx es
|
||||
push ds
|
||||
pop es
|
||||
int 15h
|
||||
pop es cx
|
||||
test ah, ah
|
||||
mov si, exmem_string
|
||||
jnz find_error_si
|
||||
add [dest_addr], ecx
|
||||
add [dest_addr], ecx
|
||||
inc byte [sou_addr+2]
|
||||
mov al, ch
|
||||
mov ah, cl
|
||||
pop cx
|
||||
sub cx, ax
|
||||
jnz .move_loop
|
||||
popad
|
||||
test cx, cx
|
||||
jnz .img_read_cluster
|
||||
jmp .img_read_block
|
||||
.img_read_done:
|
||||
; kolibri.img loaded; now load kernel.mnt
|
||||
load_kernel:
|
||||
push ds
|
||||
pop es
|
||||
mov [cur_obj], kernel_mnt_name
|
||||
; read boot sector
|
||||
xor eax, eax
|
||||
mov bx, 500h
|
||||
mov cx, 1
|
||||
call read_img
|
||||
; init vars
|
||||
mov ax, [50Eh] ; reserved_sect
|
||||
add ax, [51Ch] ; hidden
|
||||
mov word [fat_start], ax
|
||||
xchg ax, bx
|
||||
movzx ax, byte [510h] ; num_fats
|
||||
mul word [516h] ; fat_length
|
||||
add ax, bx
|
||||
; read root dir
|
||||
mov bx, 700h
|
||||
mov cx, [511h] ; dir_entries
|
||||
add cx, 0Fh
|
||||
shr cx, 4
|
||||
call read_img
|
||||
add ax, cx
|
||||
mov [img_data_start], ax
|
||||
shl cx, 9
|
||||
mov di, bx
|
||||
add bx, cx
|
||||
mov byte [bx], 0
|
||||
.scan_loop:
|
||||
cmp byte [di], 0
|
||||
mov si, notfound_string
|
||||
jz find_error_si
|
||||
mov si, kernel_mnt_name
|
||||
call fat_compare_name
|
||||
jz .found
|
||||
and di, not 1Fh
|
||||
add di, 20h
|
||||
jmp .scan_loop
|
||||
.found:
|
||||
and di, not 1Fh
|
||||
mov si, directory_string
|
||||
test byte [di+0Bh], 10h
|
||||
jnz find_error_si
|
||||
; found, now load it to 1000h:0000h
|
||||
mov ax, [di+1Ah]
|
||||
; first cluster of kernel.mnt in ax
|
||||
; translate it to sector on disk in kolibri.img
|
||||
push ax
|
||||
dec ax
|
||||
dec ax
|
||||
movzx cx, byte [50Dh]
|
||||
mul cx
|
||||
add ax, [img_data_start]
|
||||
; now ax is sector in kolibri.img
|
||||
mov [kernel_mnt_in_img], ax
|
||||
movzx cx, byte [7C0Dh]
|
||||
div cx
|
||||
; now ax is cluster in kolibri.img and
|
||||
; dx is offset from the beginning of cluster
|
||||
movzx eax, ax
|
||||
push 5000h
|
||||
pop ds
|
||||
xor si, si
|
||||
mov si, 1
|
||||
.scani:
|
||||
sub eax, [si]
|
||||
jb .scanidone
|
||||
; sanity check
|
||||
cmp dword [si], 0
|
||||
push data_error_msg
|
||||
jz find_error_sp
|
||||
pop cx
|
||||
; next chunk
|
||||
add si, 8
|
||||
jmp .scani
|
||||
.scanidone:
|
||||
add eax, [si] ; undo last subtract
|
||||
add eax, [si+4] ; get cluster
|
||||
push 0
|
||||
pop ds
|
||||
movzx ecx, byte [7C0Dh]
|
||||
push dx
|
||||
mul ecx ; get sector
|
||||
pop dx
|
||||
movzx edx, dx
|
||||
add eax, edx
|
||||
add eax, [7A04h]
|
||||
mov [kernel_mnt_1st], eax
|
||||
pop ax
|
||||
push 1000h
|
||||
pop es
|
||||
.read_loop:
|
||||
push ax
|
||||
xor bx, bx
|
||||
call img_read_cluster
|
||||
shl cx, 9-4
|
||||
mov ax, es
|
||||
add ax, cx
|
||||
mov es, ax
|
||||
pop ax
|
||||
call img_next_cluster
|
||||
jc .read_loop
|
||||
mov ax, 'KL'
|
||||
mov si, loader_block
|
||||
jmp 1000h:0000h
|
||||
|
||||
img_next_cluster:
|
||||
mov bx, 700h
|
||||
push ax
|
||||
shr ax, 1
|
||||
add ax, [esp]
|
||||
mov dx, ax
|
||||
shr ax, 9
|
||||
add ax, word [fat_start]
|
||||
mov cx, 2
|
||||
push es
|
||||
push ds
|
||||
pop es
|
||||
call read_img
|
||||
pop es
|
||||
and dx, 1FFh
|
||||
add bx, dx
|
||||
mov ax, [bx]
|
||||
pop cx
|
||||
test cx, 1
|
||||
jz .1
|
||||
shr ax, 4
|
||||
.1:
|
||||
and ax, 0FFFh
|
||||
mov si, bad_cluster_string
|
||||
cmp ax, 0FF7h
|
||||
jz find_error_si
|
||||
ret
|
||||
img_read_cluster:
|
||||
dec ax
|
||||
dec ax
|
||||
movzx cx, byte [50Dh] ; sects_per_clust
|
||||
mul cx
|
||||
add ax, [img_data_start]
|
||||
movzx eax, ax
|
||||
; call read_img
|
||||
; ret
|
||||
read_img:
|
||||
; in: ax = sector, es:bx->buffer, cx=length in sectors
|
||||
pushad
|
||||
movzx ebx, bx
|
||||
mov si, movedesc
|
||||
shl eax, 9
|
||||
add eax, 93100000h
|
||||
mov dword [si+sou_addr-movedesc], eax
|
||||
mov eax, 9300000h
|
||||
mov ax, es
|
||||
shl eax, 4
|
||||
add eax, ebx
|
||||
mov [si+dest_addr-movedesc], eax
|
||||
mov ah, 87h
|
||||
shl cx, 8 ; mul 200h/2
|
||||
push es
|
||||
push 0
|
||||
pop es
|
||||
int 15h
|
||||
pop es
|
||||
cmp ah, 0
|
||||
mov si, exmem_string
|
||||
jnz find_error_si
|
||||
popad
|
||||
ret
|
||||
|
||||
movedesc:
|
||||
times 16 db 0
|
||||
; source
|
||||
dw 0xFFFF ; segment length
|
||||
sou_addr dw 0000h ; linear address
|
||||
db 1 ; linear address
|
||||
db 93h ; access rights
|
||||
dw 0
|
||||
; destination
|
||||
dw 0xFFFF ; segment length
|
||||
dest_addr dd 93100000h ; high byte contains access rights
|
||||
; three low bytes contains linear address (updated when reading)
|
||||
dw 0
|
||||
times 32 db 0
|
||||
|
||||
find_error_si:
|
||||
push si
|
||||
find_error_sp:
|
||||
mov si, error_msg
|
||||
call out_string
|
||||
mov si, [cur_obj]
|
||||
call out_string
|
||||
mov si, colon
|
||||
call out_string
|
||||
pop si
|
||||
call out_string
|
||||
mov si, newline
|
||||
call out_string
|
||||
jmp $
|
||||
|
||||
file_not_found:
|
||||
mov si, [esp+2]
|
||||
mov [cur_obj], si
|
||||
push notfound_string
|
||||
jmp find_error_sp
|
||||
|
||||
restore_slash:
|
||||
mov si, [missing_slash]
|
||||
test si, si
|
||||
jz @f
|
||||
and [missing_slash], 0
|
||||
mov byte [si], '\'
|
||||
@@: ret
|
||||
|
||||
include 'fat32.inc'
|
||||
|
||||
if 0
|
||||
write1st:
|
||||
; callback from kernel.mnt
|
||||
; write first sector of kernel.mnt from 1000:0000 back to disk
|
||||
push cs
|
||||
pop ds
|
||||
push cs
|
||||
pop es
|
||||
; sanity check
|
||||
mov bx, 500h
|
||||
mov si, bx
|
||||
mov cx, 1
|
||||
push cx
|
||||
mov eax, [kernel_mnt_1st]
|
||||
push eax
|
||||
call relative_read
|
||||
push 1000h
|
||||
pop es
|
||||
xor di, di
|
||||
mov cx, 8
|
||||
repz cmpsw
|
||||
mov si, data_error_msg
|
||||
jnz find_error_si
|
||||
; ok, now write back to disk
|
||||
or byte [read.patch1+2], 1
|
||||
or byte [read.patch2+2], 1
|
||||
xor bx, bx
|
||||
pop eax
|
||||
pop cx
|
||||
call relative_read
|
||||
and byte [read.patch1+1], not 1
|
||||
and byte [read.patch2+2], not 2
|
||||
; and to image in memory (probably this may be done by kernel.mnt itself?)
|
||||
mov dword [sou_addr], 93010000h
|
||||
movzx eax, [kernel_mnt_in_img]
|
||||
shl eax, 9
|
||||
add eax, 93100000h
|
||||
mov dword [dest_addr], eax
|
||||
mov si, movedesc
|
||||
push ds
|
||||
pop es
|
||||
mov ah, 87h
|
||||
mov cx, 100h
|
||||
int 15h
|
||||
cmp ah, 0
|
||||
mov si, exmem_string
|
||||
jnz find_error_si
|
||||
retf
|
||||
else
|
||||
write1st = 0
|
||||
end if
|
||||
|
||||
loader_block:
|
||||
db 1 ; version
|
||||
dw 1 ; flags - image is loaded
|
||||
dw write1st ; offset
|
||||
dw 0 ; segment
|
||||
|
||||
imgnameofs dw kolibri_img_name
|
||||
|
||||
; -----------------------------------------------
|
||||
; ------------------ Settings -------------------
|
||||
; -----------------------------------------------
|
||||
|
||||
; must be in lowercase, see ntfs_parse_dir.scan, fat32_parse_dir.scan
|
||||
kernel_mnt_name db 'kernel.mnt',0
|
||||
kolibri_img_name db 'kolibri.img',0
|
||||
|
||||
missing_slash dw 0
|
||||
|
||||
start_msg db 2,' KolibriOS bootloader, FAT32 flash version'
|
||||
newline db 13,10,0
|
||||
error_msg db 'Error'
|
||||
colon db ': ',0
|
||||
root_string db '\',0
|
||||
nodata_string db '$DATA '
|
||||
notfound_string db 'not found',0
|
||||
directory_string db 'is a directory',0
|
||||
notdir_string db 'not a directory',0
|
||||
exmem_string db 'extended memory error',0
|
||||
bad_cluster_string db 'bad cluster',0
|
||||
data_error_msg db 'data error',0
|
||||
|
||||
align 2
|
||||
|
||||
; uninitialized data follows
|
||||
cur_obj dw ?
|
||||
img_data_start dw ?
|
||||
kernel_mnt_in_img dw ?
|
||||
fat_start dw ?
|
||||
kernel_mnt_1st dd ?
|
48
programs/hd_load/usb_boot/readme.txt
Normal file
48
programs/hd_load/usb_boot/readme.txt
Normal file
@@ -0,0 +1,48 @@
|
||||
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
||||
BOOT_F32.BIN - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> FAT32;
|
||||
MTLD_F32 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
||||
inst.exe - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WinNT+;
|
||||
setmbr.exe - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MBR (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>);
|
||||
readme.txt - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FAT32, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> kolibri.img <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
|
||||
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WinNT+:
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> inst.exe, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>. <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FAT32-<2D><><EFBFBD><EFBFBD><EFBFBD>) - <20><><EFBFBD><EFBFBD>.
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> kolibri.img <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. (<28><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.)
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
|
||||
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "Pen drive Without Operating System.Remove
|
||||
Pen Drive And Reboot." <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> setmbr.exe.
|
||||
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: inst.exe <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
||||
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FAT32;
|
||||
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> MTLD_F32, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>","<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>","<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" (<28><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>);
|
||||
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> BOOT_F32.BIN; <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3 <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0x5A (0x57 <20><><EFBFBD><EFBFBD>) <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
||||
- <20><>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
||||
<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 2 <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0x32) (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
||||
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>).
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> Linux <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> /dev/sdb1 (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FAT32-<2D><><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
||||
dd if=/dev/sdb1 of=BOOT_F32.BIN bs=1 skip=3 seek=3 count=87 conv=notrunc
|
||||
dd if=BOOT_F32.BIN of=/dev/sdb1 bs=512 count=1 conv=notrunc
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mtld_f32 <20> kolibri.img <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
BIN
programs/hd_load/usb_boot/rsrc.res
Normal file
BIN
programs/hd_load/usb_boot/rsrc.res
Normal file
Binary file not shown.
389
programs/hd_load/usb_boot/setmbr.asm
Normal file
389
programs/hd_load/usb_boot/setmbr.asm
Normal file
@@ -0,0 +1,389 @@
|
||||
format PE GUI 4.0
|
||||
section '.text' code readable executable
|
||||
entry start
|
||||
start:
|
||||
xor ebx, ebx
|
||||
push ebx ; lpParam
|
||||
push 400000h ; hInstance
|
||||
push ebx ; hMenu
|
||||
push ebx ; hWndParent
|
||||
push 100 ; nHeight
|
||||
push 200 ; nWidth
|
||||
mov eax, 80000000h
|
||||
push eax ; y
|
||||
push eax ; x
|
||||
push 10EF0140h ; dwStyle
|
||||
push WndName
|
||||
push ClassName
|
||||
push 388h ; dwExStyle
|
||||
call [CreateWindowExA]
|
||||
mov edi, eax
|
||||
push 0Ah ; OEM_FIXED_FONT
|
||||
call [GetStockObject]
|
||||
push ebx
|
||||
push eax
|
||||
push 30h ; WM_SETFONT
|
||||
push edi
|
||||
call [SendMessageA]
|
||||
call CollectDrivesInfo
|
||||
push MyWndProc
|
||||
push -4 ; GWL_WNDPROC
|
||||
push edi
|
||||
call [SetWindowLongA]
|
||||
mov [OldWndProc], eax
|
||||
sub esp, 20h
|
||||
mov esi, esp
|
||||
@@:
|
||||
push ebx
|
||||
push ebx
|
||||
push ebx
|
||||
push esi
|
||||
call [GetMessageA]
|
||||
test eax, eax
|
||||
jz @f
|
||||
push esi
|
||||
call [TranslateMessage]
|
||||
push esi
|
||||
call [DispatchMessageA]
|
||||
jmp @b
|
||||
@@:
|
||||
add esp, 20h
|
||||
ret
|
||||
|
||||
MyWndProc:
|
||||
push edi
|
||||
mov edi, [esp+8]
|
||||
cmp dword [esp+12], 2 ; WM_DESTROY
|
||||
jnz @f
|
||||
push 0
|
||||
call [PostQuitMessage]
|
||||
@@:
|
||||
cmp dword [esp+12], 219h ; WM_DEVICECHANGE
|
||||
jnz w
|
||||
cmp dword [esp+16], 8000h ; DBT_DEVICEARRIVAL
|
||||
jz @f
|
||||
cmp dword [esp+16], 8004h ; DBT_DEVICEREMOVECOMPLETE
|
||||
jnz w
|
||||
@@:
|
||||
call UpdateDrivesInfo
|
||||
w:
|
||||
cmp dword [esp+12], 203h ; WM_LBUTTONDBLCLK
|
||||
jnz @f
|
||||
push 0
|
||||
push 0
|
||||
push 188h ; LB_GETCURSEL
|
||||
push edi
|
||||
call [SendMessageA]
|
||||
cmp eax, -1
|
||||
jz @f
|
||||
push n+4
|
||||
push eax
|
||||
push 189h ; LB_GETTEXT
|
||||
push edi
|
||||
call [SendMessageA]
|
||||
mov dword [n], '\\.\'
|
||||
mov byte [n+4+aPhysicalDrive.sz], 0
|
||||
call install
|
||||
@@:
|
||||
pop edi
|
||||
pop eax
|
||||
push [OldWndProc]
|
||||
push eax
|
||||
jmp [CallWindowProcA]
|
||||
|
||||
UpdateDrivesInfo:
|
||||
push 0
|
||||
push 0
|
||||
push 184h ; LB_RESETCONTENT
|
||||
push edi
|
||||
call [SendMessageA]
|
||||
|
||||
CollectDrivesInfo:
|
||||
xor eax, eax
|
||||
mov ecx, 32
|
||||
push edi
|
||||
mov edi, PhysicalDrives
|
||||
rep stosd
|
||||
pop edi
|
||||
push esi
|
||||
call [GetLogicalDrives]
|
||||
mov esi, eax
|
||||
mov [a], 'A'
|
||||
l:
|
||||
shr esi, 1
|
||||
jnc d
|
||||
mov [a+2], 0
|
||||
push a
|
||||
call [GetDriveTypeA]
|
||||
; Uncomment following lines to allow hard drives
|
||||
; cmp eax, 3 ; DRIVE_FIXED
|
||||
; jz @f
|
||||
cmp eax, 2 ; DRIVE_REMOVABLE
|
||||
jnz d
|
||||
@@:
|
||||
push 0 ; hTemplateFile
|
||||
push 0 ; dwFlagsAndAttributes
|
||||
push 3 ; dwCreationDisposition = OPEN_EXISTING
|
||||
push 0 ; lpSecurityAttributes
|
||||
push 3 ; dwShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
|
||||
push 0 ; dwDesiredAccess
|
||||
push a2
|
||||
call [CreateFileA]
|
||||
cmp eax, -1
|
||||
jz d
|
||||
push eax
|
||||
push 0
|
||||
mov ecx, esp
|
||||
push 0 ; lpOverlapped
|
||||
push ecx ; lpBytesReturned
|
||||
push 12 ; nOutBufferSize
|
||||
push sdn ; lpOutBuffer
|
||||
push 0
|
||||
push 0
|
||||
push 2D1080h ; IOCTL_STORAGE_GET_DEVICE_NUMBER
|
||||
push eax
|
||||
call [DeviceIoControl]
|
||||
pop ecx
|
||||
pop edx
|
||||
push eax
|
||||
push edx
|
||||
call [CloseHandle]
|
||||
pop eax
|
||||
test eax, eax
|
||||
jz d ; probably it is floppy
|
||||
mov eax, [sdn+4]
|
||||
cmp eax, 32
|
||||
jae d
|
||||
movzx ecx, byte [a]
|
||||
sub cl, 'A'
|
||||
bts [PhysicalDrives+eax*4], ecx
|
||||
d:
|
||||
inc [a]
|
||||
test esi, esi
|
||||
jnz l
|
||||
xor esi, esi
|
||||
.physloop:
|
||||
push esi
|
||||
mov esi, [PhysicalDrives+esi*4]
|
||||
test esi, esi
|
||||
jz .physnext
|
||||
push edi esi
|
||||
mov esi, aPhysicalDrive
|
||||
mov edi, n
|
||||
@@:
|
||||
lodsb
|
||||
stosb
|
||||
test al, al
|
||||
jnz @b
|
||||
pop esi
|
||||
dec edi
|
||||
mov eax, [esp+4]
|
||||
cmp al, 10
|
||||
jb .1dig
|
||||
aam
|
||||
add ah, '0'
|
||||
mov byte [edi], ah
|
||||
inc edi
|
||||
.1dig:
|
||||
add al, '0'
|
||||
stosb
|
||||
mov al, ':'
|
||||
stosb
|
||||
mov cl, 'A'-1
|
||||
.logloop:
|
||||
mov al, ' '
|
||||
stosb
|
||||
mov al, cl
|
||||
stosb
|
||||
@@:
|
||||
inc byte [edi-1]
|
||||
shr esi, 1
|
||||
jnc @b
|
||||
mov cl, [edi-1]
|
||||
mov al, ':'
|
||||
stosb
|
||||
mov al, '\'
|
||||
stosb
|
||||
test esi, esi
|
||||
jnz .logloop
|
||||
mov al, 0
|
||||
stosb
|
||||
pop edi
|
||||
push n
|
||||
push 0
|
||||
push 180h ; LB_ADDSTRING
|
||||
push edi
|
||||
call [SendMessageA]
|
||||
.physnext:
|
||||
pop esi
|
||||
inc esi
|
||||
cmp esi, 32
|
||||
jb .physloop
|
||||
pop esi
|
||||
ret
|
||||
|
||||
install:
|
||||
push 0 ; hTemplateFile
|
||||
push 0 ; dwFlagsAndAttributes
|
||||
push 3 ; dwCreationDisposition = OPEN_EXISTING
|
||||
push 0 ; lpSecurityAttributes
|
||||
push 3 ; dwShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
|
||||
push 0C0000000h ; dwDesiredAccess = GENERIC_READ|GENERIC_WRITE
|
||||
push n
|
||||
call [CreateFileA]
|
||||
cmp eax, -1
|
||||
jnz @f
|
||||
deverre:
|
||||
push 10h
|
||||
push 0
|
||||
push deverr
|
||||
push edi
|
||||
call [MessageBoxA]
|
||||
ret
|
||||
@@:
|
||||
push esi
|
||||
mov esi, eax
|
||||
push eax
|
||||
mov eax, esp
|
||||
push 0
|
||||
push eax
|
||||
push 512
|
||||
push mbr_dev
|
||||
push esi
|
||||
call [ReadFile]
|
||||
test eax, eax
|
||||
jnz @f
|
||||
deverrl:
|
||||
push esi
|
||||
call [CloseHandle]
|
||||
pop eax
|
||||
pop esi
|
||||
jmp deverre
|
||||
@@:
|
||||
push esi edi
|
||||
mov esi, mbr_new
|
||||
mov edi, mbr_dev
|
||||
mov ecx, 1B8h
|
||||
rep movsb
|
||||
mov al, [edi+6]
|
||||
or al, [edi+16h]
|
||||
or al, [edi+26h]
|
||||
or al, [edi+36h]
|
||||
test al, al
|
||||
js @f
|
||||
or byte [edi+6], 80h
|
||||
@@:
|
||||
pop edi esi
|
||||
push 0
|
||||
push 0
|
||||
push 0
|
||||
push esi
|
||||
call [SetFilePointer]
|
||||
test eax, eax
|
||||
jnz deverrl
|
||||
mov eax, esp
|
||||
push 0
|
||||
push eax
|
||||
push 512
|
||||
push mbr_dev
|
||||
push esi
|
||||
call [WriteFile]
|
||||
test eax, eax
|
||||
jz deverrl
|
||||
cmp dword [esp], 512
|
||||
jnz deverrl
|
||||
; done!
|
||||
done_succ:
|
||||
push 40h
|
||||
push ok
|
||||
push succ
|
||||
push edi
|
||||
call [MessageBoxA]
|
||||
push 0
|
||||
call [PostQuitMessage]
|
||||
r:
|
||||
pop eax
|
||||
push esi
|
||||
call [CloseHandle]
|
||||
pop esi
|
||||
ret
|
||||
|
||||
section '.data' data readable writable
|
||||
data resource from 'rsrc.res'
|
||||
end data
|
||||
|
||||
ClassName db 'LISTBOX',0
|
||||
WndName db 'Select drive',0
|
||||
deverr db 'Cannot open physical device or device error (no administrator rights?)',0
|
||||
ok db 'Success',0
|
||||
succ db 'Standard MBR has been installed',0
|
||||
a2 db '\\.\'
|
||||
a db '?:',0,0
|
||||
aPhysicalDrive db 'PhysicalDrive',0
|
||||
.sz = $ - aPhysicalDrive
|
||||
|
||||
data import
|
||||
macro thunk a
|
||||
{a#_thunk:dw 0
|
||||
db `a,0}
|
||||
dd 0,0,0, rva kernel32_name, rva kernel32_thunks
|
||||
dd 0,0,0, rva user32_name, rva user32_thunks
|
||||
dd 0,0,0, rva gdi32_name, rva gdi32_thunks
|
||||
dd 0,0,0,0,0
|
||||
kernel32_name db 'kernel32.dll',0
|
||||
user32_name db 'user32.dll',0
|
||||
gdi32_name db 'gdi32.dll',0
|
||||
kernel32_thunks:
|
||||
GetLogicalDrives dd rva GetLogicalDrives_thunk
|
||||
GetDriveTypeA dd rva GetDriveTypeA_thunk
|
||||
CreateFileA dd rva CreateFileA_thunk
|
||||
ReadFile dd rva ReadFile_thunk
|
||||
WriteFile dd rva WriteFile_thunk
|
||||
SetFilePointer dd rva SetFilePointer_thunk
|
||||
CloseHandle dd rva CloseHandle_thunk
|
||||
DeviceIoControl dd rva DeviceIoControl_thunk
|
||||
dw 0
|
||||
thunk GetLogicalDrives
|
||||
thunk GetDriveTypeA
|
||||
thunk CreateFileA
|
||||
thunk ReadFile
|
||||
thunk WriteFile
|
||||
thunk SetFilePointer
|
||||
thunk CloseHandle
|
||||
thunk DeviceIoControl
|
||||
user32_thunks:
|
||||
CreateWindowExA dd rva CreateWindowExA_thunk
|
||||
GetMessageA dd rva GetMessageA_thunk
|
||||
TranslateMessage dd rva TranslateMessage_thunk
|
||||
DispatchMessageA dd rva DispatchMessageA_thunk
|
||||
PostQuitMessage dd rva PostQuitMessage_thunk
|
||||
CallWindowProcA dd rva CallWindowProcA_thunk
|
||||
SetWindowLongA dd rva SetWindowLongA_thunk
|
||||
SendMessageA dd rva SendMessageA_thunk
|
||||
MessageBoxA dd rva MessageBoxA_thunk
|
||||
dw 0
|
||||
thunk CreateWindowExA
|
||||
thunk GetMessageA
|
||||
thunk TranslateMessage
|
||||
thunk DispatchMessageA
|
||||
thunk PostQuitMessage
|
||||
thunk CallWindowProcA
|
||||
thunk SetWindowLongA
|
||||
thunk SendMessageA
|
||||
thunk MessageBoxA
|
||||
gdi32_thunks:
|
||||
GetStockObject dd rva GetStockObject_thunk
|
||||
dw 0
|
||||
thunk GetStockObject
|
||||
end data
|
||||
|
||||
align 4
|
||||
mbr_new:
|
||||
file 'mbr'
|
||||
|
||||
align 4
|
||||
OldWndProc dd ?
|
||||
PhysicalDrives rd 32
|
||||
sdn rd 3
|
||||
n rb 1024
|
||||
mbr_dev rb 512
|
449
programs/hd_load/usb_boot_old/MeOSload.asm
Normal file
449
programs/hd_load/usb_boot_old/MeOSload.asm
Normal file
@@ -0,0 +1,449 @@
|
||||
;
|
||||
; MenuesOS Boot Loader
|
||||
;
|
||||
; Author: Trans
|
||||
; Date: 14.02.03
|
||||
; Version: 1.0
|
||||
;
|
||||
; Current Version: 1.1
|
||||
; Date of modification: 11.06.03
|
||||
;
|
||||
; Compile with FASM
|
||||
;
|
||||
|
||||
;--------Code------------
|
||||
org 100h
|
||||
|
||||
start:
|
||||
push cs
|
||||
pop ds
|
||||
mov ax,0003h
|
||||
int 10h
|
||||
|
||||
mov dx,title
|
||||
call print
|
||||
mov dx,title_1
|
||||
call print
|
||||
; mov dx,mes1
|
||||
; call print
|
||||
|
||||
;-------open Msetup.exe--------------
|
||||
mov dx,img0
|
||||
call file_open
|
||||
cmp ax,00h
|
||||
je loader_next_file_search_0
|
||||
mov [handle],ax
|
||||
mov [foffset],dword 00h
|
||||
jmp loader_continue
|
||||
loader_next_file_search_0:
|
||||
mov dx,img1
|
||||
call file_open
|
||||
cmp ax,00h
|
||||
je loader_next_file_search_00
|
||||
mov [handle],ax
|
||||
jmp loader_continue
|
||||
loader_next_file_search_00:
|
||||
mov dx,img2
|
||||
call file_open
|
||||
cmp ax,00h
|
||||
je loader_next_file_search_01
|
||||
mov [handle],ax
|
||||
mov [foffset],dword 00h
|
||||
jmp loader_continue
|
||||
loader_next_file_search_01:
|
||||
mov dx,img3
|
||||
call file_open
|
||||
cmp ax,00h
|
||||
je loader_not_find_file
|
||||
mov [handle],ax
|
||||
mov [foffset],dword 00h
|
||||
loader_continue:
|
||||
|
||||
;******* Load IMAGE in memory***************************************************
|
||||
mov dx,start_img_read
|
||||
call print
|
||||
|
||||
mov bx,ax
|
||||
xor cx,cx ; cx:dx - offset in bytes (cx*65535+dx)
|
||||
xor edx,edx
|
||||
call file_offset
|
||||
mov [image_counter],0
|
||||
@@_1:
|
||||
mov bx,[handle]
|
||||
mov dx,buffer ;ds:dx - buffer
|
||||
mov cx,512*96
|
||||
call file_read
|
||||
|
||||
push fs
|
||||
xor ax,ax ;AX = 0
|
||||
mov fs,ax ;DS = AX = 0 ..<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!
|
||||
mov ecx,512*96
|
||||
mov si,buffer
|
||||
movzx edi,[image_counter]
|
||||
imul edi,48*1024
|
||||
add edi,0x100000
|
||||
@@:
|
||||
mov al,[si]
|
||||
mov [fs:edi],al
|
||||
inc edi
|
||||
inc esi
|
||||
loop @b
|
||||
pop fs
|
||||
|
||||
mov dx,progress_img_read
|
||||
call print
|
||||
|
||||
inc [image_counter]
|
||||
mov bx,[handle] ;ax
|
||||
movzx edx,[image_counter]
|
||||
imul edx,48*1024
|
||||
mov ecx,edx
|
||||
shr ecx,16
|
||||
call file_offset
|
||||
cmp [image_counter],30
|
||||
jne @@_1
|
||||
|
||||
mov dx,end_img_read
|
||||
call print
|
||||
|
||||
mov dx,start_kernel_read
|
||||
call print
|
||||
;*******************************************************************************
|
||||
;-------Move pointer to boot-sector--
|
||||
mov bx,[handle] ;ax
|
||||
xor cx,cx
|
||||
mov edx,[foffset]
|
||||
call file_offset
|
||||
|
||||
;---------Read boot-sector-----------
|
||||
mov bx,[handle]
|
||||
mov dx,buffer
|
||||
mov cx,512
|
||||
call file_read
|
||||
|
||||
;--------Read parametrs--------------
|
||||
mov ax,[buffer+0bh]
|
||||
mov [SectSize],ax
|
||||
mov al,[buffer+0dh]
|
||||
mov [ClustSect],al
|
||||
mov ax,[buffer+0eh]
|
||||
mov [ResSect],ax
|
||||
add ax,[ResRgn]
|
||||
mov [FATRgn],ax
|
||||
mov al,[buffer+10h]
|
||||
mov [FATCnt],al
|
||||
xor bx,bx
|
||||
mov bl,al
|
||||
mov ax,[buffer+11h]
|
||||
mov [RootEnt],ax
|
||||
shr ax,4 ; ax=ax*32/512
|
||||
mov [RootDirRgnSz],ax
|
||||
mov ax,[buffer+16h]
|
||||
mov [FATSect],ax
|
||||
mul bx
|
||||
mov [FATRgnSz],ax
|
||||
add ax,[FATRgn]
|
||||
mov [RootDirRgn],ax
|
||||
add ax,[RootDirRgnSz]
|
||||
mov [DataRgn],ax
|
||||
|
||||
;------Read FATs and RootDir---------
|
||||
xor eax,eax
|
||||
xor edx,edx
|
||||
mov ax,[FATRgn]
|
||||
mul [SectSize]
|
||||
add eax,[foffset]
|
||||
mov cx,dx
|
||||
mov dx,ax
|
||||
mov bx,[handle]
|
||||
call file_offset
|
||||
mov ax,[FATRgnSz]
|
||||
mul [SectSize]
|
||||
mov cx,ax
|
||||
mov dx,buffer
|
||||
mov bx,[handle]
|
||||
call file_read
|
||||
mov cx,[RootEnt]
|
||||
shl cx,5
|
||||
mov dx,Root
|
||||
mov bx,[handle]
|
||||
call file_read
|
||||
|
||||
;-------Search entry pointer in RootDir---------
|
||||
push ds
|
||||
pop es
|
||||
mov cx,[RootEnt]
|
||||
mov bx,Root
|
||||
loader_loc_00:
|
||||
push cx
|
||||
mov cx,11
|
||||
mov di,bx
|
||||
mov si,kernel
|
||||
repe cmpsb
|
||||
jnz loader_notfound
|
||||
pop cx
|
||||
jmp loader_find
|
||||
loader_notfound:
|
||||
pop cx
|
||||
add bx,32
|
||||
loop loader_loc_00
|
||||
loader_find:
|
||||
|
||||
mov ax,[bx+1ah]
|
||||
mov [FirstClust],ax
|
||||
mov eax,[bx+1ch]
|
||||
mov [filesize],eax
|
||||
|
||||
;------Read Kernel----------------------
|
||||
call read_kernel
|
||||
|
||||
;---------------------------------------
|
||||
|
||||
mov bx,[handle]
|
||||
call file_close
|
||||
;;;;;;;;;;;;;;;;;;;;;;
|
||||
jmp loader_yes
|
||||
;;;;;;;;;;;;;;;;;;;;;;
|
||||
; mov dx,mes2
|
||||
; call print
|
||||
;loader_key:
|
||||
; mov ah,00h
|
||||
; int 16h
|
||||
; cmp al,1bh ;ESC
|
||||
; je loader_no
|
||||
; cmp al,6eh ;'n'
|
||||
; je loader_no
|
||||
; cmp al,4eh ;'N'
|
||||
; je loader_no
|
||||
; cmp al,79h ;'y'
|
||||
; je loader_yes
|
||||
; cmp al,59h ;'Y'
|
||||
; je loader_yes
|
||||
; jmp loader_key
|
||||
|
||||
loader_not_find_file:
|
||||
mov dx,mes4
|
||||
call print
|
||||
jmp loader_exit
|
||||
|
||||
loader_yes:
|
||||
mov dx,yes
|
||||
call print
|
||||
mov ax,7000h
|
||||
mov es,ax
|
||||
mov si,move_kernel
|
||||
xor di,di
|
||||
mov cx,len_mk
|
||||
rep movsb
|
||||
jmp far 7000h:0000h
|
||||
; jmp loader_exit
|
||||
loader_no:
|
||||
mov dx,no
|
||||
call print
|
||||
|
||||
loader_exit:
|
||||
mov dx,mes3
|
||||
call print
|
||||
retn
|
||||
;----Subprogramms--------
|
||||
|
||||
print:
|
||||
; in: dx - offset of ASCII string
|
||||
; out:
|
||||
mov ah,09h
|
||||
int 21h
|
||||
retn
|
||||
|
||||
file_open:
|
||||
; in: ds:dx - offset of ASCIIZ filename string
|
||||
; out: ax - file handle (ax=0 - not found)
|
||||
mov ax,3d00h
|
||||
int 21h
|
||||
jnc fo_exit
|
||||
xor ax,ax
|
||||
fo_exit:
|
||||
retn
|
||||
|
||||
file_close:
|
||||
; in: bx - file handle
|
||||
; out:
|
||||
mov ah,3eh
|
||||
int 21h
|
||||
retn
|
||||
|
||||
file_read:
|
||||
; in: bx - file handle
|
||||
; ds:dx - buffer
|
||||
; cx - numbers of bytes
|
||||
; out:
|
||||
mov ah,3fh
|
||||
int 21h
|
||||
retn
|
||||
|
||||
file_offset:
|
||||
; in: bx - file handle
|
||||
; cx:dx - offset in bytes (cx*65535+dx)
|
||||
; out:
|
||||
mov ax,4200h
|
||||
int 21h
|
||||
retn
|
||||
|
||||
sector_find:
|
||||
; in: ax - No of Cluster
|
||||
; out: ax - 1st sector of Cluster
|
||||
dec ax
|
||||
dec ax
|
||||
push bx
|
||||
xor bx,bx
|
||||
mov bl,[ClustSect]
|
||||
mul bx
|
||||
pop bx
|
||||
add ax,[DataRgn]
|
||||
retn
|
||||
|
||||
read_cluster:
|
||||
; in: ax - No of Cluster
|
||||
; ds:dx - buffer
|
||||
; out:
|
||||
push dx
|
||||
call sector_find
|
||||
push ax
|
||||
xor eax,eax
|
||||
xor ebx,ebx
|
||||
pop ax
|
||||
mov bx,[SectSize]
|
||||
mul ebx
|
||||
add eax,[foffset]
|
||||
mov dx,ax
|
||||
shr eax,16
|
||||
mov cx,ax
|
||||
mov bx,[handle]
|
||||
call file_offset
|
||||
xor ax,ax
|
||||
mov al,[ClustSect]
|
||||
mul [SectSize]
|
||||
mov cx,ax
|
||||
mov bx,[handle]
|
||||
pop dx
|
||||
call file_read
|
||||
retn
|
||||
|
||||
read_kernel:
|
||||
; in:
|
||||
; out:
|
||||
mov ax,8000h
|
||||
mov es,ax ;8000:0000 = 80000h - Temporal location of kernel
|
||||
xor di,di ;
|
||||
mov ax,[FirstClust]
|
||||
mov bp,ax
|
||||
rk_loc_00:
|
||||
push es
|
||||
mov dx,Root
|
||||
call read_cluster
|
||||
xor ax,ax ; Moving cluster to area of location kernel
|
||||
mov al,[ClustSect] ;
|
||||
mul [SectSize] ;
|
||||
mov cx,ax ;
|
||||
pop es ;
|
||||
mov si,Root ;
|
||||
rep movsb ;
|
||||
cmp di,00h
|
||||
jne rk_continue
|
||||
mov ax,es
|
||||
add ax,1000h
|
||||
mov es,ax
|
||||
rk_continue:
|
||||
mov ax,bp
|
||||
cmp ax,0ff8h
|
||||
jae rk_done
|
||||
shl ax,1 ; Val=Clustrer*1,5 //(Cluster*3)/2
|
||||
add ax,bp ;
|
||||
shr ax,1 ;
|
||||
mov bx,ax
|
||||
add bx,buffer
|
||||
mov ax,[bx]
|
||||
bt bp,0
|
||||
jc rk_nechet
|
||||
and ax,0fffh
|
||||
jmp rk_chet
|
||||
rk_nechet:
|
||||
shr ax,4
|
||||
rk_chet:
|
||||
mov bp,ax
|
||||
jmp rk_loc_00
|
||||
rk_done:
|
||||
retn
|
||||
|
||||
move_kernel:
|
||||
; in:
|
||||
; out:
|
||||
mov ax,8000h
|
||||
mov ds,ax
|
||||
mov ax,1000h
|
||||
mov es,ax
|
||||
xor si,si
|
||||
xor di,di
|
||||
mov cx,8000h
|
||||
rep movsb
|
||||
mov cx,8000h
|
||||
rep movsb
|
||||
mov bx,es
|
||||
add bx,1000h
|
||||
mov es,bx
|
||||
mov bx,ds
|
||||
add bx,1000h
|
||||
mov ds,bx
|
||||
mov cx,8000h
|
||||
rep movsb
|
||||
mov cx,8000h
|
||||
rep movsb
|
||||
mov ax,1000h
|
||||
mov ds,ax
|
||||
mov es,ax
|
||||
jmp far 1000h:0000h
|
||||
retn
|
||||
len_mk=$-move_kernel
|
||||
|
||||
;--------Data------------
|
||||
title db 'KolibriOS\MenuetOS Boot Loader. Ver.1.2 Copyright(C) 2003, Trans.',0ah,0dh,0ah,0dh,'$'
|
||||
title_1 db 'Addition 2005-2006 by Mario79 - for boot Flash RAM.',0ah,0dh,0ah,0dh,'$'
|
||||
;mes1 db 'It is alternative of boot from floppy.',0ah,0dh
|
||||
; db 'You MUST select HD booting !!!',0ah,0dh,0ah,0dh,'$'
|
||||
;mes2 db 'Are you sure loading MeOS? (Y/N):','$'
|
||||
start_img_read db 'Read IMG file: ','$'
|
||||
progress_img_read db '#','$'
|
||||
end_img_read db 0ah,0dh,0ah,0dh,'$'
|
||||
start_kernel_read db 'Start kernel read ','$'
|
||||
yes db 'Y','$'
|
||||
no db 'N','$'
|
||||
mes3 db 0ah,0dh,0ah,0dh,'See you later ...',0ah,0dh,'$'
|
||||
mes4 db 0ah,0dh,0ah,0dh,'Not Found: '
|
||||
img0 db 'kolibri\kolibri.img',0,', '
|
||||
img1 db 'msetup.exe',0,', '
|
||||
img2 db 'menuet.img',0,', '
|
||||
img3 db 'kolibri.img',0,' :($'
|
||||
image_counter db 0
|
||||
kernel db 'KERNEL MNT',0
|
||||
handle dw ?
|
||||
foffset dd 20480
|
||||
SectSize dw ? ; +0bh
|
||||
ClustSect db ? ; +0dh
|
||||
ResSect dw ? ; +0eh
|
||||
FATCnt db ? ; +10h
|
||||
RootEnt dw ? ; +11h
|
||||
FATSect dw ? ; +16h
|
||||
filesize dd ? ; +1ch
|
||||
FirstClust dw ? ; +1ah
|
||||
|
||||
ResRgn dw 0 ; = VolumeStart
|
||||
FATRgn dw ? ; = ResRgn+ResSect
|
||||
RootDirRgn dw ? ; = FATRgn+(FATCnt*FATSect)
|
||||
DataRgn dw ? ; = RootDirRgn+((RootEnt*32)/SectSize)
|
||||
ResRgnSz dw ? ; = ResSect
|
||||
FATRgnSz dw ? ; = FATCnt*FATSect
|
||||
RootDirRgnSz dw ? ; = (RootEnt*32)/SectSize
|
||||
;First sector of cluster N = DataRgn+((N-2)*ClustSect)
|
||||
buffer:
|
||||
org 3000h
|
||||
Root:
|
||||
|
74
programs/hd_load/usb_boot_old/enable.asm
Normal file
74
programs/hd_load/usb_boot_old/enable.asm
Normal file
@@ -0,0 +1,74 @@
|
||||
format MZ
|
||||
heap 0
|
||||
stack 800h
|
||||
entry main:start
|
||||
|
||||
segment main use16
|
||||
|
||||
use16
|
||||
start:
|
||||
|
||||
mov ax,_data
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
|
||||
xor eax, eax
|
||||
mov ax,ds
|
||||
|
||||
shl eax, 4
|
||||
|
||||
mov bx, gdt
|
||||
add ebx, eax ; ebx - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> gdt
|
||||
|
||||
mov word [gdtPtr], 2 * 8 -1 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> gdt 2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = 0x000f
|
||||
mov dword [gdtPtr + 2], ebx
|
||||
|
||||
lgdt pword [gdtPtr]
|
||||
|
||||
in al, 0x70 ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NMI
|
||||
mov bl, al
|
||||
or al, 0x80
|
||||
out 70h , al
|
||||
in al, 0x71 ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RTC <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> 0<>70
|
||||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> 0x71
|
||||
|
||||
cli
|
||||
|
||||
mov eax, cr0
|
||||
or al, 01b
|
||||
mov cr0, eax
|
||||
|
||||
mov dx, 0x08
|
||||
mov gs, dx ;gs - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> 0 <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0xFFFFFFFF
|
||||
mov fs, dx
|
||||
|
||||
and al, 0xFE
|
||||
mov cr0, eax
|
||||
|
||||
sti
|
||||
|
||||
mov al, bl
|
||||
out 70h , al
|
||||
in al, 71h
|
||||
|
||||
mov dx,92h
|
||||
in al,dx
|
||||
or al,2
|
||||
out dx,al
|
||||
|
||||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
;mov eax, [gs:0xFFFFFFF0] ;
|
||||
|
||||
mov ah,4ch ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int 21h
|
||||
|
||||
segment _data use16
|
||||
|
||||
align 16
|
||||
|
||||
gdt dw 0, 0, 0, 0 ;0
|
||||
_flat dw 0ffffh,0,0F200h,008fh ;08 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DPL = 3
|
||||
;<3B><><EFBFBD><EFBFBD> 0, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0xFFFFFFFF
|
||||
|
||||
gdtPtr dq ?
|
61
programs/hd_load/usb_boot_old/usb_boot.rtf
Normal file
61
programs/hd_load/usb_boot_old/usb_boot.rtf
Normal file
@@ -0,0 +1,61 @@
|
||||
{\rtf1\ansi\ansicpg1251\deff0\deflang1049\deflangfe1049\deftab708{\fonttbl {\f0\froman\fprq2\fcharset204{\*\fname Times New Roman;}Times New Roman CYR;}}
|
||||
{\colortbl ;\red0\green0\blue255;\red0\green128\blue0;\red255\green0\blue0;}
|
||||
\uc1\pard\ulnone\b\f0\'c0\'e2\'f2\'ee\'f0: Mario79 \par
|
||||
xx.01.2006 - \'ed\'e0\'e1\'ee\'f0 \'f1\'f2\'e0\'f2\'fc\'e8 \par
|
||||
20.03.2006 - \'ef\'f3\'e1\'eb\'e8\'ea\'e0\'f6\'e8\'ff \'f1\'f2\'e0\'f2\'fc\'e8 \par
|
||||
23.03.2006 - \'e8\'f1\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'e5 \'e8 \'e4\'ee\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f1\'f2\'e0\'f2\'fc\'e8\par
|
||||
26.02.2007 - \'ef\'e5\'f0\'e5\'f0\'e0\'e1\'ee\'f2\'e0\'ed\'ee \'e8 \'e4\'ee\'ef\'ee\'eb\'ed\'e5\'ed\'ee \'e2 \'f1\'e2\'ff\'e7\'e8 \'f1 \'e8\'e7\'ec\'e5\'ed\'e8\'e2\'f8\'e8\'ec\'e8\'f1\'ff \'f0\'e5\'e0\'eb\'e8\'ff\'ec\'e8\par
|
||||
\b0\par
|
||||
\pard\qc\b\'c7\'e0\'e3\'f0\'f3\'e7\'ea\'e0 \cf1\'ce\'d1 \'ca\'ee\'eb\'e8\'e1\'f0\'e8\cf0 \'f1 \cf2 USB Flash Drive\cf0\par
|
||||
\pard\b0\'cd\'e0 \'f1\'e5\'e3\'ee\'e4\'ed\'ff\'f8\'ed\'e8\'e9 \'e4\'e5\'ed\'fc \cf1\b\'ce\'d1 \'ca\'ee\'eb\'e8\'e1\'f0\'e8\cf0\b0 \'ed\'e5 \'e8\'ec\'e5\'e5\'f2 \'ef\'ee\'e4\'e4\'e5\'f0\'e6\'ea\'e8 \cf2\lang1033\b USB\cf0\lang1049\b0 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2 \'ed\'e0 \'f3\'f0\'ee\'e2\'ed\'e5 \'f1\'e0\'ec\'ee\'e9 \'f1\'e8\'f1\'f2\'e5\'ec\'fb, \'ef\'ee \'fd\'f2\'ee\'e9 \'ef\'f0\'e8\'f7\'e8\'ed\'e5 \'e4\'eb\'ff \'e7\'e0\'ef\'f3\'f1\'ea\'e0 \'f1 \cf2\lang1033\b USB\lang1049 \lang1033 Flash\cf0\lang1049\b0 \'ed\'e0\'ea\'ee\'ef\'e8\'f2\'e5\'eb\'e5\'e9 \'ef\'f0\'e8\'f5\'ee\'e4\'e8\'f2\'f1\'ff \'e8\'e4\'f2\'e8 \'ed\'e0 \'ee\'ef\'f0\'e5\'e4\'e5\'eb\'e5\'ed\'ed\'fb\'e5 \'f5\'e8\'f2\'f0\'ee\'f1\'f2\'e8.\par
|
||||
\'d1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'e5\'f2 2 \'e8\'e7\'e2\'e5\'f1\'f2\'ed\'fb\'f5 \'f1\'ef\'ee\'f1\'ee\'e1\'e0 \'e7\'e0\'ef\'f3\'f1\'f2\'e8\'f2\'fc \cf1\b\'ce\'d1 \'ca\'ee\'eb\'e8\'e1\'f0\'e8\cf0\b0 \'f1 \'ab\'f4\'eb\'e5\'f8\'ea\'e8\'bb.\par
|
||||
\par
|
||||
\b 1)\b0 \'dd\'ec\'f3\'eb\'ff\'f6\'e8\'ff \'f4\'eb\'ee\'ef\'ef\'e8 \'e4\'e8\'f1\'ea\'e0 \'e2 \lang1033\b BIOS\lang1049\b0 .\par
|
||||
\'cc\'e5\'f2\'ee\'e4 \'ef\'f0\'ee\'f1\'f2 \'e4\'ee \'f2\'f3\'ef\'ee\'f1\'f2\'e8 \'ed\'e0 \'ab\'f4\'eb\'e5\'f8\'ea\'f3\'bb \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0\'e5\'f2\'f1\'ff \lang1033\b IMG\lang1049\b0 \'ee\'e1\'f0\'e0\'e7, \'f1 \'ef\'ee\'eb\'ed\'ee\'e9 \'fd\'ec\'f3\'eb\'ff\'f6\'e8\'e5\'e9, \'f2\'ee \'e5\'f1\'f2\'fc 0 \'f1\'e5\'ea\'f2\'ee\'f0 \lang1033\b IMG\lang1049\b0 \'ee\'e1\'f0\'e0\'e7\'e0 \'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'f1\'ff 0 \'f1\'e5\'ea\'f2\'ee\'f0\'ee\'ec \'ab\'f4\'eb\'e5\'f8\'ea\'e8\'bb, \'e8 \'f2\'e0\'ea \'e4\'e0\'eb\'e5\'e5 \'ef\'ee\'ea\'e0 \'e2\'f1\'e5 \'f1\'e5\'ea\'f2\'ee\'f0\'e0 \'ee\'e1\'f0\'e0\'e7\'e0 \'ed\'e5 \'e1\'f3\'e4\'f3\'f2 \'f1\'ea\'ee\'ef\'e8\'f0\'ee\'e2\'e0\'ed\'fb \'ed\'e0 \'ed\'e0\'ea\'ee\'ef\'e8\'f2\'e5\'eb\'fc. \'c8\'e7 \'ed\'e5\'e4\'ee\'f1\'f2\'e0\'f2\'ea\'ee\'e2 \'fd\'f2\'ee\'e3\'ee \'f1\'ef\'ee\'f1\'ee\'e1\'e0 \'f1\'f0\'e0\'e7\'f3 \'ec\'ee\'e6\'ed\'ee \'e7\'e0\'ec\'e5\'f2\'e8\'f2\'fc \'ef\'ee\'f2\'e5\'f0\'fe \'f0\'e0\'e1\'ee\'f7\'e5\'e3\'ee \'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'f1\'f2\'e2\'e0 \'e2\'fb\'f8\'e5 \b 1,44 \'cc\'e1.\b0 \'ce\'f1\'ee\'e1\'e5\'ed\'ed\'ee \'ee\'e1\'e8\'e4\'ed\'fb\'ec \'fd\'f2\'ee \'ff\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'e4\'eb\'ff \'ed\'e0\'ea\'ee\'ef\'e8\'f2\'e5\'eb\'e5\'e9, \'e5\'ec\'ea\'ee\'f1\'f2\'fc \'ea\'ee\'f2\'ee\'f0\'fb\'f5 \'ed\'e0\'ec\'ed\'ee\'e3\'ee \'ef\'f0\'e5\'e2\'fb\'f8\'e0\'e5\'f2 \'fd\'f2\'ee\'f2 \'f0\'e0\'e7\'ec\'e5\'f0.\par
|
||||
\'ca\'e0\'ea \'ef\'f0\'ee\'e8\'e7\'e2\'ee\'e4\'e8\'f2\'f1\'ff \'f2\'e0\'ea\'e0\'ff \'ab\'f3\'f1\'f2\'e0\'ed\'ee\'e2\'ea\'e0\'bb \'f1\'e8\'f1\'f2\'e5\'ec\'fb \'e2 \'f0\'e0\'e7\'ed\'fb\'f5 \'ee\'f1:\par
|
||||
\b\'e0)\b0 \cf2\b\'ce\'d1 \lang1033 Linux\lang1049 \cf0\b0\'ee\'ef\'e8\'f1\'e0\'ed\'e8\'e5 \'ec\'ee\'e6\'ed\'ee \'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc, \'e2\'e2\'e5\'e4\'ff \'e2 \'ea\'ee\'ed\'f1\'ee\'eb\'e8 \'ea\'ee\'ec\'e0\'ed\'e4\'f3 \b man dd\par
|
||||
\'e1)\b0 \cf2\b\'ce\'d1 \lang1033 Windows\lang1049\b0 \cf0\'e7\'e0\'ef\'e8\'f1\'fc \'ec\'ee\'e6\'ed\'ee \'ef\'f0\'ee\'e8\'e7\'e2\'e5\'f1\'f2\'e8 \'f1 \'ef\'ee\'ec\'ee\'f9\'fc\'fe \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb \cf1\b WinHex\b0 \cf0 (\'e8\'eb\'e8 \'e0\'ed\'e0\'eb\'ee\'e3\'e8\'f7\'ed\'ee\'e9), \'ea\'ee\'ef\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5\'ec \b 2880\b0 \'f1\'e5\'ea\'f2\'ee\'f0\'ee\'e2 \'f1 \'e4\'e8\'f1\'ea\'e0 \b A\b0 (floppy disk) \'ed\'e0 \'e4\'e8\'f1\'ea, \'ea\'ee\'f2\'ee\'f0\'fb\'e9 \'ff\'e2\'eb\'ff\'e5\'f2\'f1\'ff \cf2\b Flash\cf0\b0 \'ed\'e0\'ea\'ee\'ef\'e8\'f2\'e5\'eb\'e5\'ec, \'ed\'e0\'f7\'e8\'ed\'e0\'ff \'f1 \b 0\b0 \'f1\'e5\'ea\'f2\'ee\'f0\'e0.\par
|
||||
\b\'e2)\b0 \cf2\lang1033\b DOS\cf0\lang1049\b0 \'ec\'ee\'e6\'ed\'ee \'ef\'f0\'ee\'f1\'f2\'ee \'ee\'f2\'f4\'ee\'f0\'ec\'e0\'f2\'e8\'f0\'ee\'e2\'e0\'f2\'fc \'fd\'ec\'f3\'eb\'e8\'f0\'f3\'e5\'ec\'ee\'e5 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'ee, \'f0\'e0\'e7\'f3\'ec\'e5\'e5\'f2\'f1\'ff, \'e5\'f1\'eb\'e8 \'fd\'f2\'ee \'ef\'ee\'e7\'e2\'ee\'eb\'ff\'e5\'f2 \lang1033\b BIOS\lang1049\b0 \'ec\'e0\'f2\'e5\'f0\'e8\'ed\'f1\'ea\'ee\'e9 \'ef\'eb\'e0\'f2\'fb \'ea\'ee\'ec\'ef\'fc\'fe\'f2\'e5\'f0\'e0.\par
|
||||
\par
|
||||
\b 2)\b0 \'dd\'ec\'f3\'eb\'ff\'f6\'e8\'ff \cf2\lang1033\b Flash\cf0\lang1049\b0 \'ed\'e0\'ea\'ee\'ef\'e8\'f2\'e5\'eb\'ff \'ea\'e0\'ea \'e6\'e5\'f1\'f2\'ea\'ee\'e3\'ee \'e4\'e8\'f1\'ea\'e0 \'e2 \lang1033\b BIOS\lang1049\b0 .\par
|
||||
\'c7\'e4\'e5\'f1\'fc \'ed\'e0\'e4\'ee \'f1\'e4\'e5\'eb\'e0\'f2\'fc \'ef\'ee\'ff\'f1\'ed\'e5\'ed\'e8\'e5: \'e4\'e0\'e6\'e5 \'e5\'f1\'eb\'e8 \'e2\'e0\'f8 \lang1033\b BIOS\lang1049\b0 \'fd\'ec\'f3\'eb\'e8\'f0\'f3\'e5\'f2 \'ab\'f4\'eb\'e5\'f8\'ea\'f3\'bb \'ea\'e0\'ea \'f4\'eb\'ee\'ef\'ef\'e8 \'e4\'e8\'f1\'ea \'fd\'f2\'ee \'f1\'ee\'e2\'f1\'e5\'ec \'ed\'e5 \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2, \'f7\'f2\'ee \'e2\'fb \'ee\'e3\'f0\'e0\'ed\'e8\'f7\'e5\'ed\'fb \'f0\'e0\'e7\'ec\'e5\'f0\'e0\'ec\'e8 \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e9 \'f1\'e8\'f1\'f2\'e5\'ec\'fb \lang1033\b FAT\lang1049 12\b0 , \'ea\'ee\'f2\'ee\'f0\'e0\'ff \'e2 \'ee\'f1\'ed\'ee\'e2\'ed\'ee\'ec \'ef\'f0\'e8\'ec\'e5\'ed\'ff\'e5\'f2\'f1\'ff \'ed\'e0 \'f4\'eb\'ee\'ef\'ef\'e8 \'e4\'e8\'f1\'ea\'e0\'f5 \'e8 \'e8\'ec\'e5\'e5\'f2 \'ee\'e3\'f0\'e0\'ed\'e8\'f7\'e5\'ed\'e8\'e5 \'ed\'e0 \'f0\'e0\'e7\'ec\'e5\'f0 \'ee\'ea\'ee\'eb\'ee \b 4 \'cc\'e1.\b0\par
|
||||
\'cd\'e0 \'ef\'f0\'e0\'ea\'f2\'e8\'ea\'e5 \'fd\'f2\'ee \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2, \'f7\'f2\'ee \'ee\'f2\'f4\'ee\'f0\'ec\'e0\'f2\'e8\'f0\'ee\'e2\'e0\'ed\'ed\'fb\'e9 \'e2 \lang1033\b FAT\lang1049 16\b0 \'ed\'e0\'ea\'ee\'ef\'e8\'f2\'e5\'eb\'fc \'e1\'f3\'e4\'e5\'f2 \'e7\'e0\'ec\'e5\'f7\'e0\'f2\'e5\'eb\'fc\'ed\'ee \'e2\'e8\'e4\'e5\'f2\'fc\'f1\'ff \'ea\'e0\'ea \'f4\'eb\'ee\'ef\'ef\'e8 \'e4\'e8\'f1\'ea \'f1 \'f0\'e0\'e7\'ec\'e5\'f0\'ee\'ec \'e4\'ee \b 2 \'c3\'e1.\b0 \'ca \'f1\'ee\'e6\'e0\'eb\'e5\'ed\'e8\'fe, \'e2\'f1\'e5 \'ec\'ee\'e8 \'ef\'ee\'ef\'fb\'f2\'ea\'e8 \'e7\'e0\'e3\'f0\'f3\'e7\'e8\'f2\'fc\'f1\'ff \'f1 \'ef\'f0\'e8\'ec\'e5\'ed\'e5\'ed\'e8\'e5\'ec \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e9 \'f1\'e8\'f1\'f2\'e5\'ec\'fb \lang1033\b FAT\lang1049 32,\b0 \'ea\'ee\'f2\'ee\'f0\'e0\'ff \'ef\'ee\'e7\'e2\'ee\'eb\'e8\'eb\'e0 \'e1\'fb \'ed\'e0 \'ef\'ee\'eb\'ed\'fb\'e9 \'f0\'e0\'e7\'ec\'e5\'f0 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc \cf2\lang1033\b USB\lang1049 \lang1033 Flash\cf0\lang1049\b0 \'ed\'e0\'ea\'ee\'ef\'e8\'f2\'e5\'eb\'e8 \'f0\'e0\'e7\'ec\'e5\'f0\'ee\'ec \'e1\'ee\'eb\'e5\'e5 \b 2 \'c3\'e1,\b0 \'ed\'e5 \'f3\'e2\'e5\'ed\'f7\'e0\'eb\'e8\'f1\'fc \'f3\'f1\'ef\'e5\'f8\'ed\'ee.\par
|
||||
\par
|
||||
\'c2\'e5\'f0\'ed\'e5\'ec\'f1\'ff \'ed\'e5\'ef\'ee\'f1\'f0\'e5\'e4\'f1\'f2\'e2\'e5\'ed\'ed\'ee \'ea \'e7\'e0\'e3\'f0\'f3\'e7\'ea\'e5.\par
|
||||
\'cf\'ee\'f1\'ea\'ee\'eb\'fc\'ea\'f3 \'ed\'e0 \'e4\'e0\'ed\'ed\'fb\'e9 \'ec\'ee\'ec\'e5\'ed\'f2 \cf1\b\'ca\'ee\'eb\'e8\'e1\'f0\'e8\cf0\b0 \'ed\'e5 \'ff\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'ef\'ee\'eb\'ed\'ee\'f1\'f2\'fc\'fe \'f1\'e0\'ec\'ee\'f1\'f2\'ee\'ff\'f2\'e5\'eb\'fc\'ed\'ee\'e9 \b\'ce\'d1\b0 , \'f2\'ee \'ef\'ee\'e2\'f1\'e5\'ec\'e5\'f1\'f2\'ed\'ee \'ee\'ed\'e0 \'ef\'f0\'e8\'ec\'e5\'ed\'ff\'e5\'f2\'f1\'ff \'ef\'e0\'f0\'e0\'eb\'eb\'e5\'eb\'fc\'ed\'ee \'f1 \'e4\'f0\'f3\'e3\'e8\'ec\'e8 \b\'ce\'d1\b0 . \'dd\'f2\'e0 \'f1\'e8\'f2\'f3\'e0\'f6\'e8\'ff \'ef\'f0\'e8\'e2\'e5\'eb\'e0 \'ea \'f2\'ee\'ec\'f3, \'f7\'f2\'ee \'f1\'ee\'e1\'f1\'f2\'e2\'e5\'ed\'ed\'ee\'e3\'ee \'ed\'e5\'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'e3\'ee \'e7\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea\'e0 (\'e5\'f1\'eb\'e8 \'ed\'e5 \'f1\'f7\'e8\'f2\'e0\'f2\'fc \'f4\'eb\'ee\'ef\'ef\'e8 \'e4\'e8\'f1\'ea\'e8) \'f3 \cf1\b\'ca\'ee\'eb\'e8\'e1\'f0\'e8\b0 \cf0\'f4\'e0\'ea\'f2\'e8\'f7\'e5\'f1\'ea\'e8 \'ed\'e5\'f2.\par
|
||||
\'cd\'e0 \'f1\'e5\'e3\'ee\'e4\'ed\'ff\'f8\'ed\'e8\'e9 \'e4\'e5\'ed\'fc \'ee\'f1\'f2\'e0\'eb\'e8\'f1\'fc \'e0\'ea\'f2\'f3\'e0\'eb\'fc\'ed\'fb\'ec\'e8 \'f2\'ee\'eb\'fc\'ea\'ee 2 \'e7\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea\'e0: \b meosload.com\b0 \'e8 \b mtldr.\par
|
||||
\b0\'ce\'e1\'e0 \'ec\'ee\'e3\'f3\'f2 \'e7\'e0\'ef\'f3\'f1\'ea\'e0\'f2\'fc\'f1\'ff \'e8\'e7 \'f1\'f0\'e5\'e4\'fb \cf2\lang1033\b DOS\cf0\lang1049\b0 .\par
|
||||
\'d3\'f1\'f2\'e0\'ed\'ee\'e2\'ea\'e0 \cf1\b\'ca\'ee\'eb\'e8\'e1\'f0\'e8 \cf0\b0\'ed\'e0 \'f4\'eb\'e5\'f8\'ea\'f3 \'e2 \'ec\'ee\'e5\'ec \'e2\'e0\'f0\'e8\'e0\'ed\'f2\'e5 \'ed\'e0\'f7\'e8\'ed\'e0\'e5\'f2\'f1\'ff \'f1 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'ea\'e8 \cf2\lang1033\b DOS\cf0\lang1049\b0 \'ed\'e0 \'f4\'eb\'e5\'f8\'ea\'f3, \'ea\'e0\'ea \'ef\'e5\'f0\'e2\'e8\'f7\'ed\'ee\'e9 \'f1\'e8\'f1\'f2\'e5\'ec\'ee\'e9, \'e8\'e7-\'ef\'ee\'e4 \'ea\'ee\'f2\'ee\'f0\'ee\'e9 \'e1\'f3\'e4\'f3\'f2 \'e7\'e0\'ef\'f3\'f9\'e5\'ed\'fb \'e7\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea\'e8 \cf1\b\'ca\'ee\'eb\'e8\'e1\'f0\'e8\cf0\b0 . \'ca\'ee\'ed\'e5\'f7\'ed\'ee, \'e2 \'fd\'f2\'ee\'ec \'f1\'eb\'f3\'f7\'e0\'e5 \'f1 \'f2\'ee\'f7\'ea\'e8 \'e7\'f0\'e5\'ed\'e8\'ff \'eb\'e8\'f6\'e5\'ed\'e7\'e8\'e8 \'eb\'f3\'f7\'f8\'e5 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc \'ef\'ee\'eb\'ed\'fb\'e5 \'e0\'ed\'e0\'eb\'ee\'e3\'e8 \cf2\lang1033\b DOS\cf0\lang1049\b0 , \'ea\'ee\'f2\'ee\'f0\'fb\'e5 \'e8\'ec\'e5\'fe\'f2 \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'f3\'fe \'eb\'e8\'f6\'e5\'ed\'e7\'e8\'fe \'ed\'e0 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'ed\'e8\'e5, \'ed\'ee \'ed\'e5 \'e2 \'fd\'f2\'ee\'ec \'f1\'f3\'f2\'fc, \'f2\'e0\'ea \'f7\'f2\'ee \'ed\'e5 \'e1\'f3\'e4\'e5\'ec \'ee\'f2\'e2\'eb\'e5\'ea\'e0\'f2\'fc\'f1\'ff \'ed\'e0 \'ec\'e5\'eb\'ee\'f7\'e8.\par
|
||||
\par
|
||||
\'d3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \cf2\lang1033\b DOS\cf0\lang1049\b0 \'ed\'e0 \'ab\'f4\'eb\'e5\'f8\'ea\'f3\'bb \'ec\'ee\'e6\'ed\'ee \'ed\'e5\'f1\'ea\'ee\'eb\'fc\'ea\'e8\'ec\'e8 \'f1\'ef\'ee\'f1\'ee\'e1\'e0\'ec\'e8:\par
|
||||
\b\'e0)\b0 \cf2\b\'ce\'d1 \lang1033 Windows\cf0\lang1049\b0 \'ef\'f0\'e8 \'f4\'ee\'f0\'ec\'e0\'f2\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e8 \'f4\'eb\'e5\'f8\'ea\'e8 \'e2\'fb\'e1\'f0\'e0\'f2\'fc \'ef\'f3\'ed\'ea\'f2 \'f1\'ea\'ee\'ef\'e8\'f0\'ee\'e2\'e0\'f2\'fc \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'fb\'e5 \'f4\'e0\'e9\'eb\'fb, \'e2 \'ee\'e1\'f9\'e5\'ec, \'f2\'ee \'e6\'e5 \'f1\'e0\'ec\'ee\'e5 \'f7\'f2\'ee \'e8 \'e4\'eb\'ff \'f4\'eb\'ee\'ef\'ef\'e8 \'e4\'e8\'f1\'ea\'e5\'f2\'fb. \'ca \'f1\'ee\'e6\'e0\'eb\'e5\'ed\'e8\'fe, \'fd\'f2\'ee\'f2 \'ec\'e5\'f2\'ee\'e4 \'ef\'ee\'e4\'f5\'ee\'e4\'e8\'f2 \'f2\'ee\'eb\'fc\'ea\'ee \'e4\'eb\'ff \'eb\'e8\'ed\'e5\'e9\'ea\'e8 \b 9\'f5\b0 , \'ed\'e0 \b 2\'ca\b0 \'ed\'e5 \'ef\'f0\'ee\'e2\'e5\'f0\'ff\'eb, \'ed\'ee \'e2 \b\'d5\'d0\b0 \'fd\'f2\'ee\'f2 \'ef\'f3\'ed\'ea\'f2 \'ed\'e5\'e4\'ee\'f1\'f2\'f3\'ef\'e5\'ed.\par
|
||||
\b\'e1) \cf2\lang1033 DOS\cf0\lang1049\b0 \'ef\'f0\'e8 \'ed\'e0\'eb\'e8\'f7\'e8\'e8 \'fd\'ec\'f3\'eb\'ff\'f6\'e8\'e8 \'ab\'f4\'eb\'e5\'f8\'ea\'e8\'bb \'ea\'e0\'ea \'e3\'e8\'e1\'ea\'ee\'e3\'ee \'e8\'eb\'e8 \'e6\'e5\'f1\'f2\'ea\'ee\'e3\'ee \'e4\'e8\'f1\'ea\'e0 \'ec\'ee\'e6\'e5\'f2 \'f1\'e4\'e5\'eb\'e0\'f2\'fc \'e4\'e8\'f1\'ea \'e7\'e0\'e3\'f0\'f3\'e7\'ee\'f7\'ed\'fb\'ec. \'c4\'eb\'ff \'fd\'f2\'ee\'e3\'ee \'ed\'f3\'e6\'ed\'ee \'e2\'e2\'e5\'f1\'f2\'e8 \'ea\'ee\'ec\'e0\'ed\'e4\'f3 \lang1033\b sys\lang1049 \lang1033 X\lang1049 :\b0 \'e3\'e4\'e5 \b\'d5\b0 \'e7\'e0\'ec\'e5\'ed\'e8\'f2\'fc \'ed\'e0 \'e1\'f3\'ea\'e2\'f3, \'ef\'ee\'e4 \'ea\'ee\'f2\'ee\'f0\'ee\'e9 \'f3 \'e2\'e0\'f1 \'e7\'ed\'e0\'f7\'e8\'f2\'f1\'ff \'fd\'ec\'f3\'eb\'e8\'f0\'f3\'e5\'ec\'fb\'e9\cf2\b \lang1033 Flash\cf0\lang1049\b0 \'ed\'e0\'ea\'ee\'ef\'e8\'f2\'e5\'eb\'fc (\cf3\b\'c1\'f3\'e4\'fc\'f2\'e5 \'ee\'f1\'f2\'ee\'f0\'ee\'e6\'ed\'fb, \'e5\'f1\'eb\'e8 \'e2\'fb \'f3\'ea\'e0\'e6\'e8\'f2\'e5 \'ed\'e5 \'f2\'ee\'f2 \'e4\'e8\'f1\'ea, \'f2\'ee \'ec\'ee\'e6\'e5\'f2\'e5 \'f3\'e1\'e8\'f2\'fc \'e7\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed\'ed\'ee\'e9 \'ed\'e0 \'e2\'e0\'f8 \'e6\'e5\'f1\'f2\'ea\'e8\'e9 \'e4\'e8\'f1\'ea \'ce\'d1\cf0\b0 ). \'cf\'f0\'e8 \'fd\'f2\'ee\'ec \cf2\lang1033\b DOS\lang1049 ,\cf0\b0 \'ec\'ee\'e6\'e5\'f2, \'e8 \'e1\'f3\'e4\'e5\'f2 \'f0\'f3\'e3\'e0\'f2\'fc\'f1\'ff, \'ed\'ee \'ed\'e5 \'ee\'e1\'f0\'e0\'f9\'e0\'e9\'f2\'e5 \'ed\'e0 \'fd\'f2\'ee \'e2\'ed\'e8\'ec\'e0\'ed\'e8\'e5 \'e8 \'e2\'fb\'e1\'e5\'f0\'e8\'f2\'e5 \lang1033\b F\lang1049 \b0 (\'ef\'f0\'ee\'e4\'ee\'eb\'e6\'e8\'f2\'fc), \'e3\'eb\'e0\'e2\'ed\'ee\'e5 \'f7\'f2\'ee\'e1\'fb \'e2 \'e7\'e0\'e3\'f0\'f3\'e7\'ee\'f7\'ed\'fb\'e9 \'f1\'e5\'ea\'f2\'ee\'f0 \'ed\'e0\'ea\'ee\'ef\'e8\'f2\'e5\'eb\'ff \'e1\'fb\'eb \'e7\'e0\'ef\'e8\'f1\'e0\'ed \'e7\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea, \'ea\'ee\'f2\'ee\'f0\'fb\'e9 \'e8 \'e1\'f3\'e4\'e5\'f2 \'e7\'e0\'ef\'f3\'f1\'ea\'e0\'f2\'fc\cf2\b \lang1033 DOS\cf0\lang1049\b0 \'f1 \'ab\'f4\'eb\'e5\'f8\'ea\'e8\'bb.\par
|
||||
\'c2 \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2\'e5 \'ec\'fb \'e1\'f3\'e4\'e5\'ec \'e8\'ec\'e5\'f2\'fc \cf2\lang1033\b USB\lang1049 \lang1033 Flash\cf0\lang1049\b0 \'ed\'e0\'ea\'ee\'ef\'e8\'f2\'e5\'eb\'fc \'f1 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed\'ed\'fb\'ec \cf2\lang1033\b DOS\cf0\lang1049\b0 .\par
|
||||
\par
|
||||
\'c8\'e7 \'e2\'f1\'e5\'f5 \'f4\'e0\'e9\'eb\'ee\'e2, \'ea\'ee\'f2\'ee\'f0\'fb\'e5 \'e1\'f3\'e4\'f3\'f2 \'ed\'e0\'f5\'ee\'e4\'e8\'f2\'fc\'f1\'ff \'ed\'e0 \'ab\'f4\'eb\'e5\'f8\'ea\'e5\'bb \'ed\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'fb \'f2\'ee\'eb\'fc\'ea\'ee \b Command.com, Io.sys, Msdos.sys - \b0\'ee\'f1\'f2\'e0\'eb\'fc\'ed\'fb\'e5 \'ec\'ee\'e6\'ed\'ee \'f3\'e4\'e0\'eb\'e8\'f2\'fc, \'e4\'eb\'ff \'ed\'e0\'f8\'e8\'f5 \'f6\'e5\'eb\'e5\'e9 \'ee\'ed\'e8 \'ed\'e5 \'ed\'f3\'e6\'ed\'fb. \'c5\'f1\'eb\'e8 \'ef\'ee \'ea\'e0\'ea\'ee\'e9 \'eb\'e8\'e1\'ee \'ef\'f0\'e8\'f7\'e8\'ed\'e5 \'fd\'f2\'e8 \'f2\'f0\'e8 \'f4\'e0\'e9\'eb\'e0 \'ed\'e5 \'f1\'ea\'ee\'ef\'e8\'f0\'ee\'e2\'e0\'eb\'e8\'f1\'fc \'ed\'e0 \'ed\'e0\'ea\'ee\'ef\'e8\'f2\'e5\'eb\'fc, \'f2\'ee \'f1\'ea\'ee\'ef\'e8\'f0\'f3\'e9\'f2\'e5 \'e8\'f5 \'e2\'f0\'f3\'f7\'ed\'f3\'fe. \'c4\'e0\'eb\'e5\'e5 \'e6\'e5\'eb\'e0\'f2\'e5\'eb\'fc\'ed\'ee \'ef\'e5\'f0\'e5\'e7\'e0\'e3\'f0\'f3\'e7\'e8\'f2\'fc \'ea\'ee\'ec\'ef\'fc\'fe\'f2\'e5\'f0 \'e8 \'ef\'f0\'ee\'e2\'e5\'f0\'e8\'f2\'fc \'e7\'e0\'e3\'f0\'f3\'e7\'ea\'f3 \cf2\lang1033\b DOS\cf0\lang1049\b0 \'f1 \'f4\'eb\'e5\'f8\'ea\'e8. \'c5\'f1\'eb\'e8 \'e2\'f1\'e5 \'ef\'f0\'ee\'e9\'e4\'e5\'f2 \'ed\'ee\'f0\'ec\'e0\'eb\'fc\'ed\'ee, \'f2\'ee \'e2\'fb \'ef\'ee\'eb\'f3\'f7\'e8\'f2\'e5 \'ef\'f0\'e8\'e3\'eb\'e0\'f8\'e5\'ed\'e8\'e5 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 \cf2\lang1033\b DOS\cf0\lang1049\b0 , \'e2 \'ef\'f0\'ee\'f2\'e8\'e2\'ed\'ee\'ec \'f1\'eb\'f3\'f7\'e0\'e5 \'ed\'f3\'e6\'ed\'ee \'ef\'ee\'ef\'fb\'f2\'e0\'f2\'fc\'f1\'ff \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'f1\'ed\'ee\'e2\'e0.\par
|
||||
\'c2 \'e4\'ee\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'ea \'fd\'f2\'e8\'ec \'f2\'f0\'e5\'ec \'f4\'e0\'e9\'eb\'e0\'ec \'ef\'ee\'f2\'f0\'e5\'e1\'f3\'e5\'f2\'f1\'ff \'e2 \'f0\'f3\'f7\'ed\'f3\'fe \'f1\'ee\'e7\'e4\'e0\'f2\'fc \'e5\'f9\'e5 \'ef\'e0\'f0\'f3 \'ef\'f3\'f1\'f2\'fb\'f5 \'f4\'e0\'e9\'eb\'ee\'e2: \b Config.sys, Autoexec.bat\b0 - \'fd\'f2\'ee \'ed\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'ee, \'e4\'eb\'ff \'f2\'ee\'e3\'ee \'f7\'f2\'ee\'e1\'fb \'f1\'e4\'e5\'eb\'e0\'f2\'fc \'e2\'ef\'ee\'f1\'eb\'e5\'e4\'f1\'f2\'e2\'e8\'e8 \'ef\'ee\'eb\'ed\'ee\'f1\'f2\'fc\'fe \'e0\'e2\'f2\'ee\'ec\'e0\'f2\'e8\'f7\'e5\'f1\'ea\'f3\'fe \'e7\'e0\'e3\'f0\'f3\'e7\'ea\'f3 \cf2\b\'ca\'ee\'eb\'e8\'e1\'f0\'e8\cf0\b0 , \'e0 \'ed\'e5 \'f1\'f2\'e0\'f0\'f2\'ee\'e2\'e0\'f2\'fc \'e7\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea \'e8\'e7 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 \'ea\'e0\'e6\'e4\'fb\'e9 \'f0\'e0\'e7.\par
|
||||
\par
|
||||
\'cd\'f3, \'e2\'ee\'f2 \'ef\'ee\'eb\'ee\'e2\'e8\'ed\'e0 \'f0\'e0\'e1\'ee\'f2\'fb \'f1\'e4\'e5\'eb\'e0\'ed\'e0. \'c4\'e0\'eb\'e5\'e5 \'e2\'ee\'e7\'ed\'e8\'ea\'e0\'fe\'f2 \'ed\'e5\'ea\'ee\'f2\'ee\'f0\'fb\'e5 \'f2\'f0\'f3\'e4\'ed\'ee\'f1\'f2\'e8, \'ea\'ee\'f2\'ee\'f0\'fb\'e5 \'ec\'fb \'f3\'f1\'ef\'e5\'f8\'ed\'ee \'f0\'e0\'e7\'f0\'e5\'f8\'e8\'ec (\'e4\'eb\'ff \'f2\'ee\'e3\'ee \'ff \'e8 \'ef\'e8\'f1\'e0\'eb \'fd\'f2\'f3 \'f1\'f2\'e0\'f2\'fc\'fe).\par
|
||||
\'d2\'f0\'f3\'e4\'ed\'ee\'f1\'f2\'e8 \'e7\'e0\'ea\'eb\'fe\'f7\'e0\'fe\'f2\'f1\'ff \'e2 \'f2\'ee\'ec, \'f7\'f2\'ee \'e2 \'f1\'f2\'e0\'ed\'e4\'e0\'f0\'f2\'ed\'ee\'ec \'e2\'e0\'f0\'e8\'e0\'ed\'f2\'e5 \'ed\'e8 \'ee\'e4\'e8\'ed \'e7\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea\'e8 \'ed\'e5 \'e7\'e0\'e3\'f0\'f3\'e6\'e0\'e5\'f2 \lang1033\b IMG\lang1049\b0 \'ee\'e1\'f0\'e0\'e7 \'e2 \'ef\'e0\'ec\'ff\'f2\'fc (\'e7\'e0\'e3\'f0\'f3\'e6\'e0\'e5\'f2\'f1\'ff \'e8 \'e7\'e0\'ef\'f3\'f1\'ea\'e0\'e5\'f2\'f1\'ff \'f2\'ee\'eb\'fc\'ea\'ee \'ff\'e4\'f0\'ee), \'ef\'ee\'f1\'ea\'ee\'eb\'fc\'ea\'f3 \'ef\'ee\'e4\'f0\'e0\'e7\'f3\'ec\'e5\'e2\'e0\'e5\'f2\'f1\'ff, \'f7\'f2\'ee \'ee\'e1\'f0\'e0\'e7 \'e1\'f3\'e4\'e5\'f2 \'e7\'e0\'e3\'f0\'f3\'e6\'e5\'ed \'ff\'e4\'f0\'ee\'ec. \'cd\'ee \'ea\'e0\'ea \'e2\'fb, \'ed\'e0\'e2\'e5\'f0\'ed\'ee\'e5, \'f3\'e6\'e5 \'e4\'ee\'e3\'e0\'e4\'e0\'eb\'e8\'f1\'fc \'ee\'e1\'f0\'e0\'e7 \'ff\'e4\'f0\'f3 \'e3\'f0\'f3\'e7\'e8\'f2\'fc \'ef\'f0\'ee\'f1\'f2\'ee \'ed\'e5 \'ee\'f2\'ea\'f3\'e4\'e0, \'f2\'e0\'ea \'ea\'e0\'ea \'f1 \cf2\lang1033\b USB\cf0\lang1049\b0 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0\'ec\'e8 \cf2\b\'ca\'ee\'eb\'e8\'e1\'f0\'e8\cf0\b0 \'ef\'ee\'ea\'e0 \'ed\'e5 \'e4\'f0\'f3\'e6\'e8\'f2.\par
|
||||
\par
|
||||
\'ce\'f2\'f1\'fe\'e4\'e0 \'ee\'f1\'f2\'e0\'e5\'f2\'f1\'ff \'ee\'e4\'e8\'ed \'e2\'fb\'f5\'ee\'e4 - \'f1\'e4\'e5\'eb\'e0\'f2\'fc \'f2\'e0\'ea \'f7\'f2\'ee\'e1\'fb \'e7\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea \'e7\'e0\'e3\'f0\'f3\'e7\'e8\'eb \'ed\'e5 \'f2\'ee\'eb\'fc\'ea\'ee \'ff\'e4\'f0\'ee, \'ed\'ee \'e8 \'ee\'e1\'f0\'e0\'e7 \'ef\'ee \'ed\'f3\'e6\'ed\'ee\'ec\'f3 \'ec\'e5\'f1\'f2\'f3 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8. \'cd\'ce! (\'ce\'ef\'ff\'f2\'fc \'fd\'f2\'ee \'ed\'ee!) \'c7\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea \'e7\'e0\'ef\'f3\'f9\'e5\'ed \'e2 \cf2\lang1033\b DOS\cf0\lang1049\b0 , \'ea\'ee\'f2\'ee\'f0\'fb\'e9 \'f0\'e0\'e1\'ee\'f2\'e0\'e5\'f2 \'e2 \'f0\'e5\'e0\'eb\'fc\'ed\'ee\'ec (\lang1033\b Real\lang1049 \lang1033 mode\lang1049\b0 ) \'f0\'e5\'e6\'e8\'ec\'e5 \'ef\'f0\'ee\'f6\'e5\'f1\'f1\'ee\'f0\'e0, \'f1 \'ee\'e3\'f0\'e0\'ed\'e8\'f7\'e5\'ed\'e8\'e5\'ec \'ed\'e0 \'e0\'e4\'f0\'e5\'f1\'e0\'f6\'e8\'fe \'ef\'e0\'ec\'ff\'f2\'e8 \'e2 \b 1 \'cc\'e1\b0 , \'e0 \'ee\'e1\'f0\'e0\'e7 \'e2 \'e0\'e4\'f0\'e5\'f1\'ed\'ee\'ec \'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'f1\'f2\'e2\'e5 \cf1\b\'ca\'ee\'eb\'e8\'e1\'f0\'e8\cf0\b0 \'ea\'e0\'ea \'f0\'e0\'e7 \'e4\'ee\'eb\'e6\'e5\'ed \'f0\'e0\'f1\'ef\'ee\'eb\'e0\'e3\'e0\'f2\'fc\'f1\'ff, \'e0\'ea\'ea\'f3\'f0\'e0\'f2 \'ed\'e0\'f7\'e8\'ed\'e0\'ff \'f1 \'ef\'e5\'f0\'e2\'ee\'e3\'ee \'ec\'e5\'e3\'e0\'e1\'e0\'e9\'f2\'e0 \'e8 \'e4\'e0\'eb\'e5\'e5 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8.\par
|
||||
\'ca\'e0\'ea \'e6\'e5 \'e1\'fb\'f2\'fc? \'dd\'e2\'f0\'e8\'ea\'e0! \lang1033\b DOS\lang1049\b0 \'e2\'e5\'e4\'fc \'ec\'ee\'e6\'e5\'f2 \'ee\'e1\'f0\'e0\'f9\'e0\'f2\'fc\'f1\'ff \'f7\'e5\'f0\'e5\'e7 \'e4\'ee\'ef\'ee\'eb\'ed\'e8\'f2\'e5\'eb\'fc\'ed\'fb\'e5 \'e4\'f0\'e0\'e9\'e2\'e5\'f0\'fb \'ea \'ef\'e0\'ec\'ff\'f2\'e8 \'e2\'fb\'f8\'e5 \'ef\'e5\'f0\'e2\'ee\'e3\'ee \'ec\'e5\'e3\'e0\'e1\'e0\'e9\'f2\'e0 (\'ea\'f1\'f2\'e0\'f2\'e8 \'f2\'e0\'ea \'e8 \'ef\'ee\'f1\'f2\'f3\'ef\'e0\'e5\'f2 \'ff\'e4\'f0\'ee \'ef\'f0\'e8 \'e7\'e0\'e3\'f0\'f3\'e7\'ea\'e5 \'ee\'e1\'f0\'e0\'e7\'e0 \'f1 \'f4\'eb\'ee\'ef\'ef\'e8), \'ed\'ee \'f0\'e5\'e0\'eb\'e8\'e7\'ee\'e2\'e0\'ed\'ee \'fd\'f2\'ee \'f2\'e0\'ea \'ea\'ee\'f0\'ff\'e2\'ee, \'f7\'f2\'ee \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc\'f1\'ff \'fd\'f2\'e8\'ec \'ed\'e5 \'f5\'ee\'f7\'e5\'f2\'f1\'ff \'f1\'ee\'e2\'f1\'e5\'ec. (\'ca\'ee\'ed\'e5\'f7\'ed\'ee \'fd\'f2\'ee \'ec\'ee\'e5 \'f1\'f3\'e1\'fa\'e5\'ea\'f2\'e8\'e2\'ed\'ee\'e5 \'ec\'ed\'e5\'ed\'e8\'e5).\par
|
||||
\par
|
||||
\'ce\'e4\'ed\'ee\'e2\'f0\'e5\'ec\'e5\'ed\'ed\'ee \'f1 \'fd\'f2\'e8\'ec \'e5\'f1\'f2\'fc \'e4\'f0\'f3\'e3\'ee\'e9 \'f1\'ef\'ee\'f1\'ee\'e1 \'ee\'e1\'f0\'e0\'f2\'e8\'f2\'fc\'f1\'ff \'ea \'ef\'e0\'ec\'ff\'f2\'e8 \'e2\'fb\'f8\'e5 \'ef\'e5\'f0\'e2\'ee\'e3\'ee \'ec\'e5\'e3\'e0\'e1\'e0\'e9\'f2\'e0. \'c2 \'ef\'f0\'ee\'f6\'e5\'f1\'f1\'ee\'f0\'e0\'f5 \b\'f586\b0 \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'e5\'f2 \'e2\'ee\'e7\'ec\'ee\'e6\'ed\'ee\'f1\'f2\'fc \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'ed\'e5\'e4\'ee\'ea\'f3\'ec\'e5\'ed\'f2\'e8\'f0\'ee\'e2\'e0\'ed\'ed\'fb\'e9, \'ed\'ee \'f1\'f7\'e8\'f2\'e0\'fe\'f9\'e8\'e9\'f1\'ff \'ef\'f0\'e0\'ea\'f2\'e8\'f7\'e5\'f1\'ea\'e8 \'f1\'f2\'e0\'ed\'e4\'e0\'f0\'f2\'ed\'fb\'ec \'ab\'ed\'e5\'f0\'e5\'e0\'eb\'fc\'ed\'fb\'e9\'bb (\lang1033\b Unreal\lang1049 \lang1033 mode\lang1049\b0 ) \'f0\'e5\'e6\'e8\'ec \'f0\'e0\'e1\'ee\'f2\'fb.\par
|
||||
\'ca\'ee\'ed\'e5\'f7\'ed\'ee, \'ef\'f0\'ff\'ec\'e0\'ff \'e0\'e4\'f0\'e5\'f1\'e0\'f6\'e8\'ff \'e2 \'f2\'e0\'ea\'ee\'ec \'f0\'e5\'e6\'e8\'ec\'e5 \'ed\'e5\'e2\'ee\'e7\'ec\'ee\'e6\'ed\'e0, \'ed\'ee \'ec\'ee\'e6\'ed\'ee \'ee\'e1\'f0\'e0\'f9\'e0\'f2\'fc\'f1\'ff \'ea \'ef\'e0\'ec\'ff\'f2\'e8 \'ea\'ee\'f1\'e2\'e5\'ed\'ed\'ee \'f7\'e5\'f0\'e5\'e7 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'fb, \'f3 \'ea\'ee\'f2\'ee\'f0\'fb\'f5 \'e1\'fb\'eb\'e8 \'e8\'e7\'ec\'e5\'ed\'e5\'ed\'fb \'eb\'e8\'ec\'e8\'f2\'fb \'e0\'e4\'f0\'e5\'f1\'e0\'f6\'e8\'e8.\par
|
||||
\'c2 \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2\'e5 \'ef\'ee\'eb\'f3\'f7\'e0\'e5\'ec \'f1\'f0\'e0\'e2\'ed\'e8\'f2\'e5\'eb\'fc\'ed\'ee \'ef\'f0\'ee\'f1\'f2\'ee\'e9 \'f1\'ef\'ee\'f1\'ee\'e1 \'e4\'ee\'f1\'f2\'f3\'ef\'e0 \'ea \'ef\'e0\'ec\'ff\'f2\'e8 \'e2\'ef\'eb\'ee\'f2\'fc \'e4\'ee \b 4 \'c3\'e1,\b0 \'ed\'e0\'f5\'ee\'e4\'ff\'f1\'fc \'f4\'e0\'ea\'f2\'e8\'f7\'e5\'f1\'ea\'e8 \'e2 \'f0\'e5\'e0\'eb\'fc\'ed\'ee\'ec \'f0\'e5\'e6\'e8\'ec\'e5 \'f0\'e0\'e1\'ee\'f2\'fb \'ef\'f0\'ee\'f6\'e5\'f1\'f1\'ee\'f0\'e0.\par
|
||||
\par
|
||||
\'c2 \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2\'e5 \'ff \'e4\'ee\'f0\'e0\'e1\'ee\'f2\'e0\'eb \'e7\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea \lang1033\b meosload\lang1049 .\lang1033 com\lang1049\b0 (\'ef\'ee\'f1\'ea\'ee\'eb\'fc\'ea\'f3 \'e2 \'e5\'e3\'ee \'ea\'ee\'e4\'e5 \'ec\'ed\'e5 \'ee\'ea\'e0\'e7\'e0\'eb\'ee\'f1\'fc \'ef\'f0\'ee\'f9\'e5 \'f0\'e0\'e7\'ee\'e1\'f0\'e0\'f2\'fc\'f1\'ff), \'f2\'e5\'ef\'e5\'f0\'fc \'ee\'ed \'e7\'e0\'e3\'f0\'f3\'e6\'e0\'e5\'f2 \'e8 \'ff\'e4\'f0\'ee \'e8 \'ee\'e1\'f0\'e0\'e7, \'e0 \'e7\'e0\'f2\'e5\'ec \'f1\'f2\'e0\'f0\'f2\'f3\'e5\'f2 \b\'ce\'d1\b0 .\par
|
||||
\'c4\'eb\'ff \'e2\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'ff \'ab\'ed\'e5\'f0\'e5\'e0\'eb\'fc\'ed\'ee\'e3\'ee\'bb \'f0\'e5\'ec\'e0 \'f0\'e0\'e1\'ee\'f2\'fb \'ef\'f0\'ee\'f6\'e5\'f1\'f1\'ee\'f0\'e0 \'ff \'e8\'e7\'ed\'e0\'f7\'e0\'eb\'fc\'ed\'ee \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'eb \'ea\'ee\'e4, \'e2\'e7\'ff\'f2\'fb\'e9 \'f1 \cf1\ul <http://www.wasm.ru>\cf0\ulnone \'ea\'ee\'f2\'ee\'f0\'fb\'e9 \'ff \'ef\'e5\'f0\'e5\'f0\'e0\'e1\'ee\'f2\'e0\'eb \'e2 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'f3 \b enable.exe\par
|
||||
\b0\'cf\'ee\'e7\'e6\'e5 \'ea\'ee\'e4 \'e1\'fb\'eb \'ef\'e5\'f0\'e5\'ef\'e8\'f1\'e0\'ed \'ed\'e0 \'f1\'e8\'ed\'f2\'e0\'ea\'f1\'e8\'f1 \lang1033\b FASM\lang1049\b0 (\'ee\'f0\'e8\'e3\'e8\'ed\'e0\'eb \'e1\'fb\'eb \'e4\'eb\'ff \lang1033\b TASM\lang1049\b0 ), \'f2\'ee\'e2\'e0\'f0\'e8\'f9\'e5\'ec \cf2\lang1033\b Serge\cf0\lang1049\b0 , \'e7\'e0 \'f7\'f2\'ee \'e5\'ec\'f3 \'ee\'e3\'f0\'ee\'ec\'ed\'ee\'e5 \'f1\'ef\'e0\'f1\'e8\'e1\'ee, \'ef\'ee\'f1\'ea\'ee\'eb\'fc\'ea\'f3 \'f3 \'ec\'e5\'ed\'ff \'ed\'e5 \'f5\'e2\'e0\'f2\'e8\'eb\'ee \'f3\'ec\'e0 \'e8 \'f2\'e5\'f0\'ef\'e5\'ed\'e8\'ff \'f1\'e4\'e5\'eb\'e0\'f2\'fc \'fd\'f2\'ee \'f1\'e0\'ec\'ee\'ec\'f3.\par
|
||||
\par
|
||||
\'c8\'f2\'e0\'ea, \'fd\'f2\'ee \'e1\'fb\'eb\'ee \'e4\'eb\'e8\'ed\'ed\'ee\'e5 \'ee\'f2\'f1\'f2\'f3\'ef\'eb\'e5\'ed\'e8\'e5, \'ed\'ee \'e1\'e5\'e7 \'ed\'e5\'e3\'ee \'e2\'fb \'e1\'fb \'ed\'e5 \'ef\'ee\'ed\'ff\'eb\'e8 \'e2\'f1\'fe \'e8\'e4\'e5\'fe \'ef\'f0\'e5\'e4\'eb\'ee\'e6\'e5\'ed\'ed\'ee\'e3\'ee \'ec\'ed\'ee\'e9 \'f1\'ef\'ee\'f1\'ee\'e1\'e0 \'e7\'e0\'e3\'f0\'f3\'e7\'ea\'e8.\par
|
||||
\'ce\'f1\'f2\'e0\'eb\'ee\'f1\'fc \'eb\'e8\'f8\'fc \'f1\'ea\'ee\'ef\'e8\'f0\'ee\'e2\'e0\'f2\'fc \'ed\'e0 \'ab\'f4\'eb\'e5\'f8\'ea\'f3\'bb \'f4\'e0\'e9\'eb\'fb \b enable.exe \b0\'e8 \lang1033\b meosload\lang1049 .\lang1033 com\lang1049 ,\b0 \'e0 \'f2\'e0\'ea\'e6\'e5 \'ef\'f0\'ee\'ef\'e8\'f1\'e0\'f2\'fc \'e2 \b Autoexec.bat \b0\'e8\'f5 \'e7\'e0\'e3\'f0\'f3\'e7\'ea\'f3 (\b Autoexec.bat\b0 \'ec\'ee\'e6\'ed\'ee \'f0\'e5\'e4\'e0\'ea\'f2\'e8\'f0\'ee\'e2\'e0\'f2\'fc \'eb\'fe\'e1\'fb\'ec \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'ec \'f0\'e5\'e4\'e0\'ea\'f2\'ee\'f0\'ee\'ec) \'e8, \'f0\'e0\'e7\'f3\'ec\'e5\'e5\'f2\'f1\'ff, \'ed\'e0 \'ab\'f4\'eb\'e5\'f8\'ea\'e5\'bb \'e2 \'ea\'ee\'f0\'ed\'e5 \'e4\'e8\'f1\'ea\'e0 \'e4\'ee\'eb\'e6\'e5\'ed \'ed\'e0\'f5\'ee\'e4\'e8\'f2\'fc\'f1\'ff \'f1\'e0\'ec \'f4\'e0\'e9\'eb \'ee\'e1\'f0\'e0\'e7\'e0 \lang1033\b kolibri\lang1049 .\lang1033 img\lang1049 .\par
|
||||
\b0\par
|
||||
\'c2\'ee\'f2 \'e2 \'ef\'f0\'e8\'ed\'f6\'e8\'ef\'e5 \'e8 \'e2\'f1\'e5. \'ce\'f1\'f2\'e0\'eb\'ee\'f1\'fc \'ef\'e5\'f0\'e5\'e7\'e0\'e3\'f0\'f3\'e7\'e8\'f2\'fc \'ea\'ee\'ec\'ef\'fc\'fe\'f2\'e5\'f0 \'e8 \'e2\'fb\'e1\'f0\'e0\'f2\'fc \'e7\'e0\'e3\'f0\'f3\'e7\'ea\'f3 \'f1 \cf2\lang1033\b USB\lang1049 \lang1033 Flash\cf0\lang1049\b0 \'ed\'e0\'ea\'ee\'ef\'e8\'f2\'e5\'eb\'ff. \'c2 \'f1\'e8\'ed\'e5\'ec \'ee\'ea\'ed\'e5 \'e7\'e0\'e3\'f0\'f3\'e7\'ea\'e8 \'e2 \'ea\'e0\'f7\'e5\'f1\'f2\'e2\'e5 \'e7\'e0\'e3\'f0\'f3\'e7\'ee\'f7\'ed\'ee\'e3\'ee \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0 \'ed\'f3\'e6\'ed\'ee \'e2\'fb\'e1\'f0\'e0\'f2\'fc \'ef\'f3\'ed\'ea\'f2 \b 3-\'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc \'f3\'e6\'e5 \'e7\'e0\'e3\'f0\'f3\'e6\'e5\'ed\'ed\'fb\'e9 \'ee\'e1\'f0\'e0\'e7.\par
|
||||
\par
|
||||
\b0 P.S.\par
|
||||
1) \'d5\'ee\'f7\'f3 \'e2\'fb\'f0\'e0\'e7\'e8\'f2\'fc \'e1\'ee\'eb\'fc\'f8\'f3\'fe \'ef\'f0\'e8\'e7\'ed\'e0\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'fc \'e7\'e0 \'ef\'ee\'ec\'ee\'f9\'fc \'e2 \'ef\'ee\'e4\'e3\'ee\'f2\'ee\'e2\'ea\'e5 \'ec\'e0\'f2\'e5\'f0\'e8\'e0\'eb\'e0 \cf2\b\'c0\'ed\'e4\'f0\'e5\'fe (NoName)\b0 , \b\'dd\'e4\'f3\'e0\'f0\'e4\'f3 (DoomEdArchangel)\b0 \'e8 \b\'d1\'e5\'f0\'e3\'e5\'fe (Serge).\cf0\b0\par
|
||||
2) \'c2 \'e0\'f0\'f5\'e8\'e2\'e5 \'f1 \'fd\'f2\'e8\'ec \'f4\'e0\'e9\'eb\'ee\'ec \'f1\'ee\'e4\'e5\'f0\'e6\'e0\'f2\'fc\'f1\'ff \'f3\'ef\'ee\'ec\'ff\'ed\'f3\'f2\'fb\'e5 \'e2 \'f2\'e5\'ea\'f1\'f2\'e5 \b enable.exe \b0\'e8 \lang1033\b meosload\lang1049 .\lang1033 com\lang1049\b0 \'e8 \'e8\'f5 \'e8\'f1\'f5\'ee\'e4\'ed\'fb\'e5 \'ea\'ee\'e4\'fb.\par
|
||||
}
|
||||
|