分享
 
 
 

NTFS分区的引导记录源码

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

NTFS文件系统有着非常优秀的特性,其安全性、可靠性都远胜于我们常用的FAT文件系统,但是微软公司出于商业目的没有公布它的规范,使得这种优秀的文件系统只能在Windows NT架构的操作系统中使用。

不过先辈们唱得好:“没有枪没有炮,敌人给我们造!”。不管微软再怎么保密,它自己总要使用NTFS文件系统。那我们就通过分析它的代码来研究NTFS文件系统的规范呐。下面就列出小弟在仔细分析之后制做的Windows 2000 build 2195版格式化的NTFS分区的引导记录的源代码,以此与各位同好共勉。

本代码在MASM 6.11下编译通过。其中与分区结构相关的数据仅适用于在下自己分的分区,各位引用时请自行代入正确的值。

.486

Title NTFS $Boot of Windows 2000 build 2195

Code SEGMENT BYTE PUBLIC USE16 'CODE'

ASSUME CS:Code,DS:Code

NTFS PROC FAR

START: JMP SHORT Loader

DB 90H

PartitionID DB 'NTFS '

BytePerSector DW 512

SectorPerCluster DB 1

SectorNumWanted DW 0

SectorWanted DD 0

SupportExtendInt13Flag DB 0

StorageMedia DB 0F8H

DB 0,0

SectorPerTrack DW 3FH

Heads DW 0FFH

HiddenSector DD 3FH

CHSMaxSectorNum DD 0

CurrentDisk DB 81H

DB 0,8,0

SectorsInPartition DD 3E81FFH

DD 0

MFTPosition DD 0C5A70H

DD 0

MFTMirrPosition DD 1FCD0AH

DD 0

ClusterPerFRS DD 2

DB 08H,0,0,0,0F6H,79H

DB 58H,5CH,0BBH,58H,5CH,0F4H

DB 0,0,0,0

Loader: CLI ; Disable interrupts

XOR AX,AX

MOV SS,AX

MOV SP,7C00H ; Initalize stack

STI ; Enable interrupts

MOV AX,7C0H

MOV DS,AX

CALL GetCHSMaxSectorNum

MOV AX,0D00H

MOV ES,AX

XOR BX,BX

MOV BYTE PTR DS:[SectorNumWanted],10H

CALL ReadSector

PUSH 0D00H

PUSH 26AH

RETF

NTFS ENDP

;-----------------------------------------------------------------------------

GetCHSMaxSectorNum PROC NEAR

MOV DL,DS:[CurrentDisk]

MOV AH,8

INT 13H

JNC Lost

MOV CX,0FFFFH

MOV DH,CL

Lost: MOVZX EAX,DH

INC AX

MOVZX EDX,CL

AND DL,3FH

MUL DX

XCHG CL,CH

SHR CH,6

INC CX

MOVZX ECX,CX

MUL ECX

MOV DS:CHSMaxSectorNum,EAX

RET

GetCHSMaxSectorNum ENDP

;-----------------------------------------------------------------------------

IsSupportExtendInt13 PROC NEAR

MOV AH,41H

MOV BX,55AAH

MOV DL,DS:CurrentDisk

INT 13H ; Is support extend int 13h

JC SHORT NotSupport ; Jump if carry Set

CMP BX,0AA55H

JNE SHORT NotSupport ; Jump if not equal

TEST CL,1

JZ SHORT NotSupport ; Jump if zero

INC BYTE PTR DS:SupportExtendInt13Flag

NotSupport: RET

IsSupportExtendInt13 ENDP

;-----------------------------------------------------------------------------

;Function : read number indicated by [WantedSecotrNum] sectors at [WantedSector] to ES:BX

ReadSector PROC NEAR

PUSHAD ; Save all regs

PUSH DS

PUSH ES

GetReadParam: MOV EAX,DS:[SectorWanted]

ADD EAX,DS:[HiddenSector]

CMP EAX,DS:[CHSMaxSectorNum]

JB NEAR PTR ReadByOldInt13

; Sector number is less than CHSMaxSectorNum , use origin int 13h

PUSH DS

; PUSH DWORD PTR 0

DB 66H,6AH,0

PUSH EAX

PUSH ES

PUSH BX

PUSH DWORD PTR 10010H

CMP BYTE PTR DS:SupportExtendInt13Flag,0

JNE NEAR PTR Supported

CALL IsSupportExtendInt13

CMP BYTE PTR DS:SupportExtendInt13Flag,0

JE NEAR PTR FatalFault

Supported: MOV AH,42H

MOV DL,DS:[CurrentDisk]

PUSH SS

POP DS

MOV SI,SP

INT 13H ; read sector

POP EAX

POP BX

POP ES

POP EAX

POP EAX

POP DS

JMP SHORT OneSectorRead

ReadByOldInt13: XOR EDX,EDX

