CreateFileReadFileWriteFileDeviceIoControlCloseHandle.docx

上传人:b****7 文档编号:8801397 上传时间:2023-02-01 格式:DOCX 页数:14 大小:24.91KB
下载 相关 举报
CreateFileReadFileWriteFileDeviceIoControlCloseHandle.docx_第1页
第1页 / 共14页
CreateFileReadFileWriteFileDeviceIoControlCloseHandle.docx_第2页
第2页 / 共14页
CreateFileReadFileWriteFileDeviceIoControlCloseHandle.docx_第3页
第3页 / 共14页
CreateFileReadFileWriteFileDeviceIoControlCloseHandle.docx_第4页
第4页 / 共14页
CreateFileReadFileWriteFileDeviceIoControlCloseHandle.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

CreateFileReadFileWriteFileDeviceIoControlCloseHandle.docx

《CreateFileReadFileWriteFileDeviceIoControlCloseHandle.docx》由会员分享,可在线阅读,更多相关《CreateFileReadFileWriteFileDeviceIoControlCloseHandle.docx(14页珍藏版)》请在冰豆网上搜索。

CreateFileReadFileWriteFileDeviceIoControlCloseHandle.docx

CreateFileReadFileWriteFileDeviceIoControlCloseHandle

一、*****CreateFile*****

   这个函数可以创建或打开一个对象的句柄,凭借此句柄就可以控制这些对象:

控制台对象、通信资源对象、目录对象(只能打开)、磁盘设备对象、文件对象、邮槽对象、管道对象。

   函数原型:

HANDLECreateFile(

LPCTSTRlpFileName,                        //filename对象路径名

DWORDdwDesiredAccess,                     //accessmode控制模式

DWORDdwShareMode,                         //sharemode共享模式

LPSECURITY_ATTRIBUTESlpSecurityAttributes,//SD安全属性(也即销毁方式)

DWORDdwCreationDisposition,               //howtocreate

DWORDdwFlagsAndAttributes,                //fileattributes

HANDLEhTemplateFile                       //handletotemplatefile

);

【Parameters】

1、lpFileName

   一个指向无终结符的字符串的指针,来指明要创建或打开的对象的名字。

   在WindowsNT/2000/XP平台上:

如果用ANSI版本的函数,字符串长度应限制在MAX_PATH;如果用Unicode版本的函数,这个限制可以扩充到32000个Unicode字符。

   在Windows95/98/Me平台上:

只能用ANSI版本的函数,字符串长度限制在MAX_PATH。

2、dwDesiredAccess

   指明对象的控制模式。

一个应用程序可以包含读控制、写控制、读/写控制、设备查询控制。

这个参数的取值可以是下面这些的组合:

   0                                            指定设备查询控制:

程序可以不访问设备就查询到设备属性。

   GENERIC_READ               指定读控制,可以从对象中读取数据(指针将可以移动)。

   GENERIC_WRITE              指定写控制,可以向对象中写数据(指针将可以移动)。

   ----------------------------------------------------------------------

   另外,还可以指定下面的控制标志:

标准控制权限(16-23位掩码):

   DELETE                    删除对象的权限。

   READ_CONTROL   从对象的安全描述符中读取信息的权限,但不包括SACL(系统访问控制列表)中的信息。

   WRITE_DAC             修改对象安全描述符中的DACL(随机访问控制列表)的权限

   WRITE_OWNER     修改对象安全描述符中的属主的权限

   SYNCHRONIZE    同步化使用对象的权限,即可以创建一个线程等待信号量释放(但有些对象不支持这个权限)。

   STANDARD_RIGHTS_REQUIRED   等价于前面四种权限的总合(通常这四种是必须具有的权限)。

   STANDARD_RIGHTS_READ       一般等价于READ_CONTROL

   STANDARD_RIGHTS_WRITE      一般等价于READ_CONTROL

   STANDARD_RIGHTS_EXECUTE    一般等价于READ_CONTROL

   STANDARD_RIGHTS_ALL        等价于前面五种权限的总合。

