1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
struct exfat_super_block { uint8_t jump[3]; /* 0x00 jmp and nop instructions */ uint8_t oem_name[8]; /* 0x03 "EXFAT " */ uint8_t __unused1[53]; /* 0x0B always 0 */ le64_t sector_start; /* 0x40 partition first sector */ le64_t sector_count; /* 0x48 partition sectors count */ le32_t fat_sector_start; /* 0x50 FAT first sector */ le32_t fat_sector_count; /* 0x54 FAT sectors count */ le32_t cluster_sector_start; /* 0x58 first cluster sector */ le32_t cluster_count; /* 0x5C total clusters count */ le32_t rootdir_cluster; /* 0x60 first cluster of the root dir */ le32_t volume_serial; /* 0x64 volume serial number */ struct /* 0x68 FS version */ { uint8_t minor; uint8_t major; } version; le16_t volume_state; /* 0x6A volume state flags */ uint8_t sector_bits; /* 0x6C sector size as (1 << n) */ uint8_t spc_bits; /* 0x6D sectors per cluster as (1 << n) */ uint8_t fat_count; /* 0x6E always 1 */ uint8_t drive_no; /* 0x6F always 0x80 */ uint8_t allocated_percent; /* 0x70 percentage of allocated space */ uint8_t __unused2[397]; /* 0x71 always 0 */ le16_t boot_signature; /* the value of 0xAA55 */ } struct exfat_entry /* common container for all entries */ { uint8_t type; /* any of EXFAT_ENTRY_xxx */ uint8_t data[31]; } struct exfat_entry_bitmap /* allocated clusters bitmap */ { uint8_t type; /* EXFAT_ENTRY_BITMAP */ uint8_t __unknown1[19]; le32_t start_cluster; le64_t size; /* in bytes */ } struct exfat_entry_upcase /* upper case translation table */ { uint8_t type; /* EXFAT_ENTRY_UPCASE */ uint8_t __unknown1[3]; le32_t checksum; uint8_t __unknown2[12]; le32_t start_cluster; le64_t size; /* in bytes */ } struct exfat_entry_label /* volume label */ { uint8_t type; /* EXFAT_ENTRY_LABEL */ uint8_t length; /* number of characters */ le16_t name[EXFAT_ENAME_MAX]; /* in UTF-16LE */ } struct exfat_entry_meta1 /* file or directory info (part 1) */ { uint8_t type; /* EXFAT_ENTRY_FILE */ uint8_t continuations; le16_t checksum; le16_t attrib; /* combination of EXFAT_ATTRIB_xxx */ le16_t __unknown1; le16_t crtime, crdate; /* creation date and time */ le16_t mtime, mdate; /* latest modification date and time */ le16_t atime, adate; /* latest access date and time */ uint8_t crtime_cs; /* creation time in cs (centiseconds) */ uint8_t mtime_cs; /* latest modification time in cs */ uint8_t __unknown2[10]; } struct exfat_entry_meta2 /* file or directory info (part 2) */ { uint8_t type; /* EXFAT_ENTRY_FILE_INFO */ uint8_t flags; /* combination of EXFAT_FLAG_xxx */ uint8_t __unknown1; uint8_t name_length; le16_t name_hash; le16_t __unknown2; le64_t real_size; /* in bytes, equals to size */ uint8_t __unknown3[4]; le32_t start_cluster; le64_t size; /* in bytes, equals to real_size */ } struct exfat_entry_name /* file or directory name */ { uint8_t type; /* EXFAT_ENTRY_FILE_NAME */ uint8_t __unknown; le16_t name[EXFAT_ENAME_MAX]; /* in UTF-16LE */ } |
月度归档:2012年05月
VHDX 虚拟磁盘格式结构
Windows 8中支持的VHDX虚拟磁盘格式,以下是虚拟磁盘结构代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
//Structure 1: File Type Identifier struct VHDX_FILE_IDENTIFIER { UINT64 Signature; UINT16 Creator[256]; }; //Structure 2: Header struct VHDX_HEADER { UINT32 Signature; UINT32 Checksum; UINT64 SequenceNumber; GUID FileWriteGuid; GUID DataWriteGuid; GUID LogGuid; UINT16 LogVersion; UINT16 Version; UINT32 LogLength; UINT64 LogOffset; UINT8[502] Reserved; }; //Structure 3: Region Table Header struct VHDX_REGION_TABLE_HEADER { UINT32 Signature; UINT32 Checksum; UINT32 EntryCount; UINT32 Reserved; }; //Structure 4: Region Table Entry struct VHDX_REGION_TABLE_ENTRY { GUID Guid; UINT64 FileOffset; UINT32 Length; UINT32 Required:1; UINT32 Reserved:31; }; //Structure 5: Log Entry Header struct VHDX_LOG_ENTRY_HEADER { UINT32 Signature; UINT32 Checksum; UINT32 EntryLength; UINT32 Tail; UINT64 SequenceNumber; UINT32 DescriptorCount; UINT32 Reserved; GUID LogGuid; UINT64 FlushedFileOffset; UINT64 LastFileOffset; }; //Structure 6: Log Zero Descriptor struct VHDX_LOG_ZERO_DESCRIPTOR { UINT32 ZeroSignature; UINT32 Reserved; UINT64 ZeroLength; UINT64 FileOffset; UINT64 SequenceNumber; }; //Structure 7: Log Data Descriptor struct VHDX_LOG_DATA_DESCRIPTOR { UINT32 DataSignature; UINT32 TrailingBytes; UINT64 LeadingBytes; UINT64 FileOffset; UINT64 SequenceNumber; }; //Structure 8: Log Data Sector struct VHDX_LOG_DATA_SECTOR { UINT32 DataSignature; UINT32 SequenceHigh; UINT8 Data[4084]; UINT32 SequenceLow; }; //Structure 9: BAT Entry struct VHDX_BAT_ENTRY { UINT64 State:3; UINT64 Reserved:17; UINT64 FileOffsetMB:44; }; //Structure 10: Metadata Table Header struct VHDX_METADATA_TABLE_HEADER { UINT64 Signature; UINT16 Reserved; UINT16 EntryCount; UINT32 Reserved2[5]; }; //Structure 11: Metadata Table Entry struct VHDX_METADATA_TABLE_ENTRY { GUID ItemId; UINT32 Offset; UINT32 Length; UINT32 IsUser:1; UINT32 IsVirtualDisk:1; UINT32 IsRequired:1; UINT32 Reserved:29; UINT32 Reserved2; }; //Structure 12: File Parameters Metadata Item struct VHDX_FILE_PARAMETERS { UINT32 BlockSize; UINT32 LeaveBlocksAllocated:1; UINT32 HasParent:1; UINT32 Reserved:30; }; //Structure 13: Virtual Disk Size Metadata Item struct VHDX_VIRTUAL_DISK_SIZE { UINT64 VirtualDiskSize; }; //Structure 14: Page 83 Data Metadata Item struct VHDX_PAGE83_DATA { GUID Page83Data; }; //Structure 15: Logical Sector Size Metadata Item struct VHDX_VIRTUAL_DISK_LOGICAL_SECTOR_SIZE { UINT32 LogicalSectorSize; }; //Structure 16: Logical Sector Size Metadata Item struct VHDX_VIRTUAL_DISK_PHYSICAL_SECTOR_SIZE { UINT32 PhysicalSectorSize; }; //Structure 17: Parent Locator Header struct VHDX_PARENT_LOCATOR_HEADER { GUID LocatorType; UINT16 Reserved; UINT16 KeyValueCount; }; //Structure 18: Parent Locator Entry struct VHDX_PARENT_LOCATOR_ENTRY { UINT32 KeyOffset; UINT32 ValueOffset; UINT16 KeyLength; UINT16 ValueLength; }; |
ReFS文件系统结构
ReFS文件系统是微软为新的服务器版本准备的文件系统,具体介绍可以参阅“ReFS文件系统介绍”,里面介绍的非常详细,目前还没有发现针对ReFS文件系统研究的资料,以下是我自己摸索出来的,仅供参考。
ReFS文件系统使用的分区类型描述依然是07,与NTFS一样,DBR部分如下所示,把我做的WinHex模板贴出来。
/*------------------------------------------------------------------------------------------*/
template "Boot Sector ReFS"
description "Boot sector of an ReFS partition"
applies_to disk
sector-aligned
requires 0x03 "52 65 46 53" // ID must be "ReFS"
begin
move 3
char[4] "File system ID"
move 9
char[4] "FSRS"
uint16 "Bytes per sector ?"
hex 2 "Unknown"
int64 "Total sectors"
uint32 "Bytes per sector ?"
uint32 "Sectors per cluster"
hex 8 "01 01 00 00 00 00 00 00"
move 8
hex 4 "32-bit serial number (hex)"
move -4
hex 8 "64-bit serial number (hex)"
end
/*------------------------------------------------------------------------------------------*/
httpd.ini 伪静态设置
什么是网页的伪静态技术?
使用ISAPI Rewrite与Apache Rewrite是有区别的,主要是URL重写规则细节上,ISAPI[一般是windows系统]重写需要使用httpd.ini文件,而Apache[一般是unix系统]则使用.htaccess文件,通过对URL重写实例谈谈使用httpd.ini文件基于ISAPI Rewrite重写URL路径。目前使用的是wordpress程序,虽然前台已经全部重新架构,但URL路径还是使用原有简单的URL,如一篇文章的URL路径:http://www.adminjet.com/?p=1119,分类使用?cat=162等。
本文以httpd.ini重写文章URL路径为例,其它URL重写原理一样。
重写前URL路径:http://www.adminjet.com/p1119.html[这是需要实现的URL地址]
重写后URL路径:http://www.adminjet.com/?p=1119[这也是当前的URL地址]
一,新建httpd.ini文件
二,打开httpd.ini文件并增加如下重写规则
- [ISAPI_Rewrite]
- RewriteRule ^/p([0-9]+)\.html /index\.php\?p=$1 [L]
注意其中的一些细节,反斜杠\部分,这个非常重要[或许你会漏掉这句话,但如果你看到了将会省很多的调试时间],对于特殊字符要使用反斜杠\。
- RewriteRule ^/p([0-9]+)\.html /index\.php\?p=$1 [L]
其规则为匹配使有p开头的字符,其中参数部分$1只能是数字[0-9],并以.html结束,如p1119.html,就会匹配为index.php?p=1119,这样程序就能正常的读取ID为1119的文章。
三,上传到你空间的根目录
四,开始调试,调试过程可多刷新页面
同样的URL重写,如果是在apache下的.htaccess则使用如下语句:
- RewriteEngine on
- RewriteRule ^p([0-9]*).html$ index.php?p=$1 [L]
现在来对比这两者的区别:
- ISAPI Rewrite:
- RewriteRule ^/p([0-9]+)\.html /index\.php\?p=$1 [L]
- Apache Rewrite:
- RewriteRule ^p([0-9]*).html$ index.php?p=$1 [L]
区别就是一些反斜杠,这对于调试非常重要,其它具体的知识大家可参考相应的文档,简单实现你的ISAPI Rewrite重写URL路径。
ASP网站程序在国内运用很广,但是类似于im286.asp?id=20050307213811这样的URL有点不利于搜索引擎的收录,也就是说不符合友好URL(URLs-Friendly)的标准,那么我们用ISAPI_Rewrite打造一个Clean URL,
1.下载ISAPI_Rewrite.ISAPI_Rewrite分精简(Lite)和完全(Full)版.精简版不支持对每个虚拟主机站点进行重写,只能进行全局处理.不过对于有服务器的朋友,精简版也就够啦.精简版下载地址:http://www.helicontech.com /download/,就是那Lite Version (free)啦.
2.安装.msi的文件,和装一般程序一样装就可以了,俺就装在D:\ISAPI_Rewrite.
3.接下来一步比较重要哦,看仔细喽.打开Internet 信息服务,右键,web站点属性,电ISAPI筛选器选项卡.添加筛选器,名称自己填,路径自己指定ISAPI_Rewrite.dll,然后确定.
4.来测试一下.新建一个1ting.asp,里面写上
<%=request.querystring("inso")%>
,效果就是执行的时候1ting.asp?inso=*浏览器显示*.
5.这一步很重要哦,开始添加rewrite规则.正则,好头痛,幸亏这个例子比较简单.
找到ISAPI_Rewrite目录,把httpd.ini的只读属性去掉,打开编辑.我们要把1ting.asp?inso=im286映射成为1ting-im286.html这样的类型,需要在httpd.ini里加上这么一行:
RewriteRule /1ting-([0-9,a-z]*).html /1ting.asp\?inso=$1
,保存.
6.来来来,到浏览器里查看一下效果吧.输入http://127.0.0.1/1ting.asp?inso=im286和http://127.0.0.1/1ting-im286.html,显示的内容是不是都是im286?这就证明成功啦!
嘿嘿,1ting-im286.html这样的页面要比1ting.asp?inso=im286容易收入,所以现在还在用动态方式的朋友可以尝试一下这样的静态映射效果. IIS Rewrite也可以实现这样的功能。
------------------------------------------------------
ASP之URL重写
下载ISAPI_Rewrite解压到任意文件夹安装,给IIS用户读取权限,在IIS右键点击一个站点,属性,ISAPI筛选器,添加,筛选器名称一定得叫 re,可执行文件就点浏览找到你解压的目录Rewrite.dll加上即可。
重启IIS后应该就能支持URL重写规则了。
需要修改解压目录中的httpd.ini这个文件
RewriteRule /info_(\d+)\.htm /info\.asp\?id=$1 [N,I]
这句话就可以把提交的地址http://www.xxx.com/info_122.htm映射到真正的地址 http://www.xxx.com/info.asp?id=122
如果你在处理数据翻页,那么写法是:
More_<%=Page%>_<%=type%>.html (注:page是翻页页数,type是数据类型)
表现形式:More_1_95.html
如果翻下一页,则为:More_2_95.html,继续下一页的循环,则是:
More_3_95.html,以此类推。
不过你需要在httpd.ini文件中增加以下代码:
RewriteRule /More_(\d+)_(\d+)\.html /jsp/more\.jsp\?page=$1&type=$2 [N,I]
如果你的动态程序有多个参数需要传递,那么就增加多个(\d+)即可,如下:
RewriteRule /More_(\d+)_(\d+)_(\d+)\.html /jsp/more\.jsp\?page=$1&type=$2&type2=$3 [N,I]
翻页处理表现形式是:More_1_95.html
如果想把http://www.xxx.com/info.asp?id=50#abc 转换成静态的网页
因为#abc是程序处理了ID=50这个变量生成静态页面之后按锚点又做了一次页内链接,所以应该这么做映射
http://www.xxx.com/info.asp?id=50#abc转 69
换成http://www.xxx.com/info_50.htm#abc,重写规则如下:
RewriteRule /info_(\d+)\.htm#(\d+) /info\.asp\?id=$1#$2 [N,I]
注意:以前在Window 2000 IIS5.0一直使用ISAPI_Rewrite进行动态链接重写HTML静态网址,
硬盘变小恢复方法
我的硬盘的容量莫名其妙的减小了!怎样可以恢复它的原始容量?
有下面几种原因会导致你的硬盘丢失数M甚至数G的空间:
- 你的操作系统不支持LBA48位寻址模式
- 你混淆了二进制和十进制的表示方法
- 你的电脑主板在你的硬盘上创建了一个隐藏的区域用来备份二进制代码
- 你的电脑/笔记本电脑生产商在你的硬盘上创建了一个隐藏的区域来备份操作系统的安装文件(系统自动恢复)
- 你使用了某种软件设置了HPA(Host Protected Area,主机保护区),破坏了DCO(Device Configuration Overlay,设备配置代码),或者关闭了LBA48的支持
- 跳线设置错误
- 硬盘的故障
现在我将逐条的进行详细分析。
-
操作系统不支持LBA-48位寻址模式
Windows 95,Windows98和Windows ME即使安装了所有的补丁也不能支持大硬盘(>137GB)。虽然有方法可以解决这个问题,但是由于现在很少使用这些系统了,所有就没有必要再啰嗦了。
Windows 2000,2003,和XP默认设置是不支持大硬盘的;你必须安装最新的补丁包来支持大硬盘。Windows XP SP2版可以完美的支持大硬盘;
Windows 2000必须安装补丁文件。
Windows Vista可以完美的支持大硬盘。
- 二进制和十进制的表示方法
硬盘生产商使用十进制来表示,而操作系统使用二进制来表示。十进制的G表示1,000,000,000个字节(1000 x 1000 x 1000),而二进制的G表示1,073,741,824字节(1024 x 1024 x 1024)--相差7%!所以,你的300GB的硬盘在Windows系统中会显示为279GB。
- 主板创建了HPA
主板再硬盘上创建了一个主机保护区来存储数据。通常这个区域不会大于10M,所以不用为此担心。
- 电脑/笔记本生产商创建了HPA
电脑生产商在你的硬盘商创建了一个主机保护区来存储操作系统和程序的镜像。当进行系统恢复时就会用到这个区域中的护具。通常这个区域比较大(8-20GB)。
在这种情况下,使用一些专业的工具,如HDD Capacity Restore或MHDD可以恢复硬盘的原始容量。要进行此操作,需要将硬盘从原来的主机上拆卸下来安装到其它主机上因为原来的主机为了防止破坏隐藏区域,可能会禁用HPA/DCO指令。
- 可以设置HPA和DCO的软件
例如,MHDD。MHDD可以在硬盘上设置HPA,因此硬盘的容量无论在BIOS中还是在操作系统中都会减小。MHDD还可以访问DCO(设备配置码),它不但可以更改硬盘的容量,还可以设置硬盘的功能,例如LBA48支持,加密指令等。
有些生产商(如Dell和HP)由于市场的原因人为使用DCO来减小硬盘容量。例如:他们要生产1,000,000台配置40GB硬盘的计算机,但是他们的仓库里只有80GB的硬盘。他们就会使用他们自己的DCO工具来将硬盘的容量锁定为40GB。
- 跳线设置硬盘的容量
大部分硬盘都有一个特别的跳线设置方法来将硬盘的容量限制为32GB或128(137)GB。
- 硬盘故障
例如硬盘固件缺陷(这种现象是非常多的)。
另外,有时候MBR主引导区损坏也可能或导致BIOS或操作系统不能检测到正确的硬盘容量。在这种情况下需要使用清零工具来将MBR清零。
有时候,一个严重损坏的硬盘也可能会显示错误的容量。在这种情况下你无法修复它。
- 解决方法:恢复硬盘容量
1、检查跳线。一般在硬盘的表面都有跳线设置说明,按照说明正确设置跳线。
2、检查你的操作系统,是否安装了所有的升级补丁?
3、检查硬盘分区。运行Windows磁盘管理器,查看是否有未分区的空间。
4、如果以上方法都没有解决问题,那么可以使用下面这个工具来分析你的硬盘的LBA48,HPA和DCO状态并将其恢复为原始设置。
HDD Capacity Restore程序
你所需要做的即使运行它并点击Restore Capacity。然后此程序就会完成所有的工作。
强烈建议你在运行此程序之前先关闭计算机断电再启动。
如果此程序没有成功恢复硬盘空间,那么很可能是你的电脑主板阻止了HPA和DCO命令。你可以在BIOS设置中查看是否有DCO或HPA字样。如果还不行,就换一台电脑。如果你足够勇敢,你也可以这样做:运行程序,选择你的硬盘,然后当你看到Restore Capacity按钮时,关闭硬盘的电源然后再加电。注意:你要自己承担所有的后果!
当程序运行完毕后(3-20秒),你需要关闭你的电脑的电源,等待10-20秒钟再打开。