windows内核源码详尽分析系统篇.pdfVIP

  1. 1、本文档共114页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

文件系统

一台机器上可以安装很多物理介质来存放资料(如磁盘、光盘、软盘、U盘等)。各种物理介质千差万别,

都配备有各自的驱动程序,为了统一地访问这些物理介质,windows设计了文件系统机制。应用程序要访

问存储在那些物理介质上的资料时,无需直接访问,只需借助文件系统即可对其有效访问。各种物理介质

的存储方式千差万别,文件系统则按照‘文件’的概念,把要存储的资料以文件为单位进行存放,然后,

读取的时候也以文件为单位进行读取。当应用程序要访问资料时,只需指明‘文件名+文件内偏移’,文件

系统自然就能找到实际要访问的东西物理存放在物理介质内的何处。这样,系统就能有效的管理物理介质

上的资料。

【说到底,文件系统本质上其实就是一种如何组织数据在磁盘上进行存放的方式而已】

比如,应用程序指定要读取f文件内偏移为o处的一个字节内容,文件系统会计算出偏移o落在该文件的

哪一个簇中,以及簇内偏移co。然后算出该f文件的那个簇在磁盘上的位置,加上簇内偏移co,便可得出

具体的磁盘偏移了(不过这个磁盘偏移仍只是一个逻辑磁盘偏移,即卷偏移,下层的磁盘驱动会再将卷偏

移转换为物理磁盘偏移,最终再将物理磁盘偏移转换成盘片号、柱面号、扇区号三维的物理地址)

分区:磁盘设备才有分区。不过,光盘、U盘、软盘等整个设备也看做是一个分区。

磁盘卷:即上面的磁盘分区。磁盘卷设备对象名像\Device\HarddiskN\PartitionN形式

文件卷:挂载(即绑定)在分区上的文件系统卷。文件卷设备对象都是无名对象

每个磁盘卷都有一个C,D,E之类的盘符,由系统分配。

系统在启动初始化阶段,会为本机上的所有物理存储介质中的所有分区分配盘符,我们看看是如何分配的。

VOID//给所有分区分配盘符

xHalIoAssignDriveLetters(INPLOADER_PARAMETER_BLOCKLoaderBlock,

INPSTRINGNtDeviceName,

OUTPUCHARNtSystemPath,

OUTPSTRINGNtSystemPathString)

{

Status=RtlAnsiStringToUnicodeString(BootDevice,NtDeviceName,TRUE);

//获取系统中的硬件配置信息(磁盘、光盘、软盘个数)

ConfigInfo=IoGetConfigurationInformation();

RDiskCount=xHalpGetRDiskCount();//获取可引导磁盘个数(指物理磁盘)

Buffer1=(PWSTR)ExAllocatePool(PagedPool,64*sizeof(WCHAR));

Buffer2=(PWSTR)ExAllocatePool(PagedPool,32*sizeof(WCHAR));

PartialInformation=(PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePool(PagedPool,

sizeof(KEY_VALUE_PARTIAL_INFORMATION)+sizeof(REG_DISK_MOUNT_INFO));

//DiskMountInfo表示盘符分配信息

DiskMountInfo=(PREG_DISK_MOUNT_INFO)PartialInformation-Data;

RtlInitUnicodeString(UnicodeString1,L\\Registry\\Machine\\SYSTEM\\MountedDevices);

InitializeObjectAttributes(ObjectAttributes,UnicodeString1,OBJ_CASE_INSENSITIVE,

NULL,NULL);

//这个键记录了上次开机时各个盘符的分配信息

ZwOpenKey(hKey,KEY_ALL_ACCESS,ObjectAttributes);

//为每个磁盘的第一个分区创建一个符号链接

for(i=0;iConfigInfo-DiskCount;i++)

{

文档评论(0)

zhishifuwu + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档