NTFS文件系统启动扇区代码(简化版)

本文档详细介绍了NTFS文件系统启动扇区的代码,包括BIOS在启动过程中的作用、引导代码的内存布局以及NTFS启动扇区代码的内存使用情况。还涉及了磁盘服务扩展、数据缓冲区的分配以及NTFS系统文件记录的类型和编号。此外,还包含了解码数据运行列表的实现和检查目录中是否存在指定文件的流程。
摘要由CSDN通过智能技术生成
;====================================================================
;
; FlyingDragon OS Boot Sector FOR NTFS File System
;
; Author: Jack
; V0.01 2005-9-1 20:58
;
; Build : nasm -f bin NTFS.ASM -oNTFS.BIN
;     
;====================================================================================
;
; BIOS在启动中的角色:
;     (1) BIOS装载引导驱动器上的0扇区(CHS = 0:0:1)内容到内存线性地址7C00H处;
;     (2) BIOS检查所装载的扇区是否有启动标记(510、511字节分别为55H和AAH);
;     (3) CPU寄存器DL被设置为分配给引导驱动器的驱动器号,00H为软驱A,80H为硬盘C;
;     (4) BIOS跳转到其装载的扇区中的代码(即7C00H处),将控制权转交给引导代码。
;
; 引导代码应该初始化以下寄存器:
;     (1) DS:某些BIOS设置其值为0,某些设置其为40H,它应该被设置为(7C00H-BOOT_ORG)/16;
;         其中,BOOT_ORG为引导代码的ORG值,该值通常为7C00H(这意味着DS应设置为0);
;     (2) SS和SP(堆栈):这两个寄存器的初始值依赖于BIOS;
;     (3) CS个IP(通过JMP指令):大多数的BIOS进入启动代码的地址为0000:7C00H,但是某些
;         BIOS却跳转到07C0:0000H。由于短跳转和条件跳转是IP相关的,因此如果没有使用
;        远跳转或者绝对跳转,则不需要重置CS和IP;然而,DS仍旧必须是正确的值。
;
;=====================================================================================
;
; 常规内存( 0000 0000H - 000F FFFFH,即0-1MB )在系统启动时的使用情况
;
;=====================================================================================
;
;         ---------------------------------
;         |    0000 0000 - 0000 03FF          |    1024B      IDT  read only
;         |-------------------------------|
;         |    0000 0400 - 0000 04FF        |    256B     BIOS Data Area , read only    
;         |-------------------------------|
;         |    0000 0500 - 0000 7BFF         |*    30464B    Free Memory , read/write     (29.75KB)
;         |------------------------------    |
;         |    0000 7C00 - 0000 7DFF          |    512B    Boot Sector , read/write    
;         |------------------------------    |
;         |    0000 7E00 - 0000 7FFF        |    512B    Free Memory , read /write
;         |------------------------------    |
;         |    0000 8000 - 0009 FBFF         |    607KB    Free Memory , read / write( 32K - 639KB )
;         |------------------------------    |
;         |    0009 FC00 - 0009 FFFF          |**    1KB        EBDA extended BIOS data area          
;         |------------------------------    |
;         |    000A 0000 - 000A FFFF        |    64KB    Video Memory
;         |------------------------------    |
;         |    000B 0000 - 000B 7FFF         |    32KB    Mono Video Text Memory
;         |------------------------------    |
;         |    000B 8000 - 000B FFFF          |    32KB    Color Video Text Memory
;         |------------------------------    |
;         |    000C 0000 - 000C 7FFF        |    32KB    Video BIOS , read only
;         |------------------------------    |
;         |    000C 8000 - 000E FFFF         |    160KB    Adapter ROM,read only
;         |------------------------------    |
;         |    000F 0000 - 000F FFFF          |    64KB    System BIOS, read only
;         |------------------------------    |
;         |    0010 0000 - 0010 FFEF        |***64KB-16    High Memory Area,read/write  ( 1MB开始处 )
;         |------------------------------    |
;         |    0010 FFF0 -                  |            Free Extended Memory, read/write    
;         |------------------------------    |
;
;     *    空闲内存实际并非从 0000 0500处开始,BIOS数据区实际上会利用从0000 0500开始的少量字节,例如
;         00000500处保存的是打印屏幕状态,当按下打印屏幕(PrintScreen)键时,低级键盘BIOS初始化打印屏
;         幕功能,键盘BIOS触发中断5打印屏幕处理程序。正因为BIOS数据区越过了256B的界限,因此DOS实际
;         上是从0000 0522开始装载的。为保险起见,可从0000 0600开始利用空闲内存。(1.5K - 31K 29.5KB)
;
; **    有些机器上没有这段BIOS扩展数据区。
;
; ***    如果没有使用扩展高端内存区域程序(例如Emm386.exe),则从0010 0000 (1MB )开始的内存都是可用的。
;
;
;=====================================================================================
;

