STATUS_INVALID_PARAMETER from NtCreateFile
STATUS_INVALID_PARAMETER from NtCreateFile
下面是我使用的代码:
std::wstring GetPathFromFileReference (DWORDLONG frn)
{
if (frn != 0)
{
HANDLE handle = NULL;
wchar_t file_buffer[2048] = { NULL };
wchar_t unicode_buffer[8] = { NULL };
UNICODE_STRING unicodeString;
unicodeString.Length = 8;
unicodeString.MaximumLength = 8;
unicodeString.Buffer = unicode_buffer;
OBJECT_ATTRIBUTES objAttributes = { NULL };
InitializeObjectAttributes(&objAttributes, &unicodeString, OBJ_CASE_INSENSITIVE, _root, NULL);
IO_STATUS_BLOCK ioStatusBlock = { NULL };
LARGE_INTEGER allocSize = { NULL };
int _result = NtCreateFile(&handle, GENERIC_ALL /*FILE_TRAVERSE*/ /* FILE_READ_DATA */, &objAttributes, &ioStatusBlock, /*&allocSize*/ NULL , NULL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_OPEN_BY_FILE_ID | FILE_NON_DIRECTORY_FILE /*FILE_OPEN_FOR_BACKUP_INTENT*/, NULL, NULL);
if (_result == S_OK)
{
typedef NTSTATUS (NTAPI *LPFN_NtQueryInformationFile) (HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, int);
LPFN_NtQueryInformationFile pfnNtQueryInformationFile = (LPFN_NtQueryInformationFile)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQueryInformationFile");
_result = pfnNtQueryInformationFile(handle, &ioStatusBlock, file_buffer, 4096, 9);
if (_result == S_OK)
{
return std::wstring(file_buffer + 2);
}
}
}
return L"";
}
STATUS_INVALID_PARAMETER
呼叫NtCreateFile
失败。该调用中注释掉的代码显示了我尝试过的其他事情。
RootDirectory句柄肯定在objAttributes中被设置(到0x30)。我在代码的其他地方使用这个相同的句柄,它是完美的工作。而且这个发型看起来也不错。
我不知道还有什么可以尝试或如何进一步缩小原因:(任何帮助将不胜感激。
编辑:我忘了提到我在这里想要达到的目的。对不起!这篇文章来自《美国海军变化杂志》。我已经使用我的根句柄成功地阅读了Change Journal(因此我相信这是正确的),并且对于每个条目我都有一个frn和parent_frn。我想获得文件的完整路径,下面的代码是我如何尝试将frn转换为path。frn和parent_frn给出相同的STATUS_INVALID_PARAMETER
返回码
NtCreateFile的文档注释说:
如果使用FILE_OPEN_BY_FILE_ID,则ObjectAttributes。RootDirectory句柄必须用卷的句柄填充,否则你将得到STATUS_INVALID_PARAMETER。
要打开卷的句柄,您可以使用CreateFile
使用\.X:
路径,其中X是驱动器号。注意,后面没有反斜杠。CreateFile文档有关于它的信息(查找字符串"打开C: volume.")
相关文章:
- 如何解决"invalid conversion from 'char' to 'const char*'"
- std::async from std::async in windows xp
- std::is_reference from std::any
- std::time_point from and to std::string
- "No suitable conversion function from 'std::string' to 'const char *' exists"
- std::chrono::time_point from std::string
- Visual accept std::string from std::byte iterator
- C++中链表的错误"Abort signal from abort(3) (sigabrt) "
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++ 中的"template <typename From, typename Tag> struct Alias;"是什么?
- from std::vector to adept::avector
- qt get child (Callout) from QChart
- Webassembly from Javascript
- Generate boost::uuids::uuid from boost::compute::detail::sha
- 什么是"Reading unbounded stream from standard input (Memory Management)"的例子
- Calling C++ dll from python
- 为什么我会收到"invalid conversion from 'Queue*/Stack*' to 'int'"错误消息?
- std::chrono 在从 main 或 from 类方法使用时给出不同的值
- Calling Python Script from Visual Studio C++ Solution
- STATUS_INVALID_PARAMETER from NtCreateFile