xref: /reactos/dll/directx/msdvbnp/msdvbnp.cpp (revision 9393fc32)
1*c2c66affSColin Finck /*
2*c2c66affSColin Finck  * COPYRIGHT:       See COPYING in the top level directory
3*c2c66affSColin Finck  * PROJECT:         ReactOS Network Provider for MPEG2 based networks
4*c2c66affSColin Finck  * FILE:            dll/directx/msdvbnp/msdvbnp.cpp
5*c2c66affSColin Finck  * PURPOSE:         COM Initialization
6*c2c66affSColin Finck  *
7*c2c66affSColin Finck  * PROGRAMMERS:     Johannes Anderwald (johannes.anderwald@reactos.org)
8*c2c66affSColin Finck  */
9*c2c66affSColin Finck 
10*c2c66affSColin Finck #include "precomp.h"
11*c2c66affSColin Finck 
12*c2c66affSColin Finck #ifndef _MSC_VER
13*c2c66affSColin Finck const GUID KSCATEGORY_BDA_NETWORK_PROVIDER = {0x71985f4b, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
14*c2c66affSColin Finck #endif
15*c2c66affSColin Finck 
16*c2c66affSColin Finck static INTERFACE_TABLE InterfaceTable[] =
17*c2c66affSColin Finck {
18*c2c66affSColin Finck     {&CLSID_DVBTNetworkProvider, CNetworkProvider_fnConstructor, L"ReactOS DVBT Network Provider"},
19*c2c66affSColin Finck     {NULL, NULL, NULL}
20*c2c66affSColin Finck };
21*c2c66affSColin Finck 
22*c2c66affSColin Finck extern "C"
23*c2c66affSColin Finck BOOL
24*c2c66affSColin Finck WINAPI
DllMain(HINSTANCE hInstDLL,DWORD fdwReason,LPVOID lpvReserved)25*c2c66affSColin Finck DllMain(
26*c2c66affSColin Finck     HINSTANCE hInstDLL,
27*c2c66affSColin Finck     DWORD fdwReason,
28*c2c66affSColin Finck     LPVOID lpvReserved)
29*c2c66affSColin Finck {
30*c2c66affSColin Finck     switch (fdwReason)
31*c2c66affSColin Finck     {
32*c2c66affSColin Finck         case DLL_PROCESS_ATTACH:
33*c2c66affSColin Finck             CoInitialize(NULL);
34*c2c66affSColin Finck 
35*c2c66affSColin Finck #ifdef MSDVBNP_TRACE
36*c2c66affSColin Finck             OutputDebugStringW(L"MSDVBNP::DllMain()\n");
37*c2c66affSColin Finck #endif
38*c2c66affSColin Finck 
39*c2c66affSColin Finck             DisableThreadLibraryCalls(hInstDLL);
40*c2c66affSColin Finck             break;
41*c2c66affSColin Finck     default:
42*c2c66affSColin Finck         break;
43*c2c66affSColin Finck     }
44*c2c66affSColin Finck 
45*c2c66affSColin Finck     return TRUE;
46*c2c66affSColin Finck }
47*c2c66affSColin Finck 
48*c2c66affSColin Finck 
49*c2c66affSColin Finck extern "C"
50*c2c66affSColin Finck KSDDKAPI
51*c2c66affSColin Finck HRESULT
52*c2c66affSColin Finck WINAPI
DllUnregisterServer(void)53*c2c66affSColin Finck DllUnregisterServer(void)
54*c2c66affSColin Finck {
55*c2c66affSColin Finck     ULONG Index = 0;
56*c2c66affSColin Finck     LPOLESTR pStr;
57*c2c66affSColin Finck     HRESULT hr = S_OK;
58*c2c66affSColin Finck     HKEY hClass;
59*c2c66affSColin Finck 
60*c2c66affSColin Finck 
61*c2c66affSColin Finck     hr = StringFromCLSID(KSCATEGORY_BDA_NETWORK_PROVIDER, &pStr);
62*c2c66affSColin Finck     if (FAILED(hr))
63*c2c66affSColin Finck         return hr;
64*c2c66affSColin Finck 
65*c2c66affSColin Finck     if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"CLSID", 0, KEY_SET_VALUE, &hClass) != ERROR_SUCCESS)
66*c2c66affSColin Finck     {
67*c2c66affSColin Finck         CoTaskMemFree(pStr);
68*c2c66affSColin Finck         return E_FAIL;
69*c2c66affSColin Finck     }
70*c2c66affSColin Finck 
71*c2c66affSColin Finck     RegDeleteKeyW(hClass, pStr);
72*c2c66affSColin Finck     CoTaskMemFree(pStr);
73*c2c66affSColin Finck 
74*c2c66affSColin Finck     do
75*c2c66affSColin Finck     {
76*c2c66affSColin Finck         hr = StringFromCLSID(*InterfaceTable[Index].riid, &pStr);
77*c2c66affSColin Finck         if (FAILED(hr))
78*c2c66affSColin Finck             break;
79*c2c66affSColin Finck 
80*c2c66affSColin Finck         RegDeleteKeyW(hClass, pStr);
81*c2c66affSColin Finck         CoTaskMemFree(pStr);
82*c2c66affSColin Finck         Index++;
83*c2c66affSColin Finck     }while(InterfaceTable[Index].lpfnCI != 0);
84*c2c66affSColin Finck 
85*c2c66affSColin Finck     RegCloseKey(hClass);
86*c2c66affSColin Finck     return hr;
87*c2c66affSColin Finck }
88*c2c66affSColin Finck 
89*c2c66affSColin Finck VOID
RegisterBDAComponent(HKEY hFilter,LPCWSTR ComponentClsid,LPCWSTR ComponentName)90*c2c66affSColin Finck RegisterBDAComponent(
91*c2c66affSColin Finck     HKEY hFilter,
92*c2c66affSColin Finck     LPCWSTR ComponentClsid,
93*c2c66affSColin Finck     LPCWSTR ComponentName)
94*c2c66affSColin Finck {
95*c2c66affSColin Finck     HKEY hComp;
96*c2c66affSColin Finck 
97*c2c66affSColin Finck     // create network provider filter key
98*c2c66affSColin Finck     if (RegCreateKeyExW(hFilter, ComponentClsid, 0, NULL, 0, KEY_WRITE, NULL, &hComp, NULL) == ERROR_SUCCESS)
99*c2c66affSColin Finck     {
100*c2c66affSColin Finck         // store class id
101*c2c66affSColin Finck         RegSetValueExW(hComp, L"CLSID", 0, REG_SZ, (const BYTE*)ComponentClsid, (wcslen(ComponentClsid)+1) * sizeof(WCHAR));
102*c2c66affSColin Finck         RegSetValueExW(hComp, L"FriendlyName", 0, REG_SZ, (const BYTE*)ComponentName, (wcslen(ComponentName)+1) * sizeof(WCHAR));
103*c2c66affSColin Finck         RegCloseKey(hComp);
104*c2c66affSColin Finck     }
105*c2c66affSColin Finck }
106*c2c66affSColin Finck 
107*c2c66affSColin Finck extern "C"
108*c2c66affSColin Finck KSDDKAPI
109*c2c66affSColin Finck HRESULT
110*c2c66affSColin Finck WINAPI
DllRegisterServer(void)111*c2c66affSColin Finck DllRegisterServer(void)
112*c2c66affSColin Finck {
113*c2c66affSColin Finck     ULONG Index = 0;
114*c2c66affSColin Finck     LPOLESTR pStr;
115*c2c66affSColin Finck     HRESULT hr = S_OK;
116*c2c66affSColin Finck     HKEY hClass, hKey, hSubKey, hProvider, hInstance, hFilter;
117*c2c66affSColin Finck     static LPCWSTR ModuleName = L"msdvbnp.ax";
118*c2c66affSColin Finck     static LPCWSTR ThreadingModel = L"Both";
119*c2c66affSColin Finck 
120*c2c66affSColin Finck     hr = StringFromCLSID(KSCATEGORY_BDA_NETWORK_PROVIDER, &pStr);
121*c2c66affSColin Finck     if (FAILED(hr))
122*c2c66affSColin Finck         return hr;
123*c2c66affSColin Finck 
124*c2c66affSColin Finck     if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"CLSID", 0, KEY_WRITE, &hClass) != ERROR_SUCCESS)
125*c2c66affSColin Finck     {
126*c2c66affSColin Finck         CoTaskMemFree(pStr);
127*c2c66affSColin Finck         return E_FAIL;
128*c2c66affSColin Finck     }
129*c2c66affSColin Finck 
130*c2c66affSColin Finck     if (RegCreateKeyExW(hClass, pStr, 0, NULL, 0, KEY_WRITE, NULL, &hProvider, NULL) != ERROR_SUCCESS)
131*c2c66affSColin Finck     {
132*c2c66affSColin Finck         RegCloseKey(hClass);
133*c2c66affSColin Finck         CoTaskMemFree(pStr);
134*c2c66affSColin Finck         return E_FAIL;
135*c2c66affSColin Finck     }
136*c2c66affSColin Finck 
137*c2c66affSColin Finck     CoTaskMemFree(pStr);
138*c2c66affSColin Finck 
139*c2c66affSColin Finck     if (RegCreateKeyExW(hProvider, L"Instance", 0, NULL, 0, KEY_WRITE, NULL, &hInstance, NULL) != ERROR_SUCCESS)
140*c2c66affSColin Finck     {
141*c2c66affSColin Finck         RegCloseKey(hClass);
142*c2c66affSColin Finck         return E_FAIL;
143*c2c66affSColin Finck     }
144*c2c66affSColin Finck     RegCloseKey(hProvider);
145*c2c66affSColin Finck 
146*c2c66affSColin Finck     /* open active movie filter category key */
147*c2c66affSColin Finck     if (RegCreateKeyExW(hClass, L"{da4e3da0-d07d-11d0-bd50-00a0c911ce86}\\Instance", 0, NULL, 0, KEY_WRITE, NULL, &hFilter, NULL) != ERROR_SUCCESS)
148*c2c66affSColin Finck     {
149*c2c66affSColin Finck         RegCloseKey(hClass);
150*c2c66affSColin Finck         RegCloseKey(hInstance);
151*c2c66affSColin Finck         return E_FAIL;
152*c2c66affSColin Finck     }
153*c2c66affSColin Finck 
154*c2c66affSColin Finck     RegisterBDAComponent(hFilter, L"{71985F4A-1CA1-11d3-9CC8-00C04F7971E0}", L"BDA Playback Filter");
155*c2c66affSColin Finck     RegisterBDAComponent(hFilter, L"{71985F4B-1CA1-11D3-9CC8-00C04F7971E0}", L"BDA Network Providers");
156*c2c66affSColin Finck     RegisterBDAComponent(hFilter, L"{71985F48-1CA1-11d3-9CC8-00C04F7971E0}", L"BDA Source Filter");
157*c2c66affSColin Finck     RegisterBDAComponent(hFilter, L"{A2E3074F-6C3D-11D3-B653-00C04F79498E}", L"BDA Transport Information Renderers");
158*c2c66affSColin Finck     RegisterBDAComponent(hFilter, L"{FD0A5AF4-B41D-11d2-9C95-00C04F7971E0}", L"BDA Receiver Component");
159*c2c66affSColin Finck     RegCloseKey(hKey);
160*c2c66affSColin Finck 
161*c2c66affSColin Finck     do
162*c2c66affSColin Finck     {
163*c2c66affSColin Finck         hr = StringFromCLSID(*InterfaceTable[Index].riid, &pStr);
164*c2c66affSColin Finck         if (FAILED(hr))
165*c2c66affSColin Finck             break;
166*c2c66affSColin Finck 
167*c2c66affSColin Finck         if (RegCreateKeyExW(hClass, pStr, 0, 0, 0, KEY_WRITE, NULL, &hKey, 0) == ERROR_SUCCESS)
168*c2c66affSColin Finck         {
169*c2c66affSColin Finck             if (RegCreateKeyExW(hKey, L"InprocServer32", 0, 0, 0, KEY_WRITE, NULL, &hSubKey, 0) == ERROR_SUCCESS)
170*c2c66affSColin Finck             {
171*c2c66affSColin Finck                 RegSetValueExW(hSubKey, 0, 0, REG_SZ, (const BYTE*)ModuleName, (wcslen(ModuleName) + 1) * sizeof(WCHAR));
172*c2c66affSColin Finck                 RegSetValueExW(hSubKey, L"ThreadingModel", 0, REG_SZ, (const BYTE*)ThreadingModel, (wcslen(ThreadingModel) + 1) * sizeof(WCHAR));
173*c2c66affSColin Finck                 RegCloseKey(hSubKey);
174*c2c66affSColin Finck             }
175*c2c66affSColin Finck             RegCloseKey(hKey);
176*c2c66affSColin Finck         }
177*c2c66affSColin Finck 
178*c2c66affSColin Finck         if (RegCreateKeyExW(hInstance, InterfaceTable[Index].ProviderName, 0, 0, 0, KEY_WRITE, NULL, &hKey, 0) == ERROR_SUCCESS)
179*c2c66affSColin Finck         {
180*c2c66affSColin Finck             //FIXME filterdata
181*c2c66affSColin Finck             RegSetValueExW(hKey, L"FriendlyName", 0, REG_SZ, (const BYTE*)InterfaceTable[Index].ProviderName, (wcslen(InterfaceTable[Index].ProviderName) + 1) * sizeof(WCHAR));
182*c2c66affSColin Finck             RegSetValueExW(hKey, L"CLSID", 0, REG_SZ, (const BYTE*)pStr, (wcslen(pStr)+1) * sizeof(WCHAR));
183*c2c66affSColin Finck             RegCloseKey(hKey);
184*c2c66affSColin Finck         }
185*c2c66affSColin Finck 
186*c2c66affSColin Finck 
187*c2c66affSColin Finck 
188*c2c66affSColin Finck 
189*c2c66affSColin Finck         CoTaskMemFree(pStr);
190*c2c66affSColin Finck         Index++;
191*c2c66affSColin Finck     }while(InterfaceTable[Index].lpfnCI != 0);
192*c2c66affSColin Finck 
193*c2c66affSColin Finck     RegCloseKey(hClass);
194*c2c66affSColin Finck     RegCloseKey(hInstance);
195*c2c66affSColin Finck     return hr;
196*c2c66affSColin Finck }
197*c2c66affSColin Finck 
198*c2c66affSColin Finck KSDDKAPI
199*c2c66affSColin Finck HRESULT
200*c2c66affSColin Finck WINAPI
DllGetClassObject(REFCLSID rclsid,REFIID riid,LPVOID * ppv)201*c2c66affSColin Finck DllGetClassObject(
202*c2c66affSColin Finck     REFCLSID rclsid,
203*c2c66affSColin Finck     REFIID riid,
204*c2c66affSColin Finck     LPVOID *ppv)
205*c2c66affSColin Finck {
206*c2c66affSColin Finck     UINT i;
207*c2c66affSColin Finck     HRESULT hres = E_OUTOFMEMORY;
208*c2c66affSColin Finck     IClassFactory * pcf = NULL;
209*c2c66affSColin Finck 
210*c2c66affSColin Finck     if (!ppv)
211*c2c66affSColin Finck         return E_INVALIDARG;
212*c2c66affSColin Finck 
213*c2c66affSColin Finck     *ppv = NULL;
214*c2c66affSColin Finck 
215*c2c66affSColin Finck     for (i = 0; InterfaceTable[i].riid; i++)
216*c2c66affSColin Finck     {
217*c2c66affSColin Finck         if (IsEqualIID(*InterfaceTable[i].riid, rclsid))
218*c2c66affSColin Finck         {
219*c2c66affSColin Finck             pcf = CClassFactory_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL);
220*c2c66affSColin Finck             break;
221*c2c66affSColin Finck         }
222*c2c66affSColin Finck     }
223*c2c66affSColin Finck 
224*c2c66affSColin Finck     if (!pcf)
225*c2c66affSColin Finck     {
226*c2c66affSColin Finck         return CLASS_E_CLASSNOTAVAILABLE;
227*c2c66affSColin Finck     }
228*c2c66affSColin Finck 
229*c2c66affSColin Finck     hres = pcf->QueryInterface(riid, ppv);
230*c2c66affSColin Finck     pcf->Release();
231*c2c66affSColin Finck 
232*c2c66affSColin Finck     return hres;
233*c2c66affSColin Finck }
234*c2c66affSColin Finck 
235*c2c66affSColin Finck KSDDKAPI
236*c2c66affSColin Finck HRESULT
237*c2c66affSColin Finck WINAPI
DllCanUnloadNow(void)238*c2c66affSColin Finck DllCanUnloadNow(void)
239*c2c66affSColin Finck {
240*c2c66affSColin Finck     return S_OK;
241*c2c66affSColin Finck }
242