BITS         16            ; 生成16位代码而不是32位代码
SECTION        .TEXT         ; 代码段
ORG            0800H        ; 指定程序被装入内存的起始位置

;====================================================================
;
; NTFS启动扇区代码使用内存的情况:
;    0000 0000 - 0000 07FF         2K   IDT和BIOS数据
;    0000 0800 - 0000 2800         8K     保留给NTFS启动扇区代码,最多8K
;
;    ****:**** - 0000 7FFF        22K  堆栈区域          
;    0000:8000 - ****:****         480K 装载第二阶段程序FDOSLDR.BIN及数据的空间
;    0008 0000 - 0008 FFFF        64K  用于文件系统的缓冲区
;    0009 0000 - 0009 FFFF        64K  用于读取数据簇的缓冲区
;
;====================================================================
;
; 宏和常量定义
;
;====================================================================
?                 EQU     0        ; NASM不支持DW ?这样的语法,可以使用这样的定义
                                ; 模拟,以使代码的可读性更强
STACK_ADDR        EQU        7FD0H    ; 堆栈栈顶(注意:堆栈大小约为20K左右)
DATA_BUF_SEG    EQU        9000H    ; 用于读取根目录或文件内容的缓冲区(64K) 段地址
DATA_BUF_OFF    EQU        0000H    ; 数据缓冲区偏移
DATA_BUF_ADDR    EQU        90000H    ; 数据缓冲区线性地址
FILE_BUF_SEG    EQU        8000H    ; 文件记录缓冲区段地址
FILE_BUF_OFF    EQU        00000H    ; 文件记录缓冲区偏移
BOOT_SEC_NUM    EQU        16        ; NTFS启动扇区代码的总长度(16个扇区=8K)
BOOT_SEC_ADDR    EQU        0800H    ; NTFS启动扇区的重定位地址


; 第二阶段装载程序FDOSLDR.BIN
OSLOADER_ADDR    EQU        8000H    ; FDOSLDR.BIN放入内存中的起始位置
OSLOADER_SEG    EQU        0800H    ; 起始段地址


;====================================================================
; 用堆栈保存若干中间变量( SS = 0 BP = 7C00H )
;====================================================================
DISK_EXT_SUPPORT        EQU        1        ; BYTE    磁盘是否支持扩展BIOS    
DRIVE_NUMBER            EQU        2        ; BYTE    用于保存启动的磁盘驱动器号
BYTES_PER_FILE_RECORD    EQU        8        ; DWORD    用于保存NTFS每个文件记录的尺寸
BYTES_PER_INDEX_BLOCK    EQU        12        ; DWORD    用于保存默认的索引分配的尺寸
BYTES_PER_CLUSTER        EQU        16        ; DWORD 用于保存每簇字节数字节数