特殊控制权限(0-15位掩码):

   SPECIFIC_RIGHTS_ALL

   ACCESS_SYSTEM_SECURITY

   MAXIMUM_ALLOWED

   GENERIC_READ

   GENERIC_WRITE

   GENERIC_EXECUTE

   GENERIC_ALL

注:

实质上是通过ACCESS_MASK结构体的一个双字值来设置标准权限、特殊权限和一般权限的。

3、dwShareMode

   指定对象的共享模式。

如果dwShareMode==0,表示是互斥使用的。

如果CreateFile打开成功,则别的程序只能等到当前程序关闭对象句柄CloseHandle后才能在打开或使用。

   使用下面这些值的组合来表示对象的共享模式:

   FILE_SHARE_DELETE      WindowsNT/2000/XP:

打开操作只有在删除请求发生时才能返回成功。

   FILE_SHARE_READ                打开操作只有在读控制请求发生时才能返回成功。

   FILE_SHARE_WRITE               打开操作只有在写控制请求发生时才能返回成功。

4、lpSecurityAttributes

   一个指向SECURITY_ATTRIBUTES结构对象的指针,决定返回的句柄是否被子进程所继承。

如果lpSecurityAttributes参数为NULL,句柄就不能被子进程继承。

   在WindowsNT/2000/XP平台下:

lpSecurityDescriptor这个成员指明了这个对象的安全描述符。

如果lpSecurityAttributes参数为NULL,对象将获得一个默认的安全描述符。

目标文件系统必须为这个参数的在文件上的有效操作保证安全性。

typedefstruct_SECURITY_ATTRIBUTES{

DWORDnLength;//结构体的大小(字节为单位),即siziof(SECURITY_ATTRIBUTES)

LPVOIDlpSecurityDescriptor;//指向对象的安全描述符的指针,控制对象的共享属性。

在Windows95/98/Me平台                                                    //上这个成员被忽略。

BOOL  bInheritHandle;//指明当一个新的子进程创建时,是否继承当前返回的句柄

}SECURITY_ATTRIBUTES,*PSECURITY_ATTRIBUTES;

5、dwCreationDisposition

   指明当打开的对象存在或不存在的时候各需怎样处理。

这个参数必须是一下值的其中之一:

   CREATE_NEW           创建新文件/对象(当对象已经存在是将返回失败)。

   CREATE_ALWAYS        总是创建(如果对象存在就覆盖它,清除当前属性,把文件属性和dwFlagsAndAttributes指定的标志相结合)。

   OPEN_EXISTING        打开文件(如果不存在就返回失败)。

   OPEN_ALWAYS     存在就打开;若不存在,假如dwCreationDisposition==CREATE_NEW就创建一个新文件。

   TRUNCATE_EXISTING    存在就打开,且清空文件内容(至少要有GENERIC_WRITE权限);若文件不存在就返回失败。

6、dwFlagsAndAttributes

   指定文件属性和标志。

可以是以下值的任意组合(只有FILE_ATTRIBUTE_NORMAL必须单独使用,唯一例外):

Attribute:

   FILE_ATTRIBUTE_ARCHIVE                文件存档(备份或移动时会对文件做标记)。

   FILE_ATTRIBUTE_ENCRYPTED              加密(对文件来说是内容加密,对目录来说是对将来新建的文件默认为加密属性),与此同时,如果还设置了FILE_ATTRIBUTE_SYSTEM属性,当前这个属性将无效。

   FILE_ATTRIBUTE_HIDDEN                 隐藏属性。

   FILE_ATTRIBUTE_NORMAL                 文件没有其他属性设置,此属性只能单独使用才合法。

   FILE_ATTRIBUTE_NOT_CONTENT_INDEXED    不建立内容索引。

   FILE_ATTRIBUTE_OFFLINE                脱机属性。

文件内容暂时不可用。

此属性被RemoteStorage软件所用,不能任意更改。

   FILE_ATTRIBUTE_READONLY               只读文件属性。

