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;
}

c++windows内核编程笔记day12 硬盘逻辑分区管理、文件管理、内存管理的更多相关文章

  1. windows游戏编程X86 32位保护模式下的内存管理概述(二)

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22448323 作者:jadeshu   邮箱: jades ...

  2. C++windows内核编程笔记day09_day10,对话框和窗体基本控件等的使用

    //设置字体颜色 SetTextColor(hdc,RGB(255,0,0)); //窗体背景 //wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); //wce. ...

  3. C++windows内核编程笔记day13 进程、线程与信号量

    Windows进程 进程是一个容器,包括程序运行须要的代码.数据.资源等信息, windows进程的特点: 每一个进程都有自己的ID号 每一个进程都有自己的地址空间.进程之间无法訪问对方的地址空间. ...

  4. C++windows内核编程笔记day11 win32静态库和动态库的使用

    windows库程序: 静态库: 源码被链接到调用的程序或动态库,被调用时,代码最少有1份,文件后缀.LIB 动态库: 函数被程序或其它动态库调用,被调用时,代码仅仅有1份,文件后缀.DLL 静态库( ...

  5. windows游戏编程X86 32位保护模式下的内存管理概述(一)

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22445945 作者:jadeshu   邮箱: jades ...

  6. storysnail的Windows串口编程笔记

    storysnail的Windows串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据 ...

  7. 【翻译】《深入解析windows操作系统第6版下册》第10章:内存管理

    [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第一部分) [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第二部分) [翻译] ...

  8. Objective-C 高级编程:iOS与OS X多线程和内存管理

    <Objective-C 高级编程:iOS与OS X多线程和内存管理> 基本信息 原书名: Pro Multithreading and Memory Management for iOS ...

  9. 《天书夜读:从汇编语言到windows内核编程》五 WDM驱动开发环境搭建

    (原书)所有内核空间共享,DriverEntery是内核程序入口,在内核程序被加载时,这个函数被调用,加载入的进程为system进程,xp下它的pid是4.内核程序的编写有一定的规则: 不能调用win ...

随机推荐

  1. Android应用开发经常使用知识

    在其它站点看到的,Mark一下 1.近期打开的应用不在近期任务列表中显示 android:excludeFromRecents="true" 设置为true,则排除在近期任务列表之 ...

  2. 异常:未能载入文件或程序集”DAL”或它的某一个依赖项——解决的方法

    以下是我再使用抽象工厂+反射重构机房时,在Factoy中出现了以下一个问题: 去网上查了一下资料,发现这是一个非常普遍的问题,它出现的原因主要有两种: 第一种: 载入DLL路径错误.解决的方法是调整D ...

  3. 二维码闪电登录流程详解,附demo(2/2)

    上篇文章,我们重点介绍了一下二维码登录的流程,以及每个“角色”要做的事情,下面我们重点分析TV角色所做的工作. TV主要完成二维码图片显示,以及websocket请求.下面重点说一下这两点. 1. B ...

  4. Swift - 给图片添加图片水印(图片上绘制另一张图,并可设透明度)

    我前面写了篇文章讲解如何给图片添加文字水印,而如果想要添加图片类型的水印也很简单,只要把原来代码里添加文字的部分改成图片即可. 1,效果图如下: (在图片左上角添加了一个半透明的logo图片) 2,为 ...

  5. Redis 与 Memcache

    最近,我们看到许多使用Redis的案例,尤其是大型及先进的系统中应用的更多.事实上,我们正管理着一个新的规模庞大的Redis集群,设计该架构是为了每秒能处理上百万个事务.然而,Redis与Memcac ...

  6. Windows Azure 数据安全(清理和泄漏)

    免责声明:本文档中所述过程为 2012 年 1 月时起的情况,如有变更,恕不另行通知. 希望将应用程序部署到 Windows Azure 的企业客户(实际上是所有客户)最为关心的就是其数据的安全性.释 ...

  7. hdu4722 Good Numbers

    Good Numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. linux-shell脚本命令之sed

    [ sed简单介绍: ] sed是一个非常好的文件处理工具, 它本身是一个管道命令, 以行为单位进行处理, 能够用于对数据行进行新增.选取.替换.删除等操作. sed命令行格式:sed [-nefri ...

  9. 使用JDBC处理数据库大容量数据类型

    在本文将介绍如何使用JDBC操作MySQL数据库对于大容量数据类型的读取.在之前的博客中已经介绍了如何使用JDBC来操作数据库对各种数据的增删改查,那么大容量数据类型的数据操作又为何不同呢. 原因在于 ...

  10. Ubuntu下装QQ2012,让linux小白们不怕脱离windows

    嘿嘿,很多人可能跟我一样,QQ上同学群里会通知一些事项,所以我们希望可以在linux下开QQ,但是QQ官网做的QQ For Linux, 实在是烂的不行 那么怎么在linux下装我们平时在window ...