【问题标题】:Error 87 When Using DeviceIoControl(FSCTL_GET_RETRIEVAL_POINTERS)使用 DeviceIoControl 时出现错误 87(FSCTL_GET_RETRIEVAL_POINTERS)
【发布时间】:2017-08-14 14:38:35
【问题描述】:

我正在尝试获取磁盘上文件的物理位置。 这是当前代码:

import win32file
import winioctlcon

handle = win32file.CreateFile(raw_input("File: "), win32file.GENERIC_READ, win32file.FILE_SHARE_READ | win32file.FILE_SHARE_WRITE, None, win32file.OPEN_EXISTING, win32file.FILE_ATTRIBUTE_NORMAL | win32file.FILE_FLAG_OVERLAPPED,None)
loc = win32file.DeviceIoControl(handle, winioctlcon.FSCTL_GET_RETRIEVAL_POINTERS,"",8192,None)

当我尝试运行代码时,我收到此错误:

pywintypes.error: (87, 'DeviceIoControl', '\xfe\xfe\xe4\xf4\xf8\xee\xe8\xf8 \xf9
\xe2\xe5\xe9.')

此错误是“无效参数”。我用错了什么参数?

【问题讨论】:

  • 当然参数无效,因为你调用DeviceIoControl绝对不正确。比必须的参数少。 STARTING_VCN_INPUT_BUFFER 在哪里? RETRIEVAL_POINTERS_BUFFER 在哪里?
  • 如何获取这些参数的值?

标签: python winapi handle createfile deviceiocontrol


【解决方案1】:

请查看this MSDN 网站。

您的参数计数不正确。您需要一个输入缓冲区和一个输出缓冲区。输入是起始 VCN (>=0),句柄需要是备用流、文件、卷或目录句柄。输入缓冲区的类型

typedef struct {
  LARGE_INTEGER StartingVcn;
} STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;

【讨论】:

  • 真的是StartingVcn >= 0(不是>0)和文件不能是volume句柄。仅替代流、文件或目录
  • 您是正确的 VCN >= 0。句柄可以是卷句柄,请参阅文档“此参数可以选择是 NTFS 卷的句柄。”
猜你喜欢
  • 2014-03-02
  • 2018-01-07
  • 1970-01-01
  • 2013-02-09
  • 2021-08-19
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 2017-03-21
相关资源
最近更新 更多