;====================================================================        
; 扩展磁盘服务所使用的地址包
;====================================================================
DAP_SECTOR_HIGH            EQU        24        ; 起始扇区号的高32位 ( 每次调用需要重置 )    DWORD
DAP_SECTOR_LOW            EQU        28        ; 起始扇区号的低32位 ( 每次调用需要重置 )    DWORD
DAP_BUFFER_SEG            EQU        30        ; 缓冲区段地址         ( 每次调用需要重置 )    WORD
DAP_BUFFER_OFF            EQU        32        ; 缓冲区偏移         ( 每次调用需要重置 )    WORD        
DAP_RESERVED2            EQU        33        ; 保留字节
DAP_READ_SECTORS        EQU        34        ; 要处理的扇区数(1 - 127 )
DAP_RESERVED1            EQU        35        ; 保留字节
DAP_PACKET_SIZE            EQU        36        ; 包的大小为16字节

;====================================================================
; NTFS系统常量
;====================================================================

; 记录类型
NTFS_RECORD_TYPE_NONE    EQU        0            ; 未知的类型
NTFS_RECORD_TYPE_FILE    EQU        0x454C4946    ; 文件记录($MFT)
NTFS_RECORD_TYPE_INDX    EQU        0x58444E49    ; 索引记录(Index Allocation)
NTFS_RECORD_TYPE_HOLE    EQU        0x454C4F48    ; 空洞记录
NTFS_RECORD_TYPE_RSTR    EQU        0x52545352    ; 重启记录($LogFile Restart Page )
NTFS_RECORD_TYPE_RCRD    EQU        0x44524352    ; 日志记录($LogFile Log Record Page)
NTFS_RECORD_TYPE_CHKD    EQU        0x424B4843    ; 检查记录($LogFile CHKDSK)
NTFS_RECORD_TYPE_BAAD    EQU        0x44414142    ; 多扇区数据写入错误(通常是由于系统断电引起)
NTFS_RECORD_TYPE_FREE    EQU        0xFFFFFFFF    ; 记录是空闲的,在使用前必须初始化

;=============================================================
; NTFS系统文件记录编号
;=============================================================
NTFS_SYSTEM_FILE_MFT        EQU        0    ; $MFT        ( Master File Table )
NTFS_SYSTEM_FILE_MFTMIRR    EQU        1    ; $MFTMirr    ( 至少前四个MFT记录的拷贝)
NTFS_SYSTEM_FILE_LOGFILE    EQU        2    ; $LogFile    ( 事务日志)    
NTFS_SYSTEM_FILE_VOLUME        EQU        3    ; $Volume    ( 卷名及卷信息以及文件系统版本 )
NTFS_SYSTEM_FILE_ATTRDEF    EQU        4    ; $AttrDef    ( 所有支持的属性定义 )
NTFS_SYSTEM_FILE_ROOT        EQU        5    ; .        ( 根目录 )
NTFS_SYSTEM_FILE_BITMAP        EQU        6    ; $Bitmap    ( 卷的数据簇分配位图 )
NTFS_SYSTEM_FILE_BOOT        EQU        7    ; $Boot    ( 卷的引导记录,指向引导扇区 )
NTFS_SYSTEM_FILE_BADCLUS    EQU        8    ; $BadClus    ( 卷的坏簇列表 )
NTFS_SYSTEM_FILE_SECURE        EQU        9    ; $Secure    ( 卷使用的安全描述符 )
NTFS_SYSTEM_FILE_UPCASE        EQU        10    ; $UpCase    ( 64K个UNICODE字符串的大写形式 )
NTFS_SYSTEM_FILE_EXTEND        EQU        11    ; $Extend    ( 包含其他系统文件的目录 $ObjId $Quota $Reparse $UsnJrnl - NTFS 3.0 )
NTFS_SYSTEM_FILE_RESERVED12    EQU        12    ; 保留
NTFS_SYSTEM_FILE_RESERVED13    EQU        13    ; 保留
NTFS_SYSTEM_FILE_RESERVED14    EQU        14    ; 保留
NTFS_SYSTEM_FILE_RESERVED15    EQU        15    ; 保留
NTFS_SYSTEM_FILE_FIRSTUSER    EQU        16    ; 第一个用户可以使用的文件记录编号

