一、CreateFile

这是一个多功能的函数,可打开或创建文件或者I/O设备,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道。

函数原型:

  1. HANDLE WINAPI CreateFile(
  2. _In_ LPCTSTR lpFileName,
  3. _In_ DWORD dwDesiredAccess,
  4. _In_ DWORD dwShareMode,
  5. _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  6. _In_ DWORD dwCreationDisposition,
  7. _In_ DWORD dwFlagsAndAttributes,
  8. _In_opt_ HANDLE hTemplateFile
  9. );

返回值:

Long,如执行成功,则返回文件句柄。INVALID_HANDLE_VALUE表示出错,会设置GetLastError。即使函数成功,但若文件存在,且指定了CREATE_ALWAYS 或 OPEN_ALWAYS,GetLastError也会设为ERROR_ALREADY_EXISTS

函数声明:

  1. HANDLE CreateFile(LPCTSTR lpFileName, //普通文件名或者设备文件名
  2. DWORD dwDesiredAccess, //访问模式(写/读)
  3. DWORD dwShareMode, //共享模式
  4. LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
  5. DWORD dwCreationDisposition, //如何创建
  6. DWORD dwFlagsAndAttributes, //文件属性
  7. HANDLE hTemplateFile //用于复制文件句柄
  8. );

参数说明:

lpFileName String:要打开的文件的名或设备名。

dwDesiredAccess:指定类型的访问对象。GENERIC_READ 表示允许对设备进行读访问,GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息 。

dwShareMode:Long, 如果是零表示不共享; 如果是FILE_SHARE_DELETE表示随后打开操作对象会成功,但只有删除访问请求的权限;如果是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 —— 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件

hTemplateFile:hTemplateFile为一个文件或设备句柄,表示按这个参数给出的句柄为模板创建文件(就是将该句柄文件拷贝到lpFileName指定的路径,然后再打开)。它将指定该文件的属性扩展到新创建的文件上面,这个参数可用于将某个新文件的属性设置成与现有文件一样,并且这样会忽略dwAttrsAndFlags。通常这个参数设置为NULL,为空表示不使用模板,一般为空。

误区:

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

举个例子:

  1. CreateFile(TEXT("\\\\.\\NDISUIO"),//设备名称是NDISUIO,跟网络有关的设备
  2. GENERIC_READ | GENERIC_WRITE,//表示可以读写
  3. 0,//不共享
  4. NULL,//空指针
  5. OPEN_EXISTING,//文件必须已经存在。由设备提出要求
  6. FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//默认属性或者允许对文件进行重叠操作
  7. NULL);//不使用模板

二、DeviceIoControl

  1. BOOL DeviceIoControl(HANDLE hDevice,
  2. DWORD dwIoControlCode,
  3. LPVOID lpInBuffer,
  4. DWORD nInBufferSize,
  5. LPVOID lpOutBuffer,
  6. DWORD nOutBufferSize,
  7. LPDWORD lpBytesReturned,
  8. LPOVERLAPPED lpOverlapped );

Parameters(参数)

hDevice (CreateFile返回的设备句柄)
[in] Handle to the device that is to perform the operation. To obtain a device handle, call the CreateFile function.
dwIoControlCode (应用程序调用驱动程序的控制命令,就是IOCTL_XXX IOCTLs )
[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失败)

例子:向设备传递数据

  1. bool SendKeyData(HANDLE handle, BYTE *bData, int iSize)
  2. {
  3. ULONG nOutput;
  4. BYTE bTemp[512];
  5.  
  6. //将数据放置到发送数组
  7. memset(bTemp,0,sizeof(bTemp));
  8. memcpy(bTemp,&bData[0],iSize);
  9. //向设备发送
  10. if (!DeviceIoControl(handle,
  11. ATST2004_IOCTL_WRITE, //根据具体的设备有相关的定义
  12. bTemp, //向设备传递的数据地址
  13. iSize, //数据大小,字节数
  14. NULL, //没有返回的数据,置为NULL
  15. 0, //没有返回的数据,置为0
  16.  
  17. &nOutput,
  18. NULL)
  19. )
  20. {
  21. return false;
  22. }
  23.  
  24. return true;
  25. }

例子:从设备中读取

  1. bool ReviceKeyData(HANDLE handle, BYTE *bData, int iSize)
  2. {
  3.  
  4. ULONG nOutput;
  5. BYTE bTemp[512];
  6. //数组清零
  7. memset(bTemp,0,sizeof(bTemp));
  8. //向设备发送
  9. if (!DeviceIoControl(handle,
  10. ATST2004_IOCTL_READ, //根据具体的设备有相关的定义
  11. NULL, //没有向设备传递的数据,置为NULL
  12. 0, //没有向设备传递的数据,置为NULL
  13. bTemp, //读取设备的数据返回地址
  14. iSize, //读取数据的字节数
  15. &nOutput,
  16. NULL)
  17. )
  18. {
  19. return false;
  20. }
  21. //放置到公用数组
  22. memcpy(&bData[0],&bTemp[0],iSize);
  23. return true;
  24. }

