< 返回版块

vSylva 发表于 2023-08-05 04:56

评论区

写评论
作者 vSylva 2023-08-05 16:31

是兴趣爱好呀 工作不会用到

--
👇
binarray: @vSylva

能大概讲一下, 你为什么要写这个程序吗?

我很好奇这个函数会用在什么样的工作上.

作者 vSylva 2023-08-05 15:39

按老哥提供的方法,先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 都可以, 看个人喜好了.

作者 vSylva 2023-08-05 13:46

是的,C的是CSDN上的一位老哥写的(https://blog.csdn.net/weixin_42270114/article/details/125803630) 我改了他的代码,然后copy到rust里,删掉了线程还有别的一些结构体的信息

--
👇
binarray: 我以前没用过这个函数. 刚带着好奇心看了看微软的文档, 又自己用 Rust 写了一下, 发现了一些问题.

这个 C 语言的版本和 Rust 版本是来自同一个人吗?

单独去看 Rust 版本, 显然作者并没有理解这个函数的真实用法, 需要再把文档读一读.

C 语言确实处理了一些必要的细节, 但我还没写完, 不确定是否他的写法正确.

1 共 3 条评论, 1 页