From 7851e2066d71bec831b0a14c9ea374208ae946ec Mon Sep 17 00:00:00 2001 From: Kenny Kerr Date: Tue, 7 Jun 2022 09:39:55 -0700 Subject: [PATCH 1/7] pos --- crates/libs/metadata/src/reader/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/libs/metadata/src/reader/mod.rs b/crates/libs/metadata/src/reader/mod.rs index bf31a8e479..1851d373ad 100644 --- a/crates/libs/metadata/src/reader/mod.rs +++ b/crates/libs/metadata/src/reader/mod.rs @@ -105,8 +105,8 @@ pub enum InterfaceKind { #[derive(PartialEq, Eq)] pub enum SignatureKind { - Query, - QueryOptional, + Query((usize, usize)), + QueryOptional((usize, usize)), ResultValue, ResultVoid, ReturnStruct, From 9cc9cafccb1ce2751c6be0e7bf33d5a552125dcb Mon Sep 17 00:00:00 2001 From: Kenny Kerr Date: Tue, 7 Jun 2022 10:09:38 -0700 Subject: [PATCH 2/7] position --- crates/libs/metadata/src/reader/mod.rs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/crates/libs/metadata/src/reader/mod.rs b/crates/libs/metadata/src/reader/mod.rs index 1851d373ad..98f0ecb852 100644 --- a/crates/libs/metadata/src/reader/mod.rs +++ b/crates/libs/metadata/src/reader/mod.rs @@ -1200,14 +1200,13 @@ impl<'a> Reader<'a> { match return_type { Type::HRESULT => { if signature.params.len() >= 2 { - let guid = &signature.params[signature.params.len() - 2]; - let object = &signature.params[signature.params.len() - 1]; - - if guid.ty == Type::ConstPtr((Box::new(Type::GUID), 1)) && !self.param_flags(guid.def).output() && object.ty == Type::MutPtr((Box::new(Type::Void), 2)) && self.param_is_com_out_ptr(object.def) { - if self.param_flags(object.def).optional() { - return SignatureKind::QueryOptional; - } else { - return SignatureKind::Query; + if let Some(guid) = signature.params.iter().position(|param|self.signature_param_is_query_guid(param)) { + if let Some(object) = signature.params.iter().position(|param|self.signature_param_is_query_object(param)) { + if self.param_flags(signature.params[object].def).optional() { + return SignatureKind::QueryOptional((object, guid)); + } else { + return SignatureKind::Query((object, guid)); + } } } } @@ -1235,6 +1234,12 @@ impl<'a> Reader<'a> { SignatureKind::ReturnVoid } + fn signature_param_is_query_guid(&self, param: &SignatureParam) -> bool { + param.ty == Type::ConstPtr((Box::new(Type::GUID), 1)) && !self.param_flags(param.def).output() + } + fn signature_param_is_query_object(&self, param: &SignatureParam) -> bool { + param.ty == Type::MutPtr((Box::new(Type::Void), 2)) && self.param_is_com_out_ptr(param.def) + } // // Other type queries From 2826bfc9d326fcc0eb745879dac9a0fb9c33665d Mon Sep 17 00:00:00 2001 From: Kenny Kerr Date: Tue, 7 Jun 2022 11:47:50 -0700 Subject: [PATCH 3/7] kinds --- crates/libs/bindgen/src/com_methods.rs | 43 +++++++++++++------------- crates/libs/bindgen/src/functions.rs | 41 ++++++++++++------------ crates/libs/bindgen/src/gen.rs | 41 +++++++++++++++++++++--- crates/libs/metadata/src/reader/mod.rs | 24 +++++++++----- 4 files changed, 95 insertions(+), 54 deletions(-) diff --git a/crates/libs/bindgen/src/com_methods.rs b/crates/libs/bindgen/src/com_methods.rs index f04fe36f25..d4a2ff3db3 100644 --- a/crates/libs/bindgen/src/com_methods.rs +++ b/crates/libs/bindgen/src/com_methods.rs @@ -20,38 +20,37 @@ pub fn gen(gen: &Gen, def: TypeDef, kind: InterfaceKind, method: MethodDef, meth bases.combine("e! { .base__ }); } - match gen.reader.signature_kind(&signature) { - SignatureKind::Query => { - let leading_params = &signature.params[..signature.params.len() - 2]; - let args = gen.win32_args(leading_params); - let params = gen.win32_params(leading_params); + let kind = gen.reader.signature_kind(&signature); + match kind { + SignatureKind::Query(_) => { + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); quote! { #doc #features pub unsafe fn #name<#constraints T: ::windows::core::Interface>(&self, #params) -> ::windows::core::Result { let mut result__ = ::core::option::Option::None; - (::windows::core::Interface::vtable(self)#bases.#vname)(::windows::core::Interface::as_raw(self), #args &::IID, &mut result__ as *mut _ as *mut _).and_some(result__) + (::windows::core::Interface::vtable(self)#bases.#vname)(::windows::core::Interface::as_raw(self), #args).and_some(result__) } } } - SignatureKind::QueryOptional => { - let leading_params = &signature.params[..signature.params.len() - 2]; - let args = gen.win32_args(leading_params); - let params = gen.win32_params(leading_params); + SignatureKind::QueryOptional(_) => { + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); quote! { #doc #features pub unsafe fn #name<#constraints T: ::windows::core::Interface>(&self, #params result__: *mut ::core::option::Option) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self)#bases.#vname)(::windows::core::Interface::as_raw(self), #args &::IID, result__ as *mut _ as *mut _).ok() + (::windows::core::Interface::vtable(self)#bases.#vname)(::windows::core::Interface::as_raw(self), #args).ok() } } } SignatureKind::ResultValue => { let leading_params = &signature.params[..signature.params.len() - 1]; - let args = gen.win32_args(leading_params); - let params = gen.win32_params(leading_params); + let args = gen.win32_args(leading_params, kind); + let params = gen.win32_params(leading_params, kind); let return_type = type_deref(&signature.params[signature.params.len() - 1].ty); let return_type_tokens = gen.type_name(&return_type); let abi_return_type_tokens = gen.type_abi_name(&return_type); @@ -67,8 +66,8 @@ pub fn gen(gen: &Gen, def: TypeDef, kind: InterfaceKind, method: MethodDef, meth } } SignatureKind::ResultVoid => { - let args = gen.win32_args(&signature.params); - let params = gen.win32_params(&signature.params); + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); quote! { #doc @@ -79,8 +78,8 @@ pub fn gen(gen: &Gen, def: TypeDef, kind: InterfaceKind, method: MethodDef, meth } } SignatureKind::ReturnStruct => { - let args = gen.win32_args(&signature.params); - let params = gen.win32_params(&signature.params); + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); let return_type = gen.type_name(&signature.return_type.unwrap()); quote! { @@ -94,8 +93,8 @@ pub fn gen(gen: &Gen, def: TypeDef, kind: InterfaceKind, method: MethodDef, meth } } SignatureKind::PreserveSig => { - let args = gen.win32_args(&signature.params); - let params = gen.win32_params(&signature.params); + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); let return_type = gen.return_sig(&signature); quote! { @@ -107,8 +106,8 @@ pub fn gen(gen: &Gen, def: TypeDef, kind: InterfaceKind, method: MethodDef, meth } } SignatureKind::ReturnVoid => { - let args = gen.win32_args(&signature.params); - let params = gen.win32_params(&signature.params); + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); quote! { #doc @@ -139,7 +138,7 @@ pub fn gen_upcall(gen: &Gen, sig: &Signature, inner: TokenStream) -> TokenStream } } } - SignatureKind::Query | SignatureKind::QueryOptional | SignatureKind::ResultVoid => { + SignatureKind::Query(_) | SignatureKind::QueryOptional(_) | SignatureKind::ResultVoid => { let invoke_args = sig.params.iter().map(|param| gen_win32_invoke_arg(gen, param)); quote! { diff --git a/crates/libs/bindgen/src/functions.rs b/crates/libs/bindgen/src/functions.rs index 31481b5725..2bdab436e6 100644 --- a/crates/libs/bindgen/src/functions.rs +++ b/crates/libs/bindgen/src/functions.rs @@ -64,11 +64,11 @@ fn gen_win_function(gen: &Gen, def: MethodDef) -> TokenStream { let doc = gen.cfg_doc(&cfg); let features = gen.cfg_features(&cfg); - match gen.reader.signature_kind(&signature) { - SignatureKind::Query => { - let leading_params = &signature.params[..signature.params.len() - 2]; - let args = gen.win32_args(leading_params); - let params = gen.win32_params(leading_params); + let kind = gen.reader.signature_kind(&signature); + match kind { + SignatureKind::Query(_) => { + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); quote! { #doc @@ -82,17 +82,16 @@ fn gen_win_function(gen: &Gen, def: MethodDef) -> TokenStream { fn #name(#(#abi_params),*) #abi_return_type; } let mut result__ = ::core::option::Option::None; - #name(#args &::IID, &mut result__ as *mut _ as *mut _).and_some(result__) + #name(#args).and_some(result__) } #[cfg(not(windows))] unimplemented!("Unsupported target OS"); } } } - SignatureKind::QueryOptional => { - let leading_params = &signature.params[..signature.params.len() - 2]; - let args = gen.win32_args(leading_params); - let params = gen.win32_params(leading_params); + SignatureKind::QueryOptional(_) => { + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); quote! { #doc @@ -105,7 +104,7 @@ fn gen_win_function(gen: &Gen, def: MethodDef) -> TokenStream { extern "system" { fn #name(#(#abi_params),*) #abi_return_type; } - #name(#args &::IID, result__ as *mut _ as *mut _).ok() + #name(#args).ok() } #[cfg(not(windows))] unimplemented!("Unsupported target OS"); @@ -114,8 +113,8 @@ fn gen_win_function(gen: &Gen, def: MethodDef) -> TokenStream { } SignatureKind::ResultValue => { let leading_params = &signature.params[..signature.params.len() - 1]; - let args = gen.win32_args(leading_params); - let params = gen.win32_params(leading_params); + let args = gen.win32_args(leading_params, kind); + let params = gen.win32_params(leading_params, kind); let return_type = type_deref(&signature.params[signature.params.len() - 1].ty); let return_type_tokens = gen.type_name(&return_type); let abi_return_type_tokens = gen.type_abi_name(&return_type); @@ -140,8 +139,8 @@ fn gen_win_function(gen: &Gen, def: MethodDef) -> TokenStream { } } SignatureKind::ResultVoid => { - let args = gen.win32_args(&signature.params); - let params = gen.win32_params(&signature.params); + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); quote! { #doc @@ -163,8 +162,8 @@ fn gen_win_function(gen: &Gen, def: MethodDef) -> TokenStream { } SignatureKind::ReturnStruct | SignatureKind::PreserveSig => { if handle_last_error(gen, def, &signature) { - let args = gen.win32_args(&signature.params); - let params = gen.win32_params(&signature.params); + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); let return_type = gen.type_name(&signature.return_type.unwrap()); quote! { @@ -186,8 +185,8 @@ fn gen_win_function(gen: &Gen, def: MethodDef) -> TokenStream { } } } else { - let args = gen.win32_args(&signature.params); - let params = gen.win32_params(&signature.params); + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); quote! { #doc @@ -209,8 +208,8 @@ fn gen_win_function(gen: &Gen, def: MethodDef) -> TokenStream { } } SignatureKind::ReturnVoid => { - let args = gen.win32_args(&signature.params); - let params = gen.win32_params(&signature.params); + let args = gen.win32_args(&signature.params, kind); + let params = gen.win32_params(&signature.params, kind); let does_not_return = does_not_return(gen, def); quote! { diff --git a/crates/libs/bindgen/src/gen.rs b/crates/libs/bindgen/src/gen.rs index 4f7191b0dd..45ee09af8c 100644 --- a/crates/libs/bindgen/src/gen.rs +++ b/crates/libs/bindgen/src/gen.rs @@ -834,10 +834,34 @@ impl<'a> Gen<'a> { quote! {} } } - pub fn win32_args(&self, params: &[SignatureParam]) -> TokenStream { + pub fn win32_args(&self, params: &[SignatureParam], kind: SignatureKind) -> TokenStream { let mut tokens = quote! {}; - for param in params { + for (position, param) in params.iter().enumerate() { + match kind { + SignatureKind::Query((object, guid)) => { + if object == position { + tokens.combine("e! { &mut result__ as *mut _ as *mut _, }); + continue; + } + if guid == position { + tokens.combine("e! { &::IID, }); + continue; + } + } + SignatureKind::QueryOptional((object, guid)) => { + if object == position { + tokens.combine("e! { result__ as *mut _ as *mut _, }); + continue; + } + if guid == position { + tokens.combine("e! { &::IID, }); + continue; + } + } + _ => {} + } + let name = self.param_name(param.def); if let ArrayInfo::Fixed(fixed) = param.array_info { @@ -880,10 +904,19 @@ impl<'a> Gen<'a> { tokens } - pub fn win32_params(&self, params: &[SignatureParam]) -> TokenStream { + pub fn win32_params(&self, params: &[SignatureParam], kind: SignatureKind) -> TokenStream { let mut tokens = quote! {}; for (position, param) in params.iter().enumerate() { + match kind { + SignatureKind::Query((object, guid)) | SignatureKind::QueryOptional((object, guid)) => { + if object == position || guid == position { + continue; + } + } + _ => {} + } + let name = self.param_name(param.def); if let ArrayInfo::Fixed(fixed) = param.array_info { @@ -973,7 +1006,7 @@ impl<'a> Gen<'a> { let return_type = match signature_kind { SignatureKind::ReturnVoid => quote! {}, - SignatureKind::Query | SignatureKind::QueryOptional | SignatureKind::ResultVoid => quote! { -> ::windows::core::Result<()> }, + SignatureKind::Query(_) | SignatureKind::QueryOptional(_) | SignatureKind::ResultVoid => quote! { -> ::windows::core::Result<()> }, SignatureKind::ResultValue => { let return_type = type_deref(&signature.params[signature.params.len() - 1].ty); let return_type = self.type_name(&return_type); diff --git a/crates/libs/metadata/src/reader/mod.rs b/crates/libs/metadata/src/reader/mod.rs index 98f0ecb852..4d0fa15428 100644 --- a/crates/libs/metadata/src/reader/mod.rs +++ b/crates/libs/metadata/src/reader/mod.rs @@ -103,7 +103,7 @@ pub enum InterfaceKind { Base, } -#[derive(PartialEq, Eq)] +#[derive(Copy, Clone, PartialEq, Eq)] pub enum SignatureKind { Query((usize, usize)), QueryOptional((usize, usize)), @@ -1200,8 +1200,8 @@ impl<'a> Reader<'a> { match return_type { Type::HRESULT => { if signature.params.len() >= 2 { - if let Some(guid) = signature.params.iter().position(|param|self.signature_param_is_query_guid(param)) { - if let Some(object) = signature.params.iter().position(|param|self.signature_param_is_query_object(param)) { + if let Some(guid) = self.signature_param_is_query_guid(&signature.params) { + if let Some(object) = self.signature_param_is_query_object(&signature.params) { if self.param_flags(signature.params[object].def).optional() { return SignatureKind::QueryOptional((object, guid)); } else { @@ -1234,11 +1234,21 @@ impl<'a> Reader<'a> { SignatureKind::ReturnVoid } - fn signature_param_is_query_guid(&self, param: &SignatureParam) -> bool { - param.ty == Type::ConstPtr((Box::new(Type::GUID), 1)) && !self.param_flags(param.def).output() + fn signature_param_is_query_guid(&self, params: &[SignatureParam]) -> Option { + for pos in (0..params.len()).rev() { + if params[pos].ty == Type::ConstPtr((Box::new(Type::GUID), 1)) && !self.param_flags(params[pos].def).output() { + return Some(pos); + } + } + None } - fn signature_param_is_query_object(&self, param: &SignatureParam) -> bool { - param.ty == Type::MutPtr((Box::new(Type::Void), 2)) && self.param_is_com_out_ptr(param.def) + fn signature_param_is_query_object(&self, params: &[SignatureParam]) -> Option { + for pos in (0..params.len()).rev() { + if params[pos].ty == Type::MutPtr((Box::new(Type::Void), 2)) && self.param_is_com_out_ptr(params[pos].def) { + return Some(pos); + } + } + None } // From e624f072b0e6cc5f9112ef9b07bca26ff21382a9 Mon Sep 17 00:00:00 2001 From: Kenny Kerr Date: Tue, 7 Jun 2022 11:48:00 -0700 Subject: [PATCH 4/7] code gen --- .../src/Windows/Win32/Graphics/Direct3D/Dxc/mod.rs | 8 ++++---- .../Windows/Win32/Graphics/DirectManipulation/mod.rs | 12 ++++++------ .../windows/src/Windows/Win32/Graphics/Dxgi/mod.rs | 5 +++-- .../windows/src/Windows/Win32/Media/Audio/mod.rs | 5 +++-- .../Windows/Win32/System/Diagnostics/Debug/mod.rs | 5 +++-- .../libs/windows/src/Windows/Win32/System/Ole/mod.rs | 5 +++-- .../Windows/Win32/System/WinRT/Composition/mod.rs | 10 ++++++---- .../src/Windows/Win32/System/WinRT/Xaml/mod.rs | 5 +++-- .../libs/windows/src/Windows/Win32/System/Wmi/mod.rs | 5 +++-- .../libs/windows/src/Windows/Win32/UI/Shell/mod.rs | 10 ++++++---- 10 files changed, 40 insertions(+), 30 deletions(-) diff --git a/crates/libs/windows/src/Windows/Win32/Graphics/Direct3D/Dxc/mod.rs b/crates/libs/windows/src/Windows/Win32/Graphics/Direct3D/Dxc/mod.rs index 307ba94e8c..0b2aee863a 100644 --- a/crates/libs/windows/src/Windows/Win32/Graphics/Direct3D/Dxc/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/Graphics/Direct3D/Dxc/mod.rs @@ -1207,8 +1207,8 @@ impl IDxcExtraOutputs { ::core::mem::transmute((::windows::core::Interface::vtable(self).GetOutputCount)(::windows::core::Interface::as_raw(self))) } #[doc = "*Required features: `\"Win32_Graphics_Direct3D_Dxc\"`*"] - pub unsafe fn GetOutput(&self, uindex: u32, iid: *const ::windows::core::GUID, ppvobject: *mut *mut ::core::ffi::c_void, ppoutputtype: *mut ::core::option::Option, ppoutputname: *mut ::core::option::Option) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).GetOutput)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(uindex), ::core::mem::transmute(iid), ::core::mem::transmute(ppvobject), ::core::mem::transmute(ppoutputtype), ::core::mem::transmute(ppoutputname)).ok() + pub unsafe fn GetOutput(&self, uindex: u32, ppoutputtype: *mut ::core::option::Option, ppoutputname: *mut ::core::option::Option, result__: *mut ::core::option::Option) -> ::windows::core::Result<()> { + (::windows::core::Interface::vtable(self).GetOutput)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(uindex), &::IID, result__ as *mut _ as *mut _, ::core::mem::transmute(ppoutputtype), ::core::mem::transmute(ppoutputname)).ok() } } impl ::core::convert::From for ::windows::core::IUnknown { @@ -1964,8 +1964,8 @@ impl IDxcResult { ::core::mem::transmute((::windows::core::Interface::vtable(self).HasOutput)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(dxcoutkind))) } #[doc = "*Required features: `\"Win32_Graphics_Direct3D_Dxc\"`*"] - pub unsafe fn GetOutput(&self, dxcoutkind: DXC_OUT_KIND, iid: *const ::windows::core::GUID, ppvobject: *mut *mut ::core::ffi::c_void, ppoutputname: *mut ::core::option::Option) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).GetOutput)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(dxcoutkind), ::core::mem::transmute(iid), ::core::mem::transmute(ppvobject), ::core::mem::transmute(ppoutputname)).ok() + pub unsafe fn GetOutput(&self, dxcoutkind: DXC_OUT_KIND, ppoutputname: *mut ::core::option::Option, result__: *mut ::core::option::Option) -> ::windows::core::Result<()> { + (::windows::core::Interface::vtable(self).GetOutput)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(dxcoutkind), &::IID, result__ as *mut _ as *mut _, ::core::mem::transmute(ppoutputname)).ok() } #[doc = "*Required features: `\"Win32_Graphics_Direct3D_Dxc\"`*"] pub unsafe fn GetNumOutputs(&self) -> u32 { diff --git a/crates/libs/windows/src/Windows/Win32/Graphics/DirectManipulation/mod.rs b/crates/libs/windows/src/Windows/Win32/Graphics/DirectManipulation/mod.rs index 2cfe519ca2..7db7263aec 100644 --- a/crates/libs/windows/src/Windows/Win32/Graphics/DirectManipulation/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/Graphics/DirectManipulation/mod.rs @@ -750,8 +750,8 @@ impl IDirectManipulationContent { (::windows::core::Interface::vtable(self).GetViewport)(::windows::core::Interface::as_raw(self), &::IID, &mut result__ as *mut _ as *mut _).and_some(result__) } #[doc = "*Required features: `\"Win32_Graphics_DirectManipulation\"`*"] - pub unsafe fn GetTag(&self, riid: *const ::windows::core::GUID, object: *mut *mut ::core::ffi::c_void, id: *mut u32) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).GetTag)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(riid), ::core::mem::transmute(object), ::core::mem::transmute(id)).ok() + pub unsafe fn GetTag(&self, id: *mut u32, result__: *mut ::core::option::Option) -> ::windows::core::Result<()> { + (::windows::core::Interface::vtable(self).GetTag)(::windows::core::Interface::as_raw(self), &::IID, result__ as *mut _ as *mut _, ::core::mem::transmute(id)).ok() } #[doc = "*Required features: `\"Win32_Graphics_DirectManipulation\"`*"] pub unsafe fn SetTag<'a, Param0: ::windows::core::IntoParam<'a, ::windows::core::IUnknown>>(&self, object: Param0, id: u32) -> ::windows::core::Result<()> { @@ -1730,8 +1730,8 @@ impl IDirectManipulationViewport { (::windows::core::Interface::vtable(self).GetStatus)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(result__.as_mut_ptr())).from_abi::(result__) } #[doc = "*Required features: `\"Win32_Graphics_DirectManipulation\"`*"] - pub unsafe fn GetTag(&self, riid: *const ::windows::core::GUID, object: *mut *mut ::core::ffi::c_void, id: *mut u32) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).GetTag)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(riid), ::core::mem::transmute(object), ::core::mem::transmute(id)).ok() + pub unsafe fn GetTag(&self, id: *mut u32, result__: *mut ::core::option::Option) -> ::windows::core::Result<()> { + (::windows::core::Interface::vtable(self).GetTag)(::windows::core::Interface::as_raw(self), &::IID, result__ as *mut _ as *mut _, ::core::mem::transmute(id)).ok() } #[doc = "*Required features: `\"Win32_Graphics_DirectManipulation\"`*"] pub unsafe fn SetTag<'a, Param0: ::windows::core::IntoParam<'a, ::windows::core::IUnknown>>(&self, object: Param0, id: u32) -> ::windows::core::Result<()> { @@ -1940,8 +1940,8 @@ impl IDirectManipulationViewport2 { (::windows::core::Interface::vtable(self).base__.GetStatus)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(result__.as_mut_ptr())).from_abi::(result__) } #[doc = "*Required features: `\"Win32_Graphics_DirectManipulation\"`*"] - pub unsafe fn GetTag(&self, riid: *const ::windows::core::GUID, object: *mut *mut ::core::ffi::c_void, id: *mut u32) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).base__.GetTag)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(riid), ::core::mem::transmute(object), ::core::mem::transmute(id)).ok() + pub unsafe fn GetTag(&self, id: *mut u32, result__: *mut ::core::option::Option) -> ::windows::core::Result<()> { + (::windows::core::Interface::vtable(self).base__.GetTag)(::windows::core::Interface::as_raw(self), &::IID, result__ as *mut _ as *mut _, ::core::mem::transmute(id)).ok() } #[doc = "*Required features: `\"Win32_Graphics_DirectManipulation\"`*"] pub unsafe fn SetTag<'a, Param0: ::windows::core::IntoParam<'a, ::windows::core::IUnknown>>(&self, object: Param0, id: u32) -> ::windows::core::Result<()> { diff --git a/crates/libs/windows/src/Windows/Win32/Graphics/Dxgi/mod.rs b/crates/libs/windows/src/Windows/Win32/Graphics/Dxgi/mod.rs index dbcc3dcf9c..8f311dc6a6 100644 --- a/crates/libs/windows/src/Windows/Win32/Graphics/Dxgi/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/Graphics/Dxgi/mod.rs @@ -10376,8 +10376,9 @@ impl IDXGISurface2 { (::windows::core::Interface::vtable(self).base__.ReleaseDC)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(pdirtyrect)).ok() } #[doc = "*Required features: `\"Win32_Graphics_Dxgi\"`*"] - pub unsafe fn GetResource(&self, riid: *const ::windows::core::GUID, ppparentresource: *mut *mut ::core::ffi::c_void, psubresourceindex: *mut u32) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).GetResource)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(riid), ::core::mem::transmute(ppparentresource), ::core::mem::transmute(psubresourceindex)).ok() + pub unsafe fn GetResource(&self, psubresourceindex: *mut u32) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).GetResource)(::windows::core::Interface::as_raw(self), &::IID, &mut result__ as *mut _ as *mut _, ::core::mem::transmute(psubresourceindex)).and_some(result__) } } impl ::core::convert::From for ::windows::core::IUnknown { diff --git a/crates/libs/windows/src/Windows/Win32/Media/Audio/mod.rs b/crates/libs/windows/src/Windows/Win32/Media/Audio/mod.rs index 3f911f5b0b..0983fe5c11 100644 --- a/crates/libs/windows/src/Windows/Win32/Media/Audio/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/Media/Audio/mod.rs @@ -6391,8 +6391,9 @@ pub struct IMMDevice(::windows::core::IUnknown); impl IMMDevice { #[doc = "*Required features: `\"Win32_Media_Audio\"`, `\"Win32_Foundation\"`, `\"Win32_System_Com_StructuredStorage\"`*"] #[cfg(all(feature = "Win32_Foundation", feature = "Win32_System_Com_StructuredStorage"))] - pub unsafe fn Activate(&self, iid: *const ::windows::core::GUID, dwclsctx: super::super::System::Com::CLSCTX, pactivationparams: *const super::super::System::Com::StructuredStorage::PROPVARIANT, ppinterface: *mut *mut ::core::ffi::c_void) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).Activate)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(iid), ::core::mem::transmute(dwclsctx), ::core::mem::transmute(pactivationparams), ::core::mem::transmute(ppinterface)).ok() + pub unsafe fn Activate(&self, dwclsctx: super::super::System::Com::CLSCTX, pactivationparams: *const super::super::System::Com::StructuredStorage::PROPVARIANT) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).Activate)(::windows::core::Interface::as_raw(self), &::IID, ::core::mem::transmute(dwclsctx), ::core::mem::transmute(pactivationparams), &mut result__ as *mut _ as *mut _).and_some(result__) } #[doc = "*Required features: `\"Win32_Media_Audio\"`, `\"Win32_System_Com_StructuredStorage\"`, `\"Win32_UI_Shell_PropertiesSystem\"`*"] #[cfg(all(feature = "Win32_System_Com_StructuredStorage", feature = "Win32_UI_Shell_PropertiesSystem"))] diff --git a/crates/libs/windows/src/Windows/Win32/System/Diagnostics/Debug/mod.rs b/crates/libs/windows/src/Windows/Win32/System/Diagnostics/Debug/mod.rs index ff102d058a..cc4ec8b2fb 100644 --- a/crates/libs/windows/src/Windows/Win32/System/Diagnostics/Debug/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/System/Diagnostics/Debug/mod.rs @@ -7388,14 +7388,15 @@ pub unsafe fn DebugCreate() -> ::windows::core::R } #[doc = "*Required features: `\"Win32_System_Diagnostics_Debug\"`*"] #[inline] -pub unsafe fn DebugCreateEx(interfaceid: *const ::windows::core::GUID, dbgengoptions: u32, interface: *mut *mut ::core::ffi::c_void) -> ::windows::core::Result<()> { +pub unsafe fn DebugCreateEx(dbgengoptions: u32) -> ::windows::core::Result { #[cfg(windows)] { #[link(name = "windows")] extern "system" { fn DebugCreateEx(interfaceid: *const ::windows::core::GUID, dbgengoptions: u32, interface: *mut *mut ::core::ffi::c_void) -> ::windows::core::HRESULT; } - DebugCreateEx(::core::mem::transmute(interfaceid), ::core::mem::transmute(dbgengoptions), ::core::mem::transmute(interface)).ok() + let mut result__ = ::core::option::Option::None; + DebugCreateEx(&::IID, ::core::mem::transmute(dbgengoptions), &mut result__ as *mut _ as *mut _).and_some(result__) } #[cfg(not(windows))] unimplemented!("Unsupported target OS"); diff --git a/crates/libs/windows/src/Windows/Win32/System/Ole/mod.rs b/crates/libs/windows/src/Windows/Win32/System/Ole/mod.rs index 9fefbcacf0..f10fe258a8 100644 --- a/crates/libs/windows/src/Windows/Win32/System/Ole/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/System/Ole/mod.rs @@ -1707,8 +1707,9 @@ impl IClassFactory2 { } #[doc = "*Required features: `\"Win32_System_Ole\"`, `\"Win32_Foundation\"`*"] #[cfg(feature = "Win32_Foundation")] - pub unsafe fn CreateInstanceLic<'a, Param0: ::windows::core::IntoParam<'a, ::windows::core::IUnknown>, Param1: ::windows::core::IntoParam<'a, ::windows::core::IUnknown>, Param3: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>>(&self, punkouter: Param0, punkreserved: Param1, riid: *const ::windows::core::GUID, bstrkey: Param3, ppvobj: *mut *mut ::core::ffi::c_void) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).CreateInstanceLic)(::windows::core::Interface::as_raw(self), punkouter.into_param().abi(), punkreserved.into_param().abi(), ::core::mem::transmute(riid), bstrkey.into_param().abi(), ::core::mem::transmute(ppvobj)).ok() + pub unsafe fn CreateInstanceLic<'a, Param0: ::windows::core::IntoParam<'a, ::windows::core::IUnknown>, Param1: ::windows::core::IntoParam<'a, ::windows::core::IUnknown>, Param3: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, T: ::windows::core::Interface>(&self, punkouter: Param0, punkreserved: Param1, bstrkey: Param3) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).CreateInstanceLic)(::windows::core::Interface::as_raw(self), punkouter.into_param().abi(), punkreserved.into_param().abi(), &::IID, bstrkey.into_param().abi(), &mut result__ as *mut _ as *mut _).and_some(result__) } } #[cfg(feature = "Win32_System_Com")] diff --git a/crates/libs/windows/src/Windows/Win32/System/WinRT/Composition/mod.rs b/crates/libs/windows/src/Windows/Win32/System/WinRT/Composition/mod.rs index c782bd3ee0..5aa6f1135f 100644 --- a/crates/libs/windows/src/Windows/Win32/System/WinRT/Composition/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/System/WinRT/Composition/mod.rs @@ -84,8 +84,9 @@ pub struct ICompositionDrawingSurfaceInterop(::windows::core::IUnknown); impl ICompositionDrawingSurfaceInterop { #[doc = "*Required features: `\"Win32_System_WinRT_Composition\"`, `\"Win32_Foundation\"`*"] #[cfg(feature = "Win32_Foundation")] - pub unsafe fn BeginDraw(&self, updaterect: *const super::super::super::Foundation::RECT, iid: *const ::windows::core::GUID, updateobject: *mut *mut ::core::ffi::c_void, updateoffset: *mut super::super::super::Foundation::POINT) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).BeginDraw)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(updaterect), ::core::mem::transmute(iid), ::core::mem::transmute(updateobject), ::core::mem::transmute(updateoffset)).ok() + pub unsafe fn BeginDraw(&self, updaterect: *const super::super::super::Foundation::RECT, updateoffset: *mut super::super::super::Foundation::POINT) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).BeginDraw)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(updaterect), &::IID, &mut result__ as *mut _ as *mut _, ::core::mem::transmute(updateoffset)).and_some(result__) } #[doc = "*Required features: `\"Win32_System_WinRT_Composition\"`*"] pub unsafe fn EndDraw(&self) -> ::windows::core::Result<()> { @@ -176,8 +177,9 @@ pub struct ICompositionDrawingSurfaceInterop2(::windows::core::IUnknown); impl ICompositionDrawingSurfaceInterop2 { #[doc = "*Required features: `\"Win32_System_WinRT_Composition\"`, `\"Win32_Foundation\"`*"] #[cfg(feature = "Win32_Foundation")] - pub unsafe fn BeginDraw(&self, updaterect: *const super::super::super::Foundation::RECT, iid: *const ::windows::core::GUID, updateobject: *mut *mut ::core::ffi::c_void, updateoffset: *mut super::super::super::Foundation::POINT) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).base__.BeginDraw)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(updaterect), ::core::mem::transmute(iid), ::core::mem::transmute(updateobject), ::core::mem::transmute(updateoffset)).ok() + pub unsafe fn BeginDraw(&self, updaterect: *const super::super::super::Foundation::RECT, updateoffset: *mut super::super::super::Foundation::POINT) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).base__.BeginDraw)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(updaterect), &::IID, &mut result__ as *mut _ as *mut _, ::core::mem::transmute(updateoffset)).and_some(result__) } #[doc = "*Required features: `\"Win32_System_WinRT_Composition\"`*"] pub unsafe fn EndDraw(&self) -> ::windows::core::Result<()> { diff --git a/crates/libs/windows/src/Windows/Win32/System/WinRT/Xaml/mod.rs b/crates/libs/windows/src/Windows/Win32/System/WinRT/Xaml/mod.rs index 7c5c3ca3fb..26284b80e1 100644 --- a/crates/libs/windows/src/Windows/Win32/System/WinRT/Xaml/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/System/WinRT/Xaml/mod.rs @@ -708,8 +708,9 @@ impl ISurfaceImageSourceNativeWithD2D { } #[doc = "*Required features: `\"Win32_System_WinRT_Xaml\"`, `\"Win32_Foundation\"`*"] #[cfg(feature = "Win32_Foundation")] - pub unsafe fn BeginDraw(&self, updaterect: *const super::super::super::Foundation::RECT, iid: *const ::windows::core::GUID, updateobject: *mut *mut ::core::ffi::c_void, offset: *mut super::super::super::Foundation::POINT) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).BeginDraw)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(updaterect), ::core::mem::transmute(iid), ::core::mem::transmute(updateobject), ::core::mem::transmute(offset)).ok() + pub unsafe fn BeginDraw(&self, updaterect: *const super::super::super::Foundation::RECT, offset: *mut super::super::super::Foundation::POINT) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).BeginDraw)(::windows::core::Interface::as_raw(self), ::core::mem::transmute(updaterect), &::IID, &mut result__ as *mut _ as *mut _, ::core::mem::transmute(offset)).and_some(result__) } #[doc = "*Required features: `\"Win32_System_WinRT_Xaml\"`*"] pub unsafe fn EndDraw(&self) -> ::windows::core::Result<()> { diff --git a/crates/libs/windows/src/Windows/Win32/System/Wmi/mod.rs b/crates/libs/windows/src/Windows/Win32/System/Wmi/mod.rs index 9029b5bc67..74ee6fb222 100644 --- a/crates/libs/windows/src/Windows/Win32/System/Wmi/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/System/Wmi/mod.rs @@ -5313,8 +5313,9 @@ pub struct IWbemClientConnectionTransport(::windows::core::IUnknown); impl IWbemClientConnectionTransport { #[doc = "*Required features: `\"Win32_System_Wmi\"`, `\"Win32_Foundation\"`*"] #[cfg(feature = "Win32_Foundation")] - pub unsafe fn Open<'a, Param0: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param3: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param4: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param5: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param6: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param8: ::windows::core::IntoParam<'a, IWbemContext>>(&self, straddresstype: Param0, abbinaryaddress: &[u8], strobject: Param3, struser: Param4, strpassword: Param5, strlocale: Param6, lflags: i32, pctx: Param8, riid: *const ::windows::core::GUID, pinterface: *mut *mut ::core::ffi::c_void, pcallres: *mut ::core::option::Option) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).Open)(::windows::core::Interface::as_raw(self), straddresstype.into_param().abi(), abbinaryaddress.len() as _, ::core::mem::transmute(::windows::core::as_ptr_or_null(abbinaryaddress)), strobject.into_param().abi(), struser.into_param().abi(), strpassword.into_param().abi(), strlocale.into_param().abi(), ::core::mem::transmute(lflags), pctx.into_param().abi(), ::core::mem::transmute(riid), ::core::mem::transmute(pinterface), ::core::mem::transmute(pcallres)).ok() + pub unsafe fn Open<'a, Param0: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param3: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param4: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param5: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param6: ::windows::core::IntoParam<'a, super::super::Foundation::BSTR>, Param8: ::windows::core::IntoParam<'a, IWbemContext>, T: ::windows::core::Interface>(&self, straddresstype: Param0, abbinaryaddress: &[u8], strobject: Param3, struser: Param4, strpassword: Param5, strlocale: Param6, lflags: i32, pctx: Param8, pcallres: *mut ::core::option::Option) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).Open)(::windows::core::Interface::as_raw(self), straddresstype.into_param().abi(), abbinaryaddress.len() as _, ::core::mem::transmute(::windows::core::as_ptr_or_null(abbinaryaddress)), strobject.into_param().abi(), struser.into_param().abi(), strpassword.into_param().abi(), strlocale.into_param().abi(), ::core::mem::transmute(lflags), pctx.into_param().abi(), &::IID, &mut result__ as *mut _ as *mut _, ::core::mem::transmute(pcallres)).and_some(result__) } #[doc = "*Required features: `\"Win32_System_Wmi\"`, `\"Win32_Foundation\"`*"] #[cfg(feature = "Win32_Foundation")] diff --git a/crates/libs/windows/src/Windows/Win32/UI/Shell/mod.rs b/crates/libs/windows/src/Windows/Win32/UI/Shell/mod.rs index 36cb91f84b..b26ae5c7a2 100644 --- a/crates/libs/windows/src/Windows/Win32/UI/Shell/mod.rs +++ b/crates/libs/windows/src/Windows/Win32/UI/Shell/mod.rs @@ -38866,8 +38866,9 @@ impl IShellFolder { } #[doc = "*Required features: `\"Win32_UI_Shell\"`, `\"Win32_Foundation\"`, `\"Win32_UI_Shell_Common\"`*"] #[cfg(all(feature = "Win32_Foundation", feature = "Win32_UI_Shell_Common"))] - pub unsafe fn GetUIObjectOf<'a, Param0: ::windows::core::IntoParam<'a, super::super::Foundation::HWND>>(&self, hwndowner: Param0, apidl: &[*const Common::ITEMIDLIST], riid: *const ::windows::core::GUID, rgfreserved: *mut u32, ppv: *mut *mut ::core::ffi::c_void) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).GetUIObjectOf)(::windows::core::Interface::as_raw(self), hwndowner.into_param().abi(), apidl.len() as _, ::core::mem::transmute(::windows::core::as_ptr_or_null(apidl)), ::core::mem::transmute(riid), ::core::mem::transmute(rgfreserved), ::core::mem::transmute(ppv)).ok() + pub unsafe fn GetUIObjectOf<'a, Param0: ::windows::core::IntoParam<'a, super::super::Foundation::HWND>, T: ::windows::core::Interface>(&self, hwndowner: Param0, apidl: &[*const Common::ITEMIDLIST], rgfreserved: *mut u32) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).GetUIObjectOf)(::windows::core::Interface::as_raw(self), hwndowner.into_param().abi(), apidl.len() as _, ::core::mem::transmute(::windows::core::as_ptr_or_null(apidl)), &::IID, ::core::mem::transmute(rgfreserved), &mut result__ as *mut _ as *mut _).and_some(result__) } #[doc = "*Required features: `\"Win32_UI_Shell\"`, `\"Win32_UI_Shell_Common\"`*"] #[cfg(feature = "Win32_UI_Shell_Common")] @@ -39011,8 +39012,9 @@ impl IShellFolder2 { } #[doc = "*Required features: `\"Win32_UI_Shell\"`, `\"Win32_Foundation\"`, `\"Win32_UI_Shell_Common\"`*"] #[cfg(all(feature = "Win32_Foundation", feature = "Win32_UI_Shell_Common"))] - pub unsafe fn GetUIObjectOf<'a, Param0: ::windows::core::IntoParam<'a, super::super::Foundation::HWND>>(&self, hwndowner: Param0, apidl: &[*const Common::ITEMIDLIST], riid: *const ::windows::core::GUID, rgfreserved: *mut u32, ppv: *mut *mut ::core::ffi::c_void) -> ::windows::core::Result<()> { - (::windows::core::Interface::vtable(self).base__.GetUIObjectOf)(::windows::core::Interface::as_raw(self), hwndowner.into_param().abi(), apidl.len() as _, ::core::mem::transmute(::windows::core::as_ptr_or_null(apidl)), ::core::mem::transmute(riid), ::core::mem::transmute(rgfreserved), ::core::mem::transmute(ppv)).ok() + pub unsafe fn GetUIObjectOf<'a, Param0: ::windows::core::IntoParam<'a, super::super::Foundation::HWND>, T: ::windows::core::Interface>(&self, hwndowner: Param0, apidl: &[*const Common::ITEMIDLIST], rgfreserved: *mut u32) -> ::windows::core::Result { + let mut result__ = ::core::option::Option::None; + (::windows::core::Interface::vtable(self).base__.GetUIObjectOf)(::windows::core::Interface::as_raw(self), hwndowner.into_param().abi(), apidl.len() as _, ::core::mem::transmute(::windows::core::as_ptr_or_null(apidl)), &::IID, ::core::mem::transmute(rgfreserved), &mut result__ as *mut _ as *mut _).and_some(result__) } #[doc = "*Required features: `\"Win32_UI_Shell\"`, `\"Win32_UI_Shell_Common\"`*"] #[cfg(feature = "Win32_UI_Shell_Common")] From d5789f6195035d6a0019d091acef220deb5fff59 Mon Sep 17 00:00:00 2001 From: Kenny Kerr Date: Tue, 7 Jun 2022 11:57:53 -0700 Subject: [PATCH 5/7] test --- crates/tests/query_signature/Cargo.toml | 11 +++++++++++ crates/tests/query_signature/src/lib.rs | 1 + crates/tests/query_signature/tests/test.rs | 8 ++++++++ 3 files changed, 20 insertions(+) create mode 100644 crates/tests/query_signature/Cargo.toml create mode 100644 crates/tests/query_signature/src/lib.rs create mode 100644 crates/tests/query_signature/tests/test.rs diff --git a/crates/tests/query_signature/Cargo.toml b/crates/tests/query_signature/Cargo.toml new file mode 100644 index 0000000000..5a8ad6ac26 --- /dev/null +++ b/crates/tests/query_signature/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "test_query_signature" +version = "0.0.0" +authors = ["Microsoft"] +edition = "2018" + +[dependencies.windows] +path = "../../libs/windows" +features = [ + "Win32_System_Diagnostics_Debug", +] diff --git a/crates/tests/query_signature/src/lib.rs b/crates/tests/query_signature/src/lib.rs new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/crates/tests/query_signature/src/lib.rs @@ -0,0 +1 @@ + diff --git a/crates/tests/query_signature/tests/test.rs b/crates/tests/query_signature/tests/test.rs new file mode 100644 index 0000000000..7ed48166a5 --- /dev/null +++ b/crates/tests/query_signature/tests/test.rs @@ -0,0 +1,8 @@ +use windows::Win32::System::Diagnostics::Debug::*; + +#[test] +fn test() { + unsafe { + let _debug: IDebugClient = DebugCreateEx(0).unwrap(); + } +} From 75b90c49dba2416666f6eb9b71ac4d972508e556 Mon Sep 17 00:00:00 2001 From: Kenny Kerr Date: Tue, 7 Jun 2022 12:01:56 -0700 Subject: [PATCH 6/7] yml --- .github/workflows/build.yml | 1 + .github/workflows/test.yml | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c129c9deef..12ac16d73d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -163,6 +163,7 @@ jobs: cargo clippy -p test_ntstatus && cargo clippy -p test_null_result && cargo clippy -p test_properties && + cargo clippy -p test_query_signature && cargo clippy -p test_return_struct && cargo clippy -p test_string_param && cargo clippy -p test_structs && diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2b743d6d39..16699a7e98 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -125,8 +125,8 @@ jobs: cargo test --target ${{ matrix.target }} -p test_component && cargo test --target ${{ matrix.target }} -p test_component_client && cargo test --target ${{ matrix.target }} -p test_const_fields && - cargo clean && cargo test --target ${{ matrix.target }} -p test_core && + cargo clean && cargo test --target ${{ matrix.target }} -p test_data_object && cargo test --target ${{ matrix.target }} -p test_debug && cargo test --target ${{ matrix.target }} -p test_deprecated && @@ -152,6 +152,7 @@ jobs: cargo test --target ${{ matrix.target }} -p test_ntstatus && cargo test --target ${{ matrix.target }} -p test_null_result && cargo test --target ${{ matrix.target }} -p test_properties && + cargo test --target ${{ matrix.target }} -p test_query_signature && cargo test --target ${{ matrix.target }} -p test_return_struct && cargo test --target ${{ matrix.target }} -p test_string_param && cargo test --target ${{ matrix.target }} -p test_structs && From 851052556bc48081d36b12a2ec50253dec0f9ab7 Mon Sep 17 00:00:00 2001 From: Kenny Kerr Date: Wed, 8 Jun 2022 14:52:16 -0700 Subject: [PATCH 7/7] feedback --- crates/libs/bindgen/src/gen.rs | 92 +++++++++++--------------- crates/libs/metadata/src/reader/mod.rs | 14 ++-- 2 files changed, 48 insertions(+), 58 deletions(-) diff --git a/crates/libs/bindgen/src/gen.rs b/crates/libs/bindgen/src/gen.rs index 502bc9c6aa..f4e6e4b3f8 100644 --- a/crates/libs/bindgen/src/gen.rs +++ b/crates/libs/bindgen/src/gen.rs @@ -839,67 +839,51 @@ impl<'a> Gen<'a> { for (position, param) in params.iter().enumerate() { match kind { - SignatureKind::Query((object, guid)) => { - if object == position { - tokens.combine("e! { &mut result__ as *mut _ as *mut _, }); - continue; + SignatureKind::Query(query) if query.object == position => { + tokens.combine("e! { &mut result__ as *mut _ as *mut _, }); + } + SignatureKind::QueryOptional(query) if query.object == position => { + tokens.combine("e! { result__ as *mut _ as *mut _, }); + } + SignatureKind::Query(query) | SignatureKind::QueryOptional(query) if query.guid == position => { + tokens.combine("e! { &::IID, }); + } + _ => { + let name = self.param_name(param.def); + if let ArrayInfo::Fixed(fixed) = param.array_info { + if fixed > 0 && self.reader.param_free_with(param.def).is_none() { + let signature = if self.reader.param_flags(param.def).output() { + quote! { ::core::mem::transmute(::windows::core::as_mut_ptr_or_null(#name)), } + } else { + quote! { ::core::mem::transmute(::windows::core::as_ptr_or_null(#name)), } + }; + + tokens.combine(&signature); + continue; + } } - if guid == position { - tokens.combine("e! { &::IID, }); + if let ArrayInfo::RelativeLen(_) = param.array_info { + let signature = if self.reader.param_flags(param.def).output() { + quote! { ::core::mem::transmute(::windows::core::as_mut_ptr_or_null(#name)), } + } else { + quote! { ::core::mem::transmute(::windows::core::as_ptr_or_null(#name)), } + }; + + tokens.combine(&signature); continue; } - } - SignatureKind::QueryOptional((object, guid)) => { - if object == position { - tokens.combine("e! { result__ as *mut _ as *mut _, }); + if let ArrayInfo::RelativePtr(relative) = param.array_info { + let name = self.param_name(params[relative].def); + tokens.combine("e! { #name.len() as _, }); continue; } - if guid == position { - tokens.combine("e! { &::IID, }); + if self.reader.signature_param_is_convertible(param) { + tokens.combine("e! { #name.into_param().abi(), }); continue; } + tokens.combine("e! { ::core::mem::transmute(#name), }); } - _ => {} } - - let name = self.param_name(param.def); - - if let ArrayInfo::Fixed(fixed) = param.array_info { - if fixed > 0 && self.reader.param_free_with(param.def).is_none() { - let signature = if self.reader.param_flags(param.def).output() { - quote! { ::core::mem::transmute(::windows::core::as_mut_ptr_or_null(#name)), } - } else { - quote! { ::core::mem::transmute(::windows::core::as_ptr_or_null(#name)), } - }; - - tokens.combine(&signature); - continue; - } - } - - if let ArrayInfo::RelativeLen(_) = param.array_info { - let signature = if self.reader.param_flags(param.def).output() { - quote! { ::core::mem::transmute(::windows::core::as_mut_ptr_or_null(#name)), } - } else { - quote! { ::core::mem::transmute(::windows::core::as_ptr_or_null(#name)), } - }; - - tokens.combine(&signature); - continue; - } - - if let ArrayInfo::RelativePtr(relative) = param.array_info { - let name = self.param_name(params[relative].def); - tokens.combine("e! { #name.len() as _, }); - continue; - } - - if self.reader.signature_param_is_convertible(param) { - tokens.combine("e! { #name.into_param().abi(), }); - continue; - } - - tokens.combine("e! { ::core::mem::transmute(#name), }); } tokens @@ -909,8 +893,8 @@ impl<'a> Gen<'a> { for (position, param) in params.iter().enumerate() { match kind { - SignatureKind::Query((object, guid)) | SignatureKind::QueryOptional((object, guid)) => { - if object == position || guid == position { + SignatureKind::Query(query) | SignatureKind::QueryOptional(query) => { + if query.object == position || query.guid == position { continue; } } diff --git a/crates/libs/metadata/src/reader/mod.rs b/crates/libs/metadata/src/reader/mod.rs index 60071bf023..0c3097d2dd 100644 --- a/crates/libs/metadata/src/reader/mod.rs +++ b/crates/libs/metadata/src/reader/mod.rs @@ -68,10 +68,16 @@ pub enum InterfaceKind { Base, } +#[derive(Copy, Clone, PartialEq, Eq)] +pub struct QueryPosition { + pub object: usize, + pub guid: usize, +} + #[derive(Copy, Clone, PartialEq, Eq)] pub enum SignatureKind { - Query((usize, usize)), - QueryOptional((usize, usize)), + Query(QueryPosition), + QueryOptional(QueryPosition), ResultValue, ResultVoid, ReturnStruct, @@ -1168,9 +1174,9 @@ impl<'a> Reader<'a> { if let Some(guid) = self.signature_param_is_query_guid(&signature.params) { if let Some(object) = self.signature_param_is_query_object(&signature.params) { if self.param_flags(signature.params[object].def).optional() { - return SignatureKind::QueryOptional((object, guid)); + return SignatureKind::QueryOptional(QueryPosition { object, guid }); } else { - return SignatureKind::Query((object, guid)); + return SignatureKind::Query(QueryPosition { object, guid }); } } }