我们在说DeviceIoControl函数时其第二个参数dwIoControlCode就是由CTL_CODE宏定义的,下边我们可以了解一下CTL_CODE的内容。

  1. #define CTL_CODE(DeviceType, Function, Method, Access) ( ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) )

参数:

DeviceTypeDefines the type of device for the given IOCTL.

This parameter can be no bigger than a WORD value.

The values used by Microsoft are in the range 0-32767; the values 32768-65535 are reserved for use by OEMs and IHVs.

The following device types are defined by the system:

  • FILE_DEVICE_BEEP
  • FILE_DEVICE_CD_ROM
  • FILE_DEVICE_CD_ROM_FILE_SYSTEM
  • FILE_DEVICE_CONTROLLER
  • FILE_DEVICE_DATALINK
  • FILE_DEVICE_DFS
  • FILE_DEVICE_DISK
  • FILE_DEVICE_DISK_FILE_SYSTEM
  • FILE_DEVICE_FILE_SYSTEM
  • FILE_DEVICE_INPORT_PORT
  • FILE_DEVICE_KEYBOARD
  • FILE_DEVICE_MAILSLOT
  • FILE_DEVICE_MIDI_IN
  • FILE_DEVICE_MIDI_OUT
  • FILE_DEVICE_MOUSE
  • FILE_DEVICE_MULTI_UNC_PROVIDER
  • FILE_DEVICE_NAMED_PIPE
  • FILE_DEVICE_NETWORK
  • FILE_DEVICE_NETWORK_BROWSER
  • FILE_DEVICE_NETWORK_FILE_SYSTEM
  • FILE_DEVICE_NULL
  • FILE_DEVICE_PARALLEL_PORT
  • FILE_DEVICE_PHYSICAL_NETCARD
  • FILE_DEVICE_PRINTER
  • FILE_DEVICE_SCANNER
  • FILE_DEVICE_SERIAL_MOUSE_PORT
  • FILE_DEVICE_SERIAL_PORT
  • FILE_DEVICE_SCREEN
  • FILE_DEVICE_SOUND
  • FILE_DEVICE_DEVICE_STREAMS
  • FILE_DEVICE_TAPE
  • FILE_DEVICE_TAPE_FILE_SYSTEM
  • FILE_DEVICE_TRANSPORT
  • FILE_DEVICE_UNKNOWN
  • FILE_DEVICE_VIDEO
  • FILE_DEVICE_VIRTUAL_DISK
  • FILE_DEVICE_WAVE_IN
  • FILE_DEVICE_WAVE_OUT
  • FILE_DEVICE_8042_PORT
  • FILE_DEVICE_NETWORK_REDIRECTOR
  • FILE_DEVICE_BATTERY
  • FILE_DEVICE_BUS_EXTENDER
  • FILE_DEVICE_MODEM
  • FILE_DEVICE_VDM
  • FILE_DEVICE_MASS_STORAGE
  • FILE_DEVICE_SMB
  • FILE_DEVICE_KS
  • FILE_DEVICE_CHANGER
  • FILE_DEVICE_SMARTCARD
  • FILE_DEVICE_ACPI
  • FILE_DEVICE_DVD
  • FILE_DEVICE_FULLSCREEN_VIDEO
  • FILE_DEVICE_DFS_FILE_SYSTEM
  • FILE_DEVICE_DFS_VOLUME

The following device types are specific to Windows CE:

  • FILE_DEVICE_HAL
  • FILE_DEVICE_CONSOLE
  • FILE_DEVICE_PSL
  • FILE_DEVICE_SERVICE

Function

  Defines an action within the device category.

  Function codes 0-2047 are reserved for Microsoft; codes 2048-4095 are reserved for OEMs and IHVs.

  A function code can be no larger then 4095.

Method

Defines the method codes for how buffers are passed for I/O and file system controls.

The following values are possible for this parameter:

  • METHOD_BUFFERED
  • METHOD_IN_DIRECT
  • METHOD_OUT_DIRECT
  • METHOD_NEITHER

  This field is ignored by Windows CE. You should always use the METHOD_BUFFERED value unless compatibility with Windows-based desktop platforms is required using a different Method value.

Access

Defines the access check value for any access.

The following table shows the possible flags for this parameter. The FILE_ACCESS_ANY is generally the correct value.

