vSylva 发表于 2023-08-05 04:56
删
是兴趣爱好呀 工作不会用到
-- 👇 binarray: @vSylva
能大概讲一下, 你为什么要写这个程序吗?
我很好奇这个函数会用在什么样的工作上.
按老哥提供的方法,先call一下得到return_length的大小,然后设置缓冲区的大小在call,就正确运行。感谢老哥!
unsafe fn nt_query_all_process_information() { let mut return_length: u32 = 0; NtQuerySystemInformation(5, core::ptr::null_mut(), 0, &mut return_length); let mut buffer: Vec<u8> = Vec::with_capacity(return_length as usize); NtQuerySystemInformation( 5, buffer.as_mut_ptr() as *mut core::ffi::c_void, return_length, core::ptr::null_mut(), ); let mut current_offset: isize = 0; loop { let process_info: SYSTEM_PROCESS_INFORMATION = core::ptr::read::<SYSTEM_PROCESS_INFORMATION>( buffer.as_ptr().offset(current_offset).cast(), ); let process_name: String = { let slice = std::slice::from_raw_parts( process_info.ImageName.Buffer, process_info.ImageName.Length as usize / 2, ); String::from_utf16_lossy(slice) }; if !process_name.is_empty() { println!("ProcessName:\t{}", process_name); } if process_info.NextEntryOffset == 0 { break; } current_offset += process_info.NextEntryOffset as isize; } }
-- 👇 binarray: 程序我写完了. 把解析出来的数据和任务管理器里面的详情对比了一下, 是正确的.
你按照我说的思路走就能写出来.
如果只想看进程信息, 用 NextEntryOffset 就能找到下一个进程信息结构体的位置. 线程信息是挨着进程信息结构体的, 用 NumberOfThreads 能取出来.
内存分配没必要按照 C 语言那老哥的写法, 太多次的 heap 分配和释放了.
我是用 VirtualAlloc 直接分配了一个足够大的内存空间, 后面用指针算术解析的数据. 你使用其他内存分配, 哪怕是 Vec 都可以, 看个人喜好了.
是的,C的是CSDN上的一位老哥写的(https://blog.csdn.net/weixin_42270114/article/details/125803630) 我改了他的代码,然后copy到rust里,删掉了线程还有别的一些结构体的信息
-- 👇 binarray: 我以前没用过这个函数. 刚带着好奇心看了看微软的文档, 又自己用 Rust 写了一下, 发现了一些问题.
这个 C 语言的版本和 Rust 版本是来自同一个人吗?
单独去看 Rust 版本, 显然作者并没有理解这个函数的真实用法, 需要再把文档读一读.
C 语言确实处理了一些必要的细节, 但我还没写完, 不确定是否他的写法正确.
评论区
写评论是兴趣爱好呀 工作不会用到
--
👇
binarray: @vSylva
能大概讲一下, 你为什么要写这个程序吗?
我很好奇这个函数会用在什么样的工作上.
按老哥提供的方法,先call一下得到return_length的大小,然后设置缓冲区的大小在call,就正确运行。感谢老哥!
--
👇
binarray: 程序我写完了. 把解析出来的数据和任务管理器里面的详情对比了一下, 是正确的.
你按照我说的思路走就能写出来.
如果只想看进程信息, 用 NextEntryOffset 就能找到下一个进程信息结构体的位置. 线程信息是挨着进程信息结构体的, 用 NumberOfThreads 能取出来.
内存分配没必要按照 C 语言那老哥的写法, 太多次的 heap 分配和释放了.
我是用 VirtualAlloc 直接分配了一个足够大的内存空间, 后面用指针算术解析的数据. 你使用其他内存分配, 哪怕是 Vec 都可以, 看个人喜好了.
是的,C的是CSDN上的一位老哥写的(https://blog.csdn.net/weixin_42270114/article/details/125803630) 我改了他的代码,然后copy到rust里,删掉了线程还有别的一些结构体的信息
--
👇
binarray: 我以前没用过这个函数. 刚带着好奇心看了看微软的文档, 又自己用 Rust 写了一下, 发现了一些问题.
这个 C 语言的版本和 Rust 版本是来自同一个人吗?
单独去看 Rust 版本, 显然作者并没有理解这个函数的真实用法, 需要再把文档读一读.
C 语言确实处理了一些必要的细节, 但我还没写完, 不确定是否他的写法正确.