ReactOS 0.4.16-dev-1946-g52006dd
com_apitest.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: COM interface test
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
6 */
7
8#include "com_apitest.h"
9
10#include <winreg.h>
11#include <mshtmhst.h>
12#include <shlwapi.h>
13#include <commoncontrols.h>
14#include <activscp.h>
15#include <ndk/rtlfuncs.h>
16
17#define NDEBUG
18#include <debug.h>
19
20#define myskip(c, ...) ((c) ? 0 : (skip(__VA_ARGS__), 1))
21#define mytrace(...) do { \
22 int debug = winetest_debug; \
23 winetest_debug = 1; \
24 trace(__VA_ARGS__); \
25 winetest_debug = debug; \
26} while (0)
27
28typedef struct _KNOWN_INTERFACE
29{
30 const IID *iid;
36
37#undef ID_NAME
38#define ID_NAME(c) &c, #c, L ## #c
39#define ID_NAME_EX(c, d) &c, #d, L ## #d
40
51
53{
54 { ID_NAME(DIID__SearchAssistantEvents), RegisteredOnWS03OrOlder },
55 { ID_NAME(IID_IMarshal), RegisteredOnWS03OrOlder },
56 { ID_NAME(IID_ICDBurnPriv), RegisteredOnWS03OrOlder },
57 { ID_NAME(IID_ICompositeFolder), RegisteredOnWS03OrOlder },
58 { ID_NAME(IID_IDefViewSafety), RegisteredOnWS03OrOlder },
59 { ID_NAME(IID_IDropSource), RegisteredOnWS03OrOlder },
60 { ID_NAME(IID_ISearch), RegisteredOnWS03OrOlder },
61 { ID_NAME(IID_ISearchAssistantOC), RegisteredOnWS03OrOlder },
62 { ID_NAME(IID_ISearchAssistantOC2), RegisteredOnWS03OrOlder },
63 { ID_NAME(IID_ISearchAssistantOC3), RegisteredOnWS03OrOlder },
64 { ID_NAME(IID_ISearchBar), RegisteredOnWS03OrOlder },
65 { ID_NAME(IID_ISearches), RegisteredOnWS03OrOlder },
66 { ID_NAME(IID_IEFrameAuto), RegisteredOnWS03OrOlder },
67 { ID_NAME(IID_IWebBrowserPriv2), RegisteredOnWS03OrOlder },
68 /* These interfaces are different between PSDK and registry/shell32 */
69 { ID_NAME_EX(IID_ITransferAdviseSinkPriv,
70 IID_ITransferAdviseSink), RegisteredOnWS03OrOlder },
71 { ID_NAME_EX(IID_IDriveFolderExtOld,
72 IID_IDriveFolderExt), RegisteredOnWS03OrOlder },
73
74 { ID_NAME(IID_IAggregateFilterCondition), RegisteredOnWS03AndVista },
75 { ID_NAME(IID_IBandNavigate), RegisteredOnWS03AndVista },
76
77 { ID_NAME(IID_IAccIdentity), RegisteredAlways },
78 { ID_NAME(IID_IAccPropServer), RegisteredAlways },
79 { ID_NAME(IID_IAccPropServices), RegisteredAlways },
80 { ID_NAME(IID_IAccessible), RegisteredAlways },
81 { ID_NAME(IID_IAccessibleHandler), RegisteredAlways },
82 { ID_NAME(IID_IAccessor), RegisteredAlways },
83 { ID_NAME(IID_IActionProgress), RegisteredAlways },
84 { ID_NAME(IID_IActionProgressDialog), RegisteredAlways },
85 { ID_NAME(IID_IAutoCompleteDropDown), RegisteredAlways },
86 { ID_NAME(IID_IBandHost), RegisteredAlways },
87 { ID_NAME(IID_IBandSite), RegisteredAlways },
88 { ID_NAME(IID_IBindCtx), RegisteredAlways },
89 { ID_NAME(IID_IBindEventHandler), RegisteredAlways },
90 { ID_NAME(IID_IBindHost), RegisteredAlways },
91 { ID_NAME(IID_IBinding), RegisteredAlways },
92 { ID_NAME(IID_IBindResource), RegisteredAlways },
93 { ID_NAME(IID_IBindStatusCallback), RegisteredAlways },
94 { ID_NAME(IID_IBlockingLock), RegisteredAlways },
95 { ID_NAME(IID_IBrowserService), RegisteredAlways },
96 { ID_NAME(IID_ICDBurn), RegisteredAlways },
97 { ID_NAME(IID_ICDBurnExt), RegisteredAlways },
98 { ID_NAME(IID_ICatInformation), RegisteredAlways },
99 { ID_NAME(IID_ICatRegister), RegisteredAlways },
100 { ID_NAME(IID_IClassActivator), RegisteredAlways },
103 { ID_NAME(IID_ICommDlgBrowser), RegisteredAlways },
104 { ID_NAME(IID_ICommDlgBrowser2), RegisteredAlways },
105 { ID_NAME(IID_ICommDlgBrowser3), RegisteredAlways },
106 { ID_NAME(IID_IComputerInfoChangeNotify), RegisteredAlways },
109 { ID_NAME(IID_IContextMenuSite), RegisteredAlways },
110 { ID_NAME(IID_IContinue), RegisteredAlways },
111 { ID_NAME(IID_IContinueCallback), RegisteredAlways },
112 { ID_NAME(IID_ICustomizeInfoTip), RegisteredAlways },
114 { ID_NAME(IID_IDefViewFrame3), RegisteredAlways },
115 { ID_NAME(IID_IDefViewFrameGroup), RegisteredAlways },
116 { ID_NAME(IID_IDeskBand), RegisteredAlways },
117 { ID_NAME(IID_IDeskBandEx), RegisteredAlways },
118 // { ID_NAME(IID_IDefViewID), RegisteredAlways }, == DefViewFrame3
119 { ID_NAME(IID_IDiscMasterProgressEvents), RegisteredAlways },
121 { ID_NAME(IID_IDispatchEx), RegisteredAlways },
122 { ID_NAME(IID_IDockingWindow), RegisteredAlways },
123 { ID_NAME(IID_IDropTarget), RegisteredAlways },
124 // { ID_NAME(IID_IEnumCATID), RegisteredAlways }, == EnumGUID
125 // { ID_NAME(IID_IEnumCLSID), RegisteredAlways }, == EnumGUID
126 { ID_NAME(IID_IEnumCATEGORYINFO), RegisteredAlways },
129 { ID_NAME(IID_IEnumExtraSearch), RegisteredAlways },
130 { ID_NAME(IID_IEnumGUID), RegisteredAlways },
131 { ID_NAME(IID_IEnumIDList), RegisteredAlways },
134 { ID_NAME(IID_IEnumShellItems), RegisteredAlways },
138 { ID_NAME(IID_IEnumVARIANT), RegisteredAlways },
140 { ID_NAME(IID_IExplorerBrowser), RegisteredAlways },
141 { ID_NAME(IID_IExtractImage), RegisteredAlways },
142 { ID_NAME(IID_IExtractImage2), RegisteredAlways },
143 { ID_NAME(IID_IFileDialog), RegisteredAlways },
144 { ID_NAME(IID_IFileOpenDialog), RegisteredAlways },
145 { ID_NAME(IID_IFileSaveDialog), RegisteredAlways },
146 { ID_NAME(IID_IFileSearchBand), RegisteredAlways },
147 { ID_NAME(IID_IFilter), RegisteredAlways },
148 { ID_NAME(IID_IFilterCondition), RegisteredAlways },
149 { ID_NAME(IID_IFolderBandPriv), RegisteredAlways },
150 { ID_NAME(IID_IFolderFilter), RegisteredAlways },
151 { ID_NAME(IID_IFolderFilterSite), RegisteredAlways },
152 { ID_NAME(IID_IFolderView), RegisteredAlways },
153 { ID_NAME(IID_IFolderView2), RegisteredAlways },
154 { ID_NAME(IID_IFolderViewOC), RegisteredAlways },
155 { ID_NAME(IID_IFolderViewSettings), RegisteredAlways },
156 { ID_NAME(IID_IHWEventHandler), RegisteredAlways },
157 { ID_NAME(IID_IHWEventHandler2), RegisteredAlways },
158 { ID_NAME(IID_IHlinkFrame), RegisteredAlways },
159 { ID_NAME(IID_IInitializeWithBindCtx), RegisteredAlways },
160 { ID_NAME(IID_IInitializeWithFile), RegisteredAlways },
161 { ID_NAME(IID_IInputObject), RegisteredAlways },
162 { ID_NAME(IID_IInputObjectSite), RegisteredAlways },
163 { ID_NAME(IID_IInternetSecurityManager), RegisteredAlways },
164 { ID_NAME(IID_IItemNameLimits), RegisteredAlways },
165 { ID_NAME(IID_IModalWindow), RegisteredAlways },
166 { ID_NAME(IID_IMoniker), RegisteredAlways },
167 { ID_NAME(IID_INamespaceWalk), RegisteredAlways },
168 { ID_NAME(IID_INamespaceWalkCB), RegisteredAlways },
169 { ID_NAME(IID_INamespaceWalkCB2), RegisteredAlways },
171 { ID_NAME(IID_INewMenuClient), RegisteredAlways },
172 { ID_NAME(IID_INewWindowManager), RegisteredAlways },
173 { ID_NAME(IID_IObjectSafety), RegisteredAlways },
174 { ID_NAME(IID_IObjectWithBackReferences), RegisteredAlways },
177 { ID_NAME(IID_IOleCommandTarget), RegisteredAlways },
185 { ID_NAME(IID_IOleInPlaceSiteEx), RegisteredAlways },
191 { ID_NAME(IID_IParentAndItem), RegisteredAlways },
195 { ID_NAME(IID_IPersistFolder), RegisteredAlways },
196 { ID_NAME(IID_IPersistFolder2), RegisteredAlways },
197 { ID_NAME(IID_IPersistFolder3), RegisteredAlways },
198 { ID_NAME(IID_IPersistHistory), RegisteredAlways },
199 { ID_NAME(IID_IPersistIDList), RegisteredAlways },
202 { ID_NAME(IID_IPersistPropertyBag2), RegisteredAlways },
206 { ID_NAME(IID_IPreviewHandler), RegisteredAlways },
207 { ID_NAME(IID_IPreviewHandlerFrame), RegisteredAlways },
208 { ID_NAME(IID_IPreviewHandlerVisuals), RegisteredAlways },
210 { ID_NAME(IID_IPropertyBag2), RegisteredAlways },
211 { ID_NAME(IID_IPropertySetStorage), RegisteredAlways },
212 { ID_NAME(IID_IPropertyStore), RegisteredAlways },
215 { ID_NAME(IID_IQueryCancelAutoPlay), RegisteredAlways },
216 { ID_NAME(IID_IQuickActivate), RegisteredAlways },
217 { ID_NAME(IID_IRemoteComputer), RegisteredAlways },
218 { ID_NAME(IID_IResolveShellLink), RegisteredAlways },
219 { ID_NAME(IID_IROTData), RegisteredAlways },
221 { ID_NAME(IID_IRunningObjectTable), RegisteredAlways },
222 { ID_NAME(IID_IScriptErrorList), RegisteredAlways },
223 { ID_NAME(IID_ISecMgrCacheSeedTarget), RegisteredAlways },
224 { ID_NAME(IID_IServiceProvider), RegisteredAlways },
225 { ID_NAME(IID_IShellBrowser), RegisteredAlways },
226 { ID_NAME(IID_IShellDispatch), RegisteredAlways },
227 { ID_NAME(IID_IShellDispatch2), RegisteredAlways },
228 { ID_NAME(IID_IShellDispatch3), RegisteredAlways },
229 { ID_NAME(IID_IShellDispatch4), RegisteredAlways },
230 { ID_NAME(IID_IShellFavoritesNameSpace), RegisteredAlways },
231 { ID_NAME(IID_IShellFolder), RegisteredAlways },
232 { ID_NAME(IID_IShellFolder2), RegisteredAlways },
233 { ID_NAME(IID_IShellFolderViewDual), RegisteredAlways },
234 { ID_NAME(IID_IShellFolderViewDual2), RegisteredAlways },
235 { ID_NAME(IID_IShellIcon), RegisteredAlways },
236 { ID_NAME(IID_IShellItem), RegisteredAlways },
237 { ID_NAME(IID_IShellItem2), RegisteredAlways },
238 { ID_NAME(IID_IShellItemArray), RegisteredAlways },
239 { ID_NAME(IID_IShellItemFilter), RegisteredAlways },
240 { ID_NAME(IID_IShellLinkA), RegisteredAlways },
241 { ID_NAME(IID_IShellLinkDual), RegisteredAlways },
242 { ID_NAME(IID_IShellLinkDual2), RegisteredAlways },
243 { ID_NAME(IID_IShellLinkW), RegisteredAlways },
244 { ID_NAME(IID_IShellNameSpace), RegisteredAlways },
245 { ID_NAME(IID_IShellUIHelper), RegisteredAlways },
246 { ID_NAME(IID_IShellView), RegisteredAlways },
247 { ID_NAME(IID_IShellView2), RegisteredAlways },
248 { ID_NAME(IID_IShellView3), RegisteredAlways },
249 { ID_NAME(IID_IShellWindows), RegisteredAlways },
251 { ID_NAME(IID_IStorage), RegisteredAlways },
252 { ID_NAME(IID_IStream), RegisteredAlways },
253 { ID_NAME(IID_ISurrogate), RegisteredAlways },
254 { ID_NAME(IID_ISynchronize), RegisteredAlways },
255 { ID_NAME(IID_ITargetEmbedding), RegisteredAlways },
256 { ID_NAME(IID_ITargetFrame), RegisteredAlways },
257 { ID_NAME(IID_ITargetFrame2), RegisteredAlways },
258 { ID_NAME(IID_ITargetFramePriv), RegisteredAlways },
259 { ID_NAME(IID_ITargetFramePriv2), RegisteredAlways },
260 { ID_NAME(IID_ITargetNotify), RegisteredAlways },
261 { ID_NAME(IID_ITaskbarList), RegisteredAlways },
262 { ID_NAME(IID_ITaskbarList2), RegisteredAlways },
264 { ID_NAME(IID_IUrlHistoryNotify), RegisteredAlways },
265 { ID_NAME(IID_IUrlHistoryStg), RegisteredAlways },
266 { ID_NAME(IID_IUrlHistoryStg2), RegisteredAlways },
269 { ID_NAME(IID_IVisualProperties), RegisteredAlways },
270 { ID_NAME(IID_IWebBrowser), RegisteredAlways },
271 { ID_NAME(IID_IWebBrowser2), RegisteredAlways },
272 { ID_NAME(IID_IWebBrowserApp), RegisteredAlways },
273 { ID_NAME(IID_IWebBrowserPriv), RegisteredAlways },
274 { ID_NAME(DIID_DShellFolderViewEvents), RegisteredAlways },
275 { ID_NAME(DIID_DShellNameSpaceEvents), RegisteredAlways },
276 { ID_NAME(DIID_DShellWindowsEvents), RegisteredAlways },
277 { ID_NAME(DIID_DWebBrowserEvents), RegisteredAlways },
278 { ID_NAME(DIID_DWebBrowserEvents2), RegisteredAlways },
279 { ID_NAME(DIID_XMLDOMDocumentEvents), RegisteredAlways },
280 { ID_NAME(IID_Folder), RegisteredAlways },
281 { ID_NAME(IID_Folder2), RegisteredAlways },
282 { ID_NAME(IID_Folder3), RegisteredAlways },
283 { ID_NAME(IID_FolderItem), RegisteredAlways },
284 { ID_NAME(IID_FolderItem2), RegisteredAlways },
285 { ID_NAME(IID_FolderItems), RegisteredAlways },
286 { ID_NAME(IID_FolderItems2), RegisteredAlways },
287 { ID_NAME(IID_FolderItems3), RegisteredAlways },
288 { ID_NAME(IID_FolderItemVerb), RegisteredAlways },
289 { ID_NAME(IID_FolderItemVerbs), RegisteredAlways },
290 { ID_NAME(IID_IQueryContinue), RegisteredAlways },
291 { ID_NAME(IID_IUserNotification), RegisteredAlways },
292 { ID_NAME(IID_IUserNotificationCallback), RegisteredAlways },
293 { ID_NAME(IID_IUserNotification2), RegisteredAlways },
294 { ID_NAME(IID_IUserEventTimer), RegisteredAlways },
295 { ID_NAME(IID_IUserEventTimerCallback), RegisteredAlways },
296
297 { ID_NAME(IID_IControlPanelEnumerator), RegisteredOnVistaOnly },
298 { ID_NAME(IID_IShellFolder3), RegisteredOnVistaOnly },
299 { ID_NAME_EX(IID_IShellBrowserService4,
300 IID_IShellBrowserService), RegisteredOnVistaOnly },
301
302 { ID_NAME(IID_IDriveFolderExt), RegisteredOnVistaOrNewer },
304 { ID_NAME(IID_INetConnectionCommonUi2), RegisteredOnVistaOrNewer }, // This also covers IID_INetLanConnectionUiInfo.
305 { ID_NAME(IID_ISLTracker), RegisteredOnVistaOrNewer },
306 { ID_NAME(IID_IShellDispatch5), RegisteredOnVistaOrNewer },
307 { ID_NAME(IID_IShellFolderViewDual3), RegisteredOnVistaOrNewer },
308 { ID_NAME(IID_IShellLinkDataList), RegisteredOnVistaOrNewer },
309 { ID_NAME(IID_IShellUIHelper2), RegisteredOnVistaOrNewer },
310 { ID_NAME(IID_IBackReferencedObject), RegisteredOnVistaOrNewer },
311 { ID_NAME(IID_ICommonLayoutDefinition), RegisteredOnVistaOrNewer },
312 { ID_NAME(IID_IDelegateHostItemContainer), RegisteredOnVistaOrNewer },
313 { ID_NAME(IID_IExecuteCommand), RegisteredOnVistaOrNewer },
314 { ID_NAME(IID_IFolderType), RegisteredOnVistaOrNewer },
315 { ID_NAME(IID_IFrameLayoutDefinition), RegisteredOnVistaOrNewer },
316 { ID_NAME(IID_IItemFilter), RegisteredOnVistaOrNewer },
317 { ID_NAME(IID_IItemFilterOwner), RegisteredOnVistaOrNewer },
318 { ID_NAME(IID_INewItemAdvisor), RegisteredOnVistaOrNewer },
319 { ID_NAME(IID_IObjectWithAssociationElement), RegisteredOnVistaOrNewer },
320 { ID_NAME(IID_IObjectWithQuerySource), RegisteredOnVistaOrNewer },
321 { ID_NAME(IID_IObjectWithSelection), RegisteredOnVistaOrNewer },
322 { ID_NAME(IID_IPersistString2), RegisteredOnVistaOrNewer },
323 { ID_NAME(IID_IRootAndRelativeParsingFolder), RegisteredOnVistaOrNewer },
324
325 { ID_NAME(IID_IAssociationArray), RegisteredOnVistaAndWin7 },
326 { ID_NAME(IID_IObjectWithAssociationList), RegisteredOnVistaAndWin7 },
327
328 { ID_NAME(IID_IRegItemFolder), RegisteredOnVistaToWin8Dot1 },
329
330 { ID_NAME(IID_IFileDialog2), RegisteredOnWin7OrNewer },
331 { ID_NAME(IID_INameSpaceTreeControl), RegisteredOnWin7OrNewer },
332 { ID_NAME(IID_ITaskbarList3), RegisteredOnWin7OrNewer },
333 { ID_NAME(IID_ITaskbarList4), RegisteredOnWin7OrNewer },
334 { ID_NAME(IID_IShellBrowserService), RegisteredOnWin7OrNewer },
335
336 { ID_NAME(IID_ITransferAdviseSink), RegisteredOnWin8OrNewer },
337
338 { ID_NAME(IID_IACList), RegisteredNever },
339 { ID_NAME(IID_IACList2), RegisteredNever },
340 { ID_NAME(IID_IADesktopP2), RegisteredNever },
341 { ID_NAME(IID_IAccessControl), RegisteredNever },
342 { ID_NAME(IID_IACLCustomMRU), RegisteredNever },
343 { ID_NAME(IID_IActiveDesktop), RegisteredNever },
344 { ID_NAME(IID_IActiveDesktopP), RegisteredNever },
345 { ID_NAME(IID_IAddressBarParser), RegisteredNever },
346 { ID_NAME(IID_IAddressBand), RegisteredNever },
347 { ID_NAME(IID_IAddressEditBox), RegisteredNever },
348 { ID_NAME(IID_IAsyncMoniker), RegisteredNever },
349 { ID_NAME(IID_IAugmentedShellFolder), RegisteredNever },
350 { ID_NAME(IID_IAugmentedShellFolder2), RegisteredNever },
351 { ID_NAME(IID_IAutoComplete), RegisteredNever },
352 { ID_NAME(IID_IAutoComplete2), RegisteredNever },
353 { ID_NAME(IID_IBandProxy), RegisteredNever },
354 { ID_NAME(IID_IBandSiteHelper), RegisteredNever },
355 { ID_NAME(IID_IBanneredBar), RegisteredNever },
356 { ID_NAME(IID_IBindProtocol), RegisteredNever },
357 { ID_NAME(IID_IBrowserFrameOptions), RegisteredNever },
358 { ID_NAME(IID_IBrowserService2), RegisteredNever },
359 { ID_NAME(IID_IBrowserService3), RegisteredNever },
360 { ID_NAME(IID_IBrowserService4), RegisteredNever },
361 { ID_NAME(IID_ICallFactory), RegisteredNever },
362 { ID_NAME(IID_ICancelMethodCalls), RegisteredNever },
363 { ID_NAME(IID_IClassFactory3), RegisteredNever },
364 { ID_NAME(IID_IClientSecurity), RegisteredNever },
365 { ID_NAME(IID_IComThreadingInfo), RegisteredNever },
366 { ID_NAME(IID_IContext), RegisteredNever },
367 { ID_NAME(IID_IContextMenu), RegisteredNever },
368 { ID_NAME(IID_IContextMenu2), RegisteredNever },
369 { ID_NAME(IID_IContextMenu3), RegisteredNever },
370 { ID_NAME(IID_IContextMenuCB), RegisteredNever },
371 { ID_NAME(IID_ICopyHookA), RegisteredNever },
372 { ID_NAME(IID_ICopyHookW), RegisteredNever },
373 { ID_NAME(IID_ICurrentWorkingDirectory), RegisteredNever },
374 { ID_NAME(IID_IDVGetEnum), RegisteredNever },
375 { ID_NAME(IID_IDefViewFrame), RegisteredNever },
376 { ID_NAME(IID_IDefViewScript), RegisteredNever },
377 { ID_NAME(IID_IDelayedRelease), RegisteredNever },
378 { ID_NAME(IID_IDeskBar), RegisteredNever },
379 { ID_NAME(IID_IDeskBarClient), RegisteredNever },
380 { ID_NAME(IID_IDeskMovr), RegisteredNever },
381 { ID_NAME(IID_IDockingWindowFrame), RegisteredNever },
382 { ID_NAME(IID_IDockingWindowSite), RegisteredNever },
383 { ID_NAME(IID_IDocViewSite), RegisteredNever },
384 { ID_NAME(IID_IDragSourceHelper), RegisteredNever },
385 { ID_NAME(IID_IDropTargetHelper), RegisteredNever },
387 { ID_NAME(IID_IExplorerToolbar), RegisteredNever },
388 { ID_NAME(IID_IExtractIconA), RegisteredNever },
389 { ID_NAME(IID_IExtractIconW), RegisteredNever },
390 { ID_NAME(IID_IFileViewerA), RegisteredNever },
391 { ID_NAME(IID_IFileViewerSite), RegisteredNever },
392 { ID_NAME(IID_IFileViewerW), RegisteredNever },
393 { ID_NAME(IID_IFolderViewHost), RegisteredNever },
394 { ID_NAME(IID_IForegroundTransfer), RegisteredNever },
395 { ID_NAME(IID_IGetNameSpaceExtensionPointer), RegisteredNever },
396 { ID_NAME(IID_IGlobalFolderSettings), RegisteredNever },
397 { ID_NAME(IID_IImageList), RegisteredNever },
398 { ID_NAME(IID_IImageList2), RegisteredNever },
399 { ID_NAME(IID_IInitializeObject), RegisteredNever },
400 { ID_NAME(IID_IInternalUnknown), RegisteredNever },
401 { ID_NAME(IID_IInternetZoneManager), RegisteredNever },
402 { ID_NAME(IID_IMarshal2), RegisteredNever },
403 { ID_NAME(IID_IMenuBand), RegisteredNever },
404 { ID_NAME(IID_IMenuPopup), RegisteredNever },
405 { ID_NAME(IID_IMruDataList), RegisteredNever },
406 { ID_NAME(IID_IMruPidlList), RegisteredNever },
407 { ID_NAME(IID_IMultiMonitorDockingSite), RegisteredNever },
408 { ID_NAME(IID_IMultiQI), RegisteredNever },
409 { ID_NAME(IID_INamespaceProxy), RegisteredNever },
419 { ID_NAME(IID_INewShortcutHookA), RegisteredNever },
420 { ID_NAME(IID_INewShortcutHookW), RegisteredNever },
421 { ID_NAME(IID_INSCTree), RegisteredNever },
422 { ID_NAME(IID_INSCTree2), RegisteredNever },
423 { ID_NAME(IID_IObjMgr), RegisteredNever },
424 { ID_NAME(IID_IOleInPlaceObjectWindowless), RegisteredNever },
425 { ID_NAME(IID_IOleInPlaceSiteWindowless), RegisteredNever },
426 { ID_NAME(IID_IPersistFreeThreadedObject), RegisteredNever },
427 { ID_NAME(IID_IProgressDialog), RegisteredNever },
428 { ID_NAME(IID_IPropSheetPage), RegisteredNever },
429 { ID_NAME(IID_IQueryAssociations), RegisteredNever },
430 { ID_NAME(IID_IQueryInfo), RegisteredNever },
431 { ID_NAME(IID_IRegTreeOptions), RegisteredNever },
432 { ID_NAME(IID_IRpcOptions), RegisteredNever },
433 { ID_NAME(IID_IServerSecurity), RegisteredNever },
434 { ID_NAME(IID_IShellApp), RegisteredNever },
435 { ID_NAME(IID_IShellChangeNotify), RegisteredNever },
436 { ID_NAME(IID_IShellCopyHookA), RegisteredNever },
437 { ID_NAME(IID_IShellCopyHookW), RegisteredNever },
439 { ID_NAME(IID_IShellDetails), RegisteredNever },
440 { ID_NAME(IID_IShellDispatch6), RegisteredNever },
441 { ID_NAME(IID_IShellExecuteHookA), RegisteredNever },
442 { ID_NAME(IID_IShellExecuteHookW), RegisteredNever },
443 { ID_NAME(IID_IShellExtInit), RegisteredNever },
444 { ID_NAME(IID_IShellFolderBand), RegisteredNever },
445 { ID_NAME(IID_IShellFolderSearchable), RegisteredNever },
446 { ID_NAME(IID_IShellFolderSearchableCallback), RegisteredNever },
447 { ID_NAME(IID_IShellFolderView), RegisteredNever },
448 { ID_NAME(IID_IShellFolderViewCB), RegisteredNever },
449 { ID_NAME(IID_IShellFolderViewType), RegisteredNever },
450 { ID_NAME(IID_IShellIconOverlay), RegisteredNever },
451 { ID_NAME(IID_IShellIconOverlayIdentifier), RegisteredNever },
452 { ID_NAME(IID_IShellImageData), RegisteredNever },
453 { ID_NAME(IID_IShellImageDataAbort), RegisteredNever },
454 { ID_NAME(IID_IShellImageDataFactory), RegisteredNever },
455 { ID_NAME(IID_IShellMenu), RegisteredNever },
456 { ID_NAME(IID_IShellMenu2), RegisteredNever },
457 { ID_NAME(IID_IShellMenuAcc), RegisteredNever },
458 { ID_NAME(IID_IShellMenuCallback), RegisteredNever },
459 { ID_NAME(IID_IShellPropSheetExt), RegisteredNever },
460 { ID_NAME(IID_IShellService), RegisteredNever },
461 { ID_NAME(IID_IShellTaskScheduler), RegisteredNever },
462 { ID_NAME(IID_ISynchronizeContainer), RegisteredNever },
463 { ID_NAME(IID_ISynchronizeEvent), RegisteredNever },
464 { ID_NAME(IID_ISynchronizeHandle), RegisteredNever },
465 { ID_NAME(IID_ITrackShellMenu), RegisteredNever },
466 { ID_NAME(IID_ITransferDestination), RegisteredNever },
467 { ID_NAME(IID_ITransferSource), RegisteredNever },
468 { ID_NAME(IID_ITranslateShellChangeNotify), RegisteredNever },
469 { ID_NAME(IID_ITrayPriv), RegisteredNever },
470 { ID_NAME(IID_ITrayPriv2), RegisteredNever },
471 { ID_NAME(IID_IURLSearchHook), RegisteredNever },
472 { ID_NAME(IID_IURLSearchHook2), RegisteredNever },
473 { ID_NAME(IID_IViewObjectEx), RegisteredNever },
474 { ID_NAME(IID_IWinEventHandler), RegisteredNever },
475 { ID_NAME(IID_DFConstraint), RegisteredNever },
476 { ID_NAME(IID_CDefView), RegisteredNever },
477 { ID_NAME(CLSID_ShellDesktop), RegisteredNever },
478 { ID_NAME(IID_IAliasRegistrationCallback), RegisteredNever },
479 { ID_NAME(IID_IAssociationArrayInitialize), RegisteredNever },
480 { ID_NAME(IID_IAssociationList), RegisteredNever },
481 { ID_NAME(IID_IBasePropPage), RegisteredNever },
482 { ID_NAME(IID_IDrawPropertyControl), RegisteredNever },
483 { ID_NAME(IID_IEnumAssociationElements), RegisteredNever },
484 { ID_NAME(IID_IEnumerateAssociationElements), RegisteredNever },
485 { ID_NAME(IID_IFolderNotify), RegisteredNever },
486 { ID_NAME(IID_IFolderProperties), RegisteredNever },
487 { ID_NAME(IID_IFolderWithSearchRoot), RegisteredNever },
488 { ID_NAME(IID_ILocalizableItemParent), RegisteredNever },
489 { ID_NAME(IID_IPrinterFolder), RegisteredNever },
490 { ID_NAME(IID_IPropertyControl), RegisteredNever },
491 { ID_NAME(IID_IPropertyControlBase), RegisteredNever },
492 { ID_NAME(IID_IPropertyControlSite), RegisteredNever },
493 { ID_NAME(IID_IRegItemCustomAttributes), RegisteredNever },
494 { ID_NAME(IID_IRegItemCustomEnumerator), RegisteredNever },
495 { ID_NAME(IID_IScope), RegisteredNever },
496 { ID_NAME(IID_IScopeItem), RegisteredNever },
497 { ID_NAME(IID_ITaskCondition), RegisteredNever },
498 { ID_NAME(IID_ITaskConditionCombiner), RegisteredNever },
499 { ID_NAME(IID_ITaskConditionInit), RegisteredNever },
500 { ID_NAME(IID_ITransferProvider), RegisteredNever },
501 { ID_NAME(IID_IAssociationArrayOld), RegisteredNever },
502 { ID_NAME(IID_IPinnedListOld), RegisteredNever },
503 { ID_NAME(IID_IPinnedList), RegisteredNever },
504 { ID_NAME(IID_IAttachmentExecute), RegisteredNever },
505 { ID_NAME(IID_IComponentData), RegisteredNever },
506 { ID_NAME(IID_IConsole), RegisteredNever },
507 { ID_NAME(IID_IConsole2), RegisteredNever },
508 { ID_NAME(IID_IConsoleNameSpace), RegisteredNever },
509 { ID_NAME(IID_IConsoleNameSpace2), RegisteredNever },
510 { ID_NAME(IID_IPropertySheetCallback), RegisteredNever },
511 { ID_NAME(IID_IPropertySheetProvider), RegisteredNever },
512 { ID_NAME(IID_IExtendPropertySheet), RegisteredNever },
513 { ID_NAME(IID_IExtendPropertySheet2), RegisteredNever },
514 { ID_NAME(IID_IHeaderCtrl), RegisteredNever },
515 { ID_NAME(IID_IToolbar), RegisteredNever },
516 { ID_NAME(IID_IImageList_mmc), RegisteredNever },
517 { ID_NAME(IID_IConsoleVerb), RegisteredNever },
518 { ID_NAME(IID_ISnapInAbout), RegisteredNever },
519 { ID_NAME(IID_ICertificateManager), RegisteredNever },
524};
526
527#define ValidClassForVersion(pClass, version) \
528 ((pClass)->MinClassNTDDIVersion <= (version) && (pClass)->MaxClassNTDDIVersion >= (version))
529#define ValidInterfaceForVersion(interface, version) \
530 ((interface).MinInterfaceNTDDIVersion <= (version) && (interface).MaxInterfaceNTDDIVersion >= (version))
531
532static
535 _In_ const IID *iid)
536{
537 INT i;
538
539 for (i = 0; i < KnownInterfaceCount; i++)
540 if (IsEqualIID(KnownInterfaces[i].iid, iid))
541 return &KnownInterfaces[i];
543 return NULL;
544}
545
546static
550 _In_ const IID *iid,
551 _In_ ULONG NTDDIVersion)
552{
553 INT i;
554
555 for (i = 0; class->ifaces[i].iid; i++)
556 {
557 if (ValidInterfaceForVersion(class->ifaces[i], NTDDIVersion) &&
558 IsEqualIID(class->ifaces[i].iid, iid))
559 {
560 return TRUE;
561 }
562 }
563 return FALSE;
564}
565
566#define INTF_NOT_EXPOSED LONG_MAX
567static
568LONG
571 _In_ const IID *iid)
572{
573 HRESULT hr;
574 PVOID pObj;
575 PUNKNOWN pUnk2;
576 LONG offset;
577
578 hr = IUnknown_QueryInterface(pUnk, iid, &pObj);
579 ok(hr == S_OK || hr == E_NOINTERFACE, "IUnknown::QueryInterface returned 0x%lx\n", hr);
580 if (FAILED(hr))
581 return INTF_NOT_EXPOSED;
582
583 pUnk2 = pObj;
584 offset = (LONG_PTR)pObj - (LONG_PTR)pUnk;
585 IUnknown_Release(pUnk2);
586 return offset;
587}
588
589static
590VOID
593 _In_ INT ExpectedInterfaceCount,
594 _In_ ULONG NTDDIVersion)
595{
596 HRESULT hr;
597 PVOID pObj;
599 INT iClass, iIntf;
601
602 for (iClass = 0; iClass < ExpectedInterfaceCount; iClass++)
603 {
604 class = &ExpectedInterfaces[iClass];
605 if (!ValidClassForVersion(class, NTDDIVersion))
606 continue;
607 hr = CoCreateInstance(class->clsid,
608 NULL,
609 CLSCTX_INPROC_SERVER,
611 &pObj);
612 ok(hr == S_OK, "CoCreateInstance failed. hr=0x%lx\n", hr);
613 if (FAILED(hr))
614 {
615 skip("Failed to instantiate %s.\n", class->name);
616 continue;
617 }
618
619 pUnk = pObj;
620
621 /* Check that all expected interfaces are present */
622 for (iIntf = 0; class->ifaces[iIntf].iid; iIntf++)
623 {
624 if (!ValidInterfaceForVersion(class->ifaces[iIntf], NTDDIVersion))
625 continue;
626 PCKNOWN_INTERFACE iface = FindInterface(class->ifaces[iIntf].iid);
629 ok(0, "%s is missing %s\n", class->name, iface->name);
630#ifdef LOG_COM_INTERFACE_OFFSETS
631 else
632 mytrace("%s0x%lx, %s, %s\n", offset < 0 ? "-" : "", offset < 0 ? -offset : offset, class->name, iface->name);
633#endif
634 }
635
636 /* Check that none other than the expected interfaces are present */
637 for (iIntf = 0; iIntf < KnownInterfaceCount; iIntf++)
638 {
639 PCKNOWN_INTERFACE iface = &KnownInterfaces[iIntf];
640 LONG offset;
641 if (IsInterfaceExpected(class, iface->iid, NTDDIVersion))
642 continue;
644 ok(offset == INTF_NOT_EXPOSED, "%s exposes %s (offset %s0x%lx), but shouldn't\n", class->name, iface->name, offset < 0 ? "-" : "", offset < 0 ? -offset : offset);
645 }
646
647 // TODO: do some aggregation
648
649 IUnknown_Release(pUnk);
650 }
651}
652
653static
654VOID
658 _In_ INT ExpectedInterfaceCount,
659 _In_ ULONG NTDDIVersion)
660{
661 INT iClass;
663 HKEY hKeyClasses;
664 LONG result;
665
666 result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Classes\\CLSID", 0, KEY_ENUMERATE_SUB_KEYS, &hKeyClasses);
667 ok(result == NO_ERROR, "Failed to open classes key, error %lu\n", result);
668 if (!myskip(result == NO_ERROR, "No classes key\n"))
669 {
670 for (iClass = 0; iClass < ExpectedInterfaceCount; iClass++)
671 {
672 HKEY hKey;
673 HKEY hKeyServer;
676 DWORD type;
677 WCHAR data[100];
679 PCWSTR expectedThreadingModel;
680
681 class = &ExpectedInterfaces[iClass];
682 if (!ValidClassForVersion(class, NTDDIVersion))
683 continue;
685 ok(status == STATUS_SUCCESS, "Failed to convert guid to string for %s, status %lx\n", class->name, status);
686 if (myskip(NT_SUCCESS(status), "No guid string\n"))
687 continue;
688
689 result = RegOpenKeyExW(hKeyClasses, clsid.Buffer, 0, KEY_ENUMERATE_SUB_KEYS, &hKey);
690 ok(result == NO_ERROR, "Failed to open key for %s, error %lu\n", class->name, result);
692 if (myskip(result == NO_ERROR, "No key\n"))
693 continue;
694
695 result = RegOpenKeyExW(hKey, L"InProcServer32", 0, KEY_QUERY_VALUE, &hKeyServer);
696 ok(result == NO_ERROR, "Failed to open key for %s, error %lu\n", class->name, result);
698 if (myskip(result == NO_ERROR, "No key\n"))
699 continue;
700
701 dataSize = sizeof(data);
702 result = RegQueryValueExW(hKeyServer, NULL, NULL, &type, (PBYTE)data, &dataSize);
703 ok(result == NO_ERROR, "Failed to query value for %s, error %lu\n", class->name, result);
704 if (!myskip(result == NO_ERROR, "No module name\n"))
705 {
706 ok(type == REG_SZ || type == REG_EXPAND_SZ, "type %lu for %s\n", type, class->name);
707 ok(dataSize % sizeof(WCHAR) == 0, "size %lu for %s\n", dataSize, class->name);
708 ok(dataSize <= sizeof(data), "size %lu for %s\n", dataSize, class->name);
709 ok(data[dataSize / sizeof(WCHAR) - 1] == UNICODE_NULL, "Not null terminated for %s\n", class->name);
710 // TODO: Use SearchPath (or assume everything's in system32) and do a proper full path compare
713 ok(!_wcsicmp(data, ModuleName), "Server is %ls, expected %ls for %s\n", data, ModuleName, class->name);
714 }
715
716 dataSize = sizeof(data);
717 result = RegQueryValueExW(hKeyServer, L"ThreadingModel", NULL, &type, (PBYTE)data, &dataSize);
718 ok(result == NO_ERROR, "Failed to query value for %s, error %lu\n", class->name, result);
719 if (!myskip(result == NO_ERROR, "No ThreadingModel\n"))
720 {
721 ok(type == REG_SZ || type == REG_EXPAND_SZ, "type %lu for %s\n", type, class->name);
722 ok(dataSize % sizeof(WCHAR) == 0, "size %lu for %s\n", dataSize, class->name);
723 ok(dataSize <= sizeof(data), "size %lu for %s\n", dataSize, class->name);
724 ok(data[dataSize / sizeof(WCHAR) - 1] == UNICODE_NULL, "Not null terminated for %s\n", class->name);
725 expectedThreadingModel = class->ThreadingModel;
726 if (!expectedThreadingModel)
727 expectedThreadingModel = L"Apartment";
728 ok(!_wcsicmp(data, expectedThreadingModel), "Server is %ls, expected %ls for %s\n", data, expectedThreadingModel, class->name);
729 }
730
731 RegCloseKey(hKeyServer);
732 }
733 RegCloseKey(hKeyClasses);
734 }
735}
736
737static
738VOID
742 _In_ INT ExpectedInterfaceCount,
743 _In_ ULONG NTDDIVersion)
744{
745 INT iClass;
748
750 ok(DllGetClassObject != NULL, "DllGetClassObject not found in %ls, error %lu\n", ModuleName, GetLastError());
751 if (myskip(DllGetClassObject != NULL, "No DllGetClassObject\n"))
752 return;
753
754 for (iClass = 0; iClass < ExpectedInterfaceCount; iClass++)
755 {
756 PVOID pv;
757 HRESULT hr;
758 class = &ExpectedInterfaces[iClass];
759 if (!ValidClassForVersion(class, NTDDIVersion))
760 continue;
762 ok(hr == S_OK, "DllGetClassObject failed for %s, hr = 0x%lx\n", class->name, hr);
763 if (!myskip(SUCCEEDED(hr), "No class factory\n"))
764 {
765 IClassFactory *pCF = pv;
766 hr = IClassFactory_CreateInstance(pCF, NULL, &IID_IUnknown, &pv);
767 ok(hr == S_OK, "IClassFactory::CreateInstance failed for %s, hr = 0x%lx\n", class->name, hr);
768 if (!myskip(SUCCEEDED(hr), "No instance\n"))
769 {
770 IUnknown *pUnk = pv;
771 IUnknown_Release(pUnk);
772 }
773 IClassFactory_Release(pCF);
774 }
775 }
776}
777
778VOID
782 _In_ INT ExpectedInterfaceCount,
783 _In_ ULONG MinimumNTDDIVersion,
784 _In_ ULONG MaximumNTDDIVersion,
785 _In_ BOOLEAN IsWinRT)
786{
787 HRESULT hr;
788 ULONG NTDDIVersion;
789
790 NTDDIVersion = GetNTDDIVersion();
791
792 if (NTDDIVersion < MinimumNTDDIVersion || NTDDIVersion > MaximumNTDDIVersion)
793 {
794 skip("Skipping all tests for module %S, NTDDI version (0x%08lx) is outside of the supported range (0x%08lx-0x%08lx).\n",
795 ModuleName, NTDDIVersion, MinimumNTDDIVersion, MaximumNTDDIVersion);
796 return;
797 }
798
800 ok(hr == S_OK, "CoInitializeEx failed. hr=0x%lx\n", hr);
801 if (myskip(SUCCEEDED(hr), "Failed to initialize COM. Cannot perform tests\n"))
802 return;
803
804 TestModuleInterfaces(ExpectedInterfaces, ExpectedInterfaceCount, NTDDIVersion);
805 TestModuleRegistry(ModuleName, ExpectedInterfaces, ExpectedInterfaceCount, NTDDIVersion);
806 if (IsWinRT)
807 skip("%S is a WinRT module, skipping manual instantiation tests.\n", ModuleName);
808 else
809 TestManualInstantiation(ModuleName, ExpectedInterfaces, ExpectedInterfaceCount, NTDDIVersion);
810
812}
813
814VOID
818 _In_ INT ExpectedInterfaceCount)
819{
821}
822
823static
824VOID
826 _In_ PCKNOWN_INTERFACE Interfaces,
827 _In_ INT InterfaceCount)
828{
829 INT i;
830 HKEY hKeyInterface;
831 LONG result;
832 ULONG CurrentNTDDI;
833
834 result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Classes\\Interface", 0, KEY_ENUMERATE_SUB_KEYS, &hKeyInterface);
835 ok(result == NO_ERROR, "Failed to open interface key, error %lu\n", result);
836 if (!myskip(result == NO_ERROR, "No interface key\n"))
837 {
838 CurrentNTDDI = GetNTDDIVersion();
839
840 for (i = 0; i < InterfaceCount; i++)
841 {
842 HKEY hKey;
844 UNICODE_STRING iid;
845 DWORD type;
846 WCHAR data[100];
848 PCKNOWN_INTERFACE iface;
849 PCWSTR expectedName;
850
851 iface = &Interfaces[i];
852 status = RtlStringFromGUID(iface->iid, &iid);
853 ok(status == STATUS_SUCCESS, "Failed to convert guid to string for %s, status %lx\n", iface->name, status);
854 if (myskip(NT_SUCCESS(status), "No guid string\n"))
855 continue;
856
857 result = RegOpenKeyExW(hKeyInterface, iid.Buffer, 0, KEY_QUERY_VALUE, &hKey);
858 if (iface->IsRegistered(CurrentNTDDI))
859 {
860 ok(result == NO_ERROR, "%s should be registered. (Error %lu)\n", iface->name, result);
861 // (void)myskip(result == NO_ERROR, "No key\n");
862 }
863 else
864 {
865 ok(result == ERROR_FILE_NOT_FOUND, "%s should not be registered. (Error %lu)\n", iface->name, result);
866 }
868 if (result != NO_ERROR)
869 continue;
870
871 dataSize = sizeof(data);
873 ok(result == NO_ERROR, "Failed to query value for %s, error %lu\n", iface->name, result);
874 if (!myskip(result == NO_ERROR, "No module name\n"))
875 {
876 ok(type == REG_SZ, "type %lu for %s\n", type, iface->name);
877 ok(dataSize % sizeof(WCHAR) == 0, "size %lu for %s\n", dataSize, iface->name);
878 ok(dataSize <= sizeof(data), "size %lu for %s\n", dataSize, iface->name);
879 ok(data[dataSize / sizeof(WCHAR) - 1] == UNICODE_NULL, "Not null terminated for %s\n", iface->name);
880 expectedName = wcschr(iface->wname, L'_');
881 if (expectedName)
882 expectedName++;
883 else
884 expectedName = iface->wname;
885 ok(!_wcsicmp(data, expectedName), "Name is %ls, expected %ls\n", data, expectedName);
886 }
887
889 }
890 RegCloseKey(hKeyInterface);
891 }
892}
893
894START_TEST(interfaces)
895{
897}
unsigned char BOOLEAN
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 ACPI_STATUS const char UINT32 ACPI_STATUS const char UINT32 const char const char * ModuleName
Definition: acpixf.h:1280
#define NTDDI_MIN
Definition: apitest.h:20
#define NTDDI_MAX
Definition: apitest.h:21
static ULONG GetNTDDIVersion(VOID)
Definition: apitest.h:23
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
const WCHAR * class
Definition: main.c:68
LONG NTSTATUS
Definition: precomp.h:26
const GUID IID_IShellDesktopTray
Definition: traywnd.cpp:176
const GUID IID_IUnknown
const GUID IID_IClassFactory
#define RegCloseKey(hKey)
Definition: registry.h:49
static const CLASS_AND_INTERFACES ExpectedInterfaces[]
Definition: browseui.c:14
static VOID TestModuleRegistry(_In_ PCWSTR ModuleName, _In_ PCCLASS_AND_INTERFACES ExpectedInterfaces, _In_ INT ExpectedInterfaceCount, _In_ ULONG NTDDIVersion)
Definition: com_apitest.c:655
#define INTF_NOT_EXPOSED
Definition: com_apitest.c:566
VOID TestClasses(_In_ PCWSTR ModuleName, _In_ PCCLASS_AND_INTERFACES ExpectedInterfaces, _In_ INT ExpectedInterfaceCount)
Definition: com_apitest.c:815
static LONG GetInterfaceOffset(_In_ PUNKNOWN pUnk, _In_ const IID *iid)
Definition: com_apitest.c:569
BOOLEAN RegisteredOnWin8OrNewer(ULONG version)
Definition: com_apitest.c:49
VOID TestClassesEx(_In_ PCWSTR ModuleName, _In_ PCCLASS_AND_INTERFACES ExpectedInterfaces, _In_ INT ExpectedInterfaceCount, _In_ ULONG MinimumNTDDIVersion, _In_ ULONG MaximumNTDDIVersion, _In_ BOOLEAN IsWinRT)
Definition: com_apitest.c:779
#define myskip(c,...)
Definition: com_apitest.c:20
#define ValidClassForVersion(pClass, version)
Definition: com_apitest.c:527
BOOLEAN RegisteredOnVistaAndWin7(ULONG version)
Definition: com_apitest.c:46
BOOLEAN RegisteredOnVistaToWin8Dot1(ULONG version)
Definition: com_apitest.c:47
static VOID TestInterfaceRegistry(_In_ PCKNOWN_INTERFACE Interfaces, _In_ INT InterfaceCount)
Definition: com_apitest.c:825
BOOLEAN RegisteredOnWS03OrOlder(ULONG version)
Definition: com_apitest.c:50
#define ValidInterfaceForVersion(interface, version)
Definition: com_apitest.c:529
const KNOWN_INTERFACE * PCKNOWN_INTERFACE
Definition: com_apitest.c:35
BOOLEAN RegisteredAlways(ULONG version)
Definition: com_apitest.c:41
BOOLEAN RegisteredOnVistaOnly(ULONG version)
Definition: com_apitest.c:45
static const INT KnownInterfaceCount
Definition: com_apitest.c:525
#define ID_NAME(c)
Definition: com_apitest.c:38
#define ID_NAME_EX(c, d)
Definition: com_apitest.c:39
static PCKNOWN_INTERFACE FindInterface(_In_ const IID *iid)
Definition: com_apitest.c:534
BOOLEAN RegisteredOnVistaOrNewer(ULONG version)
Definition: com_apitest.c:44
static VOID TestModuleInterfaces(_In_ PCCLASS_AND_INTERFACES ExpectedInterfaces, _In_ INT ExpectedInterfaceCount, _In_ ULONG NTDDIVersion)
Definition: com_apitest.c:591
BOOLEAN RegisteredNever(ULONG version)
Definition: com_apitest.c:42
static KNOWN_INTERFACE KnownInterfaces[]
Definition: com_apitest.c:52
BOOLEAN RegisteredOnWS03AndVista(ULONG version)
Definition: com_apitest.c:43
BOOLEAN RegisteredOnWin7OrNewer(ULONG version)
Definition: com_apitest.c:48
#define mytrace(...)
Definition: com_apitest.c:21
struct _KNOWN_INTERFACE KNOWN_INTERFACE
static BOOLEAN IsInterfaceExpected(_In_ PCCLASS_AND_INTERFACES class, _In_ const IID *iid, _In_ ULONG NTDDIVersion)
Definition: com_apitest.c:548
static VOID TestManualInstantiation(_In_ PCWSTR ModuleName, _In_ PCCLASS_AND_INTERFACES ExpectedInterfaces, _In_ INT ExpectedInterfaceCount, _In_ ULONG NTDDIVersion)
Definition: com_apitest.c:739
#define NO_ERROR
Definition: dderror.h:5
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
#define wcschr
Definition: compat.h:17
#define GetProcAddress(x, y)
Definition: compat.h:753
static const WCHAR version[]
Definition: asmname.c:66
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
void WINAPI PathRemoveExtensionW(WCHAR *path)
Definition: path.c:1946
void WINAPI PathStripPathW(WCHAR *path)
Definition: path.c:2328
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI DECLSPEC_HOTPATCH CoInitializeEx(LPVOID lpReserved, DWORD dwCoInit)
Definition: compobj.c:2002
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
static void *static void *static LPDIRECTPLAY IUnknown * pUnk
Definition: dplayx.c:30
#define L(x)
Definition: resources.c:13
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLintptr offset
Definition: glext.h:5920
GLenum GLsizei dataSize
Definition: glext.h:11123
GLuint64EXT * result
Definition: glext.h:11304
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
NTSYSAPI NTSTATUS WINAPI RtlStringFromGUID(REFGUID, PUNICODE_STRING)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define REG_SZ
Definition: layer.c:22
#define ASSERT(a)
Definition: mode.c:44
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
const IID IID_IObjectWithSite
HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, LPVOID *ppvOut)
Definition: msctf.cpp:566
const CLSID * clsid
Definition: msctf.cpp:50
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
EXTERN_C const IID IID_INetCfgComponentPropertyUi
Definition: netcfgn.h:88
EXTERN_C const IID IID_INetCfgComponentControl
Definition: netcfgn.h:57
EXTERN_C const IID IID_INetCfgPnpReconfigCallback
Definition: netcfgn.h:29
EXTERN_C const IID IID_INetCfgComponentBindings
Definition: netcfgx.h:239
EXTERN_C const IID IID_IEnumNetCfgBindingInterface
Definition: netcfgx.h:131
EXTERN_C const IID IID_INetCfgLock
Definition: netcfgx.h:17
EXTERN_C const IID IID_INetCfgComponent
Definition: netcfgx.h:77
EXTERN_C const IID IID_INetCfgBindingPath
Definition: netcfgx.h:165
EXTERN_C const IID IID_IEnumNetCfgBindingPath
Definition: netcfgx.h:192
EXTERN_C const IID IID_IEnumNetCfgComponent
Definition: netcfgx.h:266
EXTERN_C const IID IID_INetCfg
Definition: netcfgx.h:300
EXTERN_C const IID IID_INetCfgBindingInterface
Definition: netcfgx.h:103
EXTERN_C const IID IID_INetConnectionConnectUi
Definition: netcon.h:203
EXTERN_C const IID IID_IEnumNetConnection
Definition: netcon.h:142
EXTERN_C const IID IID_INetConnectionPropertyUi2
Definition: netcon.h:252
EXTERN_C const IID IID_INetConnectionManager
Definition: netcon.h:173
EXTERN_C const IID IID_INetConnectionPropertyUi
Definition: netcon.h:227
#define _In_
Definition: no_sal2.h:158
#define KEY_QUERY_VALUE
Definition: nt_native.h:1019
#define KEY_ENUMERATE_SUB_KEYS
Definition: nt_native.h:1022
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define REG_EXPAND_SZ
Definition: nt_native.h:1497
#define UNICODE_NULL
@ COINIT_APARTMENTTHREADED
Definition: objbase.h:278
const GUID IID_IOleInPlaceActiveObject
const GUID IID_IOleInPlaceSite
const GUID IID_IViewObject
const GUID IID_IOleContainer
const GUID IID_IEnumConnections
const GUID IID_IParseDisplayName
const GUID IID_IConnectionPointContainer
const GUID IID_IConnectionPoint
const GUID IID_IProvideClassInfo
const GUID IID_IOleInPlaceFrame
const GUID IID_IPropertyBag
const GUID IID_IOleWindow
const GUID IID_IViewObject2
const GUID IID_IEnumString
const GUID IID_IOleControlSite
const GUID IID_IRunnableObject
const GUID IID_IProvideClassInfo2
const GUID IID_IOleClientSite
const GUID IID_IDataObject
const GUID IID_IDispatch
const GUID IID_IOleInPlaceObject
const GUID IID_IErrorLog
const GUID IID_IEnumConnectionPoints
const GUID IID_IPersistStorage
const GUID IID_IPersistMemory
const GUID IID_IOleLink
const GUID IID_IOleObject
const GUID IID_IEnumSTATSTG
const GUID IID_IOleInPlaceUIWindow
const GUID IID_IOleControl
const GUID IID_IClassFactory2
const GUID IID_IEnumMoniker
const GUID IID_IPersistStreamInit
const GUID IID_IPersistFile
const GUID IID_IEnumUnknown
const GUID IID_IOleItemContainer
BYTE * PBYTE
Definition: pedump.c:66
#define BOOLEAN
Definition: pedump.c:73
long LONG
Definition: pedump.c:60
const GUID IID_IPersist
Definition: proxy.cpp:14
const GUID IID_IPersistStream
Definition: proxy.cpp:13
const GUID IID_ISpecifyPropertyPages
Definition: proxy.cpp:12
const GUID IID_IPersistPropertyBag
Definition: proxy.cpp:11
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define NTDDI_WIN8
Definition: sdkddkver.h:114
#define NTDDI_VISTA
Definition: sdkddkver.h:103
#define NTDDI_WS03
Definition: sdkddkver.h:92
#define NTDDI_WS03SP4
Definition: sdkddkver.h:96
#define NTDDI_WIN7
Definition: sdkddkver.h:112
#define NTDDI_WIN10
Definition: sdkddkver.h:117
#define STATUS_SUCCESS
Definition: shellext.h:65
HRESULT hr
Definition: shlfolder.c:183
BOOLEAN(* IsRegistered)(ULONG version)
Definition: com_apitest.c:33
const IID * iid
Definition: com_apitest.c:30
Definition: name.c:39
Definition: ps.c:97
#define LONG_PTR
Definition: treelist.c:79
const uint16_t * PCWSTR
Definition: typedefs.h:57
void * PVOID
Definition: typedefs.h:50
int32_t INT
Definition: typedefs.h:58
#define __stdcall
Definition: typedefs.h:25
const char * PCSTR
Definition: typedefs.h:52
uint32_t ULONG
Definition: typedefs.h:59
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define HRESULT
Definition: msvc.h:7
#define E_NOINTERFACE
Definition: winerror.h:3479
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
__wchar_t WCHAR
Definition: xmlstorage.h:180