Highway to (DLL) Hell

It's no secret that I've always been a huge fan of Windows Media Center, probably the best digital/personal video recorder out there and definitely one of the most impressive Microsoft applications developed using the .NET Framework.

As an avid WMC user, I have built 3 HTPC machines and recorded thousands of TV programs (movies, series, documentaries, etc.). As such, when Microsoft announced in May 2015 that Windows Media Center would no longer be developed (almost 6 year after disbanding the development team!) – and thus would not be part of Windows 10 – I refused to migrate to Windows 10, despite Microsoft's offers encouraging users to upgrade their OS for free.

The fact Windows Media Center was not available on Windows 10 – even as a paid feature like it was on Windows 8.x – was a major blocker for many users. To work around this limitation, enthusiasts decided to create an unofficial port of Windows Media Center for Windows 10.

While unofficial, the port worked just fine. But over time, Microsoft started to update some of the system components Windows Media Center relied on, causing annoying bugs. For instance, the introduction of breaking changes in Windows 10 1803 made watching a .wtv file (WMC's TV file format) recorded on Windows 7 completely impossible.

While investigating, I discovered that the issue was caused by a change in MSVidCtl.dll, the system-wide DLL containing the DirectShow components needed by WMC for all its TV-related features. After replacing the faulty DLL by an older version, WMC was able to play old recordings like a charm.

This phenomenom, that occurs every time API or functional changes are introduced in a DLL a program depends on, has a name: DLL Hell.

You shall not replace system DLLs

The thing is, replacing a system-owned DLL is far from ideal: while it solves the initial problem quite easily, it's not future-proof as any major Windows update will end up overwriting the replaced DLL. The same thing will happen if the user (or the system on his behalf) runs the sfc.exe utility, that will detect the modification and revert it. It may also cause issues in other applications depending on new APIs that are only part of the newest version of the replaced DLL.

Since replacing a system DLL was not a good option, I eventually opted for the other approach: forcing Windows Media Center to load its own version of MSVidCtl.dll instead of the global one stored in System32.

Typically, you'd achieve that by simply dropping the DLL in the application's root folder (in our case, C:\Windows\ehome). This usually works because the DLL loader first looks for the DLL in the directory the application was loaded from.

Enter the marvelous world of COM

In this case, this didn't work: Windows Media Center kept loading the MSVidCtl DLL contained in the System32 folder. Why? Because MSVidCtl.dll is actually a very special DLL: it's a Component Object Model DLL. Unlike other DLLs, COM DLLs are almost never loaded via LoadLibrary (at least, not directly): instead, they are assigned a GUID that corresponds to a special entry in the registry that contains the absolute path of the COM DLL. When an application wants to instantiate a COM component, it usually imports Ole32.dll and calls CoCreateInstance with the unique GUID: the COM loader locates the entry in the registry and loads the DLL from the associated path.

Since the path is absolute, trying to add a MSVidCtl.dll in the ehome folder was completely pointless: the loader would never look for it.

DLL redirection and side-by-side assemblies

To mitigate this issue, Microsoft offers 2 mechanisms that allow overriding the default search order used by Windows' DLL loader even when the specified path is absolute:

  • DLL redirection: by creating an empty .local file/folder whose name is the same as the executable (in our case, ehshell.exe.local), one can easily force the OS to load DLLs from the application folder: it's dead simple and works flawlessly, even for COM DLLs. Unfortunately, it has a major caveat: it doesn't work when the application has an application manifest (there's a registry switch to override that but turning it on would impact the entire system, certainly not a good thing to do).

  • Side-by-side assemblies: first introduced in Windows 98 Second Edition, it allows an application to define its dependencies in its application manifest (and explicitly opt for a specific DLL version). DLL dependencies can be either stored in the same directory as the application (in this case, they are known as private assemblies) or in a special shared directory called winsxs. Starting with Windows XP, it also allows defining registration-free COM components: unlike classical COM components, they don't have an entry in the registry and thus are not registered globally. Instead, they are defined in the application manifest: when the COM loader finds an entry in the manifest for the specified GUID, it loads the corresponding DLL and doesn't apply the default registry loading routine.

An application manifest is a special XML file that is either embedded in the executable or provided separately and that defines some core aspects of the application (e.g does it need to be executed with administrator rights?).

In our case, the first option is sadly not applicable: all the Windows Media Center executables come with an embedded manifest used to enable the DPI-aware mode. For instance, here's the manifest embedded in ehshell.exe:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright (c) Microsoft Corporation -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v3" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" manifestVersion="1.0">
<assemblyIdentity name="Microsoft.Windows.MultiMedia.EhShell" processorArchitecture="amd64" version="5.1.0.0" type="win32"/>
<description>Windows Media Center Shell</description>
<application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</application>

<!-- Identify the application security requirements. -->

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

Removing the manifest to make the .local approach work would be very easy, but we'd loose all the benefits of the DPI-aware mode: definitely not an option.

Defining registration-free COM components

While powerful, defining registration-free COM components is far from being trivial and is rather error-prone.

Extracting the TypeLib tables

First, you need to extract the TypeLib table from the COM DLL you want to use. For convenience, it's almost always embedded as a binary resource in the COM DLLs themselves. To extract these resources, you can use the popular Resource Hacker tool. In some cases, a single COM DLL might expose multiple TypeLib tables: you'll have to extract them all and merge them later. MSVidCtl.dll is one of them:

Generating assembly manifests

Then, you need to use the Manifest Tool coming with Visual Studio to generate the manifest files from the COM definitions.

For that, open a VS command prompt and run the following commands:

1
2
mt -tlb:TYPELIB1.bin -dll:MSVidCtl.dll -out:Manifest1.manifest
mt -tlb:TYPELIB2.bin -dll:MSVidCtl.dll -out:Manifest2.manifest

Merging assembly manifests

In a perfect world, you'd also use mt.exe to merge the 2 manifests into a single one:

1
mt -manifest:Manifest1.manifest -manifest:Manifest2.manifest -out:Microsoft.Windows.Video.Control.manifest

Unfortunately, the two manifests actually contain multiple elements with the same TypeLib identifier, making them impossible to merge automatically:

Manifest2.manifest : manifest authoring error c1010001: Values of attribute "tlbid" not equal in different manifest snippets.

To work around this limitation, I manually merged the two XML files using Notepad++ and wrote a tiny C# script to remove the duplicate entries:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var path = @"[path pointing to the merged XML manifest file]";
var document = XDocument.Load(path);

foreach (var stub in document.Root.Elements(XName.Get("comInterfaceExternalProxyStub", "urn:schemas-microsoft-com:asm.v1")).ToList())
{
var name = stub.Attribute("name");
if (string.IsNullOrEmpty(name?.Value))
{
throw new InvalidOperationException();
}

var duplicates = document.Root.Elements(XName.Get("comInterfaceExternalProxyStub", "urn:schemas-microsoft-com:asm.v1"))
.Where(element => element.Attributes()
.Any(attribute => attribute.Name == "name" && attribute.Value == name.Value))
.ToArray();

if (duplicates.Length > 1)
{
duplicates[0].SetAttributeValue("tlbid", null);

for (var index = 1; index < duplicates.Length; index++)
{
duplicates[index].Remove();
}
}
}

document.Save(path);

Fixing the resulting manifest

This is not done yet: if you try to use the resulting manifest as-is, Windows Media Center will simply crash as the mt utility misses an important part of the COM definitions: the threading model of the COM classes.

The good news is that this information can be retrived from the registry of a Windows 7 machine (or on Windows 10 pre-1803). To make that process much easier, I wrote a second tiny script updating the manifest from the data found in the registry:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var path = @"[path pointing to the merged XML manifest file]";
var document = XDocument.Load(path);

foreach (var file in document.Root.Elements(XName.Get("file", "urn:schemas-microsoft-com:asm.v1")))
{
foreach (var component in file.Elements(XName.Get("comClass", "urn:schemas-microsoft-com:asm.v1")))
{
var id = component.Attribute("clsid");

using (var root = Registry.ClassesRoot.OpenSubKey("CLSID"))
using (var clsid = root.OpenSubKey(id.Value))
using (var ipc = clsid?.OpenSubKey("InprocServer32"))
{
var model = ipc?.GetValue("ThreadingModel").ToString();
if (string.IsNullOrEmpty(model))
{
continue;
}

component.SetAttributeValue("threadingModel", model);
}
}
}

document.Save(path);

After cleaning the XML manifest a bit, here's what I ended up with:

Microsoft.Windows.Video.Control.manifest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="Microsoft.Windows.Video.Control" version="1.0.0.0" />

<file name="MSVidCtl.dll">
<comClass clsid="{1C15D484-911D-11D2-B632-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Analog TV Tuner Device Class" threadingModel="Apartment" />
<comClass clsid="{A2E3074E-6C3D-11D3-B653-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control BDA Tuner Device Class" threadingModel="Apartment" />
<comClass clsid="{37B0353C-A4C8-11D2-B634-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control File Playback Device Class" threadingModel="Apartment" />
<comClass clsid="{011B3619-FE63-4814-8A84-15A194CE9CE3}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MSVidWebDVD Class" threadingModel="Apartment" />
<comClass clsid="{FA7C375B-66A7-4280-879D-FD459C84BB02}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MSVidWebDVDAdm Class" threadingModel="Apartment" />
<comClass clsid="{37B03543-A4C8-11D2-B634-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Video Renderer(DX7/8) Class" threadingModel="Apartment" />
<comClass clsid="{24DC3975-09BF-4231-8655-3EE71F43837D}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Video Renderer 9(DX9) Class" threadingModel="Apartment" />
<comClass clsid="{C45268A2-FA81-4E19-B1E3-72EDBD60AEDA}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Enhanced Video Renderer(DX10) Class" threadingModel="Apartment" />
<comClass clsid="{37B03544-A4C8-11D2-B634-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Audio Renderer Class" threadingModel="Apartment" />
<comClass clsid="{4A5869CF-929D-4040-AE03-FCAFC5B9CD42}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Stream Buffer Engine Sink Class" threadingModel="Apartment" />
<comClass clsid="{9E77AAC4-35E5-42A1-BDC2-8F3FF399847C}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Stream Buffer Engine Sink Class" threadingModel="Apartment" />
<comClass clsid="{AD8E510D-217F-409B-8076-29C5E73B98E8}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Stream Buffer Engine Playback Device Class" threadingModel="Apartment" />
<comClass clsid="{FD351EA1-4173-4AF4-821D-80D4AE979048}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Stream Buffer Engine V2 Playback Device Class" threadingModel="Apartment" />
<comClass clsid="{BB530C63-D9DF-4B49-9439-63453962E598}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Encoder" threadingModel="Apartment" />
<comClass clsid="{5740A302-EF0B-45CE-BF3B-4470A14A8980}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control iTV Capture" threadingModel="Apartment" />
<comClass clsid="{9E797ED0-5253-4243-A9B7-BD06C58F8EF3}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control iTV Playback" threadingModel="Apartment" />
<comClass clsid="{86151827-E47B-45EE-8421-D10E6E690979}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Closed Captions Analysis" threadingModel="Apartment" />
<comClass clsid="{7F9CB14D-48E4-43B6-9346-1AEBC39C64D3}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Standard Closed Captioning" threadingModel="Apartment" />
<comClass clsid="{92ED88BF-879E-448F-B6B6-A385BCEB846D}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control CCSI Closed Captioning" threadingModel="Apartment" />
<comClass clsid="{334125C0-77E5-11D3-B653-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Standard Data Services for Broadcast IP through NDIS stack" threadingModel="Apartment" />
<comClass clsid="{0149EEDF-D08F-4142-8D73-D23903D21E90}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Encoder" threadingModel="Apartment" />
<comClass clsid="{C5702CD6-9B79-11D3-B654-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for Analog Capture to Data Services" threadingModel="Apartment" />
<comClass clsid="{38F03426-E83B-4E68-B65B-DCAE73304838}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for Data Services to Stream Buffer Sink" threadingModel="Apartment" />
<comClass clsid="{0429EC6E-1144-4BED-B88B-2FB9899A4A3D}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for DataServices To XDS" threadingModel="Apartment" />
<comClass clsid="{3540D440-5B1D-49CB-821A-E84B8CF065A7}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for TV Tuner to XDS" threadingModel="Apartment" />
<comClass clsid="{B0EDF163-910A-11D2-B632-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Class" threadingModel="Apartment" />
<comClass clsid="{C5702CCC-9B79-11D3-B654-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Input Device Collection Class" threadingModel="Apartment" />
<comClass clsid="{C5702CCD-9B79-11D3-B654-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Output Device Collection Class" threadingModel="Apartment" />
<comClass clsid="{C5702CCE-9B79-11D3-B654-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Video Renderer Device Collection Class" threadingModel="Apartment" />
<comClass clsid="{C5702CCF-9B79-11D3-B654-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Audio Renderer Device Collection Class" threadingModel="Apartment" />
<comClass clsid="{C5702CD0-9B79-11D3-B654-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Feature Collection Class" threadingModel="Apartment" />
<comClass clsid="{2764BCE5-CC39-11D2-B639-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Generic Composition Class" threadingModel="Apartment" />
<comClass clsid="{E18AF75A-08AF-11D3-B64A-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for Analog Capture to Overlay Mixer" threadingModel="Apartment" />
<comClass clsid="{267DB0B3-55E3-4902-949B-DF8F5CEC0191}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for WebDVD to Overlay Mixer" threadingModel="Apartment" />
<comClass clsid="{8D04238E-9FD1-41C6-8DE3-9E1EE309E935}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for WebDVD to Audio Renderer" threadingModel="Apartment" />
<comClass clsid="{6AD28EE1-5002-4E71-AAF7-BD077907B1A4}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for Mpeg2 Decoder to Closed Captioning" threadingModel="Apartment" />
<comClass clsid="{9F50E8B1-9530-4DDC-825E-1AF81D47AED6}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for Analog Capture to Stream Buffer Sink" threadingModel="Apartment" />
<comClass clsid="{ABE40035-27C3-4A2F-8153-6624471608AF}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for Digital Capture to Stream Buffer Sink" threadingModel="Apartment" />
<comClass clsid="{92B94828-1AF7-4E6E-9EBF-770657F77AF5}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for iTV to Stream Buffer Sink" threadingModel="Apartment" />
<comClass clsid="{3EF76D68-8661-4843-8B8F-C37163D8C9CE}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for CCA to Stream Buffer Sink" threadingModel="Apartment" />
<comClass clsid="{A0B9B497-AFBC-45AD-A8A6-9B077C40D4F2}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for Encoder to Stream Buffer Sink" threadingModel="Apartment" />
<comClass clsid="{B401C5EB-8457-427F-84EA-A4D2363364B0}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for File Playback to Video Renderer" threadingModel="Apartment" />
<comClass clsid="{CC23F537-18D4-4ECE-93BD-207A84726979}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for File Playback to Audio Renderer" threadingModel="Apartment" />
<comClass clsid="{28953661-0231-41DB-8986-21FF4388EE9B}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for TV Tuner to Encoder" threadingModel="Apartment" />
<comClass clsid="{3C4708DC-B181-46A8-8DA8-4AB0371758CD}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for SBE Source to Video renderer" threadingModel="Apartment" />
<comClass clsid="{942B7909-A28E-49A1-A207-34EBCBCB4B3B}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for TV Tuner to CCA" threadingModel="Apartment" />
<comClass clsid="{73D14237-B9DB-4EFA-A6DD-84350421FB2F}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for Digital Capture to CCA" threadingModel="Apartment" />
<comClass clsid="{5D8E73F7-4989-4AC8-8A98-39BA0D325302}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for Digital Capture to ITV" threadingModel="Apartment" />
<comClass clsid="{2291478C-5EE3-4BEF-AB5D-B5FF2CF58352}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for Stream Buffer Source to ITV" threadingModel="Apartment" />
<comClass clsid="{9193A8F9-0CBA-400E-AA97-EB4709164576}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for Stream Buffer Source to CC" threadingModel="Apartment" />
<comClass clsid="{991DA7E5-953F-435B-BE5E-B92A05EDFC42}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Stream Buffer Source to Generic Sink Composition Class" threadingModel="Apartment" />
<comClass clsid="{C4BF2784-AE00-41BA-9828-9C953BD3C54A}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for CC to Video Renderer" threadingModel="Apartment" />
<comClass clsid="{D76334CA-D89E-4BAF-86AB-DDB59372AFC2}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MS Video Control Custom Composition for CC to Audio Renderer" threadingModel="Apartment" />
<comClass clsid="{577FAA18-4518-445E-8F70-1473F8CF4BA4}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MSEventBinder Class" threadingModel="Apartment" />
<comClass clsid="{CAAFDD83-CEFC-4E3D-BA03-175F17A24F91}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="MSVidStreamBufferRecordingControl" threadingModel="Apartment" />
<comClass clsid="{CB4276E6-7D5F-4CF1-9727-629C5E6DB6AE}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="Automation compliant scalable rectangle Class" />
<comClass clsid="{6E40476F-9C49-4C3E-8BB9-8587958EFF74}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="dummy class to expose base interface to VB" />
<comClass clsid="{30997F7D-B3B5-4A1C-983A-1FE8098CB77D}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="dummy class to expose base interface to VB" />
<comClass clsid="{AC1972F2-138A-4CA3-90DA-AE51112EDA28}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="dummy class to expose base interface to VB" />
<comClass clsid="{95F4820B-BB3A-4E2D-BC64-5B817BC2C30E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="dummy class to expose base interface to VB" />
<comClass clsid="{1990D634-1A5E-4071-A34A-53AAFFCE9F36}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="dummy class to expose base interface to VB" />
<comClass clsid="{7748530B-C08A-47EA-B24C-BE8695FF405F}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="dummy class to expose base interface to VB" />
<comClass clsid="{87EB890D-03AD-4E9D-9866-376E5EC572ED}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" description="dummy class to expose base interface to VB" />
<comClass clsid="{D02AAC50-027E-11D3-9D8E-00C04F72D980}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="SystemTuningSpace Class" threadingModel="Both" />
<comClass clsid="{5FFDC5E6-B83A-4B55-B6E8-C69E765FE9DB}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="dummy class to expose base tuning space i/f to VB" />
<comClass clsid="{CC829A2F-3365-463F-AF13-81DBB6F3A555}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Channel ID Tuning Space Class" threadingModel="Both" />
<comClass clsid="{A2E30750-6C3D-11D3-B653-00C04F79498E}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="ATSC Digital Broadcast Tuning Space Class" threadingModel="Both" />
<comClass clsid="{D9BB4CEE-B87A-47F1-AC92-B08D9C7813FC}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Digital Cable Tuning Space Class" threadingModel="Both" />
<comClass clsid="{8A674B4C-1F63-11D3-B64C-00C04F79498E}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Analog Radio Tuning Space Class" threadingModel="Both" />
<comClass clsid="{F9769A06-7ACA-4E39-9CFB-97BB35F0E77E}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Auxiliary Inputs Tuning Space Class" threadingModel="Both" />
<comClass clsid="{8A674B4D-1F63-11D3-B64C-00C04F79498E}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Analog TV Tuning Space Class" threadingModel="Both" />
<comClass clsid="{C6B14B32-76AA-4A86-A7AC-5C79AAF58DA7}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="DVB Tuning Space Class" threadingModel="Both" />
<comClass clsid="{B64016F3-C9A2-4066-96F0-BD9563314726}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="DVB Satellite Tuning Space Class" threadingModel="Both" />
<comClass clsid="{A1A2B1C4-0E3A-11D3-9D8E-00C04F72D980}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Component Types Collection Class" threadingModel="Both" />
<comClass clsid="{823535A0-0318-11D3-9D8E-00C04F72D980}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="ComponentType Class" threadingModel="Both" />
<comClass clsid="{1BE49F30-0E1B-11D3-9D8E-00C04F72D980}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="LanguageComponentType Class" threadingModel="Both" />
<comClass clsid="{418008F3-CF67-4668-9628-10DC52BE1D08}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="MPEG2ComponentType Class" threadingModel="Both" />
<comClass clsid="{A8DCF3D5-0780-4EF4-8A83-2CFFAACB8ACE}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="ATSCComponentType Class" threadingModel="Both" />
<comClass clsid="{809B6661-94C4-49E6-B6EC-3F0F862215AA}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Components Collection Class" threadingModel="Both" />
<comClass clsid="{59DC47A8-116C-11D3-9D8E-00C04F72D980}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Component Class" threadingModel="Both" />
<comClass clsid="{055CB2D7-2969-45CD-914B-76890722F112}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="MPEG2 Component Class" threadingModel="Both" />
<comClass clsid="{28AB0005-E845-4FFA-AA9B-F4665236141C}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Analog Audio Component Class" threadingModel="Both" />
<comClass clsid="{B46E0D38-AB35-4A06-A137-70576B01B39F}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="dummy class to expose base tune request i/f to VB" />
<comClass clsid="{3A9428A7-31A4-45E9-9EFB-E055BF7BB3DB}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Channel Tune Request" threadingModel="Both" />
<comClass clsid="{0369B4E5-45B6-11D3-B650-00C04F79498E}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Channel Tune Request" threadingModel="Both" />
<comClass clsid="{0369B4E6-45B6-11D3-B650-00C04F79498E}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="ATSC Channel Tune Request" threadingModel="Both" />
<comClass clsid="{26EC0B63-AA90-458A-8DF4-5659F2C8A18A}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Digital Cable Channel Tune Request" threadingModel="Both" />
<comClass clsid="{0955AC62-BF2E-4CBA-A2B9-A63F772D46CF}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="dummy class to expose mpeg2 request i/f to VB" threadingModel="Both" />
<comClass clsid="{2C63E4EB-4CEA-41B8-919C-E947EA19A77C}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Factory for creating IMPEG2TuneRequest" threadingModel="Apartment" />
<comClass clsid="{0888C883-AC4F-4943-B516-2C38D9B34562}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="dummy class to expose base locator i/f to VB" />
<comClass clsid="{6E50CC0D-C19B-4BF6-810B-5BD60761F5CC}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="dummy class to expose base digital locator i/f to VB" />
<comClass clsid="{49638B91-48AB-48B7-A47A-7D0E75A08EDE}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Analog Locator" threadingModel="Both" />
<comClass clsid="{8872FF1B-98FA-4D7A-8D93-C9F1055F85BB}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="ATSC Locator" threadingModel="Both" />
<comClass clsid="{03C06416-D127-407A-AB4C-FDD279ABBE5D}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Digital Cable Locator" threadingModel="Both" />
<comClass clsid="{9CD64701-BDF3-4D14-8E03-F12983D86664}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="DVB-Terrestrial Locator" threadingModel="Both" />
<comClass clsid="{EFE3FA02-45D7-4920-BE96-53FA7F35B0E6}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="DVB-Terrestrial 2 Locator" threadingModel="Both" />
<comClass clsid="{1DF7D126-4050-47F0-A7CF-4C4CA9241333}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="DVB-Satellite Locator" threadingModel="Both" />
<comClass clsid="{C531D9FD-9685-4028-8B68-6E1232079F1E}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="DVB-Cable Locator" threadingModel="Both" />
<comClass clsid="{6504AFED-A629-455C-A7F1-04964DEA5CC4}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="ISDB-Satellite Locator" threadingModel="Both" />
<comClass clsid="{15D6504A-5494-499C-886C-973C9E53B9F1}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="DVB Tune Request" threadingModel="Both" />
<comClass clsid="{8A674B49-1F63-11D3-B64C-00C04F79498E}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Create property bag backed by registry" threadingModel="Both" />
<comClass clsid="{0B3FFB92-0919-4934-9D5B-619C719D0202}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="DShow Broadcast Event Service Object" threadingModel="Both" />
<comClass clsid="{6438570B-0C08-4A25-9504-8012BB4D50CF}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="BDA ITuner Marshaling utility object" threadingModel="Both" />
<comClass clsid="{E77026B0-B97F-4CBB-B7FB-F4F03AD69F11}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Utility object for Tuning Model Object Xml deserialization or serialization" threadingModel="Both" />
<comClass clsid="{C20447FC-EC60-475E-813F-D2B0A6DECEFE}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Extensible Eventing Service object" threadingModel="Both" />
<comClass clsid="{8E8A07DA-71F8-40C1-A929-5E3A868AC2C6}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" description="Eventing Service object(used for unmarshal)" />

<typelib tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" version="1.0" helpdir="" flags="HASDISKIMAGE" />
<typelib tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" version="1.0" helpdir="" flags="HASDISKIMAGE" />
</file>

<comInterfaceExternalProxyStub name="_IMSVidCtlEvents" iid="{B0EDF164-910A-11D2-B632-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidAnalogTuner2" iid="{37647BF7-3DDE-4CC8-A4DC-0D534D3D0037}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidAnalogTuner" iid="{1C15D47E-911D-11D2-B632-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidTuner" iid="{1C15D47D-911D-11D2-B632-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidVideoInputDevice" iid="{1C15D47F-911D-11D2-B632-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidInputDevice" iid="{37B0353D-A4C8-11D2-B634-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidDevice" iid="{1C15D47C-911D-11D2-B632-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="ITuneRequest" iid="{07DDC146-FC3D-11D2-9D8C-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="ITuningSpace" iid="{061C6E30-E622-11D2-9493-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IEnumGUID" iid="{0002E000-0000-0000-C000-000000000046}" proxyStubClsid32="{0002E000-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IEnumMoniker" iid="{00000102-0000-0000-C000-000000000046}" proxyStubClsid32="{00000102-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMoniker" iid="{0000000F-0000-0000-C000-000000000046}" proxyStubClsid32="{0000000F-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IPersistStream" iid="{00000109-0000-0000-C000-000000000046}" proxyStubClsid32="{00000109-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IPersist" iid="{0000010C-0000-0000-C000-000000000046}" proxyStubClsid32="{0000010C-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IStream" iid="{0000000C-0000-0000-C000-000000000046}" proxyStubClsid32="{0000000C-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="ISequentialStream" iid="{0C733A30-2A1C-11CE-ADE5-00AA0044773D}" proxyStubClsid32="{0C733A30-2A1C-11CE-ADE5-00AA0044773D}" />
<comInterfaceExternalProxyStub name="IBindCtx" iid="{0000000E-0000-0000-C000-000000000046}" proxyStubClsid32="{0000000E-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IRunningObjectTable" iid="{00000010-0000-0000-C000-000000000046}" proxyStubClsid32="{00000010-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IEnumString" iid="{00000101-0000-0000-C000-000000000046}" proxyStubClsid32="{00000101-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IComponentTypes" iid="{0DC13D4A-0313-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IEnumComponentTypes" iid="{8A674B4A-1F63-11D3-B64C-00C04F79498E}" proxyStubClsid32="{8A674B4A-1F63-11D3-B64C-00C04F79498E}" />
<comInterfaceExternalProxyStub name="IComponentType" iid="{6A340DC0-0311-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="ILocator" iid="{286D7F89-760C-4F89-80C4-66841D2507AA}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IComponents" iid="{39A48091-FFFE-4182-A161-3FF802640E26}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IEnumComponents" iid="{2A6E2939-2595-11D3-B64C-00C04F79498E}" proxyStubClsid32="{2A6E2939-2595-11D3-B64C-00C04F79498E}" />
<comInterfaceExternalProxyStub name="IComponent" iid="{1A5576FC-0E19-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidAnalogTunerEvent" iid="{1C15D486-911D-11D2-B632-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidTunerEvent" iid="{1C15D485-911D-11D2-B632-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidInputDeviceEvent" iid="{37B0353E-A4C8-11D2-B634-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidGraphSegment" iid="{238DEC54-ADEB-4005-A349-F772B9AFEBC4}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{238DEC54-ADEB-4005-A349-F772B9AFEBC4}" />
<comInterfaceExternalProxyStub name="IEnumFilters" iid="{56A86893-0AD4-11CE-B03A-0020AF0BA770}" proxyStubClsid32="{56A86893-0AD4-11CE-B03A-0020AF0BA770}" />
<comInterfaceExternalProxyStub name="IBaseFilter" iid="{56A86895-0AD4-11CE-B03A-0020AF0BA770}" proxyStubClsid32="{56A86895-0AD4-11CE-B03A-0020AF0BA770}" />
<comInterfaceExternalProxyStub name="IMediaFilter" iid="{56A86899-0AD4-11CE-B03A-0020AF0BA770}" proxyStubClsid32="{56A86899-0AD4-11CE-B03A-0020AF0BA770}" />
<comInterfaceExternalProxyStub name="IReferenceClock" iid="{56A86897-0AD4-11CE-B03A-0020AF0BA770}" proxyStubClsid32="{56A86897-0AD4-11CE-B03A-0020AF0BA770}" />
<comInterfaceExternalProxyStub name="IEnumPins" iid="{56A86892-0AD4-11CE-B03A-0020AF0BA770}" proxyStubClsid32="{56A86892-0AD4-11CE-B03A-0020AF0BA770}" />
<comInterfaceExternalProxyStub name="IPin" iid="{56A86891-0AD4-11CE-B03A-0020AF0BA770}" proxyStubClsid32="{56A86891-0AD4-11CE-B03A-0020AF0BA770}" />
<comInterfaceExternalProxyStub name="IEnumMediaTypes" iid="{89C31040-846B-11CE-97D3-00AA0055595A}" proxyStubClsid32="{89C31040-846B-11CE-97D3-00AA0055595A}" />
<comInterfaceExternalProxyStub name="IFilterGraph" iid="{56A8689F-0AD4-11CE-B03A-0020AF0BA770}" proxyStubClsid32="{56A8689F-0AD4-11CE-B03A-0020AF0BA770}" />
<comInterfaceExternalProxyStub name="IMSVidGraphSegmentContainer" iid="{3DD2903D-E0AA-11D2-B63A-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{3DD2903D-E0AA-11D2-B63A-00C04F79498E}" />
<comInterfaceExternalProxyStub name="IGraphBuilder" iid="{56A868A9-0AD4-11CE-B03A-0020AF0BA770}" proxyStubClsid32="{56A868A9-0AD4-11CE-B03A-0020AF0BA770}" />
<comInterfaceExternalProxyStub name="IEnumMSVidGraphSegment" iid="{3DD2903E-E0AA-11D2-B63A-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{3DD2903E-E0AA-11D2-B63A-00C04F79498E}" />
<comInterfaceExternalProxyStub name="IMSVidFilePlayback2" iid="{2F7E44AF-6E52-4660-BC08-D8D542587D72}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidFilePlayback" iid="{37B03539-A4C8-11D2-B634-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidPlayback" iid="{37B03538-A4C8-11D2-B634-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidFilePlaybackEvent" iid="{37B0353A-A4C8-11D2-B634-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidPlaybackEvent" iid="{37B0353B-A4C8-11D2-B634-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidWebDVD" iid="{CF45F88B-AC56-4EE2-A73A-ED04E2885D3C}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidRect" iid="{7F5000A6-A440-47CA-8ACC-C0E75531A2C2}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{7F5000A6-A440-47CA-8ACC-C0E75531A2C2}" />
<comInterfaceExternalProxyStub name="IMSVidWebDVDEvent" iid="{B4F7A674-9B83-49CB-A357-C63B871BE958}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidWebDVDAdm" iid="{B8BE681A-EB2C-47F0-B415-94D5452F0E05}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidVideoRenderer2" iid="{6BDD5C1E-2810-4159-94BC-05511AE8549B}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidVideoRenderer" iid="{37B03540-A4C8-11D2-B634-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidOutputDevice" iid="{37B03546-A4C8-11D2-B634-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IVMRImageCompositor" iid="{7A4FB5AF-479F-4074-BB40-CE6722E43C82}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{7A4FB5AF-479F-4074-BB40-CE6722E43C82}" />
<comInterfaceExternalProxyStub name="IVMRMixerBitmap" iid="{1E673275-0257-40AA-AF20-7C608D4A0428}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{1E673275-0257-40AA-AF20-7C608D4A0428}" />
<comInterfaceExternalProxyStub name="IVMRSurfaceAllocator" iid="{31CE832E-4484-458B-8CCA-F4D7E3DB0B52}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{31CE832E-4484-458B-8CCA-F4D7E3DB0B52}" />
<comInterfaceExternalProxyStub name="IVMRSurfaceAllocatorNotify" iid="{AADA05A8-5A4E-4729-AF0B-CEA27AED51E2}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{AADA05A8-5A4E-4729-AF0B-CEA27AED51E2}" />
<comInterfaceExternalProxyStub name="IMSVidVideoRendererEvent" iid="{37B03545-A4C8-11D2-B634-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidOutputDeviceEvent" iid="{2E6A14E2-571C-11D3-B652-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidDeviceEvent" iid="{1C15D480-911D-11D2-B632-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidVMR9" iid="{D58B0015-EBEF-44BB-BBDD-3F3699D76EA1}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidEVR" iid="{15E496AE-82A8-4CF9-A6B6-C561DC60398F}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMFVideoPresenter" iid="{29AFF080-182A-4A5D-AF3B-448F3A6346CB}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{29AFF080-182A-4A5D-AF3B-448F3A6346CB}" />
<comInterfaceExternalProxyStub name="IMFClockStateSink" iid="{F6696E82-74F7-4F3D-A178-8A5E09C3659F}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{F6696E82-74F7-4F3D-A178-8A5E09C3659F}" />
<comInterfaceExternalProxyStub name="IMFVideoMediaType" iid="{B99F381F-A8F9-47A2-A5AF-CA3A225A3890}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{B99F381F-A8F9-47A2-A5AF-CA3A225A3890}" />
<comInterfaceExternalProxyStub name="IMFMediaType" iid="{44AE0FA8-EA31-4109-8D2E-4CAE4997C555}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{44AE0FA8-EA31-4109-8D2E-4CAE4997C555}" />
<comInterfaceExternalProxyStub name="IMFAttributes" iid="{2CD2D921-C447-44A7-A13C-4ADABFC247E3}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{2CD2D921-C447-44A7-A13C-4ADABFC247E3}" />
<comInterfaceExternalProxyStub name="IStorage" iid="{0000000B-0000-0000-C000-000000000046}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{0000000B-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IEnumSTATSTG" iid="{0000000D-0000-0000-C000-000000000046}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{0000000D-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IRecordInfo" iid="{0000002F-0000-0000-C000-000000000046}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{0000002F-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="ITypeInfo" iid="{00020401-0000-0000-C000-000000000046}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020401-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="ITypeComp" iid="{00020403-0000-0000-C000-000000000046}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020403-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="ITypeLib" iid="{00020402-0000-0000-C000-000000000046}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020402-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidEVREvent" iid="{349ABB10-883C-4F22-8714-CECAEEE45D62}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidAudioRenderer" iid="{37B0353F-A4C8-11D2-B634-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidAudioRendererEvent" iid="{37B03541-A4C8-11D2-B634-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidGenericSink2" iid="{6B5A28F3-47F1-4092-B168-60CABEC08F1C}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidGenericSink" iid="{6C29B41D-455B-4C33-963A-0D28E5E555EA}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidStreamBufferSink3" iid="{4F8721D7-7D59-4D8B-99F5-A77775586BD5}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidStreamBufferSink2" iid="{2CA9FC63-C131-4E5A-955A-544A47C67146}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidStreamBufferSink" iid="{159DBB45-CD1B-4DAB-83EA-5CB1F4F21D07}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidStreamBufferRecordingControl" iid="{160621AA-BBBC-4326-A824-C395AEBC6E74}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidStreamBufferSinkEvent4" iid="{1B01DCB0-DAF0-412C-A5D1-590C7F62E2B8}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidStreamBufferSinkEvent3" iid="{735AD8D5-C259-48E9-81E7-D27953665B23}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidStreamBufferSinkEvent2" iid="{3D7A5166-72D7-484B-A06F-286187B80CA1}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidStreamBufferSinkEvent" iid="{F798A36B-B05B-4BBE-9703-EAEA7D61CD51}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidStreamBufferSource" iid="{EB0C8CF9-6950-4772-87B1-47D11CF3A02F}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidStreamBufferSource2" iid="{E4BA9059-B1CE-40D8-B9A0-D4EA4A9989D3}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidStreamBufferSourceEvent" iid="{50CE8A7D-9C28-4DA8-9042-CDFA7116F979}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidStreamBufferSourceEvent2" iid="{7AEF50CE-8E22-4BA8-BC06-A92A458B4EF2}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidStreamBufferSourceEvent3" iid="{CEABD6AB-9B90-4570-ADF1-3CE76E00A763}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidStreamBufferV2SourceEvent" iid="{49C771F9-41B2-4CF7-9F9A-A313A8F6027E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidEncoder" iid="{C0020FD4-BEE7-43D9-A495-9F213117103D}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidFeature" iid="{37B03547-A4C8-11D2-B634-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidClosedCaptioning3" iid="{C8638E8A-7625-4C51-9366-2F40A9831FC0}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidClosedCaptioning2" iid="{E00CB864-A029-4310-9987-A873F5887D97}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidClosedCaptioning" iid="{99652EA1-C1F7-414F-BB7B-1C967DE75983}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidDataServices" iid="{334125C1-77E5-11D3-B653-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidXDS" iid="{11EBC158-E712-4D1F-8BB3-01ED5274C4CE}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidXDSEvent" iid="{6DB2317D-3B23-41EC-BA4B-701F407EAF3A}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidFeatureEvent" iid="{3DD2903C-E0AA-11D2-B63A-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidCompositionSegment" iid="{1C15D483-911D-11D2-B632-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{1C15D483-911D-11D2-B632-00C04F79498E}" />
<comInterfaceExternalProxyStub name="IObjectWithSite" iid="{FC4801A3-2BA9-11CF-A229-00AA003D7352}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{FC4801A3-2BA9-11CF-A229-00AA003D7352}" />
<comInterfaceExternalProxyStub name="IMSVidCtl" iid="{B0EDF162-910A-11D2-B632-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidInputDevices" iid="{C5702CD1-9B79-11D3-B654-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidOutputDevices" iid="{C5702CD2-9B79-11D3-B654-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidVideoRendererDevices" iid="{C5702CD3-9B79-11D3-B654-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidAudioRendererDevices" iid="{C5702CD4-9B79-11D3-B654-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidFeatures" iid="{C5702CD5-9B79-11D3-B654-00C04F79498E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSEventBinder" iid="{C3A9F406-2222-436D-86D5-BA3229279EFB}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMSVidDevice2" iid="{87BD2783-EBC0-478C-B4A0-E8E7F43AB78E}" tlbid="{B0EDF154-910A-11D2-B632-00C04F79498E}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="ITuningSpaceContainer" iid="{5B692E84-E2F1-11D2-9493-00C04F72D980}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="ITuningSpaces" iid="{901284E4-33FE-4B69-8D63-634A596F3756}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IEnumTuningSpaces" iid="{8B8EB248-FC2B-11D2-9D8C-00C04F72D980}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{8B8EB248-FC2B-11D2-9D8C-00C04F72D980}" />
<comInterfaceExternalProxyStub name="IBDAComparable" iid="{B34505E0-2F0E-497B-80BC-D43F3B24ED7F}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{B34505E0-2F0E-497B-80BC-D43F3B24ED7F}" />
<comInterfaceExternalProxyStub name="IBDACreateTuneRequestEx" iid="{C0A4A1D4-2B3C-491A-BA22-499FBADD4D12}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{C0A4A1D4-2B3C-491A-BA22-499FBADD4D12}" />
<comInterfaceExternalProxyStub name="IATSCTuningSpace" iid="{0369B4E2-45B6-11D3-B650-00C04F79498E}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IAnalogTVTuningSpace" iid="{2A6E293C-2595-11D3-B64C-00C04F79498E}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IDigitalCableTuningSpace" iid="{013F9F9C-B449-4EC7-A6D2-9D4F2FC70AE5}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IAnalogRadioTuningSpace2" iid="{39DD45DA-2DA8-46BA-8A8A-87E2B73D983A}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IAnalogRadioTuningSpace" iid="{2A6E293B-2595-11D3-B64C-00C04F79498E}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IAuxInTuningSpace" iid="{E48244B8-7E17-4F76-A763-5090FF1E2F30}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IAuxInTuningSpace2" iid="{B10931ED-8BFE-4AB0-9DCE-E469C29A9729}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IDVBTuningSpace2" iid="{843188B4-CE62-43DB-966B-8145A094E040}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IDVBTuningSpace" iid="{ADA0B268-3B19-4E5B-ACC4-49F852BE13BA}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IDVBSTuningSpace" iid="{CDF7BE60-D954-42FD-A972-78971958E470}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="ILanguageComponentType" iid="{B874C8BA-0FA2-11D3-9D8E-00C04F72D980}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMPEG2ComponentType" iid="{2C073D84-B51C-48C9-AA9F-68971E1F6E38}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IATSCComponentType" iid="{FC189E4D-7BD4-4125-B3B3-3A76A332CC96}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IComponentsOld" iid="{FCD01846-0E19-11D3-9D8E-00C04F72D980}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMPEG2Component" iid="{1493E353-1EB6-473C-802D-8E6B8EC9D2A9}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IAnalogAudioComponentType" iid="{2CFEB2A8-1787-4A24-A941-C6EAEC39C842}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IChannelIDTuneRequest" iid="{156EFF60-86F4-4E28-89FC-109799FD57EE}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IChannelTuneRequest" iid="{0369B4E0-45B6-11D3-B650-00C04F79498E}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IATSCChannelTuneRequest" iid="{0369B4E1-45B6-11D3-B650-00C04F79498E}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IDigitalCableTuneRequest" iid="{BAD7753B-6B37-4810-AE57-3CE0C4A9E6CB}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMPEG2TuneRequest" iid="{EB7D987F-8A01-42AD-B8AE-574DEEE44D1A}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMPEG2TuneRequestFactory" iid="{14E11ABD-EE37-4893-9EA1-6964DE933E39}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IDigitalLocator" iid="{19B595D8-839A-47F0-96DF-4F194F3C768C}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IAnalogLocator" iid="{34D1F26B-E339-430D-ABCE-738CB48984DC}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IATSCLocator2" iid="{612AA885-66CF-4090-BA0A-566F5312E4CA}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IATSCLocator" iid="{BF8D986F-8C2B-4131-94D7-4D3D9FCC21EF}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IDigitalCableLocator" iid="{48F66A11-171A-419A-9525-BEEECD51584C}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IDVBTLocator" iid="{8664DA16-DDA2-42AC-926A-C18F9127C302}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IDVBTLocator2" iid="{448A2EDF-AE95-4B43-A3CC-747843C453D4}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IDVBSLocator2" iid="{6044634A-1733-4F99-B982-5FB12AFCE4F0}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IDVBSLocator" iid="{3D7C353C-0D04-45F1-A742-F97CC1188DC8}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IDVBCLocator" iid="{6E42F36E-1DD2-43C4-9F78-69D25AE39034}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IISDBSLocator" iid="{C9897087-E29C-473F-9E4B-7072123DEA14}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IDVBTuneRequest" iid="{0D6F567E-A636-42BB-83BA-CE4C1704AFA2}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="ICreatePropBagOnRegKey" iid="{8A674B48-1F63-11D3-B64C-00C04F79498E}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{8A674B48-1F63-11D3-B64C-00C04F79498E}" />
<comInterfaceExternalProxyStub name="IBroadcastEvent" iid="{3B21263F-26E8-489D-AAC4-924F7EFD9511}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{3B21263F-26E8-489D-AAC4-924F7EFD9511}" />
<comInterfaceExternalProxyStub name="IRegisterTuner" iid="{359B3901-572C-4854-BB49-CDEF66606A25}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{359B3901-572C-4854-BB49-CDEF66606A25}" />
<comInterfaceExternalProxyStub name="ITuner" iid="{28C52640-018A-11D3-9D8E-00C04F72D980}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{28C52640-018A-11D3-9D8E-00C04F72D980}" />
<comInterfaceExternalProxyStub name="IPersistTuneXmlUtility" iid="{990237AE-AC11-4614-BE8F-DD217A4CB4CB}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{990237AE-AC11-4614-BE8F-DD217A4CB4CB}" />
<comInterfaceExternalProxyStub name="IPersistTuneXmlUtility2" iid="{992E165F-EA24-4B2F-9A1D-009D92120451}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{992E165F-EA24-4B2F-9A1D-009D92120451}" />
<comInterfaceExternalProxyStub name="IESEventService" iid="{ED89A619-4C06-4B2F-99EB-C7669B13047C}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{ED89A619-4C06-4B2F-99EB-C7669B13047C}" />
<comInterfaceExternalProxyStub name="IESEvent" iid="{1F0E5357-AF43-44E6-8547-654C645145D2}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{1F0E5357-AF43-44E6-8547-654C645145D2}" />
<comInterfaceExternalProxyStub name="IESEvents" iid="{ABD414BF-CFE5-4E5E-AF5B-4B4E49C5BFEB}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{ABD414BF-CFE5-4E5E-AF5B-4B4E49C5BFEB}" />
<comInterfaceExternalProxyStub name="IESEventFactory" iid="{506A09B8-7F86-4E04-AC05-3303BFE8FC49}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{506A09B8-7F86-4E04-AC05-3303BFE8FC49}" />
<comInterfaceExternalProxyStub name="IMarshal2" iid="{000001CF-0000-0000-C000-000000000046}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{000001CF-0000-0000-C000-000000000046}" />
<comInterfaceExternalProxyStub name="IMarshal" iid="{00000003-0000-0000-C000-000000000046}" tlbid="{9B085638-018E-11D3-9D8E-00C04F72D980}" proxyStubClsid32="{00000003-0000-0000-C000-000000000046}" />
</assembly>

Writing the application manifest

This is the last step: writing the application manifest and importing the assembly manifest we just created.

For that, I took the original manifest embedded in ehshell.exe, cleaned it up a bit, added the necessary parts and created ehshell.exe.manifest with the resulting XML:

ehshell.exe.manifest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright (c) Microsoft Corporation -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v3" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" manifestVersion="1.0">
<assemblyIdentity name="Microsoft.Windows.MultiMedia.EhShell" processorArchitecture="amd64" version="5.1.0.0" type="win32" />

<description>Windows Media Center Shell</description>

<application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</application>

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>

<dependency>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Windows.Video.Control" version="1.0.0.0" />
</dependentAssembly>
</dependency>

<dependency>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Windows.Video.Tagging" version="1.0.0.0" />
</dependentAssembly>
</dependency>
</assembly>

The Microsoft.Windows.Video.Tagging dependency was generated using the same exact procedure, but using EncDec.dll instead of MSVidCtl.dll. For more information about this system DLL and why it's important for Windows Media Center, visit Windows 10 April Update: comment résoudre le problème de miniatures (Thumbnails) sous Windows Media Center (in French).

At this stage, it's important to note that external manifest files are NOT loaded if the executable already contains an embedded manifest. Since I preferred having an external manifest, I used Resource Hacker to remove the embedded manifest from ehshell.exe and the other WMC executables.

Conclusion

Creating registration-free COM manifests to work around a breaking change in a system DLL is definitely a painful process (after all, it's called DLL Hell for a reason!). Fortunately, the result is worth it, as it makes an application safe from future DLL changes introduced in minor or major Windows versions.

Since I don't expect anyone to reproduce this painful process to fix their Windows Media Center setup, I decided to team up with Rémi Lachapelle – who ows the WindowsMediaCenter.fr blog – to offer an updated installer that includes the precious manifest and the MSVidCtl/EncDec DLLs needed for Windows Media Center to work properly with recent versions of Windows 10: keep an eye on his blog, it should be there shortly!