Flag Description
FILE_ANY_ACCESS Request all access.
FILE_READ_ACCESS Request read access. Can be used with FILE_WRITE_ACCESS.
FILE_WRITE_ACCESS Request write access. Can be used with FILE_READ_ACCESS.

其中CTL_CODE定义中有一个Method域,该域的功能意义是定义用于与在驱动程序中获取应用程序数据缓冲区的地址方式。Method域就是定义了lpInBuffer 和lpOutBuffer 缓冲区在驱动程序中对这两个缓冲区地址的获取和数据的操作方式。我们分别进行描述:

  • METHOD_BUFFERED

    系统分配一个缓冲区用于输入和输出,该缓冲区的字节数应该为应用程序的输入和输出缓冲区中较大的字节数。驱动程序中通过KIrp::IoctlBuffer获得缓冲区的地址。对于输出,驱动程序必须将输出字节数返回给I.Information(),然后由I/O管理器将数据从系统缓冲区复制到应用程序的缓冲区中。

  • METHOD_IN_DIRECT
  • METHOD_OUT_DIRECT

    在这两种方式下,输入缓冲区数据被复制到一个系统缓冲区中,驱动程序可以用KIrp::IoctlBuffer访问这个缓冲区。输出缓冲区被类KMemory对象映射,驱动程序可以通过KIrp::Mdl来访问这个缓冲区。

  • METHOD_NEITHER

    这个比较特殊,一般不使用。

关于DeviceIoControl的第二个参数代表什么,目前还没有查出来,应该与NDISUIO.sys有关,后续会继续查看。

以太网类型字段及值ETHER_TYPE ,类型与含义

Ethertype
            ( 十六进制 )

协议

0x0000 - 0x05DC

IEEE 802.3 长度

0x0101 – 0x01FF

实验

0x0600

XEROX NS IDP

0x0660
            0x0661

DLOG

0x0800

网际协议(IP)

0x0801

X.75 Internet

0x0802

NBS Internet

0x0803

ECMA Internet

0x0804

Chaosnet

0x0805

X.25 Level 3

0x0806

地址解析协议(ARP : Address Resolution Protocol)

0x0808

帧中继 ARP (Frame Relay ARP) [RFC1701]
0x6559

原始帧中继(Raw Frame Relay) [RFC1701]
0x8035

动态 DARP (DRARP:Dynamic RARP)
            反向地址解析协议(RARP:Reverse Address Resolution Protocol)

0x8037

Novell Netware IPX
0x809B

EtherTalk
0x80D5

IBM SNA Services over Ethernet
0x 80F 3

AppleTalk 地址解析协议(AARP:AppleTalk Address Resolution Protocol)

0x8100

以太网自动保护开关(EAPS:Ethernet Automatic Protection Switching)

0x8137

因特网包交换(IPX:Internet Packet Exchange)

0x 814C

简单网络管理协议(SNMP:Simple Network Management Protocol)

0x86DD

网际协议v6 (IPv6,Internet Protocol version 6)

0x880B

点对点协议(PPP:Point-to-Point Protocol)

0x 880C

通用交换管理协议(GSMP:General Switch Management Protocol)

0x8847

多协议标签交换(单播) MPLS:Multi-Protocol Label Switching )

0x8848

多协议标签交换(组播)(MPLS, Multi-Protocol Label Switching )

0x8863

以太网上的 PPP(发现阶段)(PPPoE:PPP Over Ethernet )

0x8864

以太网上的 PPP(PPP 会话阶段) (PPPoE,PPP Over Ethernet)

0x88BB

轻量级访问点协议(LWAPP:Light Weight Access Point Protocol)

0x88CC

链接层发现协议(LLDP:Link Layer Discovery Protocol)

0x8E88

局域网上的 EAP(EAPOL:EAP over LAN)

0x9000

配置测试协议(Loopback)
0x9100

VLAN 标签协议标识符(VLAN Tag Protocol Identifier)

0x9200

VLAN 标签协议标识符(VLAN Tag Protocol Identifier)

0xFFFF

保留