MOVZX ECX,WORD PTR DS:[SectorPerTrack]

DIV ECX

INC DL

MOV CL,DL

MOV EDX,EAX

SHR EDX,10H

DIV WORD PTR DS:[Heads]

XCHG DL,DH

MOV DL,DS:[CurrentDisk]

MOV CH,AL

SHL AH,6

OR CL,AH ; Build read sector parameters

MOV AX,201H

INT 13H ; Read sector

OneSectorRead: JC NEAR PTR FatalFault ; Read error,shut down

MOV AX,ES

ADD AX,20H

MOV ES,AX

INC DWORD PTR DS:[SectorWanted]

DEC WORD PTR DS:[SectorNumWanted]

JNZ GetReadParam ; Fixup parameters

POP ES

POP DS

POPAD ; Restore all regs

RET

FatalFault:: MOV AL,ReadDiskErrorOffset

ReadSector ENDP

;-----------------------------------------------------------------------------

DispFatalMsg:: CALL PrintString

MOV AL,ShutDownMsgOffset

CALL PrintString ; Display shutdown message

STI ; Enable interrupts

ShutDown: JMP SHORT ShutDown ; Crash

;-----------------------------------------------------------------------------

PrintString PROC NEAR

MOV AH,1

MOV SI,AX

LoadChar: LODSB

CMP AL,0

JZ SHORT PrintStringEnd

MOV AH,0EH

MOV BX,7

INT 10H

JMP SHORT LoadChar

PrintStringEnd: RET

PrintString ENDP

;-----------------------------------------------------------------------------

ReadDiskError DB 0DH, 0AH, 'A disk read error occurred', 0

MissNTLDRError DB 0DH, 0AH, 'NTLDR is missing', 0

NTLDRCompressed DB 0DH, 0AH, 'NTLDR is compressed', 0

ShutDownMsg DB 0DH, 0AH, 'Press Ctrl+Alt+Del to restart',0DH,0AH,0

DB 13 DUP (0)

ReadDiskErrorOffset DB 83H ;OFFSET ReadDiskError

MissNTLDRErrorMsg DB 0A0H ;OFFSET MissNTLDRError

NTLDRComperssedOffset DB 0B3H ;OFFSET NTLDRCompressed

ShutDownMsgOffset DB 0C9H ;OFFSET ShutDownMsg

DB 0, 0

BootValidFlag DW 0AA55H

UnicodeNTLDR DW 5

DB "N",0,"T",0,"L",0,"D",0,"R",0

UnicodeDirectory:

DW 4

DB "S",0,"I",0,"3",0,"0",0

AttributePoint DD 0E000H

MFTPoint DD 3000H

MFTNumber DD 0

TempRootBuffer DD 0

TempDirBuffer DD 0

TempBitmapBuf DD 0

RootAttribute DD 0

DirEntryList DD 0

BitmapAttribute DD 0

TempMFT DD 0

DD 0

TempDataBuf DD 0

BitampPoint DD 0

ParamTailPoint DD 0

BytePerCluster DD 0

MFTSize DD 0

MFTSizeBySector DD 909012EBH

MFTTail DD 0

BytePerRecord DD 0

DATA_46 DD 0

SectorPerRecord DD 0

Booting: MOV AX,CS

MOV DS,AX

SHL AX,4

CLI

MOV SP,AX ; Initalize stack

STI ; Enable interrupts

CALL GetCHSMaxSectorNum

MOVZX EAX,WORD PTR [BytePerSector]

MOVZX EBX,BYTE PTR [SectorPerCluster]

MUL EBX

MOV [BytePerCluster],EAX

MOV ECX,[ClusterPerFRS]

CMP CL,0

JG NEAR PTR IsMFTSize

NEG CL

MOV EAX,1

SHL EAX,CL

JMP SHORT LOC_14

DB 90H

IsMFTSize: MOV EAX,BytePerCluster

MUL ECX

LOC_14: MOV [MFTSize],EAX

MOVZX EBX,WORD PTR [BytePerSector]

XOR EDX,EDX

DIV EBX

MOV [MFTSizeBySector],EAX ; Count sector number occurpied by MFT

CALL FindLastMFT

MOV ECX,[ParamTailPoint]

MOV [TempRootBuffer],ECX

ADD ECX,[MFTSize]

MOV [TempDirBuffer],ECX

ADD ECX,[MFTSize]

MOV [TempBitmapBuf],ECX

ADD ECX,[MFTSize]

MOV [TempMFT],ECX

ADD ECX,[MFTSize]

MOV [TempDataBuf],ECX

MOV EAX,90H

MOV ECX,[TempRootBuffer]

CALL GetAttributePos

OR EAX,EAX

JZ FatalFault

MOV [RootAttribute],EAX

MOV EAX,0A0H

MOV ECX,[TempDirBuffer]

CALL GetAttributePos

MOV [DirEnt

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有