xref: /reactos/dll/win32/avicap32/avicap32.c (revision c2c66aff)
1 /*
2  * PROJECT:         avicap32
3  * FILE:            dll\win32\avicap32\avicap32.c
4  * PURPOSE:         Main file
5  * PROGRAMMERS:     Dmitry Chapyshev (dmitry@reactos.org)
6  */
7 
8 #define WIN32_NO_STATUS
9 #define _INC_WINDOWS
10 #define COM_NO_WINDOWS_H
11 
12 #include <stdio.h>
13 #include <windef.h>
14 #include <winbase.h>
15 #include <winreg.h>
16 #include <winver.h>
17 #include <winnls.h>
18 #include <wingdi.h>
19 #include <winternl.h>
20 #include <vfw.h>
21 #include <wine/debug.h>
22 
23 #define CAP_DESC_MAX 32
24 
25 WINE_DEFAULT_DEBUG_CHANNEL(avicap32);
26 
27 
28 HINSTANCE hInstance;
29 
30 
31 /* INTRENAL FUNCTIONS **************************************************/
32 
33 LRESULT
34 CALLBACK
35 CaptureWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
36 {
37     switch (Msg)
38     {
39         case WM_CREATE:
40             break;
41 
42         case WM_PAINT:
43             break;
44 
45         case WM_DESTROY:
46             break;
47     }
48 
49     return DefWindowProc(hwnd, Msg, wParam, lParam);
50 }
51 
52 
53 /* FUNCTIONS ***********************************************************/
54 
55 /*
56  * implemented
57  */
58 HWND
59 VFWAPI
60 capCreateCaptureWindowW(LPCWSTR lpszWindowName,
61                         DWORD dwStyle,
62                         INT x,
63                         INT y,
64                         INT nWidth,
65                         INT nHeight,
66                         HWND hWnd,
67                         INT nID)
68 {
69     WCHAR szWindowClass[] = L"ClsCapWin";
70     WNDCLASSEXW WndClass = {0};
71     DWORD dwExStyle = 0;
72 
73     FIXME("capCreateCaptureWindowW() not fully implemented!\n");
74 
75     WndClass.cbSize        = sizeof(WNDCLASSEXW);
76     WndClass.lpszClassName = szWindowClass;
77     WndClass.lpfnWndProc   = CaptureWindowProc; /* TODO: Implement CaptureWindowProc */
78     WndClass.hInstance     = hInstance;
79     WndClass.style         = CS_HREDRAW | CS_VREDRAW;
80     WndClass.hCursor       = LoadCursorW(0, IDC_ARROW);
81     WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
82 
83     if (RegisterClassExW(&WndClass) == (ATOM)0)
84     {
85         if (GetLastError() != ERROR_ALREADY_EXISTS)
86             return NULL;
87     }
88 
89     return CreateWindowExW(dwExStyle,
90                            szWindowClass,
91                            lpszWindowName,
92                            dwStyle,
93                            x, y,
94                            nWidth,
95                            nHeight,
96                            hWnd,
97                            ULongToHandle(nID),
98                            hInstance,
99                            NULL);
100 }
101 
102 /*
103  * implemented
104  */
105 HWND
106 VFWAPI
107 capCreateCaptureWindowA(LPCSTR lpszWindowName,
108                         DWORD dwStyle,
109                         INT x,
110                         INT y,
111                         INT nWidth,
112                         INT nHeight,
113                         HWND hWnd,
114                         INT nID)
115 {
116     UNICODE_STRING Name;
117     HWND Wnd;
118 
119     if (lpszWindowName)
120         RtlCreateUnicodeStringFromAsciiz(&Name, lpszWindowName);
121     else
122         Name.Buffer = NULL;
123 
124     Wnd = capCreateCaptureWindowW(Name.Buffer,
125                                   dwStyle,
126                                   x, y,
127                                   nWidth,
128                                   nHeight,
129                                   hWnd,
130                                   nID);
131 
132     RtlFreeUnicodeString(&Name);
133     return Wnd;
134 }
135 
136 
137 /*
138  * implemented
139  */
140 BOOL
141 VFWAPI
142 capGetDriverDescriptionW(WORD wDriverIndex,
143                          LPWSTR lpszName,
144                          INT cbName,
145                          LPWSTR lpszVer,
146                          INT cbVer)
147 {
148     DWORD dwSize, dwIndex = 0;
149     WCHAR szDriver[MAX_PATH];
150     WCHAR szDriverName[MAX_PATH];
151     WCHAR szFileName[MAX_PATH];
152     WCHAR szVersion[MAX_PATH];
153     HKEY hKey, hSubKey;
154 
155     /* TODO: Add support of data acquisition from system.ini */
156     FIXME("capGetDriverDescriptionW() not fully implemented!\n");
157 
158     if (lpszName && cbName)
159         lpszName[0] = L'\0';
160 
161     if (lpszVer && cbVer)
162         lpszVer[0] = L'\0';
163 
164     if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
165                       L"SYSTEM\\CurrentControlSet\\Control\\MediaResources\\msvideo",
166                       0,
167                       KEY_READ,
168                       &hKey) != ERROR_SUCCESS)
169     {
170         return FALSE;
171     }
172 
173     dwSize = sizeof(szDriver) / sizeof(WCHAR);
174 
175     while (RegEnumKeyExW(hKey, dwIndex,
176                          szDriver, &dwSize,
177                          NULL, NULL,
178                          NULL, NULL) == ERROR_SUCCESS)
179     {
180         if (RegOpenKeyW(hKey, szDriver, &hSubKey) == ERROR_SUCCESS)
181         {
182             dwSize = sizeof(szFileName);
183 
184             if (RegQueryValueExW(hSubKey,
185                                  L"Driver",
186                                  NULL,
187                                  NULL,
188                                  (LPBYTE)&szFileName,
189                                  &dwSize) == ERROR_SUCCESS)
190             {
191                 dwSize = sizeof(szDriverName);
192 
193                 if (RegQueryValueExW(hSubKey,
194                                      L"FriendlyName",
195                                      NULL,
196                                      NULL,
197                                      (LPBYTE)&szDriverName,
198                                      &dwSize) != ERROR_SUCCESS)
199                 {
200                     wcscpy(szDriverName, L"Unknown Driver Name");
201                 }
202 
203                 if (dwIndex == (DWORD)wDriverIndex)
204                 {
205                     if (lpszName && cbName)
206                     {
207                         lstrcpynW(lpszName, szDriverName, cbName);
208                     }
209 
210                     if (lpszVer && cbVer)
211                     {
212                         LPVOID Version, Ms;
213                         DWORD dwInfoSize;
214                         VS_FIXEDFILEINFO FileInfo;
215                         UINT Ls;
216 
217                         dwInfoSize = GetFileVersionInfoSize(szFileName, NULL);
218                         if (dwInfoSize)
219                         {
220                             Version = HeapAlloc(GetProcessHeap(), 0, dwInfoSize);
221 
222                             if (Version != NULL)
223                             {
224                                 GetFileVersionInfo(szFileName, 0, dwInfoSize, Version);
225 
226                                 if (VerQueryValueW(Version, L"\\", &Ms, &Ls))
227                                 {
228                                     memmove(&FileInfo, Ms, Ls);
229                                     swprintf(szVersion, L"Version: %d.%d.%d.%d",
230                                              HIWORD(FileInfo.dwFileVersionMS),
231                                              LOWORD(FileInfo.dwFileVersionMS),
232                                              HIWORD(FileInfo.dwFileVersionLS),
233                                              LOWORD(FileInfo.dwFileVersionLS));
234 
235                                     lstrcpynW(lpszVer, szVersion, cbVer);
236                                 }
237                                 HeapFree(GetProcessHeap(), 0, Version);
238                             }
239                         }
240                     }
241 
242                     RegCloseKey(hSubKey);
243                     RegCloseKey(hKey);
244                     return TRUE;
245                 }
246             }
247 
248             RegCloseKey(hSubKey);
249         }
250 
251         dwSize = sizeof(szDriver) / sizeof(WCHAR);
252         dwIndex++;
253     }
254 
255     RegCloseKey(hKey);
256 
257     return FALSE;
258 }
259 
260 
261 /*
262  * implemented
263  */
264 BOOL
265 VFWAPI
266 capGetDriverDescriptionA(WORD wDriverIndex,
267                          LPSTR lpszName,
268                          INT cbName,
269                          LPSTR lpszVer,
270                          INT cbVer)
271 {
272     WCHAR DevName[CAP_DESC_MAX], DevVer[CAP_DESC_MAX];
273     BOOL Result;
274 
275     Result = capGetDriverDescriptionW(wDriverIndex, DevName, CAP_DESC_MAX, DevVer, CAP_DESC_MAX);
276     if (Result)
277     {
278         WideCharToMultiByte(CP_ACP, 0, DevName, -1, lpszName, cbName, NULL, NULL);
279         WideCharToMultiByte(CP_ACP, 0, DevVer, -1, lpszVer, cbVer, NULL, NULL);
280     }
281 
282     return Result;
283 }
284 
285 
286 /*
287  * unimplemented
288  */
289 VOID
290 VFWAPI
291 AppCleanup(HINSTANCE hInst)
292 {
293     UNIMPLEMENTED;
294 }
295 
296 
297 /*
298  * unimplemented
299  */
300 DWORD
301 VFWAPI
302 videoThunk32(DWORD dwUnknown1, DWORD dwUnknown2, DWORD dwUnknown3, DWORD dwUnknown4, DWORD dwUnknown5)
303 {
304     UNIMPLEMENTED;
305     return 0;
306 }
307 
308 
309 BOOL
310 WINAPI
311 DllMain(IN HINSTANCE hinstDLL,
312         IN DWORD dwReason,
313         IN LPVOID lpvReserved)
314 {
315     switch (dwReason)
316     {
317         case DLL_PROCESS_ATTACH:
318             TRACE("avicap32 attached!\n");
319             hInstance = hinstDLL;
320             break;
321     }
322 
323     return TRUE;
324 }
325