CreateFile 获取一个文件或程序的内核句柄

来源:互联网 发布:lifekeeper for linux 编辑:程序博客网 时间:2024/05/16 02:05

该函数用来打开或创建一个文件并且获取该文件的内核句柄。

函数原型:

HANDLE CreateFile(

  LPCTSTR lpFileName, //指向文件名的指针

  DWORD dwDesiredAccess, //访问模式(写/读)

  DWORD dwShareMode, //共享模式

  LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针

  DWORD dwCreationDisposition, //如何创建

  DWORD dwFlagsAndAttributes, //文件属性

  HANDLE hTemplateFile //用于复制文件句柄

  );

参数列表:

1lpFileName
   
一个指向无终结符的字符串的指针,来指明要创建或打开的对象的名字。
     2
dwDesiredAccess
   
指明对象的控制模式。一个应用程序可以包含读控制、写控制、读/写控制、设备查询控制。
这个参数的取值可以是下面这些的组合:
    0                                   
指定设备查询控制:程序可以不访问设备就查询到设备属性。
    GENERIC_READ               
指定读控制,可以从对象中读取数据(指针将可以移动)
    GENERIC_WRITE             
指定写控制,可以向对象中写数据(指针将可以移动)

3dwShareMode
   
指定对象的共享模式。如果dwShareMode==0,表示是互斥使用的。如果CreateFile打开成功,则别的程序只能等到当前程序关闭对象句柄CloseHandle后才能在打开或使用。
   
使用下面这些值的组合来表示对象的共享模式:
    FILE_SHARE_DELETE       Windows NT/2000/XP:
打开操作只有在删除请求发生时才能返回成功。
    FILE_SHARE_READ                
打开操作只有在读控制请求发生时才能返回成功。
    FILE_SHARE_WRITE               
打开操作只有在写控制请求发生时才能返回成功。

4lpSecurityAttributes  (这个参数一般可以设置为 NULL
   
一个指向SECURITY_ATTRIBUTES结构对象的指针,决定返回的句柄是否被子进程所继承。如果lpSecurityAttributes参数为NULL,句柄就不能被子进程继承。
   
Windows NT/2000/XP平台下:lpSecurityDescriptor这个成员指明了这个对象的安全描述符。如果lpSecurityAttributes参数为NULL,对象将获得一个默认的安全描述符。目标文件系统必须为这个参数的在文件上的有效操作保证安全性。
typedef struct _SECURITY_ATTRIBUTES { 
DWORD nLength; //
结构体的大小(字节为单位),siziof(SECURITY_ATTRIBUTES)
LPVOID lpSecurityDescriptor; //
指向对象的安全描述符的指针,控制对象的共享属性。在Windows 95/98/Me平台                                                     //上这个成员被忽略。
BOOL   bInheritHandle; //
指明当一个新的子进程创建时,是否继承当前返回的句柄
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;

5dwCreationDisposition
   
指明当打开的对象存在或不存在的时候各需怎样处理。这个参数必须是一下值的其中之一:
    CREATE_NEW           
创建新文件/对象(当对象已经存在是将返回失败)
    CREATE_ALWAYS        
总是创建(如果对象存在就覆盖它,清除当前属性,把文件属性和dwFlagsAndAttributes指定的标志相结合)
    OPEN_EXISTING        
打开文件(如果不存在就返回失败)
    OPEN_ALWAYS     
存在就打开;若不存在,假如dwCreationDisposition==CREATE_NEW就创建一个新文件。
    TRUNCATE_EXISTING    
存在就打开,且清空文件内容(至少要有GENERIC_WRITE权限);若文件不存在就返回失败。

6dwFlagsAndAttributes Long

指定文件属性和标志。可以是以下值的任意组合(只有FILE_ATTRIBUTE_NORMAL必须单独使用,唯一例外)

  FILE_ATTRIBUTE_ARCHIVE 标记归档属性

  FILE_ATTRIBUTE_COMPRESSED 将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式

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

  FILE_ATTRIBUTE_HIDDEN 隐藏文件或目录

  FILE_ATTRIBUTE_READONLY 文件为只读

  FILE_ATTRIBUTE_SYSTEM 文件为系统文件

  FILE_FLAG_WRITE_THROUGH 操作系统不得推迟对文件的写操作

  FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作

  FILE_FLAG_NO_BUFFERING 禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块

  FILE_FLAG_RANDOM_ACCESS 针对随机访问对文件缓冲进行优化

  FILE_FLAG_SEQUENTIAL_SCAN 针对连续访问对文件缓冲进行优化

  FILE_FLAG_DELETE_ON_CLOSE 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件

7hTemplateFile  (这个参数一般可以默认为 NULL
   
把具有GENERIC_READ权限的句柄指定为一个模板文件。这个模板文件提供了文件属性和扩展属性,用于创建文件。在Windows95/98/Me平台上:这个参数必须为空,否则如果你提供一个句柄,函数调用将会失败,用GerLastError函数获得的出错信息为ERROR_NOT_SUPPORTED

 

返回值:

如函数执行成功,则返回文件(程序)的句柄。否则返回: INVALID_HANDLE_VALUE

误区

  CreateFile的涵义是创建File这个内核对象,而不是创建物理磁盘上的文件。在Win32 API中有一系列操作内核对象的函数,创建内核对象的函数大多命名为CreateXxxx型。