* Update Johannes's email address.
[reactos.git] / reactos / dll / directx / bdaplgin / bdaplgin.cpp
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS BDA Proxy
4 * FILE: dll/directx/bdaplgin/classfactory.cpp
5 * PURPOSE: ClassFactory interface
6 *
7 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
8 */
9
10 #include "precomp.h"
11
12 const GUID CBDADeviceControl_GUID = {STATIC_KSMETHODSETID_BdaChangeSync};
13 const GUID CBDAPinControl_GUID = {0x0DED49D5, 0xA8B7, 0x4d5d, {0x97, 0xA1, 0x12, 0xB0, 0xC1, 0x95, 0x87, 0x4D}};
14
15 static INTERFACE_TABLE InterfaceTable[] =
16 {
17 {&CBDADeviceControl_GUID, CBDADeviceControl_fnConstructor},
18 {&CBDAPinControl_GUID, CBDAPinControl_fnConstructor},
19 {NULL, NULL}
20 };
21
22 extern "C"
23 BOOL
24 WINAPI
25 DllMain(
26 HINSTANCE hInstDLL,
27 DWORD fdwReason,
28 LPVOID lpvReserved)
29 {
30 switch (fdwReason)
31 {
32 case DLL_PROCESS_ATTACH:
33 CoInitialize(NULL);
34
35 #ifdef BDAPLGIN_TRACE
36 OutputDebugStringW(L"BDAPLGIN::DllMain()\n");
37 #endif
38
39 DisableThreadLibraryCalls(hInstDLL);
40 break;
41 default:
42 break;
43 }
44
45 return TRUE;
46 }
47
48
49 extern "C"
50 KSDDKAPI
51 HRESULT
52 WINAPI
53 DllUnregisterServer(void)
54 {
55 ULONG Index = 0;
56 LPOLESTR pStr;
57 HRESULT hr = S_OK;
58 HKEY hClass;
59
60 if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"CLSID", 0, KEY_SET_VALUE, &hClass) != ERROR_SUCCESS)
61 return E_FAIL;
62
63 do
64 {
65 hr = StringFromCLSID(*InterfaceTable[Index].riid, &pStr);
66 if (FAILED(hr))
67 break;
68
69 RegDeleteKeyW(hClass, pStr);
70 CoTaskMemFree(pStr);
71 Index++;
72 }while(InterfaceTable[Index].lpfnCI != 0);
73
74 RegCloseKey(hClass);
75 return hr;
76 }
77
78 extern "C"
79 KSDDKAPI
80 HRESULT
81 WINAPI
82 DllRegisterServer(void)
83 {
84 ULONG Index = 0;
85 LPOLESTR pStr;
86 HRESULT hr = S_OK;
87 HKEY hClass, hKey, hSubKey;
88 static LPCWSTR ModuleName = L"bdaplgin.ax";
89 static LPCWSTR ThreadingModel = L"Both";
90
91 if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"CLSID", 0, KEY_WRITE, &hClass) != ERROR_SUCCESS)
92 return E_FAIL;
93
94 do
95 {
96 hr = StringFromCLSID(*InterfaceTable[Index].riid, &pStr);
97 if (FAILED(hr))
98 break;
99
100 if (RegCreateKeyExW(hClass, pStr, 0, 0, 0, KEY_WRITE, NULL, &hKey, 0) == ERROR_SUCCESS)
101 {
102 if (RegCreateKeyExW(hKey, L"InprocServer32", 0, 0, 0, KEY_WRITE, NULL, &hSubKey, 0) == ERROR_SUCCESS)
103 {
104 RegSetValueExW(hSubKey, 0, 0, REG_SZ, (const BYTE*)ModuleName, (wcslen(ModuleName) + 1) * sizeof(WCHAR));
105 RegSetValueExW(hSubKey, L"ThreadingModel", 0, REG_SZ, (const BYTE*)ThreadingModel, (wcslen(ThreadingModel) + 1) * sizeof(WCHAR));
106 RegCloseKey(hSubKey);
107 }
108 RegCloseKey(hKey);
109 }
110
111 CoTaskMemFree(pStr);
112 Index++;
113 }while(InterfaceTable[Index].lpfnCI != 0);
114
115 RegCloseKey(hClass);
116 return hr;
117 }
118
119 KSDDKAPI
120 HRESULT
121 WINAPI
122 DllGetClassObject(
123 REFCLSID rclsid,
124 REFIID riid,
125 LPVOID *ppv)
126 {
127 UINT i;
128 HRESULT hres = E_OUTOFMEMORY;
129 IClassFactory * pcf = NULL;
130
131 if (!ppv)
132 return E_INVALIDARG;
133
134 *ppv = NULL;
135
136 for (i = 0; InterfaceTable[i].riid; i++)
137 {
138 if (IsEqualIID(*InterfaceTable[i].riid, rclsid))
139 {
140 pcf = CClassFactory_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL);
141 break;
142 }
143 }
144
145 if (!pcf)
146 {
147 return CLASS_E_CLASSNOTAVAILABLE;
148 }
149
150 hres = pcf->QueryInterface(riid, ppv);
151 pcf->Release();
152
153 return hres;
154 }
155
156 KSDDKAPI
157 HRESULT
158 WINAPI
159 DllCanUnloadNow(void)
160 {
161 return S_OK;
162 }