应用程序不能写或删除。

   FILE_ATTRIBUTE_SYSTEM                 文件是系统文件或被操作系统互斥地使用。

   FILE_ATTRIBUTE_TEMPORARY              临时文件,使用过程中尽量留在内存以保证存取速度。

Flag:

   FILE_FLAG_WRITE_THROUGH           指示系统立即写磁盘。

这个写操作允许被cache缓存,但不能被搁置。

   FILE_FLAG_OVERLAPPED                  指示系统初始化对象,如果操作需要大量时间执行就先返回一个ERROR_IO_PENDING,当操作完成后再通过事件使能信号量。

指定这个标志就必须在read和write函数里初始化OVERLAPPED结构体,应用程序必须执行重复的读写操作。

此时,操作系统不维护文件指针,当前的位置  需要通过OVERLAPPED的指针传递给读写函数。

这个标志还允许多个操作的并行(并行读写)。

   FILE_FLAG_NO_BUFFERING                指示系统不要缓冲,它如果和FILE_FLAG_OVERLAPPED联合使用,将呈现最好的异步性能,因为I/O操作并不依赖于内存管理器的同步性。

但是有时I/O操作会慢些,因为没用cache。

有时程序需要做调整,比如文件大小必须是扇区大小的整数倍,Buffer地址的按扇区地址对齐等。

按扇区地址对齐内存边界可以使用VirtualAlloc来分配内存,GerDiskFreeSpace函数可以得到磁盘一个扇区的大小。

   FILE_FLAG_RANDOM_ACCESS               指示文件进行随即存取,系统可据此对cache的分配进行优化。

   FILE_FLAG_SEQUENTIAL_SCAN             指示顺序存取,系统也可据此对cache的分配进行优化。

即使有随即存取的操作,也不会出错,不过cache的优化就取消了。

在连续读取大文件时性能非常好。

   FILE_FLAG_DELETE_ON_CLOSE             指示系统在句柄关闭时将响应的文件立即删除,对当前句柄以外的其他句柄也有效。

而且随后的打开请求也会失败,直到你使用了FILE_SHARE_DELETE属性。

   FILE_FLAG_BACKUP_SEMANTICS            在WindowsNT/2000/XP平台上:

指示文件作为备份或恢复文件打开,这是如果调用进程拥有特殊权限(SE_BACKUP_NAME或SE_RESTORE_NAME),就可以不进行安全检查。

也可以在获得一个目录的句柄时设置这个flag,目录句柄可以代替文件句柄传递给一些函数。

   FILE_FLAG_POSIX_SEMANTICS             指明按照操作系统接口规范进行文件存取,这包括允许多文件名的使用。

请谨慎使用,因为MS_DOS或16位Windows系统可能不支持。

   FILE_FLAG_OPEN_REPARSE_POINT          这个标志指明禁止文件系统的重解析点的动作。

文件打开时就返回文件的句柄,而不在乎控制重解析点的过滤器是否可运行。

不能和CREATE_ALWAYS同时使用。

   FILE_FLAG_OPEN_NO_RECALL              表明文件数据被请求,但仍然驻留在远程存储体中,而不会被传回本地存储体。

这个标志由远程存储系统或分层存储管理系统使用。

   如果CreateFile函数打开一个命名管道的客户端,dwFlagsAndAttributes参数也会包含服务信息的安全性。

当调用程序指定了

SECURITY_PRESENT标志时,dwFlagsAndAttributes参数可以取以下一个或多个值:

   SECURITY_ANONYMOUS                 指定将客户端模拟在匿名级别(theAnonymousimpersonationlevel)

   SECURITY_IDENTIFICATION            指定将客户端模拟在身份认证级别(theIdentificationimpersonationlevel)

   SECURITY_IMPERSONATION             指定将客户端模拟在伪装级别(theImpersonationimpersonationlevel)

   SECURITY_DELEGATION                指定将客户端模拟在授权级别(theDelegationimpersonationlevel)

   SECURITY_CONTEXT_TRACKING          指定安全跟踪模式是动态的,否则(不指定此标志)是静态的

   SECURITY_EFFECTIVE_ONLY            指定客户端的安全内容中的有效内容才可以被服务端使用,否则所有内容都可被使用。

