os实验指导书(新)1(2) 下载本文

______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

4、 程序清单

清单4-1 了解和检测进程的虚拟内存空间 // 工程vmwalker

#include #include #include #include

#pragma comment(lib, \

// 以可读方式对用户显示保护的辅助方法。

// 保护标记表示允许应用程序对内存进行访问的类型 // 以及操作系统强制访问的类型

inline bool TestSet(DWORD dwTarget, DWORD dwMask) {

return ((dwTarget &dwMask) == dwMask) ; }

# define SHOWMASK(dwTarget, type) \\ if (TestSet(dwTarget, PAGE_##type) ) \\ {std :: cout << \

void ShowProtection(DWORD dwTarget) {

SHOWMASK(dwTarget, READONLY) ; SHOWMASK(dwTarget, GUARD) ; SHOWMASK(dwTarget, NOCACHE) ; SHOWMASK(dwTarget, READWRITE) ; SHOWMASK(dwTarget, WRITECOPY) ; SHOWMASK(dwTarget, EXECUTE) ;

SHOWMASK(dwTarget, EXECUTE_READ) ;

SHOWMASK(dwTarget, EXECUTE_READWRITE) ; SHOWMASK(dwTarget, EXECUTE_WRITECOPY) ; SHOWMASK(dwTarget, NOACCESS) ; }

// 遍历整个虚拟内存并对用户显示其属性的工作程序的方法 void WalkVM(HANDLE hProcess) {

// 首先,获得系统信息 SYSTEM_INFO si;

36

:: ZeroMemory(&si, sizeof(si) ) ; :: GetSystemInfo(&si) ;

// 分配要存放信息的缓冲区 MEMORY_BASIC_INFORMATION mbi;

:: ZeroMemory(&mbi, sizeof(mbi) ) ;

// 循环整个应用程序地址空间

LPCVOID pBlock = (LPVOID) si.lpMinimumApplicationAddress; while (pBlock < si.lpMaximumApplicationAddress) {

// 获得下一个虚拟内存块的信息 if (:: VirtualQueryEx(

hProcess, // 相关的进程 pBlock, // 开始位置 &mbi, // 缓冲区 sizeof(mbi))==sizeof(mbi) ) // 大小的确认 {

// 计算块的结尾及其大小

LPCVOID pEnd = (PBYTE) pBlock + mbi.RegionSize; TCHAR szSize[MAX_PATH];

:: StrFormatByteSize(mbi.RegionSize, szSize, MAX_PATH) ;

// 显示块地址和大小

std :: cout.fill ('0') ; std :: cout

<< std :: hex << std :: setw(8) << (DWORD) pBlock << \

<< std :: hex << std :: setw(8) << (DWORD) pEnd << (:: strlen(szSize)==7? \ << \

// 显示块的状态 switch(mbi.State) {

case MEM_COMMIT :

std :: cout << \ break;

case MEM_FREE :

std :: cout << \ break;

case MEM_RESERVE :

std :: cout << \ break; }

// 显示保护

if(mbi.Protect==0 && mbi.State!=MEM_FREE)

37

{

mbi.Protect=PAGE_READONLY; }

ShowProtection(mbi.Protect);

// 显示类型

switch(mbi.Type){ case MEM_IMAGE :

std :: cout << \ break;

case MEM_MAPPED:

std :: cout << \ break;

case MEM_PRIVATE :

std :: cout << \ break; }

// 检验可执行的影像

TCHAR szFilename [MAX_PATH] ; if (:: GetModuleFileName (

(HMODULE) pBlock, // 实际虚拟内存的模块句柄 szFilename, //完全指定的文件名称 MAX_PATH)>0) //实际使用的缓冲区大小 {

// 除去路径并显示

:: PathStripPath(szFilename) ;

std :: cout << \ }

std :: cout << std :: endl; // 移动块指针以获得下一下个块 pBlock = pEnd; } } }

void ShowVirtualMemory() {

// 首先,让我们获得系统信息 SYSTEM_INFO si;

:: ZeroMemory(&si, sizeof(si) ) ; :: GetSystemInfo(&si) ;

// 使用外壳辅助程序对一些尺寸进行格式化 TCHAR szPageSize[MAX_PATH];

::StrFormatByteSize(si.dwPageSize, szPageSize, MAX_PATH) ;

38

DWORD dwMemSize = (DWORD)si.lpMaximumApplicationAddress - (DWORD) si.lpMinimumApplicationAddress; TCHAR szMemSize [MAX_PATH] ;

:: StrFormatByteSize(dwMemSize, szMemSize, MAX_PATH) ;

// 将内存信息显示出来

std :: cout << \

std :: cout.fill ('0') ;

std :: cout << \ << std :: hex << std :: setw(8)

<< (DWORD) si.lpMinimumApplicationAddress << std :: endl;

std :: cout << \ << std :: hex << std :: setw(8)

<< (DWORD) si.lpMaximumApplicationAddress << std :: endl;

std :: cout << \ << szMemSize << std :: endl ; }

void main() {

//显示虚拟内存的基本信息 ShowVirtualMemory();

// 遍历当前进程的虚拟内存

::WalkVM(::GetCurrentProcess()); }

39

实验五 文件和设备管理

背景知识

1. 选择文件系统

文件系统决定了操作系统能够对磁盘进行的处理。Windows 2000支持的文件系统主要有: 1) 文件分配表 (File Allocation Table,FAT) 文件系统 (FAT16) 2) 保护模式FAT文件系统 (FAT32) 3) Windows NT文件系统 (NTFS)

