zoukankan      html  css  js  c++  java
  • 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 ",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] ",wfd.cFileName);
    }
    else
    {
    printf("文件:%s ",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
    ",logic);
    }
    void GetPath()
    {
    	char txt[200]={0};
    	GetSystemDirectory(txt,sizeof(txt));
    	printf("系统路径%s
    ",txt);
    	memset(txt,0,sizeof(txt));
    	GetWindowsDirectory(txt,sizeof(txt));
    	printf("windows路径%s
    ",txt);
    	memset(txt,0,sizeof(txt));
    	GetCurrentDirectory(sizeof(txt),txt);
    	printf("程序工作路径%s
    ",txt);
    	SetCurrentDirectory("c:/");
    	memset(txt,0,sizeof(txt));
    	GetCurrentDirectory(sizeof(txt),txt);
    	printf("更改后程序工作路径%s
    ",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
    ",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]
    ",wfd.cFileName);
    		}
    		else
    		{
    			printf("文件:%s
    ",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("按随意键结束!

    "); 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 ",mm.dwMemoryLoad);
    printf("TotalPhys:%u MB ",mm.dwTotalPhys/1024/1024);
    printf("AvaliPhys:%u MB ",mm.dwAvailPhys/1024/1024);
    printf("TotalVirtual:%u MB ",mm.dwTotalPageFile/1024/1024);
    printf("AvaliVirtual:%u MB ",mm.dwAvailPageFile/1024/1024);
    printf("TotalAddr:%u MB ",mm.dwTotalVirtual/1024/1024);
    printf("AvaliAddr:%u MB ",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 ",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 ",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 ",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 as d a s d as d a s aaaaa bbbbb ccccc ");
    printf("%s ",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 ",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
    ",mm.dwMemoryLoad);
    	printf("TotalPhys:%u MB
    ",mm.dwTotalPhys/1024/1024);
    	printf("AvaliPhys:%u MB
    ",mm.dwAvailPhys/1024/1024);
    	printf("TotalVirtual:%u MB
    ",mm.dwTotalPageFile/1024/1024);
    	printf("AvaliVirtual:%u MB
    ",mm.dwAvailPageFile/1024/1024);
    	printf("TotalAddr:%u MB
    ",mm.dwTotalVirtual/1024/1024);
    	printf("AvaliAddr:%u MB
    ",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
    ",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
    ",p);
    	VirtualFree(p,0,MEM_RELEASE);
    }
    void HeapInfo()
    {
    	HANDLE h1=GetProcessHeap();
    	printf("h1-%d
    ",h1);
    	HANDLE hs[256]={0};
    	DWORD count=GetProcessHeaps(256,hs);
    	for(int i=0;i<count;i++)
    	{
    		printf("%d-%d
    ",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
    ",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
     as d a
     s d as d a s aaaaa bbbbb ccccc
    ");
    	printf("%s
    ",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 ",p); UnmapViewOfFile(p); CloseHandle(map);//关闭就没了 } int main(int argc, char* argv[]) { //Virtual_info(); //Virtual_commit(); //Virtual_reserve(); //HeapInfo(); //MyHead(); FileMap(); //ReadFileMap(); return 0; }







  • 相关阅读:
    idea中yml文件变成text样式并且没有提示
    挂载redhat镜像创建本地yum源
    Windows环境下Oracle数据库的自动备份脚本
    Oracle存储过程锁表
    DDL和客户端ip监控
    Linux 单实例oracle安装步骤
    Linux常用命令
    Linux常用目录
    oracle基础知识及语法
    Linux下Oracle新建用户并且将已有的数据dmp文件导入到新建的用户下的操作流程
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5120688.html
Copyright © 2011-2022 走看看