问题标签 [nt-native-api]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
601 浏览

c++ - 按名称查找进程ID的快速方法

任务是:通过可执行文件名查找进程ID。
调用应用程序是 32 位的,查找进程可以是 32 位或 64 位

解决方案:

有比OpenProcesses+更快的方法GetProcessImageFileName吗?

我还发现QueryFullProcessImageName了可以稍微减少 find_process_1 时间的函数

UPD1:使用 NtQuerySystemInformation 代码的解决方案是错误的,请参阅解决方案

和结果:

看起来真的更快,谢谢@RbMm

0 投票
2 回答
112 浏览

filesystems - 如何通过具有 DELETE 访问权限的 id 打开文件?

使用 NT 原生函数,可以使用create 选项NtCreateFile按 id 打开文件。FILE_OPEN_BY_FILE_ID但是,这样做DELETE似乎会忽略访问标志。如果我设置它,文件将正常打开,但任何删除或重命名文件的尝试都会失败(例如,通过设置FILE_DELETE_ON_CLOSE或使用FILE_RENAME_INFORMATION带有 的类NtSetInformationFile)。

以这种方式打开的文件无法删除吗?有没有其他方法可以通过 id 而不是 name 删除文件?

0 投票
1 回答
126 浏览

c - NativeAPI 挂起进程

我尝试停止一些进程,我使用来自 ntdll 的 NativeAPI。我写了一些C代码,它可以工作:

但是,当我尝试使用 MASM 编写它时,我的过程并没有停止。我查看了寄存器 EAX 和 ECX,那里一切正常。我调用了 GetLastError,返回值为零。代码:

关于常量:

我使用 Windows 10,因为我们需要写入 0FFFF。适用于 Windows Vista 0FFFh 之前的版本。为什么进程不会停止?

0 投票
1 回答
250 浏览

c++ - 带有外部“c”和程序集的未定义函数

嘿,所以当我尝试编译我的代码时遇到一个未定义的函数错误,我不知道为什么。

这是我的文件: Api.h

API_ASM.asm

它们都编译正确,但我收到一个错误,因为定义了 NtWriteVirtualMem 但我在我的 asm 中定义了它?

编辑 1。

所以我将代码更改为:

该程序现在可以编译,但写入不起作用。我已经对其进行了测试以查看 writeprocessmemory 是否有效并且确实有效。NtWriteVirtualMem此外,当我将鼠标悬停在 C 源代码中的名称上时,我的 IDE 显示仍然未定义。

编辑 2。

此外,该操作的 NTSTATUS 返回码是最大负整数。

0 投票
1 回答
297 浏览

c++ - 使用 NtCreateKey() NTAPI 函数创建新的注册表项 [NtOpenKey() 函数返回 NTSTATUS 错误值 -1073741772]

我编写了以下代码以在注册表中创建一个新键,但是在尝试获取基本键的句柄以创建新键时,该函数返回了一个NTSTATUS错误值。-1073741772NtOpenKey()

提前致谢。

0 投票
0 回答
206 浏览

windows - 跨 Windows 版本的 HANDLE_TYPE_PROCESS

我找不到任何关于此的文档。我正在枚举另一个进程中的进程句柄。

我检查了 Windows 版本之间的值,SYSTEM_HANDLE::ObjectTypeNumber显然它是不同的。我在 GitHub 上的一个项目中找到了这段代码

奇怪的是,它跳过了 Windows 7。我一直在检查各种与内核相关的书籍(例如 Windows Internals),但无法找到适用于 Windows 7 的正确值。我也没有 Windows 7 机器来测试。

因此,我的代码目前看起来像这样:

Windows 7 中进程句柄的对象类型号是多少?

0 投票
0 回答
161 浏览

winapi - NtSetInformationFile(..., FileBasicInformation) 在 FAT 共享上出现 STATUS_INVALID_PARAMETER 失败

偶然发现一个奇怪的问题:

  • 假设我们有一个 SMB 共享\\<server>\<share>,我们打开它进行写入
  • NtSetInformationFile(..., FileBasicInformation)通常会成功
  • ...但是如果底层文件系统是 FAT——它会失败STATUS_INVALID_PARAMETER(即使FILE_BASIC_INFORMATION结构被清零)

为什么会失败以及如何正确处理?

笔记:

  • 共享在 Windows Server 2012 R2 x64 上
  • 客户端是Win7 x64

* 更多信息 *

转换为 Win32 APISetFileInformationByHandle()并没有帮助 - 它失败但GetLastError()返回0。此外,SetFileTime()调用SetFileAttributes()失败并显示ERROR_INVALID_PARAMETER.

我想,我需要以某种方式弄清楚给定的路径是否指向 FAT 文件系统上的共享,并默默地跳过与元数据相关的调用......

* 代码重现 *

0 投票
0 回答
127 浏览

winapi - NtReadFile() 可以在不达到 eof 的情况下产生短读吗?

我在我的 Win7 上针对 NTFS 卷测试NtReadFile()功能,并注意到在以下代码中(句柄是用FILE_SYNCHRONOUS_IO_NONALERT标志打开的):

io.Information(应该包含接收的字节数)仅在r == STATUS_SUCCESS. 如果r == STATUS_END_OF_FILEio.Information 包含原始垃圾并且(似乎)在该调用中没有读取数据。

r == STATUS_SUCCESS那么,我可以假设io.Information < buf_size我们是否已经到达文件末尾?还是我应该一直打电话NtReadFile直到它回来STATUS_END_OF_FILE?(即短读是可能的)。

一方面,微软声称短读是不可能的:

NtReadFile ... 在下列条件之一下终止读取操作:

  • 缓冲区已满,因为已读取 Length 参数指定的字节数。因此,在没有溢出的情况下,不能再将数据放入缓冲区。
  • 在读取操作期间到达文件末尾,因此文件中没有更多数据要传输到缓冲区中。

...我想避免不必要的NtReadFile电话。另一方面,我的经验表明永远不要 100% 相信微软。

0 投票
0 回答
184 浏览

winapi - NtWriteFile() 可以产生短写吗?

考虑这个片段(句柄是用FILE_SYNCHRONOUS_IO_NONALERT标志打开的):

是否有可能NtWriteFile()成功但写得比要求的少?

是否有可能NtWriteFile()失败并写入一些数据?如果是 - 如何确定写入的数据量?

0 投票
1 回答
528 浏览

winapi - NtAllocateVirtualMemoryEx 定义

我正在通过连接内存 API 来实现内存管理工具,当我来到 NtAllocateVirtualMemoryEx 时,我试图在谷歌上找到它的定义,但什么也没找到,但是 NtAllocateVirtualMemory 在https://docs.microsoft.com/en-us中有明确定义/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntallocatevirtualmemory,有人知道它的详细信息吗?