; MFT文件记录属性
NTFS_FILE_RECORD_FLAG_INUSE            EQU    0x0001    ; 正在使用
NTFS_FILE_RECORD_FLAG_DIRECTORY        EQU    0x0002    ; 是目录

;==============================================================================
;
; 属性排序规则
;
;==============================================================================
NTFS_COLLATION_BINARY                EQU    0    ; 按原始字节依次顺序比较
NTFS_COLLATION_FILE_NAME            EQU    1    ; 按UNICODE方式比较文件名(不区分大小写?)
NTFS_COLLATION_UNICODE_STRING        EQU    2    ; 按UNICODE字符串比较(区分大小写?)
NTFS_COLLATION_ULONG                EQU    16    ; 按32为无符号整数排序
NTFS_COLLATION_SID                    EQU    17    ; 按SID值排序
NTFS_COLLATION_SECURITY_HASH        EQU    18    ; 首先按哈希值排序,然后按SID排序
NTFS_COLLATION_ULONGS                EQU    19    ; 按整数序列排序(GUID?)

;==============================================================================
;
; 属性定义标志(用于属性定义结构)
;
;==============================================================================
NTFS_ATTRDEF_FLAG_INDEXABLE            EQU    0x00000002    ; 属性可以被索引
NTFS_ATTRDEF_FLAG_MULTIPLE            EQU    0x00000004    ; 属性可以出现多次
NTFS_ATTRDEF_FLAG_NOT_NULLABLE        EQU    0x00000008    ; 属性值必须至少包括一个非0字节
NTFS_ATTRDEF_FLAG_INDEXED_UNIQUE    EQU    0x00000010    ; 属性必须被索引并且必须唯一
NTFS_ATTRDEF_FLAG_NAMED_UNIQUE        EQU    0x00000020    ; 属性必须被命名并且名称必须唯一
NTFS_ATTRDEF_FLAG_RESIDENT            EQU    0x00000040    ; 属性必须是驻留的
NTFS_ATTRDEF_FLAG_LOG                EQU    0x00000080    ; 属性的修改必须记录日志,不管属性
                                                    ; 是否为驻留属性;如果没有该标志,
                                                    ; 则只记录驻留属性的修改日志
                                                    
