low-level 相关问题

就计算机系统而言,低级别是指在系统层堆栈中显得较低的组件。

用于命令行 Linux (ArchLinux) 的简单图形库/API?

我想在 ArchLinux 上做一些图形化的东西。没什么大的,只是一些二维线,圆圈之类的。我实际上喜欢低级编码,但我看到linux内核不提供任何支持

回答 1 投票 0

即时指令修补

我为 Linux 创建了一个小型调试器。 我尝试创建一种机制,对二进制指令进行加密并在执行之前对其进行解密(我已经设置了硬件断点或逐步...

回答 1 投票 0

无法停止powershell中的低级钩子(c#钩子)

在与 chat gpt 和 bing chat 争论了一晚之后,我现在转向(希望)stackoverflow 上更明智的人。我的问题是这样的:我在 C# 中实现了低级挂钩。我订阅...

回答 1 投票 0

使用 GNU Assembly 让扬声器在 Ubuntu Linux 中以定义的频率振动

我是汇编语言新手 我们的电脑一直发出声音(mp3、wav、mp4、ogg 等)。 如何用汇编语言直接与说话者交流?在C语言中,你可以使用“Beep()&q...

回答 1 投票 0

在没有 Win32 API 的 Windows 上用 C++ 或汇编从头创建 GUI [已关闭]

我在 GUI 库方面有过很多不好的经历 所以我想知道如何在 C++ 中从头开始创建一个窗口 我不是在谈论 win32,我的意思基本上是自己创建它......

回答 4 投票 0

在没有 Win32 API 的 Windows 上用 C++ 或汇编从头创建 GUI [已关闭]

我在 GUI 库方面有过很多不好的经历 所以我想知道如何在 C++ 中从头开始创建一个窗口 我不是在谈论 win32,我的意思基本上是自己创建它......

回答 4 投票 0

优化伽罗瓦域算术中的 y = x*x

我有这个 C 代码来对 GF(8) 进行乘法: int32_t 伽罗瓦乘法 (int32_t a, int32_t b) { int32_t 我; int32_t掩码=0x100; int32_t y = 0; 对于(i=0;i<8;i++) { ...

回答 7 投票 0

在 Rust 中使用 CryptUnprotectData 解密数据会导致 STATUS_HEAP_CORRUPTION 错误

我正在开发一个 Rust 函数,该函数接收 &[u8] 并使用 WinAPI 中的 CryptUnprotectData 对其进行解密。这是有问题的函数: fn 解密(数据: &[u8]) -> 结果 我正在开发一个 Rust 函数,该函数接收 &[u8] 并使用 CryptUnprotectData 中的 WinAPI 对其进行解密。这是有问题的函数: fn decrypt(data: &[u8]) -> Result<Vec<u8>, String> {} 我已经成功实现了这个功能,并且使用DPAPI成功解密了数据。 但是,我在尝试释放传递给 CryptUnprotectData 的缓冲区时遇到了问题。我收到以下错误: error: process didn't exit successfully: `target\debug\main.exe` (exit code: 0xc0000374, STATUS_HEAP_CORRUPTION) 这是该函数的代码: use winapi::{ um::{ winbase, dpapi, wincrypt }, shared::minwindef }; fn decrypt(keydpapi: &[u8]) -> Result<Vec<u8>, String> { // https://learn.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptunprotectdata // https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-localfree // https://docs.rs/winapi/latest/winapi/um/dpapi/index.html // https://docs.rs/winapi/latest/winapi/um/winbase/fn.LocalFree.html let mut data_in = wincrypt::DATA_BLOB { cbData: keydpapi.len() as minwindef::DWORD, pbData: keydpapi.as_ptr() as *mut minwindef::BYTE, }; let mut data_out = wincrypt::DATA_BLOB { cbData: 0, pbData: ptr::null_mut() }; let result = unsafe { dpapi::CryptUnprotectData( &mut data_in, ptr::null_mut(), ptr::null_mut(), ptr::null_mut(), ptr::null_mut(), 0, &mut data_out ) }; if result == 0 { return Err("CryptUnprotectData failed".to_string()) }; if data_out.pbData.is_null() { return Err("CryptUnprotectData returned a null pointer".to_string()); } let decrypted_data = unsafe { Vec::from_raw_parts(data_out.pbData, data_out.cbData as usize, data_out.cbData as usize) }; unsafe { winbase::LocalFree(data_out.pbData as minwindef::HLOCAL); // error occured here }; Ok(decrypted_data) } 如果有任何见解或解决方案来解决此STATUS_HEAP_CORRUPTION错误,我将不胜感激。 谢谢! let decrypted_data = unsafe { Vec::from_raw_parts(data_out.pbData, data_out.cbData as usize, data_out.cbData as usize) }; unsafe { winbase::LocalFree(data_out.pbData as minwindef::HLOCAL); // error occured here }; 此代码有两处不正确。 Vec::from_raw_parts() 取得所提供的分配指针的所有权;也就是说,它负责释放分配。如果您在创建 Vec 后释放分配,这将是双重释放。 ptr的所有权被有效地转移到Vec<T>,然后它可以随意释放、重新分配或更改指针指向的内存内容。确保调用此函数后没有其他任何东西使用该指针。 分配必须由 Rust 全局分配器分配: ptr 必须使用全局分配器进行分配,例如via alloc::alloc 功能。 每当您使用unsafe功能时,您必须阅读安全要求并遵守所有要求。 而不是 Vec::from_raw_parts,您应该使用 std::slice::from_raw_parts 构造一个非拥有的 切片引用,然后在该切片上调用 to_vec() 将数据 copy 到新的 Vec 中。然后,您可以LocalFree系统创建的分配。 如果您不想复制数据,则必须返回拥有 Windows 分配的类型 - 而不是 Rust Vec。我不熟悉 Windows 绑定,所以也许这样的类型已经存在,但如果不存在,则编写自己的类型 - 一个包含指针的结构,并实现 Deref 特征以提供数据访问和 Drop当不再需要时释放特征。

回答 1 投票 0

为什么有这么多不同的调用约定?

从历史上看,为什么似乎每个人和他们的弟弟都定义了自己的调用约定?你有 C、C++、Windows、Pascal、Fortran、Fastcall 以及可能不计其数的其他语言...

回答 5 投票 0

DIY Bootloader 没有做它应该做的事情

不久前,我在教程的帮助下编写了一个引导加载程序。但它太复杂了,我几乎什么都听不懂。所以今天我开始利用我的知识和谷歌来制作我自己的引导加载程序。

回答 1 投票 0

DIY Bootloader 没有做它应该做的事情 |组装

不久前,我在教程的帮助下编写了一个引导加载程序。但它太复杂了,我几乎什么都听不懂。所以今天我开始利用我的知识和谷歌来制作我自己的引导加载程序。

回答 1 投票 0

汇编中的换行符和空终止字符串

我是汇编新手,我正在看一个 hello world 程序: .data 节 你好: db '你好,世界!',10 ; '你好世界!'加一个换行符 helloLen: equ $-hello ...

回答 1 投票 0

有没有办法检查 /dev/input/ 中的哪个事件文件用于键盘输入?

基本上,我想做的是使用“/dev/input/”中的文件捕获用户的键盘输入。然而,我遇到的一个问题是处理键盘输入的文件......

回答 2 投票 0

如何使用寄存器中存储的偏移量跳转到相对地址?

Intel/AMD 表示: 移动 rax, 0xabc jmp rax 不等于: 跳转0xabc 由于第一个由于寄存器的原因假设绝对跳转,而第二个假设相对跳转。我的问题...

回答 1 投票 0

自定义 PE 可执行文件 - Windows 10 无法执行运行给定文件

我正在尝试为 win10 64 位编写一个自定义 PE 文件导出器,在添加对齐后遇到了一些麻烦。我创建了一个基本测试用例:一个包含“ret”指令的 .exe 文件...

回答 1 投票 0

为什么Rockchip RK3588上的VOP(视频输出处理器)无法访问?

我有一段时间有一个设备 - Firefly ITX-3588J - 使用这个芯片,我一直试图将其变成一种低档但仍然可用的 ARM 桌面系统。更具体地说,我曾经

回答 1 投票 0

高级汇编 (HLA) 中的十进制到二进制

我有以下作业:编写一个 HLA 汇编程序,提示输入要检查的 int8 值,然后以二进制格式打印它。例如,这里是 vari 的程序输出...

回答 3 投票 0

低级 C 结构定义

我正在尝试一些低级嵌入式编程,我在基于 ARM 的系统中使用 C,但在检索内存中的数据时遇到了问题。 我正在尝试使用结构来实现这一点,但我得到...

回答 0 投票 0

我的汇编语言代码没有给出正确的输出

用Emu8086语言用汇编写一个程序,让你从键盘输入一个四位数字,确定并在屏幕上显示:1)由第二个和

回答 0 投票 0

尝试将元素输入数组时出现程序集分段错误

程序应该从用户那里获取输入并将其存储直到数组已满,然后数组加倍并将元素复制到新数组中并继续直到用户(ctrl-d to st ...

回答 0 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.