ZwDeviceIoControlFile 函数 (ntifs.h)

ZwDeviceIoControlFile 例程将控制代码直接发送到指定的设备驱动程序,导致相应的驱动程序执行指定的操作。

语法

NTSYSAPI NTSTATUS ZwDeviceIoControlFile(
  [in]            HANDLE           FileHandle,
  [in, optional]  HANDLE           Event,
  [in, optional]  PIO_APC_ROUTINE  ApcRoutine,
  [in, optional]  PVOID            ApcContext,
  [out]           PIO_STATUS_BLOCK IoStatusBlock,
  [in]            ULONG            IoControlCode,
  [in, optional]  PVOID            InputBuffer,
  [in]            ULONG            InputBufferLength,
  [out, optional] PVOID            OutputBuffer,
  [in]            ULONG            OutputBufferLength
);

参数

[in] FileHandle

ZwCreateFileZwOpenFile 为表示应向其提供控制信息或从中返回信息的设备的文件对象返回的句柄。 如果调用方在 ApcContext) 中指定 事件ApcRoutine 和 APC 上下文 (,或者在 ApcContext) 中指定 完成上下文 (,则必须为异步 I/O 打开文件对象。 对于基础大容量存储设备的 I/O,必须已打开文件对象,以便直接访问存储设备 (DASD) 访问。

[in, optional] Event

调用方创建的事件的句柄。 如果提供了此参数,则调用方将进入等待状态,直到请求的操作完成,并且给定的事件设置为“已发出信号”状态。 此参数是可选的,可以为 NULL。 如果调用方将等待 FileHandle 设置为“已发出信号”状态,则必须为 NULL

[in, optional] ApcRoutine

调用方提供的可选 APC 例程的地址,该例程将在请求的操作完成时调用。 此参数可以为 NULL。 如果存在与文件对象关联的 I/O 完成对象,则它必须为 NULL

[in, optional] ApcContext

指向调用方确定的上下文区域的指针。 如果调用方提供 APC,此参数值将用作 APC 上下文;如果 I/O 完成对象已与文件对象关联,则将其用作完成上下文。 操作完成后,会将 APC 上下文传递给 APC(如果指定了),或者完成上下文作为 I/O 管理器发布到关联的 I/O 完成对象的完成消息的一部分包含在内。

此参数是可选的,可以为 NULL。 如果 ApcRoutineNULL 并且没有与文件对象关联的 I/O 完成对象,则它必须为 NULL

[out] IoStatusBlock

指向接收最终完成状态和操作相关信息的变量的指针。 对于返回数据的成功调用,在 Information 成员中返回写入 OutputBuffer 的字节数。

[in] IoControlCode

IOCTL_XXX 代码,指示要对哪个设备 I/O 控制操作执行,通常由基础设备驱动程序执行。 此参数的值确定 InputBufferOutputBuffer 的格式和所需长度,以及以下哪些参数对是必需的。 有关系统定义的特定于设备的 IOCTL_XXX 代码的详细信息,请参阅 Microsoft Windows SDK 文档中的 Microsoft Windows 驱动程序工具包 (WDK) 文档和设备输入和输出控制代码中的特定于设备技术的部分

[in, optional] InputBuffer

指向调用方分配的输入缓冲区的指针,该缓冲区包含要提供给目标设备的特定于设备的信息。 如果 IoControlCode 指定不需要输入数据的操作,则此指针可以为 NULL

[in] InputBufferLength

InputBuffer 中缓冲区的大小(以字节为单位)。 如果 InputBufferNULL,请将 InputBufferLength 设置为零。

[out, optional] OutputBuffer

指向调用方分配的输出缓冲区的指针,该缓冲区从目标设备返回信息。 如果 IoControlCode 指定不生成输出数据的操作,则此指针可以为 NULL

[in] OutputBufferLength

OutputBuffer 中缓冲区的大小(以字节为单位)。 如果 OutputBufferNULL,请将 OutputBufferLength 设置为零。

返回值

如果基础驱动程序 () 成功执行请求的操作,ZwDeviceIoControlFile 将返回STATUS_SUCCESS。 否则,返回值可能是从基础驱动程序传播的错误状态代码。 可能的错误状态代码包括以下内容:

注解

ZwDeviceIoControlFile 为系统和内核模式驱动程序提供输入和输出数据的一致视图,同时为应用程序和基础驱动程序提供与设备相关的指定通信接口的方法。

有关系统定义的 IOCTL_XXX 代码以及定义特定于驱动程序的 IOCTL_XXX 或 FSCTL_XXX 值的详细信息,请参阅使用内核模式体系结构指南中的 I/O 控制代码和Microsoft Windows SDK文档中的设备输入和输出控制代码

如果调用方为异步 I/O (打开了文件且未FILE_SYNCHRONOUS_XXX 创建/打开选项) ,则指定事件(如果有)将在设备控制操作完成时设置为信号状态。 否则, FileHandle 指定的文件对象将设置为信号状态。 如果指定了 ApcRoutine ,则使用 ApcContextIoStatusBlock 指针调用它。

微筛选器应使用 FltDeviceIoControlFile 而不是 ZwDeviceIoControlFile

ZwDeviceIoControlFile 的调用方必须在 IRQL = PASSIVE_LEVEL 运行,并且启用了特殊内核 APC

注意 如果在用户模式下调用 ZwDeviceIoControlFile 函数,则应使用名称“NtDeviceIoControlFile”而不是“ZwDeviceIoControlFile”。
 
对于来自内核模式驱动程序的调用,Windows 本机系统服务例程的 **Nt*Xxx*** 和 **Zw*Xxx*** 版本在处理和解释输入参数的方式上的行为可能会有所不同。 有关例程的 **Nt*Xxx*** 和 **Zw*Xxx*** 版本之间的关系的详细信息,请参阅 [使用本机系统服务例程的 Nt 和 Zw 版本] (/windows-hardware/drivers/kernel/using-nt-and-zw-versions-of-native-system-services-routines) 。

要求

要求
最低受支持的客户端 Windows 2000。
目标平台 通用
标头 ntifs.h (包括 Ntifs.h、Ntddk.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL (请参阅备注部分)
DDI 符合性规则 HwStorPortProhibitedDDI (storport) PowerIrpDDis (wdm)

另请参阅

FltDeviceIoControlFile

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoBuildSynchronousFsdRequest

IoCallDriver

使用 I/O 控制代码

使用本机系统服务例程的 Nt 和 Zw 版本

ZwClose

ZwCreateFile

ZwOpenFile