问题标签 [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.
c++ - 按名称查找进程ID的快速方法
任务是:通过可执行文件名查找进程ID。
调用应用程序是 32 位的,查找进程可以是 32 位或 64 位
解决方案:
有比OpenProcesses
+更快的方法GetProcessImageFileName
吗?
我还发现QueryFullProcessImageName
了可以稍微减少 find_process_1 时间的函数
UPD1:使用 NtQuerySystemInformation 代码的解决方案是错误的,请参阅解决方案
和结果:
看起来真的更快,谢谢@RbMm
filesystems - 如何通过具有 DELETE 访问权限的 id 打开文件?
使用 NT 原生函数,可以使用create 选项NtCreateFile
按 id 打开文件。FILE_OPEN_BY_FILE_ID
但是,这样做DELETE
似乎会忽略访问标志。如果我设置它,文件将正常打开,但任何删除或重命名文件的尝试都会失败(例如,通过设置FILE_DELETE_ON_CLOSE
或使用FILE_RENAME_INFORMATION
带有 的类NtSetInformationFile
)。
以这种方式打开的文件无法删除吗?有没有其他方法可以通过 id 而不是 name 删除文件?
c - NativeAPI 挂起进程
我尝试停止一些进程,我使用来自 ntdll 的 NativeAPI。我写了一些C代码,它可以工作:
但是,当我尝试使用 MASM 编写它时,我的过程并没有停止。我查看了寄存器 EAX 和 ECX,那里一切正常。我调用了 GetLastError,返回值为零。代码:
关于常量:
我使用 Windows 10,因为我们需要写入 0FFFF。适用于 Windows Vista 0FFFh 之前的版本。为什么进程不会停止?
c++ - 带有外部“c”和程序集的未定义函数
嘿,所以当我尝试编译我的代码时遇到一个未定义的函数错误,我不知道为什么。
这是我的文件: Api.h
API_ASM.asm
它们都编译正确,但我收到一个错误,因为定义了 NtWriteVirtualMem 但我在我的 asm 中定义了它?
编辑 1。
所以我将代码更改为:
该程序现在可以编译,但写入不起作用。我已经对其进行了测试以查看 writeprocessmemory 是否有效并且确实有效。NtWriteVirtualMem
此外,当我将鼠标悬停在 C 源代码中的名称上时,我的 IDE 显示仍然未定义。
编辑 2。
此外,该操作的 NTSTATUS 返回码是最大负整数。
c++ - 使用 NtCreateKey() NTAPI 函数创建新的注册表项 [NtOpenKey() 函数返回 NTSTATUS 错误值 -1073741772]
我编写了以下代码以在注册表中创建一个新键,但是在尝试获取基本键的句柄以创建新键时,该函数返回了一个NTSTATUS
错误值。-1073741772
NtOpenKey()
提前致谢。
windows - 跨 Windows 版本的 HANDLE_TYPE_PROCESS
我找不到任何关于此的文档。我正在枚举另一个进程中的进程句柄。
我检查了 Windows 版本之间的值,SYSTEM_HANDLE::ObjectTypeNumber
显然它是不同的。我在 GitHub 上的一个项目中找到了这段代码
奇怪的是,它跳过了 Windows 7。我一直在检查各种与内核相关的书籍(例如 Windows Internals),但无法找到适用于 Windows 7 的正确值。我也没有 Windows 7 机器来测试。
因此,我的代码目前看起来像这样:
Windows 7 中进程句柄的对象类型号是多少?
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 文件系统上的共享,并默默地跳过与元数据相关的调用......
* 代码重现 *
winapi - NtReadFile() 可以在不达到 eof 的情况下产生短读吗?
我在我的 Win7 上针对 NTFS 卷测试NtReadFile()
功能,并注意到在以下代码中(句柄是用FILE_SYNCHRONOUS_IO_NONALERT
标志打开的):
io.Information
(应该包含接收的字节数)仅在r == STATUS_SUCCESS
. 如果r == STATUS_END_OF_FILE
io.Information 包含原始垃圾并且(似乎)在该调用中没有读取数据。
r == STATUS_SUCCESS
那么,我可以假设io.Information < buf_size
我们是否已经到达文件末尾?还是我应该一直打电话NtReadFile
直到它回来STATUS_END_OF_FILE
?(即短读是可能的)。
一方面,微软声称短读是不可能的:
NtReadFile ... 在下列条件之一下终止读取操作:
- 缓冲区已满,因为已读取 Length 参数指定的字节数。因此,在没有溢出的情况下,不能再将数据放入缓冲区。
- 在读取操作期间到达文件末尾,因此文件中没有更多数据要传输到缓冲区中。
...我想避免不必要的NtReadFile
电话。另一方面,我的经验表明永远不要 100% 相信微软。
winapi - NtWriteFile() 可以产生短写吗?
考虑这个片段(句柄是用FILE_SYNCHRONOUS_IO_NONALERT
标志打开的):
是否有可能NtWriteFile()
成功但写得比要求的少?
是否有可能NtWriteFile()
失败并写入一些数据?如果是 - 如何确定写入的数据量?
winapi - NtAllocateVirtualMemoryEx 定义
我正在通过连接内存 API 来实现内存管理工具,当我来到 NtAllocateVirtualMemoryEx 时,我试图在谷歌上找到它的定义,但什么也没找到,但是 NtAllocateVirtualMemory 在https://docs.microsoft.com/en-us中有明确定义/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntallocatevirtualmemory,有人知道它的详细信息吗?