FSCTL_LOOKUP_STREAM_FROM_CLUSTER returns ERROR_INVALID_PARAM
FSCTL_LOOKUP_STREAM_FROM_CLUSTER returns ERROR_INVALID_PARAMETER
我的目标是从集群中获取文件名。为此,我使用函数FSCTL_LOOKUP_STREAM_FROM_CLUSTER
。使用时,我会得到错误87,该错误代表 ERROR_INVALID_PARAMETER
根据MSDN。驱动器手柄是正确的,因为我在其他正常工作的功能中使用它。
#include <Windows.h>
#include <iostream>
using namespace std;
class Disk{
public:
Disk();
HANDLE hDisk;
WCHAR *individualName;
WCHAR *Letter;
};
bool searchFileByItCluster(Disk drive){
LOOKUP_STREAM_FROM_CLUSTER_INPUT inpStruct;
LOOKUP_STREAM_FROM_CLUSTER_ENTRY str;
LOOKUP_STREAM_FROM_CLUSTER_OUTPUT str1;
PNTFS_VOLUME_DATA_BUFFER info;
PLARGE_INTEGER INT = (PLARGE_INTEGER)malloc(sizeof(LARGE_INTEGER));
DWORD cbWritten;
int size = (sizeof(DWORD) * 2 + sizeof(LARGE_INTEGER));
inpStruct.NumberOfClusters = 1;
inpStruct.Cluster[0].QuadPart = 26585528;
bool ret = DeviceIoControl(drive.hDisk, FSCTL_LOOKUP_STREAM_FROM_CLUSTER, &inpStruct, (sizeof(DWORD) * 2 + sizeof(LARGE_INTEGER)), &str1, sizeof(LOOKUP_STREAM_FROM_CLUSTER_OUTPUT), &cbWritten, NULL);
if (!ret){
cout << GetLastError()<<endl<<sizeof(LOOKUP_STREAM_FROM_CLUSTER_INPUT);
for (int i = 0; i < inpStruct.NumberOfClusters; i++){
printf("%llin", inpStruct.Cluster[i]);
}
int i = 0;
}
return false;
}
相当古老的问题,并不特别有用。但这是Google为fsctl_lookup_stream_from_cluster找到的少数页面之一。所以现在我已经弄清楚了如何使用它,我已经传递了我学到的东西。
警告:正如文档指出的那样:
fsctl_lookup_stream_from_cluster是一个非常重要的操作,通常使用大量的磁盘带宽,内存和时间。
仍然,如果需要,您需要它(我肯定只是这样)。因此,这里有一些对我有用的代码以及我在途中学到的东西。
// Pick a plausible estimate. Note: valid output sizes can be up to ~64k!
DWORD bufsize =
MAX_PATH +
sizeof(LOOKUP_STREAM_FROM_CLUSTER_OUTPUT) +
sizeof(LOOKUP_STREAM_FROM_CLUSTER_ENTRY);
LOOKUP_STREAM_FROM_CLUSTER_INPUT sfci;
LOOKUP_STREAM_FROM_CLUSTER_OUTPUT *sfco =
(LOOKUP_STREAM_FROM_CLUSTER_OUTPUT *)malloc(bufsize);
sfci.NumberOfClusters = 1; // Only looking up one cluster
sfci.Flags = 0; // No flags are currently defined
sfci.Cluster[0].QuadPart = 123; // Cluster number being sought
// While some DeviceIoControl calls get away with 0 or FILE_READ_ATTRIBUTES,
// FSCTL_LOOKUP_STREAM_FROM_CLUSTER needs at least FILE_READ_DATA. Also,
// while the docs claim you can use "a file on a NTFS volume," I believe a
// volume handle is required, which requires running with admin rights.
HANDLE h1 = CreateFile(
L"\\.\j:",
FILE_READ_DATA,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, // Required, but the SE_BACKUP_NAME priv is not
NULL);
if (h1 == INVALID_HANDLE_VALUE)
; // Do something
DWORD ret;
BOOL B = DeviceIoControl(
h1,
FSCTL_LOOKUP_STREAM_FROM_CLUSTER,
&sfci,
sizeof(sfci),
sfco,
bufsize,
&ret,
NULL);
if (!B && GetLastError() == ERROR_MORE_DATA)
; // bufsize too small. Resize to sfco->BufferSizeRequired and retry
if (!B)
; // Some other error
// Here's the data.
LOOKUP_STREAM_FROM_CLUSTER_ENTRY *sfce =
(LOOKUP_STREAM_FROM_CLUSTER_ENTRY *)((BYTE *)sfco + sfco->Offset);
那里。现在,下次有人搜索fsctl_lookup_stream_from_cluster时,至少他们会调出一个有效的示例。
相关文章:
- "error: no matching function for call to"构造函数错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 如何解决"invalid conversion from 'char' to 'const char*'"
- C++错误:"error: int aaa::bbb is protected within this context"
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- C++ "error: invalid use of void expression"
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- C++二进制到 Java 会"java.lang.Error: Invalid memory access"
- 我在检查字符串时得到"Invalid utf 8 error",但当我使用 std::cout 时似乎是正确的
- WSARecv 有时会返回与 IOCP 端口关联的套接字的"invalid handle (error no 6)"。(C++)
- 在嵌入式八度C++中如何执行脚本文件?( "error: invalid call to script" )
- 来自字符串库组件内部的"error: invalid operands to binary expression"
- "error: invalid conversion from 'int*' to 'int' function"
- 如何解决"[Error] invalid use of incomplete type 'class SLLNode'"链表
- 深度缓冲区作为纹理 - "D3D11 ERROR: The Format is invalid when creating a View"