分享

CreateFile、DeviceIoControl、WriteFile函数说明

 ylw527 2010-09-10

HANDLE CreateFile(
  LPCTSTR lpFileName, //指向文件名的指针
  DWORD dwDesiredAccess, //访问模式(写/读)
  DWORD dwShareMode, //共享模式
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
  DWORD dwCreationDisposition, //如何创建
  DWORD dwFlagsAndAttributes, //文件属性
  HANDLE hTemplateFile //用于复制文件句柄
  );
  参数列表 
  lpFileName String 要打开的文件的名字 
  dwDesiredAccess Long 如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息 
  dwShareMode Long, 零表示不共享; FILE_SHARE_READ 和/或 FILE_SHARE_WRITE 表示允许对文件进行共享访问
  lpSecurityAttributes SECURITY_ATTRIBUTES, 指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话)
  dwCreationDisposition Long,下述常数之一: 
  CREATE_NEW 创建文件;如文件存在则会出错 
  CREATE_ALWAYS 创建文件,会改写前一个文件 
  OPEN_EXISTING 文件必须已经存在。由设备提出要求 
  OPEN_ALWAYS 如文件不存在则创建它 
  TRUNCATE_EXISTING 讲现有文件缩短为零长度 
  dwFlagsAndAttributes Long, 一个或多个下述常数 
  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 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件
  也可在Windows NT下组合使用下述常数标记: 
  SECURITY_ANONYMOUS, SECURITY_IDENTIFICATION, SECURITY_IMPERSONATION, SECURITY_DELEGATION, SECURITY_CONTEXT_TRACKING, SECURITY_EFFECTIVE_ONLY 
  hTemplateFile Long, 如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性
返回值
如执行成功,则返回文件句柄。
  INVALID_HANDLE_VALUE表示出错,会设置GetLastError。即使函数成功,但若文件存在,且指定了CREATE_ALWAYS 或 OPEN_ALWAYS,GetLastError也会设为ERROR_ALREADY_EXISTS
 
BOOL DeviceIoControl(
HANDLE hDevice, // CreateFile返回的设备句柄
DWORD dwIoControlCode, // 应用程序调用驱动程序的控制命令,就是IOCTL_XXX IOCTLs 控制码
      //发送不同的控制码,可以调用设备驱动程序的不同类型的功能。在头文件
winioctl.h 中,预定义的标准设备控制码,都以 IOCTL 或 FSCTL 开头。
LPVOID lpInBuffer, // 输入数据缓冲区指针, 应用程序传递给驱动程序的数据缓冲区地址
DWORD nInBufferSize, // 输入数据缓冲区长度
LPVOID lpOutBuffer, // 输出数据缓冲区指针 驱动程序返回给应用程序的数据缓冲区地址
DWORD nOutBufferSize, // 输出数据缓冲区长度
LPDWORD lpBytesReturned, // 输出数据实际长度单元长度
LPOVERLAPPED lpOverlapped // 重叠操作结构指针
);
/*Parameters(参数)
hDevice (设备句柄)
[in] Handle to the device that is to perform the operation. To obtain a device handle, call the CreateFile function.
dwIoControlCode ()
[in] IOCTL for the operation. This value identifies the specific operation to perform and the type of device on which to perform the operation. There are no specific values defined for the dwIoControlCode parameter. However, you can define custom IOCTL_XXX IOCTLs with the CTL_CODE macro. You can then advertise these IOCTLs and an application can use these IOCTLs with DeviceIoControl to perform the driver-specific functions.
lpInBuffer ()
[in] Long pointer to a buffer that contains the data required to perform the operation. Set to NULL if the dwIoControlCode parameter specifies an operation that does not require input data.
nInBufferSize (应用程序传递给驱动程序的数据缓冲区大小,字节数)
[in] Size, in bytes, of the buffer pointed to by lpInBuffer.
lpOutBuffer ()
[out] Long pointer to a buffer that receives the output data for the operation. Set to NULL if the dwIoControlCode parameter specifies an operation that does not produce output data.
nOutBufferSize (驱动程序返回给应用程序的数据缓冲区大小,字节数)
[out] Size, in bytes, of the buffer pointed to by lpOutBuffer.
lpBytesReturned (驱动程序实际返回给应用程序的数据字节数地址)
[out] Long pointer to a variable that receives the size, in bytes, of the data stored in lpOutBuffer. The DeviceIoControl function may unnecessarily use this parameter. For example, if an operation does not produce data for lpOutBuffer and lpOutBuffer is NULL, the value of lpBytesReturned is meaningless.
lpOverlapped (重叠操作结构)
[in] Ignored; set to NULL.
Return Values(返回值)
Nonzero indicates success. Zero indicates failure. To obtain extended error information, call the GetLastError function. (非0成功,0失败)
*/
BOOL WriteFile(  
       HANDLE hFile, // 文件句柄, 需要写入数据的文件指针
    LPCVOID lpBuffer, // 数据缓存区指针  
    DWORD nNumberOfBytesToWrite, // 你要写的字节数  
      LPDWORD lpNumberOfBytesWritten, // 用于保存实际写入字节数的存储区域的指针  
    LPOVERLAPPED lpOverlapped // OVERLAPPED结构体指针  
     );

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多