FAT文件系统是早期文件系统之一,也是MS-DOS使用的原始文件系统。它将文件信息储存在位于卷标开头处的文件分配表中,并保存两份文件分配表,以防其中的一个遭到破坏,见图7-1所示。

FAT文件系统最大的优点是MS-DOS、Windows 9x甚至OS/2都能访问FAT卷标;而其最大的弱点是随着FAT卷标尺寸的增长,最小的簇尺寸也随之增长。对于大于512MB的硬盘而言,最小的簇尺寸为16KB;对于大于2GB的硬盘,最小的簇尺寸为64KB。这就导致磁盘空间的极大浪费,因为一个文件必须占用整数个簇。因此,1KB的文件在2GB的硬盘上将占用64KB的磁盘空间。FAT文件系统不支持尺寸大于4GB的卷标。

BIOS 参数 文件 分配表 文件分配 表副本 文件和目录 根目录

图5-1 FAT文件系统的结构

FAT32文件系统通过提供长文件名的支持来扩展FAT文件系统,并与FAT16兼容。FAT (16和32) 文件系统是支持可移动媒体 (例如软盘) 上的惟一的文件系统。

Windows NT文件系统 (NTFS) 包括了FAT文件系统的所有功能,同时又提供了对高级文件系统特征 (例如安全模式、压缩和加密) 的支持。它是为在大磁盘上有效地完成文件操作而设计的。与FAT和保护模式FAT文件系统不同,它的最小簇尺寸不超过4KB。但是,NTFS卷标只能为Windows NT、2000和XP操作系统所访问。

Windows 2000提供的新特征 (NTFS 5.0) 使文件系统更安全、更可靠,比以往的Windows版本更好地支持分布式计算。

此外,Windows 2000支持的文件系统还有:

CDFS:光盘文件系统 (Compact Disc File System) 用于光盘的文件存储。 UDF:通用磁盘格式 (Universal Disk Format) 用于DVD的文件存储。

在文件系统中,FAT16、FAT32和NTFS这三个文件系统对磁盘子系统的性能影响最大。而事实上,选择NTFS之外的任何文件系统都只有两个理由,即:

1) 可双引导系统 2) 小于400MB的卷

如果系统不是这两种情况,那么NTFS就应该是所选择的文件系统,NTFS将提供更好的性能、可靠性和安全性。

2. EFS加密文件系统

EFS (Encrypting File System) 实际上是NTFS的一个特性,它提供了核心文件加密技术,主要用来在NTFS文件系统卷上存储加密文件。在加密了文件或文件夹之后,使用加密文件和文件夹的方法与使用其他任何文件和文件夹相同。即,加密对于加密该文件的用户来说是透明的,这意味着不必在使用加密文件之前将其解密,可以像平常一样打开和更改文件。但是,如果侵入者试图打开、复制、移动或重命名加密的文件或文件夹,那么他将接收到一条拒绝访问的消息。

像设置其他任何属性 (如只读、压缩或隐藏) 一样,可以通过设置文件夹和文件的加密属性来对文件夹或文件加密或解密。如果加密文件夹,那么在加密文件夹中创建的所有文件和子文件夹都将加密。因此,推荐在文件夹一级上加密。

使用EFS保护文档的安全,可以防止侵入者获得对存储的敏感数据的未经授权的物理访问。

EFS带来的附加安全性是以性能为代价的。当操作系统对所访问的加密文件进行加密或解密时,文件传输将增加一点延迟。

影响系统性能的程度将具体取决于执行加密或解密操作的系统的处理能力。对于在本地驱动器上包含加密文件的现代工作站来说,因为这些系统通常不受处理器限制,所以影响通常可以忽略不计。这种影响对处理器上的额外

40