NtCancelIoFileEx 函数

标记指定文件句柄的任何未完成的 I/O 操作。 函数仅取消当前进程中的 I/O 操作,而不考虑创建 I/O 操作的线程。

注意

此函数是等效于 CancelIoEX Win32 函数的用户模式。

语法

BOOL WINAPI NtCancelIoFileEx(
  _In_     HANDLE       hFile,
  _In_opt_ LPOVERLAPPED lpOverlapped
);

parameters

hFile [in]

文件的句柄。

lpOverlapped [in, optional]

指向包含用于异步 I/O 的数据的 OVERLAPPED 数据结构的指针。

如果此参数为 NULL,则会取消 hFile 参数的所有 I/O 请求。

如果此参数不为 NULL,则只有为具有指定 lpOverlapped 重叠结构的文件发出的特定 I/O 请求标记为已取消,这意味着可以取消一个或多个请求,而 NtCancelIoFile 函数将取消文件句柄上所有未完成的请求。

返回

如果该函数成功,则返回值为非零值。 已成功请求由指定文件句柄的调用进程发出的所有挂起 I/O 操作的取消操作。 在取消的 I/O 操作之前,应用程序不得释放或重复使用与已取消的 I/O 操作关联的 OVERLAPPED 结构。 线程可以使用 GetOverlappedResult 函数来确定 I/O 操作本身的完成时间。

如果函数失败,则返回值为 0 (零) 。 若要获取扩展错误信息,请调用 GetLastError 函数。

如果此函数找不到取消请求,则返回值为 0 (零) , GetLastError 返回 ERROR_NOT_FOUND

备注

NTCancelIoFileEx 函数允许取消调用线程以外的线程中的请求。 NtCancelIoFile 函数仅取消调用 NtCancelIoFile 函数的同一线程中的请求。 NtCancelIoFileEx 仅取消句柄上的未完成 I/O,它不会更改句柄的状态;这意味着不能依赖于句柄的状态,因为无法知道操作是成功完成还是已取消。

如果指定文件句柄有任何挂起的 I/O 操作正在进行中, 则 NtCancelIoFileEx 函数将其标记为取消。 大多数类型的操作都可以立即取消;其他操作可以在实际取消并通知调用方之前继续完成。 NtCancelIoFileEx 函数不会等待所有取消的操作完成。

如果文件句柄与完成端口关联,则如果同步操作成功取消,则 I/O 完成数据包不会排队到该端口。 对于仍处于挂起状态的异步操作,取消操作会将 I/O 完成数据包排队。

正在取消的操作以三种状态之一完成:必须检查完成状态才能确定完成状态。 这三种状态为:

  • 操作正常完成。 即使已取消操作,也会发生这种情况,因为取消请求可能尚未及时提交以取消操作。
  • 该操作已取消。 GetLastError 函数返回ERROR_OPERATION_ABORTED
  • 操作失败,出现另一个错误。 GetLastError 函数返回相关的错误代码。

在Windows 8和Windows Server 2012中,以下技术支持此功能。

技术 支持
服务器消息块 (SMB) 3.0 协议

SMB 3.0 透明故障转移 (TFO)

具有横向扩展文件共享的 SMB 3.0 (SO)

群集共享卷文件系统 (CsvFS)

弹性文件系统 (ReFS)

要求

要求
标头
ntioapi.h

ntdll.lib

请参阅

NtCancelIoFile