首页 电脑 电脑学堂 查看内容

NTFS分区的引导记录源码

2009-7-17 09:11 761 0

摘要:       NTFS文件系统有着非常优秀的特性,其安全性、可靠性都远胜于我们常用的FAT文件系统,但是微软公司出于商业目的没有公布它的规范,使得这种优...

      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
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部