第三十二篇 -- CreateFile、ReadFile、WriteFile的更多相关文章

  1. 第三十二篇、iOS 10开发

    1.语音识别 苹果官方在文档中新增了API   Speech,那么在以前我们处理语音识别非常的繁琐甚至很多时候可能需要借助于第三方框架处理,那么苹果推出了这个后,我们以后处理起来就非常的方便了,spe ...

  2. Python之路(第三十二篇) 网络编程:udp套接字、简单文件传输

    一.UDP套接字 服务端 # udp是无链接的,先启动哪一端都不会报错 # udp没有链接,与tcp相比没有链接循环,只有通讯循环 server = socket.socket(socket.AF_I ...

  3. Android UI开发第三十二篇——Creating a Navigation Drawer

    Navigation Drawer是从屏幕的左侧滑出,显示应用导航的视图.官方是这样定义的: The navigation drawer is a panel that displays the ap ...

  4. 第三十二篇 玩转数据结构——AVL树(AVL Tree)

          1.. 平衡二叉树 平衡二叉树要求,对于任意一个节点,左子树和右子树的高度差不能超过1. 平衡二叉树的高度和节点数量之间的关系也是O(logn) 为二叉树标注节点高度并计算平衡因子 AVL ...

  5. 第三十二篇:在SOUI2.0中像android一样使用资源

    SOUI2.0之前,在SOUI中使用资源通常是直接使用这个资源的name(一个字符串)来引用.使用字符串的好处在于字符串能够表达这个资源的意义,因此使用字符串也是现代UI引擎常用的方式. 尽管直接使用 ...

  6. 第三十二篇-NavigationView导航抽屉的使用

    效果图: 导航抽屉所用到的布局是DrawerLayout,可以在里面添加一个线性布局和TextView组件,TextView组件的文本信息就是"主页面".然后和线性布局平行添加一个 ...

  7. Python之路【第三十二篇】:django 分页器

    Django的分页器paginator 文件为pageDemo models.py from django.db import models # Create your models here. cl ...

  8. 第三十二篇:vue的响应式原理

    好家伙 什么是响应式?比较官方的回答: Vue.js 的核心包括一套"响应式系统". "响应式",是指当数据改变后,Vue 会通知到使用该数据的代码. 例如,视 ...

  9. 《手把手教你》系列技巧篇(三十二)-java+ selenium自动化测试-select 下拉框(详解教程)

    1.简介 在实际自动化测试过程中,我们也避免不了会遇到下拉选择的测试,因此宏哥在这里直接分享和介绍一下,希望小伙伴或者童鞋们在以后工作中遇到可以有所帮助. 2.select 下拉框 2.1Select ...

随机推荐

  1. robotframework用户关键字创建过程

    robotframework是一个关键字驱动框架,核心在于关键字的应用.系统本身通过各种库自带了大量关键字,同时支持用户自定义关键字.关键字可以简单理解为各种处理数据的方法. 关键字区别与用户参数. ...

  2. 用Python爬取分析【某东618】畅销商品销量数据,带你看看大家都喜欢买什么!

    618购物节,辰哥准备分析一波购物节大家都喜欢买什么?本文以某东为例,Python爬取618活动的畅销商品数据,并进行数据清洗,最后以可视化的方式从不同角度去了解畅销商品中,名列前茅的商品是哪些?销售 ...

  3. 可微渲染 SoftRas 实践

    SoftRas 是目前主流三角网格可微渲染器之一. 可微渲染通过计算渲染过程的导数,使得从单张图片学习三维结构逐渐成为现实.可微渲染目前被广泛地应用于三维重建,特别是人体重建.人脸重建和三维属性估计等 ...

  4. noip模拟7[匹配·回家·寿司]

    这次考试状态好像还是没有回来,只拿了55pts,还全是第一题的功劳,就是一个小KMP,然后还让我给打错了 就很难受,while打成了if,然后wa掉45分考完立马拿回来了,悔死了,害 第二题爆零了,为 ...

  5. 【题解】codeforces 1B Spreadsheets

    题意翻译 人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统:第一列被标为A,第二列为B,以此类推,第26列为Z.接下来为由两个字母构成的列号: 第27列为AA,第28列为AB-在标为 ...

  6. 【题解】ball 数论

    题目 题目描述: 众所周知的是Dr.Bai 穷困潦倒负债累累,最近还因邦邦的出现被班上的男孩子们几乎打入冷宫,所以Dr.Bai 决定去打工赚钱. Dr.Bai 决定做玩♂球的工作,工作内容如下. 老板 ...

  7. java 写webservice接口解析xml报文

    1 <!--解析xml报文--> 2 <dependency> 3 <groupId>dom4j</groupId> 4 <artifactId& ...

  8. Go基础语法0x01-数组

    数组 1.Go数组简介 数组是Go语言编程中最常用的数据结构之一.顾名思义,数组就是指一系列同一类型数据的集合.数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的 ...

  9. mysql主节点down机后如何恢复操作

    1 停机维护 (1) 先停止上层应用 (2) 检查backup和slave的中继日志是否已经完成了回放及gtid_executed保持一致 mysql> show slave status\G; ...

  10. QQ邮箱获取授权码方法

    1.登录QQ邮箱,点击"设置" 2.点击"账户" 3.开启POP3/SMTP服务 4.点击"生成授权码" 5.完成验证后,即可生成授权码 P ...