这个标志允许客户端限制服务端在模拟客户端时所具有的权限。

7、hTemplateFile

   把具有GENERIC_READ权限的句柄指定为一个模板文件。

这个模板文件提供了文件属性和扩展属性,用于创建文件。

在Windows95/98/Me平台上:

这个参数必须为空,否则如果你提供一个句柄,函数调用将会失败,用GerLastError函数获得的出错信息为ERROR_NOT_SUPPORTED。

【ReturnValues】

   调用如果成功,返回值时一个打开文件的句柄。

   如果调用之前文件已存在,且dwCreationDisposetion为CREATE_ALWAYS或OPEN_ALWAYS,用GetLastError返回ERROR_ALREADY_EXISTS。

(即使调用成功也会返回这个值)。

如果调用之前不存在,GetLastError返回0。

   调用如果失败,返回值是INVALID_HANDLE_VALUE。

要进一步了解出错原因,调用GetLastError。

   

【Remarks】

   在Windows2000/XP平台上:

   如果你企图打开一个远程机器上的文件或目录,dwDesiredAccess设置为DELETE或者任一其他的控制标志,

而这时远程文件或目录还没有以FILE_SHARE_DELETE的方式打开的话,你的函数调用就会发生共享错误了。

为了避免共享错误,一种办法是单独用DELETE方式打开远程文件或目录,另一种方法是在打开文件或目录之前先调用DeleteFile函数。

   如果dwCreationDisposition参数指定为CREATE_ALWAYS并且dwFlagsAndAttributes参数指定为FILE_ATTRIBUTE_NORMAL的话,CreateFile调用将失败,GetLastError报告的错误是ACCESS_DENIED。

这时,把dwFlagsAndAttributes参数设置为FILE_ATTRIBUTE_HIDDEN和FILE_ATTRIBUTE_NORMAL的联合值,将避免这个问题。

二、*****CloseHandle*****

   用于关掉一个打开的对象句柄。

   函数原型:

BOOLCloseHandle(

HANDLEhObject  //handletoobject

);

【ReturnValues】

   函数调用成功返回非零,失败返回0。

获得更多错误信息,需要调用GetLastError函数。

   在WindowsNT/2000/XP平台上:

当应用程序在调试器下运行时,关闭一个不合法的句柄将产生一个异常(Exception)。

包括两次关闭同一个句柄,或者试图关闭一个由FindFirstFile函数返回的句柄,都会产生异常。

【Remarks】

   CloseHandle使指定的句柄无效,减少对象的句柄计数,进行对象保持检验。

当对象的最后一个句柄关闭时,对象将从系统中删除。

关闭一个线程句柄并不会终止一个线程,要释放一个线程对象,必须terminate线程,然后关闭所有的线程句柄。

用CloseHandle只能关闭由CreateFile函数返回的句柄。

用FindClose来关闭由FindFirstFile返回的句柄。

三、*****ReadFile*****

   ReadFile函数从文件指针指定的位置读取数据。

读操作完成后,文件指针将根据实际读出的数据自动进行调整,除非文件句柄是以OVERLAPPED属性值打开的。

如果是以OVERLAPPED打开的I/O,应用程序就需要自己手动调整文件指针。

   这个函数被设计成兼有同步和异步操作。

ReadFileEx函数则设计成只支持异步操作,异步操作允许应用程序在读文件期间可以同时进行其他的操作。

   函数原型:

BOOLReadFile(

HANDLEhFile,               //handletofile

LPVOIDlpBuffer,            //databuffer

DWORDnNumberOfBytesToRead,//numberofbytestoread

LPDWORDlpNumberOfBytesRead,//numberofbytesread

LPOVERLAPPEDlpOverlapped   //overlappedbuffer

);

