我正在嘗試將 ID3D11Device 實體從 Rust 傳遞到 C FFI 庫(FFMPEG)。
我做了這個示例代碼:
pub fn create_d3d11_device(&mut self, device: &mut Box<windows::Win32::Graphics::Direct3D11::ID3D11Device>, context: &mut Box<windows::Win32::Graphics::Direct3D11::ID3D11DeviceContext>) {
let av_device : Box<AVBufferRef> = self.alloc(HwDeviceType::D3d11va);
unsafe {
let device_context = Box::from_raw(av_device.data as *mut AVHWDeviceContext);
let mut d3d11_device_context = Box::from_raw(device_context.hwctx as *mut AVD3D11VADeviceContext);
d3d11_device_context.device = device.as_mut() as *mut _;
d3d11_device_context.device_context = context.as_mut() as *mut _;
let avp = Box::into_raw(av_device);
av_hwdevice_ctx_init(avp);
self.av_hwdevice = Some(Box::from_raw(avp));
}
}
在 Rust 端,Device 確實可以作業,但在 C 端,當 FFMEPG 呼叫ID3D11DeviceContext_QueryInterface應用程式時,應用程式崩潰并出現以下錯誤:Exception 0xc0000005 encountered at address 0x7ff9fb99ad38: User-mode data execution prevention (DEP) violation at location 0x7ff9fb99ad38
該地址實際上是 QueryInterface 的 lpVtbl 的指標,如下所示:
地址的反匯編看起來也是正確的(這是在另一個除錯會話中完成的):
(lldb) disassemble --start-address 0x00007ffffdf3ad38
0x7ffffdf3ad38: addb %ah, 0x7ffffd(%rdi,%riz,8)
0x7ffffdf3ad3f: addb %al, (%rax)
0x7ffffdf3ad41: movabsl -0x591fffff80000219,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/468956.html
