c++windows内核编程笔记day12 硬盘逻辑分区管理、文件管理、内存管理[通俗易懂]

c++windows内核编程笔记day12 硬盘逻辑分区管理、文件管理、内存管理

大家好,又见面了,我是全栈君。

windows系统磁盘文件存储:

分区格式:NTFS / FAT32

GetSystemDirectory();//获取系统路径

GetWindowsDirectory();//获取windows路径

GetCurrentDirectory();//获取当前工作文件夹

SetCurrentDirectory();//改动当前工作文件夹

CreateFile/ReadFile/WriteFile/GetFileSize/SetFilePointer

//返回文件大小的低32位

DWORD GetFileSize(  HANDLE hFile,// handle to file

  LPDWORD lpFileSizeHigh  //输出參数:返回文件大小的高32位

  );

//创建文件并写入文本代码演示样例

HANDLE hf=CreateFile(“file.txt”,GENERIC_WRITE,FILE_SHARE_READ,NULL,


OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

char txt[]=”hello file to write”;

DWORD len=0;//返回实际写入的长度

WriteFile(hf,txt,strlen(txt),&len,NULL);

CloseHandle(hf);

//读代替码演示样例

HANDLE hf=CreateFile(“file.txt”,GENERIC_READ,FILE_SHARE_READ,


NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

CHAR txt[1000]={0};

DWORD len=0;//实际读到的长度

ReadFile(hf,txt,sizeof(txt),&len,NULL);

printf(“读取到的字符串:%s\n”,txt);

CloseHandle(hf);

day75 am over!

创建文件夹:CreateDirectory

移动文件夹(不能跨分区移动)、移动文件(能够跨分区):

BOOL MoveFile(  LPCTSTR lpExistingFileName,// file name

  LPCTSTR lpNewFileName// new file name

  );

删除空文件夹:RemoveDirectory

拷贝文件:CopyFile

删除文件:DeleteFile

//查找文件。返回查找句柄

HANDLE FindFirstFile(  LPCTSTR lpFileName,               // file name

  LPWIN32_FIND_DATA lpFindFileData  //输出參数 data buffer

  );

//查找下一个

BOOL FindNextFile(  HANDLE hFindFile,                // search handle

  LPWIN32_FIND_DATA lpFindFileData // data buffer

  );

//关闭查找句柄

 BOOL FindClose(  HANDLE hFindFile   // file search handle

 );

 //使用演示样例

 
char *path=”c:/*.*”;


WIN32_FIND_DATA wfd={0};


HANDLE hf=FindFirstFile(path,&wfd);


while(1)


{


if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)


{


printf(“文件夹:[%s]\n”,wfd.cFileName);


}


else


{


printf(“文件:%s\n”,wfd.cFileName);


}


if(FindNextFile(hf,&wfd)==0) break;


}

if(hf) FindClose(hf);

演示样例代码:

// winlogic.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<STDIO.H>
#include<WINDOWS.H>
void GetLogical()
{
	UINT logic=GetLogicalDrives();
	printf("%d\n",logic);
}
void GetPath()
{
	char txt[200]={0};
	GetSystemDirectory(txt,sizeof(txt));
	printf("系统路径%s\n",txt);
	memset(txt,0,sizeof(txt));
	GetWindowsDirectory(txt,sizeof(txt));
	printf("windows路径%s\n",txt);
	memset(txt,0,sizeof(txt));
	GetCurrentDirectory(sizeof(txt),txt);
	printf("程序工作路径%s\n",txt);
	SetCurrentDirectory("c:/");
	memset(txt,0,sizeof(txt));
	GetCurrentDirectory(sizeof(txt),txt);
	printf("更改后程序工作路径%s\n",txt);

}
void CreateWrite()
{
	HANDLE hf=CreateFile("file.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,
		OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	char txt[]="hello file to write";
	DWORD len=0;//返回实际写入的长度
	WriteFile(hf,txt,strlen(txt),&len,NULL);
	CloseHandle(hf);
}
void Read()
{
	HANDLE hf=CreateFile("file.txt",GENERIC_READ,FILE_SHARE_READ,
		NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	CHAR txt[1000]={0};
	DWORD len=0;//实际读到的长度
	ReadFile(hf,txt,sizeof(txt),&len,NULL);
	printf("读取到的字符串:%s\n",txt);
	CloseHandle(hf);
}
void CreateDir()
{
	CreateDirectory("abc/",NULL);
}
void Find()
{
	char *path="c:/*.*";
	WIN32_FIND_DATA wfd={0};
	HANDLE hf=FindFirstFile(path,&wfd);
	while(1)
	{
		if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
		{
			printf("文件夹:[%s]\n",wfd.cFileName);
		}
		else
		{
			printf("文件:%s\n",wfd.cFileName);
		}
		if(FindNextFile(hf,&wfd)==0) break;
	}
	if(hf) FindClose(hf);
}
int main(int argc, char* argv[])
{
//	GetLogical();
//	GetPath();
	//CreateWrite();
	//Read();
	//CreateDir();
	Find();
	char c=0;

	printf("按随意键结束!

\n"); scanf("%c",&c); return 0;}

windows内存:

1、区域(针对内存的概念):


通常是64K的倍数。


空暇:没被使用


私有:被预定


映像:存放代码


映射:存放数据

2、物理内存


系统能够使用的实际内存,CPU能够直接訪问的内存

3、虚拟内存


将硬盘文件虚拟成内在使用(pagafile.sys),CPU假设要訪问虚拟内存数据,必须将虚拟内存数据放到物理内存。

4、内存页(针对地址的概念)
系统管理内存的最小单位。内存页大小为4K,每内存页有自己的权限。
5、页目表。

指针地址(32位):
          31~22        21~12       11~0
页目(1K)     页表(1K)   页内偏移地址(4K)
6、从内存获取数据的过程
1、先在物理内存中找。
2、找不到时在虚拟内在中找。
3、假设在虚拟内存中找到,把物理内存与虚拟内存页数据交换。
4、使用物理内存数据;
5、最后可能物理内存数据与虚拟内存数据交换还原。
7、内存分配
7.1 虚拟内存分配-适合大内存分配,通常是1M之上的内存。
7.2 堆内存分配-适合小内存分配,通常是1M下面的内存。

7.3 栈内存分配-适合小内存分配,通常是1M下面的内存。
//虚拟内存分配函数,分配成功后返回地址
LPVOID VirtualAlloc(  LPVOID lpAddress,//NULL或提交地址
  SIZE_T dwSize, //分配大小
  DWORD flAllocationType,  //分配方式
  DWORD flProtect//内存訪问方式
);
flAllocationType:
MEM_COMMIT 分配之后返回地址和内存空间
MEM_RESERVE 保留地址。分配之后仅仅返回地址,内存空间不生成
flProtect:一般 PAGE_READWRITE

//查看内存的使用情况
VOID GlobalMemoryStatus(  LPMEMORYSTATUS lpBuffer
);
typedef struct _MEMORYSTATUS {
    DWORD dwLength;
    DWORD dwMemoryLoad;
    DWORD dwTotalPhys;//物理内存总大小
    DWORD dwAvailPhys;//物理内存可用大小
    DWORD dwTotalPageFile;//虚拟内存总大小
    DWORD dwAvailPageFile;//虚拟内存可用大小
    DWORD dwTotalVirtual;//地址总数
    DWORD dwAvailVirtual;//可用地址数
} MEMORYSTATUS, *LPMEMORYSTATUS;
BOOL VirtualFree(  LPVOID lpAddress,//释放地址
  SIZE_T dwSize,      // 释放大小
  DWORD dwFreeType    // 释放方式
);
dwFreeType:
MEM_DECOMMIT-仅仅释放内存
MEM_RELEASE -释放内存和地址
代码演示样例:
void ShowMemStatus()
{
MEMORYSTATUS mm;
mm.dwLength=sizeof(mm);
GlobalMemoryStatus(&mm);
printf(“内存使用率:%d/100\n”,mm.dwMemoryLoad);
printf(“TotalPhys:%u MB\n”,mm.dwTotalPhys/1024/1024);
printf(“AvaliPhys:%u MB\n”,mm.dwAvailPhys/1024/1024);
printf(“TotalVirtual:%u MB\n”,mm.dwTotalPageFile/1024/1024);
printf(“AvaliVirtual:%u MB\n”,mm.dwAvailPageFile/1024/1024);
printf(“TotalAddr:%u MB\n”,mm.dwTotalVirtual/1024/1024);
printf(“AvaliAddr:%u MB\n”,mm.dwAvailVirtual/1024/1024);
}
void Virtual_info()
{
ShowMemStatus();
char* p=(char*)VirtualAlloc(NULL,1024*1024*1024,MEM_COMMIT,PAGE_READWRITE);//1G内存和地址
ShowMemStatus();
VirtualFree(p,0,MEM_RELEASE);
ShowMemStatus();
}
void Virtual_commit()
{
char* p=(char*) VirtualAlloc(NULL,4096,MEM_COMMIT,PAGE_READWRITE);
strcpy(p,”HELLO MEMORY”);
printf(“%s\n”,p);
VirtualFree(p,0,MEM_RELEASE);
}
void Virtual_reserve()
{
//申请地址。不分配内存
char* p =(char*) VirtualAlloc(NULL,1024*1024,MEM_RESERVE,PAGE_READWRITE);
char* p1=(char*)VirtualAlloc(p,4096,MEM_COMMIT,PAGE_READWRITE);//提交内存,以一个内存页4k为最小单位
strcpy(p,”HELLO MEMORY”);
printf(“%s\n”,p);
VirtualFree(p,0,MEM_RELEASE);

}

堆内存Heap
GetProcessHeap-获取程序默认第一个堆
GetProcessHeaps-获取程序全部默认堆
演示样例:
HANDLE h1=GetProcessHeap();
HANDLE hs[256]={0};
DWORD count=GetProcessHeaps(256,hs);
HeapCreate -创建堆
HeapAlloc -从堆分配内存
  -把内存还给堆
HeapDestroy -销毁堆
演示样例:
HANDLE h= HeapCreate(HEAP_NO_SERIALIZE,1024*1024,0);
char* p= (char*) HeapAlloc(h,HEAP_ZERO_MEMORY,2*1024*1024);
strcpy(p,”123456″);
printf(“%s\n”,p);
HeapFree(h,0,p);
HeapDestroy(h);
假设要使用,建议用:malloc/new 和 free/delete

内存映射文件的操作。速度快:
1、先创建一个硬盘文件 CreateFile()
2、创建内存映射文件
HANDLE CreateFileMapping(  HANDLE hFile,    // 硬盘文件的句柄
  LPSECURITY_ATTRIBUTES lpAttributes, // 传0即可
  DWORD flProtect,                    // protection
  DWORD dwMaximumSizeHigh,            // 高32位大小。小于4G传0
  DWORD dwMaximumSizeLow,             // 低32位大小
  LPCTSTR lpName                      // 命名,能够为NULL
);
3、获取映射文件里某部分的地址
LPVOID MapViewOfFile(
  HANDLE hFileMappingObject,   // 映射文件句柄
  DWORD dwDesiredAccess,       // 訪问权限
  DWORD dwFileOffsetHigh,      // 高32位大小。小于4G传0
  DWORD dwFileOffsetLow,       // 低32位大小
  SIZE_T dwNumberOfBytesToMap  // 映射的字节数量
);
dwFileOffsetHigh和dwFileOffsetLow 的合成必须是64K的整数倍。
4、断开地址和映射文件某部分
BOOL UnmapViewOfFile(  LPCVOID lpBaseAddress//
);
5、关闭映射文件
CloseHandle(HANDLE)
6、关闭硬盘文件
CloseHandle(HANDLE);
演示样例:
HANDLE file=CreateFile(“file.txt”,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,
0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
HANDLE map=CreateFileMapping(file,0,PAGE_READWRITE,0,1024*1024,”pkm”);
//
char* p=(char*)MapViewOfFile(map,FILE_MAP_ALL_ACCESS,0,64*1024,0);
strcpy(p,”adsadsad asd as d\n as d a\n s d as d a s aaaaa bbbbb ccccc\n”);
printf(“%s\n”,p);
UnmapViewOfFile(p);
getchar();
CloseHandle(map);//关闭就没了,假设其它进程要使用,则不能关。

CloseHandle(file);//关闭了还在硬盘上

其它进程获取本进程已经创建好的映射文件,不能提前关闭映射文件
HANDLE OpenFileMapping(  DWORD dwDesiredAccess,  // access mode
  BOOL bInheritHandle,    // 返回值是否能被子进程使用
  LPCTSTR lpName          // 映射名称
);
演示样例:
HANDLE map=OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,”pkm”);
char* p=(char*)MapViewOfFile(map,FILE_MAP_ALL_ACCESS,0,64*1024,0);
printf(“%s\n”,p);
UnmapViewOfFile(p);

演示样例代码:

// winVirtual.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<STDIO.H>
#include <WINDOWS.H>
void ShowMemStatus()
{
	MEMORYSTATUS mm;
	mm.dwLength=sizeof(mm);
	GlobalMemoryStatus(&mm);
	printf("内存使用率:%d/100\n",mm.dwMemoryLoad);
	printf("TotalPhys:%u MB\n",mm.dwTotalPhys/1024/1024);
	printf("AvaliPhys:%u MB\n",mm.dwAvailPhys/1024/1024);
	printf("TotalVirtual:%u MB\n",mm.dwTotalPageFile/1024/1024);
	printf("AvaliVirtual:%u MB\n",mm.dwAvailPageFile/1024/1024);
	printf("TotalAddr:%u MB\n",mm.dwTotalVirtual/1024/1024);
	printf("AvaliAddr:%u MB\n",mm.dwAvailVirtual/1024/1024);
}
void Virtual_info()
{
	ShowMemStatus();
	char* p=(char*)VirtualAlloc(NULL,1024*1024*1024,MEM_COMMIT,PAGE_READWRITE);
	ShowMemStatus();
	VirtualFree(p,0,MEM_RELEASE);
	ShowMemStatus();
}
void Virtual_commit()
{
	char* p=(char*) VirtualAlloc(NULL,4096,MEM_COMMIT,PAGE_READWRITE);
	strcpy(p,"HELLO MEMORY");
	printf("%s\n",p);
	VirtualFree(p,0,MEM_RELEASE);
}
void Virtual_reserve()
{
	//申请地址,不分配内存
	char* p =(char*) VirtualAlloc(NULL,1024*1024,MEM_RESERVE,PAGE_READWRITE);
	char* p1=(char*)VirtualAlloc(p,4096,MEM_COMMIT,PAGE_READWRITE);//提交内存,以一个内存页4k为最小单位
	strcpy(p,"HELLO MEMORY");
	printf("%s\n",p);
	VirtualFree(p,0,MEM_RELEASE);
}
void HeapInfo()
{
	HANDLE h1=GetProcessHeap();
	printf("h1-%d\n",h1);
	HANDLE hs[256]={0};
	DWORD count=GetProcessHeaps(256,hs);
	for(int i=0;i<count;i++)
	{
		printf("%d-%d\n",i,hs[i]);
	}
}
void MyHead()
{
	HANDLE h= HeapCreate(HEAP_NO_SERIALIZE,1024*1024,0);
	char* p= (char*) HeapAlloc(h,HEAP_ZERO_MEMORY,2*1024*1024);
	strcpy(p,"123456");
	printf("%s\n",p);
	HeapFree(h,0,p);
	HeapDestroy(h);
}

void FileMap()
{
	HANDLE file=CreateFile("file.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,
		0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	HANDLE map=CreateFileMapping(file,0,PAGE_READWRITE,0,1024*1024,"pkm");
	//
	char* p=(char*)MapViewOfFile(map,FILE_MAP_ALL_ACCESS,0,64*1024,0);
	strcpy(p,"adsadsad asd as d\n as d a\n s d as d a s aaaaa bbbbb ccccc\n");
	printf("%s\n",p);
	UnmapViewOfFile(p);
	getchar();
	CloseHandle(map);//关闭就没了。假设其它进程要使用。则不能关。

CloseHandle(file);//关闭了还在硬盘上}void ReadFileMap(){HANDLE map=OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,"pkm");char* p=(char*)MapViewOfFile(map,FILE_MAP_ALL_ACCESS,0,64*1024,0);printf("%s\n",p);UnmapViewOfFile(p);CloseHandle(map);//关闭就没了}int main(int argc, char* argv[]){ //Virtual_info(); //Virtual_commit(); //Virtual_reserve(); //HeapInfo(); //MyHead(); FileMap(); //ReadFileMap(); return 0;}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116369.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 帮谷歌推广Webp图片格式之:Webp的格式转换

    帮谷歌推广Webp图片格式之:Webp的格式转换

    2022年2月9日
    86
  • awakeFromNib小总结

    awakeFromNib小总结

    2021年12月31日
    51
  • java 删除目录下所有文件_Java删除文件、目录及目录下所有文件的方法实例

    java 删除目录下所有文件_Java删除文件、目录及目录下所有文件的方法实例前言本文主要实现的功能是删除某个目录及目录下的所有子目录和文件,涉及到的知识点:File.delete()用于删除“某个文件或者空目录”!所以要删除某个目录及其中的所有文件和子目录,要进行递归删除。具体代码示例如下:importjava.io.File;publicclassDeleteDirectory{/***删除空目录*@paramdir将要删除的目录路径*/private…

    2022年5月24日
    48
  • nextSibling 和nextElementSibling

    nextSibling 和nextElementSibling在使用DOM过程中发现一个问题:使用nextSibling属性返回指定节点之后紧跟的节点,在相同的树层级中。被返回的节点以Node对象返回。nextSibling属性与nextElement

    2022年7月4日
    21
  • 免费下载电子书攻略大全_我被系统攻略了txt

    免费下载电子书攻略大全_我被系统攻略了txt经常帮博友们查找各种书籍,也算是攒了一些经验。在此整理下我是如何找电子书籍的,准确来说,是找书籍的网站汇总。本文借鉴了@陆浑戎,@设定控@没有我找不到的电子书等朋友的方法,在此表示感谢! 如以下内容有不当之处,还请各位指正。一、初级攻略利用网盘检索工具进行检索在此推荐几个我常用的网盘检索工具:1、西林街西林街::网盘搜索引擎,更是网盘搜索神器!

    2022年8月10日
    12
  • 医学图形图像处理(医学影像和医学图像处理)

    文章目录1图像和数字图像1图像和数字图像  数字图像:被定义为一个二维函数,f(x,y),其中x,y代表空间坐标,f代表点(x,y)处的强度或灰度级。和普通的笛卡尔坐标系有区别,在计算机中坐标系左上角为原点:  图像数字化:图像进入计算机后,对图像进行数字化(映射)。数字图像三要素:  (1)像素:大小决定了图像存储、显示的清晰度;  (2)灰度值:通常为0-255,因为在计算机中通常用一个字节来表示一个像素,即28。  (3)坐标  图像存储在计算机中会丢失信息,因为是从一个连续的

    2022年4月15日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号