【Parameters】

1、hFile

   文件句柄(必须具有GENERIC_READ访问权限)。

   在WindowsNT/2000/XP平台上:

对于异步读操作,hFile可以是由CreateFile函数以FILE_FLAG_OVERLAPPED方式打开的任何句柄,或者一个由socket或accept函数返回的socket句柄。

   在Windows95/98/Me平台上:

对于邮槽、命名管道和磁盘文件不能使用异步读操作。

2、lpBuffer

   用来接收从文件中读出的数据的缓冲区指针。

3、nNumberOfBytesToRead

   指明要读的字节总数。

4、lpNumberOfBytesRead

   一个变量指针,用来存储实际传输的字节总数。

ReadFile在做所有事情(包括错误检查)之前,先将这个值赋为0。

当ReadFile从一个命名管道上返回TRUE时这个参数为0,说明消息管道另一端调用WriteFile时设置的nNumberOfBytesToWrite参数为0。

   在WindowsNT/2000/XP平台上:

如果lpOverlapped为NULL,则lpNumberOfBytesRead不能为NULL。

如果lpOverlapped不是NULL,lpNumberOfBytesRead可以设为NULL。

如果是一个overlapped形式的读操作,我们可以动用GetOverlappedResult函数来获得传输的实际字节数。

如果hFile关联的是一个完成端口(I/Ocompletionport),那么可以调用GetQueuedCompletionStatus函数来获得传输的实际字节数。

   如果完成端口(I/Ocompletionport)被占用,而你用的是一个用于释放内存的回调例程,对于lpOverlapped参数指向的OVERLAPPED结构体来说,为这个参数指定NULL可以避免重新分配内存时发生内存泄漏。

内存泄漏会导致返回这个参数值时是一个非法值。

   Windows95/98/Me平台上:

这个参数不允许为NULL。

5、lpOverlapped

   一个指向OVERLAPPED结构体的指针。

如果hFile是以FILE_FLAG_OVERLAPPED方式获得的句柄,这个结构是必须的,不能为NULL。

(否则函数会在错误的时刻报告读操作已经完成了)。

这时,读操作在由OVERLAPPED中Offset成员指定的偏移地址开始读,并且在实际完成读操作之前就返回了。

在这种情况下,ReadFile返回FALSE,GerLastError报告从错误类型是ERROR_IO_PENDING。

这允许调用进程继续其他工作直到读操作完成。

OVERLAPPED结构中的事件将会在读操作完成时被使能。

   如果hFile不是以FILE_FLAG_OVERLAPPED方式获得的句柄,并且lpOverlapped为NULL,读操作就从当前文件的开始位置读起,直到读操作完成ReadFile函数才能返回。

   在WindowsNT/2000/XP平台上:

如果hFile不是以FILE_FLAG_OVERLAPPED方式获得的句柄,并且lpOverlapped不为NULL,则读操作在由OVERLAPPED中Offset成员指定的偏移地址开始读,直到读操作完成ReadFile函数才能返回。

   在Windows95/98/Me平台上:

对于文件、磁盘、管道和邮槽的操作,这个参数必须为NULL。

一个不为空的OVERLAPPED结构体指针将导致调用失败。

Windows95/98/Me平台只支持串行口和并行口的overlapped读写。

【ReturnValues】

   有如下任一种情况发生都会导致函数返回:

(1)在管道另一端的写操作完成后

(2)请求的字节数传输完毕(3)发生错误。

   如果函数正确,返回非零。

   如果返回值是非零,但接收的字节数是0,那么可能是文件指针在读操作期间超出了文件的end位置。

然而,如果文件以FILE_FLAG_OVERLAPPED方式打开,lpOverlapped参数不为NULL,文件指针在读操作期间超出了文件的end位置,那么返回值肯定是FALSE,GetLastError返回的错误是ERROR_HANDLE_EOF。

【Remarks】

   如果文件的一部分被

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1