Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmsdvbnp.cpp
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Network Provider for MPEG2 based networks 00004 * FILE: dll/directx/msdvbnp/msdvbnp.cpp 00005 * PURPOSE: COM Initialization 00006 * 00007 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) 00008 */ 00009 00010 #include "precomp.h" 00011 00012 #ifndef _MSC_VER 00013 const GUID KSCATEGORY_BDA_NETWORK_PROVIDER = {0x71985f4b, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}}; 00014 #endif 00015 00016 static INTERFACE_TABLE InterfaceTable[] = 00017 { 00018 {&CLSID_DVBTNetworkProvider, CNetworkProvider_fnConstructor, L"ReactOS DVBT Network Provider"}, 00019 {NULL, NULL, NULL} 00020 }; 00021 00022 extern "C" 00023 BOOL 00024 WINAPI 00025 DllMain( 00026 HINSTANCE hInstDLL, 00027 DWORD fdwReason, 00028 LPVOID lpvReserved) 00029 { 00030 switch (fdwReason) 00031 { 00032 case DLL_PROCESS_ATTACH: 00033 CoInitialize(NULL); 00034 00035 #ifdef MSDVBNP_TRACE 00036 OutputDebugStringW(L"MSDVBNP::DllMain()\n"); 00037 #endif 00038 00039 DisableThreadLibraryCalls(hInstDLL); 00040 break; 00041 default: 00042 break; 00043 } 00044 00045 return TRUE; 00046 } 00047 00048 00049 extern "C" 00050 KSDDKAPI 00051 HRESULT 00052 WINAPI 00053 DllUnregisterServer(void) 00054 { 00055 ULONG Index = 0; 00056 LPOLESTR pStr; 00057 HRESULT hr = S_OK; 00058 HKEY hClass; 00059 00060 00061 hr = StringFromCLSID(KSCATEGORY_BDA_NETWORK_PROVIDER, &pStr); 00062 if (FAILED(hr)) 00063 return hr; 00064 00065 if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"CLSID", 0, KEY_SET_VALUE, &hClass) != ERROR_SUCCESS) 00066 { 00067 CoTaskMemFree(pStr); 00068 return E_FAIL; 00069 } 00070 00071 RegDeleteKeyW(hClass, pStr); 00072 CoTaskMemFree(pStr); 00073 00074 do 00075 { 00076 hr = StringFromCLSID(*InterfaceTable[Index].riid, &pStr); 00077 if (FAILED(hr)) 00078 break; 00079 00080 RegDeleteKeyW(hClass, pStr); 00081 CoTaskMemFree(pStr); 00082 Index++; 00083 }while(InterfaceTable[Index].lpfnCI != 0); 00084 00085 RegCloseKey(hClass); 00086 return hr; 00087 } 00088 00089 VOID 00090 RegisterBDAComponent( 00091 HKEY hFilter, 00092 LPCWSTR ComponentClsid, 00093 LPCWSTR ComponentName) 00094 { 00095 HKEY hComp; 00096 00097 // create network provider filter key 00098 if (RegCreateKeyExW(hFilter, ComponentClsid, 0, NULL, 0, KEY_WRITE, NULL, &hComp, NULL) == ERROR_SUCCESS) 00099 { 00100 // store class id 00101 RegSetValueExW(hComp, L"CLSID", 0, REG_SZ, (const BYTE*)ComponentClsid, (wcslen(ComponentClsid)+1) * sizeof(WCHAR)); 00102 RegSetValueExW(hComp, L"FriendlyName", 0, REG_SZ, (const BYTE*)ComponentName, (wcslen(ComponentName)+1) * sizeof(WCHAR)); 00103 RegCloseKey(hComp); 00104 } 00105 } 00106 00107 extern "C" 00108 KSDDKAPI 00109 HRESULT 00110 WINAPI 00111 DllRegisterServer(void) 00112 { 00113 ULONG Index = 0; 00114 LPOLESTR pStr; 00115 HRESULT hr = S_OK; 00116 HKEY hClass, hKey, hSubKey, hProvider, hInstance, hFilter; 00117 static LPCWSTR ModuleName = L"msdvbnp.ax"; 00118 static LPCWSTR ThreadingModel = L"Both"; 00119 00120 hr = StringFromCLSID(KSCATEGORY_BDA_NETWORK_PROVIDER, &pStr); 00121 if (FAILED(hr)) 00122 return hr; 00123 00124 if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"CLSID", 0, KEY_WRITE, &hClass) != ERROR_SUCCESS) 00125 { 00126 CoTaskMemFree(pStr); 00127 return E_FAIL; 00128 } 00129 00130 if (RegCreateKeyExW(hClass, pStr, 0, NULL, 0, KEY_WRITE, NULL, &hProvider, NULL) != ERROR_SUCCESS) 00131 { 00132 RegCloseKey(hClass); 00133 CoTaskMemFree(pStr); 00134 return E_FAIL; 00135 } 00136 00137 CoTaskMemFree(pStr); 00138 00139 if (RegCreateKeyExW(hProvider, L"Instance", 0, NULL, 0, KEY_WRITE, NULL, &hInstance, NULL) != ERROR_SUCCESS) 00140 { 00141 RegCloseKey(hClass); 00142 return E_FAIL; 00143 } 00144 RegCloseKey(hProvider); 00145 00146 /* open active movie filter category key */ 00147 if (RegCreateKeyExW(hClass, L"{da4e3da0-d07d-11d0-bd50-00a0c911ce86}\\Instance", 0, NULL, 0, KEY_WRITE, NULL, &hFilter, NULL) != ERROR_SUCCESS) 00148 { 00149 RegCloseKey(hClass); 00150 RegCloseKey(hInstance); 00151 return E_FAIL; 00152 } 00153 00154 RegisterBDAComponent(hFilter, L"{71985F4A-1CA1-11d3-9CC8-00C04F7971E0}", L"BDA Playback Filter"); 00155 RegisterBDAComponent(hFilter, L"{71985F4B-1CA1-11D3-9CC8-00C04F7971E0}", L"BDA Network Providers"); 00156 RegisterBDAComponent(hFilter, L"{71985F48-1CA1-11d3-9CC8-00C04F7971E0}", L"BDA Source Filter"); 00157 RegisterBDAComponent(hFilter, L"{A2E3074F-6C3D-11D3-B653-00C04F79498E}", L"BDA Transport Information Renderers"); 00158 RegisterBDAComponent(hFilter, L"{FD0A5AF4-B41D-11d2-9C95-00C04F7971E0}", L"BDA Receiver Component"); 00159 RegCloseKey(hKey); 00160 00161 do 00162 { 00163 hr = StringFromCLSID(*InterfaceTable[Index].riid, &pStr); 00164 if (FAILED(hr)) 00165 break; 00166 00167 if (RegCreateKeyExW(hClass, pStr, 0, 0, 0, KEY_WRITE, NULL, &hKey, 0) == ERROR_SUCCESS) 00168 { 00169 if (RegCreateKeyExW(hKey, L"InprocServer32", 0, 0, 0, KEY_WRITE, NULL, &hSubKey, 0) == ERROR_SUCCESS) 00170 { 00171 RegSetValueExW(hSubKey, 0, 0, REG_SZ, (const BYTE*)ModuleName, (wcslen(ModuleName) + 1) * sizeof(WCHAR)); 00172 RegSetValueExW(hSubKey, L"ThreadingModel", 0, REG_SZ, (const BYTE*)ThreadingModel, (wcslen(ThreadingModel) + 1) * sizeof(WCHAR)); 00173 RegCloseKey(hSubKey); 00174 } 00175 RegCloseKey(hKey); 00176 } 00177 00178 if (RegCreateKeyExW(hInstance, InterfaceTable[Index].ProviderName, 0, 0, 0, KEY_WRITE, NULL, &hKey, 0) == ERROR_SUCCESS) 00179 { 00180 //FIXME filterdata 00181 RegSetValueExW(hKey, L"FriendlyName", 0, REG_SZ, (const BYTE*)InterfaceTable[Index].ProviderName, (wcslen(InterfaceTable[Index].ProviderName) + 1) * sizeof(WCHAR)); 00182 RegSetValueExW(hKey, L"CLSID", 0, REG_SZ, (const BYTE*)pStr, (wcslen(pStr)+1) * sizeof(WCHAR)); 00183 RegCloseKey(hKey); 00184 } 00185 00186 00187 00188 00189 CoTaskMemFree(pStr); 00190 Index++; 00191 }while(InterfaceTable[Index].lpfnCI != 0); 00192 00193 RegCloseKey(hClass); 00194 RegCloseKey(hInstance); 00195 return hr; 00196 } 00197 00198 KSDDKAPI 00199 HRESULT 00200 WINAPI 00201 DllGetClassObject( 00202 REFCLSID rclsid, 00203 REFIID riid, 00204 LPVOID *ppv) 00205 { 00206 UINT i; 00207 HRESULT hres = E_OUTOFMEMORY; 00208 IClassFactory * pcf = NULL; 00209 00210 if (!ppv) 00211 return E_INVALIDARG; 00212 00213 *ppv = NULL; 00214 00215 for (i = 0; InterfaceTable[i].riid; i++) 00216 { 00217 if (IsEqualIID(*InterfaceTable[i].riid, rclsid)) 00218 { 00219 pcf = CClassFactory_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL); 00220 break; 00221 } 00222 } 00223 00224 if (!pcf) 00225 { 00226 return CLASS_E_CLASSNOTAVAILABLE; 00227 } 00228 00229 hres = pcf->QueryInterface(riid, ppv); 00230 pcf->Release(); 00231 00232 return hres; 00233 } 00234 00235 KSDDKAPI 00236 HRESULT 00237 WINAPI 00238 DllCanUnloadNow(void) 00239 { 00240 return S_OK; 00241 } Generated on Sun May 27 2012 04:21:53 for ReactOS by
1.7.6.1
|