;==============================================================================
;
; 属性类型
;
;==============================================================================
;    Type Name                    Flags    IRN        MinSize MaxSize
;------------------------------------------------------------------------------
;    0x10 $STANDARD_INFORMATION    0x40    R        0x30    0x48
;    0x20 $ATTRIBUTE_LIST        0x80    N        -        -
;    0x30 $FILE_NAME                0x42    IR        0x44    0x242
;    0x40 $VOLUME_VERSION        0x40    R        0x8        0x8
;    0x40 $OBJECT_ID                0x40    R        -        0x100
;    0x50 $SECURITY_DESCRIPTOR    0x80    N        -        -
;    0x60 $VOLUME_NAME            0x40    R        0x2        0x100
;    0x70 $VOLUME_INFORMATION    0x40    R        0xC        0xC
;    0x80 $DATA                    0x00            -        -
;    0x90 $INDEX_ROOT            0x40    R        -        -
;    0xA0 $INDEX_ALLOCATION        0x80    N        -        -
;    0xB0 $BITMAP                0x80    N        -        -
;    0xC0 $SYMBOLIC_LINK            0x80    N        -        -
;    0xC0 $REPARSE_POINT            0x80    N        -        0x4000
;    0xD0 $EA_INFORMATION        0x40    R        0x8        0x8
;    0xE0 $EA                    0x00            -        0x10000
;    0xF0 $PROPERTY_SET            -        -        -        -
;    0x100$LOGGED_UTILITY_STREAM 0x80    N        -        0x10000
;------------------------------------------------------------------------------
;
; 其中:    I - Indexable
;            N - NonNullable
;            R - Resident
;
;==============================================================================
NTFS_ATTRIBUTE_TYPE_STANDARD_INFORMATION    EQU    0x00000010    ; 标准信息
NTFS_ATTRIBUTE_TYPE_ATTRIBUTE_LIST            EQU    0x00000020    ; 属性列表
NTFS_ATTRIBUTE_TYPE_FILE_NAME                EQU    0x00000030    ; 文件名
NTFS_ATTRIBUTE_TYPE_VOLUME_VERSION            EQU    0x00000040    ; 卷版本信息(WINNT)
NTFS_ATTRIBUTE_TYPE_OBJECT_ID                EQU    0x00000040    ; 对象ID(Win2000/XP)
NTFS_ATTRIBUTE_TYPE_SECURITY_DESCRIPTOR        EQU    0x00000050    ; 安全描述符
NTFS_ATTRIBUTE_TYPE_VOLUME_NAME                EQU    0x00000060    ; 卷名称
NTFS_ATTRIBUTE_TYPE_VOLUME_INFORMATION        EQU    0x00000070    ; 卷信息
NTFS_ATTRIBUTE_TYPE_DATA                    EQU    0x00000080    ; 数据
NTFS_ATTRIBUTE_TYPE_INDEX_ROOT                EQU    0x00000090    ; 索引根目录
NTFS_ATTRIBUTE_TYPE_INDEX_ALLOCATION        EQU    0x000000A0    ; 索引分配缓冲区
NTFS_ATTRIBUTE_TYPE_BITMAP                    EQU    0x000000B0    ; 位图
NTFS_ATTRIBUTE_TYPE_SYMBOLIC_LINK            EQU    0x000000C0    ; 符号连接(WINNT)
NTFS_ATTRIBUTE_TYPE_REPARSE_POINT            EQU    0x000000C0    ; 重解析点(WIN2000/XP)
NTFS_ATTRIBUTE_TYPE_EA_INFORMATION            EQU    0x000000D0    ; 附加信息
NTFS_ATTRIBUTE_TYPE_EA                        EQU    0x000000E0    ; 附加属性
NTFS_ATTRIBUTE_TYPE_PROPERTY_SET            EQU    0x000000F0    ; 属性集(WIN2000/XP)
NTFS_ATTRIBUTE_TYPE_LOGGED_UTILITY_STREAM    EQU    0x00000100    ; 事务日志
NTFS_ATTRIBUTE_TYPE_FIRST_USER                EQU    0x00001000    ; 用户自定义属性起始值
NTFS_ATTRIBUTE_TYPE_END                        EQU    0xFFFFFFFF    ; 表明属性结束

; 属性名称最大长度
NTFS_ATTRIBUTE_NAME_LENGTH                    EQU    64            ; UNICODE字符长度

; 属性标志
NTFS_ATTRIBUTE_FLAG_COMPRESSED                EQU    0x0001        ; 压缩标志
NTFS_ATTRIBUTE_FLAG_ENCRYPTED                EQU    0x4000        ; 加密标志
NTFS_ATTRIBUTE_FLAG_SPARSE                    EQU    0x8000        ; 稀疏文件
NTFS_ATTRIBUTE_RESIDENT_FLAG_INDEXED        EQU    0x0001        ; 驻留属性被索引

;============================================================
; 文件属性
;=============================================================
NTFS_FILE_FLAG_READONLY                        EQU    0x00000001        ; 只读标志
NTFS_FILE_FLAG_HIDDEN                        EQU    0x00000002        ; 隐藏标志
NTFS_FILE_FLAG_SYSTEM                        EQU    0x00000004        ; 系统标志
NTFS_FILE_FLAG_VOLUME                        EQU    0x00000008        ; 卷标标准(NTFS不使用)
NTFS_FILE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值