winapi/um/
combaseapi.rs

1// Licensed under the Apache License, Version 2.0
2// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4// All files in the project carrying such notice may not be copied, modified, or distributed
5// except according to those terms.
6//! Base Component Object Model defintions.
7use ctypes::{c_int, c_void};
8use shared::basetsd::{SIZE_T, UINT64, ULONG_PTR};
9use shared::guiddef::{CLSID, GUID, LPCLSID, LPIID, REFCLSID, REFGUID, REFIID};
10use shared::minwindef::{BOOL, DWORD, FILETIME, HGLOBAL, LPDWORD, LPHANDLE, LPVOID, ULONG};
11use shared::rpcdce::{RPC_AUTHZ_HANDLE, RPC_AUTH_IDENTITY_HANDLE};
12use shared::wtypesbase::{
13    CLSCTX, CLSCTX_INPROC_HANDLER, CLSCTX_INPROC_SERVER, CLSCTX_LOCAL_SERVER, CLSCTX_REMOTE_SERVER,
14    LPCOLESTR, LPOLESTR, OLECHAR,
15};
16use um::objidl::SOLE_AUTHENTICATION_SERVICE;
17use um::objidlbase::{
18    APTTYPE, APTTYPEQUALIFIER, COSERVERINFO, IActivationFilter, IAgileReference, LPMALLOC,
19    LPMARSHAL, LPSTREAM, LPSURROGATE, MULTI_QI,
20};
21use um::propidl::PROPVARIANT;
22use um::unknwnbase::{IUnknown, LPUNKNOWN};
23use um::winnt::{HANDLE, HRESULT, LARGE_INTEGER, LONG, PSECURITY_DESCRIPTOR, PVOID, ULARGE_INTEGER};
24#[inline]
25pub fn LISet32(li: &mut LARGE_INTEGER, v: DWORD) {
26    unsafe {
27        li.u_mut().HighPart = if (v as LONG) < 0 {
28            -1
29        } else {
30            0
31        };
32        li.u_mut().LowPart = v;
33    }
34}
35#[inline]
36pub fn ULISet32(li: &mut ULARGE_INTEGER, v: DWORD) {
37    unsafe {
38        li.u_mut().HighPart = 0;
39        li.u_mut().LowPart = v;
40    }
41}
42pub const CLSCTX_INPROC: CLSCTX = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER;
43pub const CLSCTX_ALL: CLSCTX = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER
44    | CLSCTX_REMOTE_SERVER;
45pub const CLSCTX_SERVER: CLSCTX = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER
46    | CLSCTX_REMOTE_SERVER;
47ENUM!{enum REGCLS {
48    REGCLS_SINGLEUSE = 0,
49    REGCLS_MULTIPLEUSE = 1,
50    REGCLS_MULTI_SEPARATE = 2,
51    REGCLS_SUSPENDED = 4,
52    REGCLS_SURROGATE = 8,
53    REGCLS_AGILE = 0x10,
54}}
55ENUM!{enum COINITBASE {
56    COINITBASE_MULTITHREADED = 0x0,
57}}
58extern "system" {
59    pub fn CoGetMalloc(
60        dwMemContext: DWORD,
61        ppMalloc: *mut LPMALLOC,
62    ) -> HRESULT;
63    pub fn CreateStreamOnHGlobal(
64        hGlobal: HGLOBAL,
65        fDeleteOnRelease: BOOL,
66        ppstm: *mut LPSTREAM,
67    ) -> HRESULT;
68    pub fn GetHGlobalFromStream(
69        pstm: LPSTREAM,
70        phglobal: *mut HGLOBAL,
71    ) -> HRESULT;
72    pub fn CoUninitialize() -> ();
73    pub fn CoGetCurrentProcess() -> DWORD;
74    pub fn CoInitializeEx(
75        pvReserved: LPVOID,
76        dwCoInit: DWORD,
77    ) -> HRESULT;
78    pub fn CoGetCallerTID(
79        lpdwTID: LPDWORD,
80    ) -> HRESULT;
81    pub fn CoGetCurrentLogicalThreadId(
82        pguid: *mut GUID,
83    ) -> HRESULT;
84    pub fn CoGetContextToken(
85        pToken: *mut ULONG_PTR,
86    ) -> HRESULT;
87    pub fn CoGetDefaultContext(
88        aptType: APTTYPE,
89        riid: REFIID,
90        ppv: *mut *mut c_void,
91    ) -> HRESULT;
92    pub fn CoGetApartmentType(
93        pAptType: *mut APTTYPE,
94        pAptQualifier: *mut APTTYPEQUALIFIER,
95    ) -> HRESULT;
96}
97STRUCT!{struct ServerInformation {
98    dwServerPid: DWORD,
99    dwServerTid: DWORD,
100    ui64ServerAddress: UINT64,
101}}
102pub type PServerInformation = *mut ServerInformation;
103extern "system" {
104    pub fn CoDecodeProxy(
105        dwClientPid: DWORD,
106        ui64ProxyAddress: UINT64,
107        pServerInformation: PServerInformation,
108    ) -> HRESULT;
109}
110DECLARE_HANDLE!{CO_MTA_USAGE_COOKIE, CO_MTA_USAGE_COOKIE__}
111extern "system" {
112    pub fn CoIncrementMTAUsage(
113        pCookie: *mut CO_MTA_USAGE_COOKIE,
114    ) -> HRESULT;
115    pub fn CoDecrementMTAUsage(
116        Cookie: CO_MTA_USAGE_COOKIE,
117    ) -> HRESULT;
118    pub fn CoAllowUnmarshalerCLSID(
119        clsid: REFCLSID,
120    ) -> HRESULT;
121    pub fn CoGetObjectContext(
122        riid: REFIID,
123        ppv: *mut LPVOID,
124    ) -> HRESULT;
125    pub fn CoGetClassObject(
126        rclsid: REFCLSID,
127        dwClsContext: DWORD,
128        pvReserved: LPVOID,
129        riid: REFIID,
130        ppv: *mut LPVOID,
131    ) -> HRESULT;
132    pub fn CoRegisterClassObject(
133        rclsid: REFCLSID,
134        pUnk: LPUNKNOWN,
135        dwClsContext: DWORD,
136        flags: DWORD,
137        lpdwRegister: LPDWORD,
138    ) -> HRESULT;
139    pub fn CoRevokeClassObject(
140        dwRegister: DWORD,
141    ) -> HRESULT;
142    pub fn CoResumeClassObjects() -> HRESULT;
143    pub fn CoSuspendClassObjects() -> HRESULT;
144    pub fn CoAddRefServerProcess() -> ULONG;
145    pub fn CoReleaseServerProcess() -> ULONG;
146    pub fn CoGetPSClsid(
147        riid: REFIID,
148        pClsid: *mut CLSID,
149    ) -> HRESULT;
150    pub fn CoRegisterPSClsid(
151        riid: REFIID,
152        rclsid: REFCLSID,
153    ) -> HRESULT;
154    pub fn CoRegisterSurrogate(
155        pSurrogate: LPSURROGATE,
156    ) -> HRESULT;
157    pub fn CoGetMarshalSizeMax(
158        pulSize: *mut ULONG,
159        riid: REFIID,
160        pUnk: LPUNKNOWN,
161        dwDestContext: DWORD,
162        pvDestContext: LPVOID,
163        mshlflags: DWORD,
164    ) -> HRESULT;
165    pub fn CoMarshalInterface(
166        pStm: LPSTREAM,
167        riid: REFIID,
168        pUnk: LPUNKNOWN,
169        dwDestContext: DWORD,
170        pvDestContext: LPVOID,
171        mshlflags: DWORD,
172    ) -> HRESULT;
173    pub fn CoUnmarshalInterface(
174        pStm: LPSTREAM,
175        riid: REFIID,
176        ppv: *mut LPVOID,
177    ) -> HRESULT;
178    pub fn CoMarshalHresult(
179        pstm: LPSTREAM,
180        hresult: HRESULT,
181    ) -> HRESULT;
182    pub fn CoUnmarshalHresult(
183        pstm: LPSTREAM,
184        phresult: *mut HRESULT,
185    ) -> HRESULT;
186    pub fn CoReleaseMarshalData(
187        pstm: LPSTREAM,
188    ) -> HRESULT;
189    pub fn CoDisconnectObject(
190        pUnk: LPUNKNOWN,
191        dwReserved: DWORD,
192    ) -> HRESULT;
193    pub fn CoLockObjectExternal(
194        pUnk: LPUNKNOWN,
195        fLock: BOOL,
196        fLastUnlockReleases: BOOL,
197    ) -> HRESULT;
198    pub fn CoGetStandardMarshal(
199        riid: REFIID,
200        pUnk: LPUNKNOWN,
201        dwDestContext: DWORD,
202        pvDestContext: LPVOID,
203        mshlflags: DWORD,
204        ppMarshal: *mut LPMARSHAL,
205    ) -> HRESULT;
206    pub fn CoGetStdMarshalEx(
207        pUnkOuter: LPUNKNOWN,
208        smexflags: DWORD,
209        ppUnkInner: *mut LPUNKNOWN,
210    ) -> HRESULT;
211}
212ENUM!{enum STDMSHLFLAGS {
213    SMEXF_SERVER = 0x01,
214    SMEXF_HANDLER = 0x02,
215}}
216extern "system" {
217    pub fn CoIsHandlerConnected(
218        pUnk: LPUNKNOWN,
219    ) -> BOOL;
220    pub fn CoMarshalInterThreadInterfaceInStream(
221        riid: REFIID,
222        pUnk: LPUNKNOWN,
223        ppStm: *mut LPSTREAM,
224    ) -> HRESULT;
225    pub fn CoGetInterfaceAndReleaseStream(
226        pStm: LPSTREAM,
227        iid: REFIID,
228        ppv: *mut LPVOID,
229    ) -> HRESULT;
230    pub fn CoCreateFreeThreadedMarshaler(
231        punkOuter: LPUNKNOWN,
232        ppunkMarshal: *mut LPUNKNOWN,
233    ) -> HRESULT;
234    pub fn CoFreeUnusedLibraries();
235    pub fn CoFreeUnusedLibrariesEx(
236        dwUnloadDelay: DWORD,
237        dwReserved: DWORD,
238    );
239    pub fn CoDisconnectContext(
240        dwTimeout: DWORD,
241    )-> HRESULT;
242    pub fn CoInitializeSecurity(
243        pSecDesc: PSECURITY_DESCRIPTOR,
244        cAuthSvc: LONG,
245        asAuthSvc: *mut SOLE_AUTHENTICATION_SERVICE,
246        pReserved1: *mut c_void,
247        dwAuthnLevel: DWORD,
248        dwImpLevel: DWORD,
249        pAuthList: *mut c_void,
250        dwCapabilities: DWORD,
251        pReserved3: *mut c_void,
252    ) -> HRESULT;
253    pub fn CoGetCallContext(
254        riid: REFIID,
255        ppInterface: *mut *mut c_void,
256    ) -> HRESULT;
257    pub fn CoQueryProxyBlanket(
258        pProxy: *mut IUnknown,
259        pwAuthnSvc: *mut DWORD,
260        pAuthzSvc: *mut DWORD,
261        pServerPrincName: *mut LPOLESTR,
262        pAuthnLevel: *mut DWORD,
263        pImpLevel: *mut DWORD,
264        pAuthInfo: *mut RPC_AUTH_IDENTITY_HANDLE,
265        pCapabilites: *mut DWORD,
266    ) -> HRESULT;
267    pub fn CoSetProxyBlanket(
268        pProxy: *mut IUnknown,
269        dwAuthnSvc: DWORD,
270        dwAuthzSvc: DWORD,
271        pServerPrincName: *mut OLECHAR,
272        dwAuthnLevel: DWORD,
273        dwImpLevel: DWORD,
274        pAuthInfo: RPC_AUTH_IDENTITY_HANDLE,
275        dwCapabilities: DWORD,
276    ) -> HRESULT;
277    pub fn CoCopyProxy(
278        pProxy: *mut IUnknown,
279        ppCopy: *mut *mut IUnknown,
280    ) -> HRESULT;
281    pub fn CoQueryClientBlanket(
282        pAuthnSvc: *mut DWORD,
283        pAuthzSvc: *mut DWORD,
284        pServerPrincName: *mut LPOLESTR,
285        pAuthnLevel: *mut DWORD,
286        pImpLevel: *mut DWORD,
287        pPrivs: *mut RPC_AUTHZ_HANDLE,
288        pCapabilities: *mut DWORD,
289    ) -> HRESULT;
290    pub fn CoImpersonateClient() -> HRESULT;
291    pub fn CoRevertToSelf() -> HRESULT;
292    pub fn CoQueryAuthenticationServices(
293        pcAuthSvc: *mut DWORD,
294        asAuthSvc: *mut *mut SOLE_AUTHENTICATION_SERVICE,
295    ) -> HRESULT;
296    pub fn CoSwitchCallContext(
297        pNewObject: *mut IUnknown,
298        ppOldObject: *mut *mut IUnknown,
299    ) -> HRESULT;
300}
301pub const COM_RIGHTS_EXECUTE: DWORD = 1;
302pub const COM_RIGHTS_EXECUTE_LOCAL: DWORD = 2;
303pub const COM_RIGHTS_EXECUTE_REMOTE: DWORD = 4;
304pub const COM_RIGHTS_ACTIVATE_LOCAL: DWORD = 8;
305pub const COM_RIGHTS_ACTIVATE_REMOTE: DWORD = 16;
306extern "system" {
307    pub fn CoCreateInstance(
308        rclsid: REFCLSID,
309        pUnkOuter: LPUNKNOWN,
310        dwClsContext: DWORD,
311        riid: REFIID,
312        ppv: *mut LPVOID,
313    ) -> HRESULT;
314    pub fn CoCreateInstanceEx(
315        Clsid: REFCLSID,
316        punkOuter: *mut IUnknown,
317        dwClsCtx: DWORD,
318        pServerInfo: *mut COSERVERINFO,
319        dwCount: DWORD,
320        pResults: *mut MULTI_QI,
321    ) -> HRESULT;
322    pub fn CoRegisterActivationFilter(
323        pActivationFilter: *mut IActivationFilter,
324    ) -> HRESULT;
325    pub fn CoCreateInstanceFromApp(
326        Clsid: REFCLSID,
327        punkOuter: *mut IUnknown,
328        dwClsCtx: DWORD,
329        reserved: PVOID,
330        dwCount: DWORD,
331        pResults: *mut MULTI_QI,
332    ) -> HRESULT;
333    pub fn CoGetCancelObject(
334        dwThreadId: DWORD,
335        iid: REFIID,
336        ppUnk: *mut *mut c_void,
337    ) -> HRESULT;
338    pub fn CoSetCancelObject(
339        pUnk: *mut *mut IUnknown,
340    ) -> HRESULT;
341    pub fn CoCancelCall(
342        dwThreadId: DWORD,
343        ulTimeout: ULONG,
344    ) -> HRESULT;
345    pub fn CoTestCancel() -> HRESULT;
346    pub fn CoEnableCallCancellation(
347        pReserved: LPVOID,
348    ) -> HRESULT;
349    pub fn CoDisableCallCancellation(
350        pReserved: LPVOID,
351    ) -> HRESULT;
352    pub fn StringFromCLSID(
353        rclsid: REFCLSID,
354        lplpsz: *mut LPOLESTR,
355    ) -> HRESULT;
356    pub fn CLSIDFromString(
357        lpsz: LPCOLESTR,
358        pclsid: LPCLSID,
359    ) -> HRESULT;
360    pub fn StringFromIID(
361        rclsid: REFIID,
362        lplpsz: *mut LPOLESTR,
363    ) -> HRESULT;
364    pub fn IIDFromString(
365        lpsz: LPCOLESTR,
366        lpiid: LPIID,
367    ) -> HRESULT;
368    pub fn ProgIDFromCLSID(
369        clsid: REFCLSID,
370        lplpszProgID: *mut LPOLESTR,
371    ) -> HRESULT;
372    pub fn CLSIDFromProgID(
373        lpszProgID: LPCOLESTR,
374        lpclsid: LPCLSID,
375    ) -> HRESULT;
376    pub fn StringFromGUID2(
377        rguid: REFGUID,
378        lpsz: LPOLESTR,
379        cchMax: c_int,
380    ) -> c_int;
381    pub fn CoCreateGuid(
382        pguid: *mut GUID,
383    ) -> HRESULT;
384    pub fn PropVariantCopy(
385        pvarDest: *mut PROPVARIANT,
386        pvarSrc: *const PROPVARIANT,
387    ) -> HRESULT;
388    pub fn PropVariantClear(
389        pvar: *mut PROPVARIANT,
390    ) -> HRESULT;
391    pub fn FreePropVariantArray(
392        cVariants: ULONG,
393        rgvars: *mut PROPVARIANT,
394    ) -> HRESULT;
395    pub fn CoWaitForMultipleHandles(
396        dwFlags: DWORD,
397        dwTimeout: DWORD,
398        cHandles: ULONG,
399        pHandles: LPHANDLE,
400        lpdwindex: LPDWORD,
401    ) -> HRESULT;
402}
403ENUM!{enum COWAIT_FLAGS {
404    COWAIT_DEFAULT = 0,
405    COWAIT_WAITALL = 1,
406    COWAIT_ALERTABLE = 2,
407    COWAIT_INPUTAVAILABLE = 4,
408    COWAIT_DISPATCH_CALLS = 8,
409    COWAIT_DISPATCH_WINDOW_MESSAGES = 0x10,
410}}
411ENUM!{enum CWMO_FLAGS {
412    CWMO_DEFAULT = 0,
413    CWMO_DISPATCH_CALLS = 1,
414    CWMO_DISPATCH_WINDOW_MESSAGES = 2,
415}}
416extern "system" {
417    pub fn CoWaitForMultipleObjects(
418        dwFlags: DWORD,
419        dwTimeout: DWORD,
420        cHandles: ULONG,
421        pHandles: *const HANDLE,
422        lpdwindex: LPDWORD,
423    ) -> HRESULT;
424}
425pub const CWMO_MAX_HANDLES: ULONG = 56;
426extern "system" {
427    pub fn CoGetTreatAsClass(
428        clsidOld: REFCLSID,
429        pClsidNew: LPCLSID,
430    ) -> HRESULT;
431    pub fn CoInvalidateRemoteMachineBindings(
432        pszMachineName: LPOLESTR,
433    ) -> HRESULT;
434}
435ENUM!{enum AgileReferenceOptions {
436    AGILEREFERENCE_DEFAULT = 0,
437    AGILEREFERENCE_DELAYEDMARSHAL = 1,
438}}
439extern "system" {
440    pub fn RoGetAgileReference(
441        options: AgileReferenceOptions,
442        riid: REFIID,
443        pUnk: *mut IUnknown,
444        ppAgileReference: *mut *mut IAgileReference,
445    ) -> HRESULT;
446}
447FN!{stdcall LPFNGETCLASSOBJECT(
448    REFCLSID,
449    REFIID,
450    *mut LPVOID,
451) -> HRESULT}
452FN!{stdcall LPFNCANUNLOADNOW() -> HRESULT}
453extern "system" {
454    pub fn DllGetClassObject(
455        rclsid: REFCLSID,
456        riid: REFIID,
457        ppv: *mut LPVOID,
458    ) -> HRESULT;
459    pub fn DllCanUnloadNow() -> HRESULT;
460    pub fn CoTaskMemAlloc(
461        cb: SIZE_T,
462    ) -> LPVOID;
463    pub fn CoTaskMemRealloc(
464        pv: LPVOID,
465        cb: SIZE_T,
466    ) -> LPVOID;
467    pub fn CoTaskMemFree(
468        pv: LPVOID,
469    );
470    pub fn CoFileTimeNow(
471        lpFileTime: *mut FILETIME,
472    ) -> HRESULT;
473    pub fn CLSIDFromProgIDEx(
474        lpszProgID: LPCOLESTR,
475        lpclsid: LPCLSID,
476    ) -> HRESULT;
477}