ReactOS 0.4.17-dev-804-g023d8af
advpack.c
Go to the documentation of this file.
1/*
2 * Advpack main
3 *
4 * Copyright 2004 Huw D M Davies
5 * Copyright 2005 Sami Aario
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#include <stdarg.h>
23#include <stdlib.h>
24
25#include "windef.h"
26#include "winbase.h"
27#include "winuser.h"
28#include "winreg.h"
29#include "winternl.h"
30#include "winnls.h"
31#include "setupapi.h"
32#include "advpub.h"
33#include "wine/debug.h"
34#include "advpack_private.h"
35
37
39
40#define MAX_FIELD_LENGTH 512
41#define PREFIX_LEN 5
42
43/* registry path of the Installed Components key for per-user stubs */
44static const WCHAR setup_key[] = L"SOFTWARE\\Microsoft\\Active Setup\\Installed Components";
45
46/* Strip single quotes from a token - note size includes NULL */
48{
49 if (buffer[0] == '\'' && (*size > 1) && buffer[*size-2]=='\'')
50 {
51 *size -= 2;
52 buffer[*size] = 0x00;
53 memmove(buffer, buffer + 1, *size * sizeof(WCHAR));
54 }
55}
56
57/* parses the destination directory parameters from pszSection
58 * the parameters are of the form: root,key,value,unknown,fallback
59 * we first read the reg value root\\key\\value and if that fails,
60 * use fallback as the destination directory
61 */
62static void get_dest_dir(HINF hInf, PCWSTR pszSection, PWSTR pszBuffer, DWORD dwSize)
63{
65 WCHAR key[MAX_PATH + 2], value[MAX_PATH + 2];
67 HKEY root, subkey = 0;
68 DWORD size;
69
70 /* load the destination parameters */
71 SetupFindFirstLineW(hInf, pszSection, NULL, &context);
78
79 if (!lstrcmpW(prefix, L"HKLM"))
81 else if (!lstrcmpW(prefix, L"HKCU"))
83 else
84 root = NULL;
85
86 size = dwSize * sizeof(WCHAR);
87
88 /* fallback to the default destination dir if reg fails */
89 if (RegOpenKeyW(root, key, &subkey) ||
90 RegQueryValueExW(subkey, value, NULL, NULL, (LPBYTE)pszBuffer, &size))
91 {
92 SetupGetStringFieldW(&context, 5, pszBuffer, dwSize, &size);
93 strip_quotes(pszBuffer, &size);
94 }
95
96 if (subkey) RegCloseKey(subkey);
97}
98
99/* loads the LDIDs specified in the install section of an INF */
100void set_ldids(HINF hInf, LPCWSTR pszInstallSection, LPCWSTR pszWorkingDir)
101{
106 DWORD size;
107 int ldid;
108
109 if (!SetupGetLineTextW(NULL, hInf, pszInstallSection, L"CustomDestination",
111 return;
112
113 if (!SetupFindFirstLineW(hInf, field, NULL, &context))
114 return;
115
116 do
117 {
118 LPWSTR value, ptr, key, key_copy = NULL;
119 DWORD flags = 0;
120
123
124 /* SetupGetLineTextW returns the value if there is only one key, but
125 * returns the whole line if there is more than one key
126 */
127 if (!(value = wcschr(line, '=')))
128 {
130 key = malloc(size * sizeof(WCHAR));
131 key_copy = key;
133 value = line;
134 }
135 else
136 {
137 key = line;
138 *(value++) = '\0';
139 }
140
141 /* remove leading whitespace from the value */
142 while (*value == ' ')
143 value++;
144
145 /* Extract the flags */
146 ptr = wcschr(value, ',');
147 if (ptr) {
148 *ptr = '\0';
149 flags = wcstol(ptr+1, NULL, 10);
150 }
151
152 /* set dest to pszWorkingDir if key is SourceDir */
153 if (pszWorkingDir && !lstrcmpiW(value, L"SourceDir"))
154 lstrcpynW(dest, pszWorkingDir, MAX_PATH);
155 else
157
158 /* If prompting required, provide dialog to request path */
159 if (flags & 0x04)
160 FIXME("Need to support changing paths - default will be used\n");
161
162 /* set all ldids to dest */
163 while ((ptr = get_parameter(&key, ',', FALSE)))
164 {
165 ldid = wcstol(ptr, NULL, 10);
166 SetupSetDirectoryIdW(hInf, ldid, dest);
167 }
168 free(key_copy);
169 } while (SetupFindNextLine(&context, &context));
170}
171
172/***********************************************************************
173 * CloseINFEngine (ADVPACK.@)
174 *
175 * Closes a handle to an INF file opened with OpenINFEngine.
176 *
177 * PARAMS
178 * hInf [I] Handle to the INF file to close.
179 *
180 * RETURNS
181 * Success: S_OK.
182 * Failure: E_FAIL.
183 */
185{
186 TRACE("(%p)\n", hInf);
187
188 if (!hInf)
189 return E_INVALIDARG;
190
191 SetupCloseInfFile(hInf);
192 return S_OK;
193}
194
195/***********************************************************************
196 * IsNTAdmin (ADVPACK.@)
197 *
198 * Checks if the user has admin privileges.
199 *
200 * PARAMS
201 * reserved [I] Reserved. Must be 0.
202 * pReserved [I] Reserved. Must be NULL.
203 *
204 * RETURNS
205 * TRUE if user has admin rights, FALSE otherwise.
206 */
208{
210 PTOKEN_GROUPS pTokenGroups;
211 BOOL bSidFound = FALSE;
212 DWORD dwSize, i;
213 HANDLE hToken;
214 PSID pSid;
215
216 TRACE("(%ld, %p)\n", reserved, pReserved);
217
219 return FALSE;
220
221 if (!GetTokenInformation(hToken, TokenGroups, NULL, 0, &dwSize))
222 {
224 {
225 CloseHandle(hToken);
226 return FALSE;
227 }
228 }
229
230 pTokenGroups = malloc(dwSize);
231 if (!pTokenGroups)
232 {
233 CloseHandle(hToken);
234 return FALSE;
235 }
236
237 if (!GetTokenInformation(hToken, TokenGroups, pTokenGroups, dwSize, &dwSize))
238 {
239 free(pTokenGroups);
240 CloseHandle(hToken);
241 return FALSE;
242 }
243
244 CloseHandle(hToken);
245
247 DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pSid))
248 {
249 free(pTokenGroups);
250 return FALSE;
251 }
252
253 for (i = 0; i < pTokenGroups->GroupCount; i++)
254 {
255 if (EqualSid(pSid, pTokenGroups->Groups[i].Sid))
256 {
257 bSidFound = TRUE;
258 break;
259 }
260 }
261
262 free(pTokenGroups);
263 FreeSid(pSid);
264
265 return bSidFound;
266}
267
268/***********************************************************************
269 * NeedRebootInit (ADVPACK.@)
270 *
271 * Sets up conditions for reboot checking.
272 *
273 * RETURNS
274 * Value required by NeedReboot.
275 */
277{
278 FIXME("(VOID): stub\n");
279 return 0;
280}
281
282/***********************************************************************
283 * NeedReboot (ADVPACK.@)
284 *
285 * Determines whether a reboot is required.
286 *
287 * PARAMS
288 * dwRebootCheck [I] Value from NeedRebootInit.
289 *
290 * RETURNS
291 * TRUE if a reboot is needed, FALSE otherwise.
292 *
293 * BUGS
294 * Unimplemented.
295 */
297{
298 FIXME("(%ld): stub\n", dwRebootCheck);
299 return FALSE;
300}
301
302/***********************************************************************
303 * OpenINFEngineA (ADVPACK.@)
304 *
305 * See OpenINFEngineW.
306 */
307HRESULT WINAPI OpenINFEngineA(LPCSTR pszInfFilename, LPCSTR pszInstallSection,
309{
310 UNICODE_STRING filenameW, installW;
311 HRESULT res;
312
313 TRACE("(%s, %s, %ld, %p, %p)\n", debugstr_a(pszInfFilename),
314 debugstr_a(pszInstallSection), dwFlags, phInf, pvReserved);
315
316 if (!pszInfFilename || !phInf)
317 return E_INVALIDARG;
318
320 RtlCreateUnicodeStringFromAsciiz(&installW, pszInstallSection);
321
322 res = OpenINFEngineW(filenameW.Buffer, installW.Buffer,
323 dwFlags, phInf, pvReserved);
324
326 RtlFreeUnicodeString(&installW);
327
328 return res;
329}
330
331/***********************************************************************
332 * OpenINFEngineW (ADVPACK.@)
333 *
334 * Opens and returns a handle to an INF file to be used by
335 * TranslateInfStringEx to continuously translate the INF file.
336 *
337 * PARAMS
338 * pszInfFilename [I] Filename of the INF to open.
339 * pszInstallSection [I] Name of the Install section in the INF.
340 * dwFlags [I] See advpub.h.
341 * phInf [O] Handle to the loaded INF file.
342 * pvReserved [I] Reserved. Must be NULL.
343 *
344 * RETURNS
345 * Success: S_OK.
346 * Failure: E_FAIL.
347 */
348HRESULT WINAPI OpenINFEngineW(LPCWSTR pszInfFilename, LPCWSTR pszInstallSection,
350{
351 TRACE("(%s, %s, %ld, %p, %p)\n", debugstr_w(pszInfFilename),
352 debugstr_w(pszInstallSection), dwFlags, phInf, pvReserved);
353
354 if (!pszInfFilename || !phInf)
355 return E_INVALIDARG;
356
357 *phInf = SetupOpenInfFileW(pszInfFilename, NULL, INF_STYLE_WIN4, NULL);
358 if (*phInf == INVALID_HANDLE_VALUE)
360
361 set_ldids(*phInf, pszInstallSection, NULL);
362
363 return S_OK;
364}
365
366/***********************************************************************
367 * RebootCheckOnInstallA (ADVPACK.@)
368 *
369 * See RebootCheckOnInstallW.
370 */
372 LPCSTR pszSec, DWORD dwReserved)
373{
374 UNICODE_STRING infW, secW;
375 HRESULT res;
376
377 TRACE("(%p, %s, %s, %ld)\n", hWnd, debugstr_a(pszINF),
378 debugstr_a(pszSec), dwReserved);
379
380 if (!pszINF || !pszSec)
381 return E_INVALIDARG;
382
385
387
390
391 return res;
392}
393
394/***********************************************************************
395 * RebootCheckOnInstallW (ADVPACK.@)
396 *
397 * Checks if a reboot is required for an installed INF section.
398 *
399 * PARAMS
400 * hWnd [I] Handle to the window used for messages.
401 * pszINF [I] Filename of the INF file.
402 * pszSec [I] INF section to check.
403 * dwReserved [I] Reserved. Must be 0.
404 *
405 * RETURNS
406 * Success: S_OK - Reboot is needed if the INF section is installed.
407 * S_FALSE - Reboot is not needed.
408 * Failure: HRESULT of GetLastError().
409 *
410 * NOTES
411 * if pszSec is NULL, RebootCheckOnInstall checks the DefaultInstall
412 * or DefaultInstall.NT section.
413 *
414 * BUGS
415 * Unimplemented.
416 */
418 LPCWSTR pszSec, DWORD dwReserved)
419{
420 FIXME("(%p, %s, %s, %ld): stub\n", hWnd, debugstr_w(pszINF),
421 debugstr_w(pszSec), dwReserved);
422
423 return E_FAIL;
424}
425
426/* registers the OCX if do_reg is TRUE, unregisters it otherwise */
427HRESULT do_ocx_reg(HMODULE hocx, BOOL do_reg, const WCHAR *flags, const WCHAR *param)
428{
429 DLLREGISTER reg_func;
430
431 if (do_reg)
432 reg_func = (DLLREGISTER)GetProcAddress(hocx, "DllRegisterServer");
433 else
434 reg_func = (DLLREGISTER)GetProcAddress(hocx, "DllUnregisterServer");
435
436 if (!reg_func)
437 return E_FAIL;
438
439 reg_func();
440 return S_OK;
441}
442
443/***********************************************************************
444 * RegisterOCX (ADVPACK.@)
445 *
446 * Registers an OCX.
447 *
448 * PARAMS
449 * hWnd [I] Handle to the window used for the display.
450 * hInst [I] Instance of the process.
451 * cmdline [I] Contains parameters in the order OCX,flags,param.
452 * show [I] How the window should be shown.
453 *
454 * RETURNS
455 * Success: S_OK.
456 * Failure: E_FAIL.
457 *
458 * NOTES
459 * OCX - Filename of the OCX to register.
460 * flags - Controls the operation of RegisterOCX.
461 * 'I' Call DllRegisterServer and DllInstall.
462 * 'N' Only call DllInstall.
463 * param - Command line passed to DllInstall.
464 */
466{
467 LPWSTR ocx_filename, str_flags, param;
468 LPWSTR cmdline_copy, cmdline_ptr;
469 UNICODE_STRING cmdlineW;
470 HRESULT hr = E_FAIL;
471 HMODULE hm = NULL;
472
473 TRACE("(%s)\n", debugstr_a(cmdline));
474
476
477 cmdline_copy = wcsdup(cmdlineW.Buffer);
478 cmdline_ptr = cmdline_copy;
479
480 ocx_filename = get_parameter(&cmdline_ptr, ',', TRUE);
481 if (!ocx_filename || !*ocx_filename)
482 goto done;
483
484 str_flags = get_parameter(&cmdline_ptr, ',', TRUE);
485 param = get_parameter(&cmdline_ptr, ',', TRUE);
486
488 if (!hm)
489 goto done;
490
491 hr = do_ocx_reg(hm, TRUE, str_flags, param);
492
493done:
494 FreeLibrary(hm);
495 free(cmdline_copy);
496 RtlFreeUnicodeString(&cmdlineW);
497
498 return hr;
499}
500
501/***********************************************************************
502 * SetPerUserSecValuesA (ADVPACK.@)
503 *
504 * See SetPerUserSecValuesW.
505 */
507{
508 PERUSERSECTIONW perUserW;
509
510 TRACE("(%p)\n", pPerUser);
511
512 if (!pPerUser)
513 return E_INVALIDARG;
514
515 MultiByteToWideChar(CP_ACP, 0, pPerUser->szGUID, -1, perUserW.szGUID, ARRAY_SIZE(perUserW.szGUID));
516 MultiByteToWideChar(CP_ACP, 0, pPerUser->szDispName, -1, perUserW.szDispName, ARRAY_SIZE(perUserW.szDispName));
517 MultiByteToWideChar(CP_ACP, 0, pPerUser->szLocale, -1, perUserW.szLocale, ARRAY_SIZE(perUserW.szLocale));
518 MultiByteToWideChar(CP_ACP, 0, pPerUser->szStub, -1, perUserW.szStub, ARRAY_SIZE(perUserW.szStub));
519 MultiByteToWideChar(CP_ACP, 0, pPerUser->szVersion, -1, perUserW.szVersion, ARRAY_SIZE(perUserW.szVersion));
520 MultiByteToWideChar(CP_ACP, 0, pPerUser->szCompID, -1, perUserW.szCompID, ARRAY_SIZE(perUserW.szCompID));
521 perUserW.dwIsInstalled = pPerUser->dwIsInstalled;
522 perUserW.bRollback = pPerUser->bRollback;
523
524 return SetPerUserSecValuesW(&perUserW);
525}
526
527/***********************************************************************
528 * SetPerUserSecValuesW (ADVPACK.@)
529 *
530 * Prepares the per-user stub values under IsInstalled\{GUID} that
531 * control the per-user installation.
532 *
533 * PARAMS
534 * pPerUser [I] Per-user stub values.
535 *
536 * RETURNS
537 * Success: S_OK.
538 * Failure: E_FAIL.
539 */
541{
542 HKEY setup, guid;
543
544 TRACE("(%p)\n", pPerUser);
545
546 if (!pPerUser || !*pPerUser->szGUID)
547 return S_OK;
548
550 NULL, &setup, NULL))
551 {
552 return E_FAIL;
553 }
554
555 if (RegCreateKeyExW(setup, pPerUser->szGUID, 0, NULL, 0, KEY_ALL_ACCESS,
556 NULL, &guid, NULL))
557 {
559 return E_FAIL;
560 }
561
562 if (*pPerUser->szStub)
563 {
564 RegSetValueExW(guid, L"StubPath", 0, REG_SZ, (BYTE *)pPerUser->szStub,
565 (lstrlenW(pPerUser->szStub) + 1) * sizeof(WCHAR));
566 }
567
568 if (*pPerUser->szVersion)
569 {
570 RegSetValueExW(guid, L"Version", 0, REG_SZ, (BYTE *)pPerUser->szVersion,
571 (lstrlenW(pPerUser->szVersion) + 1) * sizeof(WCHAR));
572 }
573
574 if (*pPerUser->szLocale)
575 {
576 RegSetValueExW(guid, L"Locale", 0, REG_SZ, (BYTE *)pPerUser->szLocale,
577 (lstrlenW(pPerUser->szLocale) + 1) * sizeof(WCHAR));
578 }
579
580 if (*pPerUser->szCompID)
581 {
582 RegSetValueExW(guid, L"ComponentID", 0, REG_SZ, (BYTE *)pPerUser->szCompID,
583 (lstrlenW(pPerUser->szCompID) + 1) * sizeof(WCHAR));
584 }
585
586 if (*pPerUser->szDispName)
587 {
589 (lstrlenW(pPerUser->szDispName) + 1) * sizeof(WCHAR));
590 }
591
592 RegSetValueExW(guid, L"IsInstalled", 0, REG_DWORD,
593 (LPBYTE)&pPerUser->dwIsInstalled, sizeof(DWORD));
594
597
598 return S_OK;
599}
600
601/***********************************************************************
602 * TranslateInfStringA (ADVPACK.@)
603 *
604 * See TranslateInfStringW.
605 */
606HRESULT WINAPI TranslateInfStringA(LPCSTR pszInfFilename, LPCSTR pszInstallSection,
607 LPCSTR pszTranslateSection, LPCSTR pszTranslateKey, LPSTR pszBuffer,
608 DWORD dwBufferSize, PDWORD pdwRequiredSize, PVOID pvReserved)
609{
610 UNICODE_STRING filenameW, installW;
611 UNICODE_STRING translateW, keyW;
612 LPWSTR bufferW;
613 HRESULT res;
614 DWORD len = 0;
615
616 TRACE("(%s, %s, %s, %s, %p, %ld, %p, %p)\n",
617 debugstr_a(pszInfFilename), debugstr_a(pszInstallSection),
618 debugstr_a(pszTranslateSection), debugstr_a(pszTranslateKey),
619 pszBuffer, dwBufferSize,pdwRequiredSize, pvReserved);
620
621 if (!pszInfFilename || !pszTranslateSection ||
622 !pszTranslateKey || !pdwRequiredSize)
623 return E_INVALIDARG;
624
626 RtlCreateUnicodeStringFromAsciiz(&installW, pszInstallSection);
627 RtlCreateUnicodeStringFromAsciiz(&translateW, pszTranslateSection);
628 RtlCreateUnicodeStringFromAsciiz(&keyW, pszTranslateKey);
629
630 res = TranslateInfStringW(filenameW.Buffer, installW.Buffer,
631 translateW.Buffer, keyW.Buffer, NULL,
632 dwBufferSize, &len, NULL);
633
634 if (res == S_OK)
635 {
636 bufferW = malloc(len * sizeof(WCHAR));
637
638 res = TranslateInfStringW(filenameW.Buffer, installW.Buffer,
639 translateW.Buffer, keyW.Buffer, bufferW,
640 len, &len, NULL);
641 if (res == S_OK)
642 {
643 *pdwRequiredSize = WideCharToMultiByte(CP_ACP, 0, bufferW, -1,
644 NULL, 0, NULL, NULL);
645
646 if (dwBufferSize >= *pdwRequiredSize)
647 {
648 WideCharToMultiByte(CP_ACP, 0, bufferW, -1, pszBuffer,
649 dwBufferSize, NULL, NULL);
650 }
651 else
653 }
654
655 free(bufferW);
656 }
657
659 RtlFreeUnicodeString(&installW);
660 RtlFreeUnicodeString(&translateW);
662
663 return res;
664}
665
666/***********************************************************************
667 * TranslateInfStringW (ADVPACK.@)
668 *
669 * Translates the value of a specified key in an inf file into the
670 * current locale by expanding string macros.
671 *
672 * PARAMS
673 * pszInfFilename [I] Filename of the inf file.
674 * pszInstallSection [I]
675 * pszTranslateSection [I] Inf section where the key exists.
676 * pszTranslateKey [I] Key to translate.
677 * pszBuffer [O] Contains the translated string on exit.
678 * dwBufferSize [I] Size on input of pszBuffer.
679 * pdwRequiredSize [O] Length of the translated key.
680 * pvReserved [I] Reserved, must be NULL.
681 *
682 * RETURNS
683 * Success: S_OK.
684 * Failure: An hresult error code.
685 */
686HRESULT WINAPI TranslateInfStringW(LPCWSTR pszInfFilename, LPCWSTR pszInstallSection,
687 LPCWSTR pszTranslateSection, LPCWSTR pszTranslateKey, LPWSTR pszBuffer,
688 DWORD dwBufferSize, PDWORD pdwRequiredSize, PVOID pvReserved)
689{
690 HINF hInf;
691 HRESULT hret = S_OK;
692
693 TRACE("(%s, %s, %s, %s, %p, %ld, %p, %p)\n",
694 debugstr_w(pszInfFilename), debugstr_w(pszInstallSection),
695 debugstr_w(pszTranslateSection), debugstr_w(pszTranslateKey),
696 pszBuffer, dwBufferSize,pdwRequiredSize, pvReserved);
697
698 if (!pszInfFilename || !pszTranslateSection ||
699 !pszTranslateKey || !pdwRequiredSize)
700 return E_INVALIDARG;
701
702 hInf = SetupOpenInfFileW(pszInfFilename, NULL, INF_STYLE_WIN4, NULL);
703 if (hInf == INVALID_HANDLE_VALUE)
705
706 set_ldids(hInf, pszInstallSection, NULL);
707
708 if (!SetupGetLineTextW(NULL, hInf, pszTranslateSection, pszTranslateKey,
709 pszBuffer, dwBufferSize, pdwRequiredSize))
710 {
711 if (dwBufferSize < *pdwRequiredSize)
713 else
715 }
716
717 SetupCloseInfFile(hInf);
718 return hret;
719}
720
721/***********************************************************************
722 * TranslateInfStringExA (ADVPACK.@)
723 *
724 * See TranslateInfStringExW.
725 */
727 LPCSTR pszTranslateSection, LPCSTR pszTranslateKey,
728 LPSTR pszBuffer, DWORD dwBufferSize,
729 PDWORD pdwRequiredSize, PVOID pvReserved)
730{
731 UNICODE_STRING filenameW, sectionW, keyW;
732 LPWSTR bufferW;
733 HRESULT res;
734 DWORD len = 0;
735
736 TRACE("(%p, %s, %s, %s, %p, %ld, %p, %p)\n", hInf, debugstr_a(pszInfFilename),
737 debugstr_a(pszTranslateSection), debugstr_a(pszTranslateKey),
738 pszBuffer, dwBufferSize, pdwRequiredSize, pvReserved);
739
740 if (!pszInfFilename || !pszTranslateSection ||
741 !pszTranslateKey || !pdwRequiredSize)
742 return E_INVALIDARG;
743
745 RtlCreateUnicodeStringFromAsciiz(&sectionW, pszTranslateSection);
746 RtlCreateUnicodeStringFromAsciiz(&keyW, pszTranslateKey);
747
748 res = TranslateInfStringExW(hInf, filenameW.Buffer, sectionW.Buffer,
749 keyW.Buffer, NULL, 0, &len, NULL);
750
751 if (res == S_OK)
752 {
753 bufferW = malloc(len * sizeof(WCHAR));
754
755 res = TranslateInfStringExW(hInf, filenameW.Buffer, sectionW.Buffer,
756 keyW.Buffer, bufferW, len, &len, NULL);
757
758 if (res == S_OK)
759 {
760 *pdwRequiredSize = WideCharToMultiByte(CP_ACP, 0, bufferW, -1,
761 NULL, 0, NULL, NULL);
762
763 if (dwBufferSize >= *pdwRequiredSize)
764 {
765 WideCharToMultiByte(CP_ACP, 0, bufferW, -1, pszBuffer,
766 dwBufferSize, NULL, NULL);
767 }
768 else
770 }
771
772 free(bufferW);
773 }
774
776 RtlFreeUnicodeString(&sectionW);
778
779 return res;
780}
781
782/***********************************************************************
783 * TranslateInfStringExW (ADVPACK.@)
784 *
785 * Using a handle to an INF file opened with OpenINFEngine, translates
786 * the value of a specified key in an inf file into the current locale
787 * by expanding string macros.
788 *
789 * PARAMS
790 * hInf [I] Handle to the INF file.
791 * pszInfFilename [I] Filename of the INF file.
792 * pszTranslateSection [I] Inf section where the key exists.
793 * pszTranslateKey [I] Key to translate.
794 * pszBuffer [O] Contains the translated string on exit.
795 * dwBufferSize [I] Size on input of pszBuffer.
796 * pdwRequiredSize [O] Length of the translated key.
797 * pvReserved [I] Reserved. Must be NULL.
798 *
799 * RETURNS
800 * Success: S_OK.
801 * Failure: E_FAIL.
802 *
803 * NOTES
804 * To use TranslateInfStringEx to translate an INF file continuously,
805 * open the INF file with OpenINFEngine, call TranslateInfStringEx as
806 * many times as needed, then release the handle with CloseINFEngine.
807 * When translating more than one keys, this method is more efficient
808 * than calling TranslateInfString, because the INF file is only
809 * opened once.
810 */
812 LPCWSTR pszTranslateSection, LPCWSTR pszTranslateKey,
813 LPWSTR pszBuffer, DWORD dwBufferSize,
814 PDWORD pdwRequiredSize, PVOID pvReserved)
815{
816 TRACE("(%p, %s, %s, %s, %p, %ld, %p, %p)\n", hInf, debugstr_w(pszInfFilename),
817 debugstr_w(pszTranslateSection), debugstr_w(pszTranslateKey),
818 pszBuffer, dwBufferSize, pdwRequiredSize, pvReserved);
819
820 if (!hInf || !pszInfFilename || !pszTranslateSection || !pszTranslateKey)
821 return E_INVALIDARG;
822
823 if (!SetupGetLineTextW(NULL, hInf, pszTranslateSection, pszTranslateKey,
824 pszBuffer, dwBufferSize, pdwRequiredSize))
825 {
826 if (dwBufferSize < *pdwRequiredSize)
828
830 }
831
832 return S_OK;
833}
834
835/***********************************************************************
836 * UserInstStubWrapperA (ADVPACK.@)
837 *
838 * See UserInstStubWrapperW.
839 */
841 LPSTR pszParms, INT nShow)
842{
843 UNICODE_STRING parmsW;
844 HRESULT res;
845
846 TRACE("(%p, %p, %s, %i)\n", hWnd, hInstance, debugstr_a(pszParms), nShow);
847
848 if (!pszParms)
849 return E_INVALIDARG;
850
851 RtlCreateUnicodeStringFromAsciiz(&parmsW, pszParms);
852
853 res = UserInstStubWrapperW(hWnd, hInstance, parmsW.Buffer, nShow);
854
855 RtlFreeUnicodeString(&parmsW);
856
857 return res;
858}
859
860/***********************************************************************
861 * UserInstStubWrapperW (ADVPACK.@)
862 *
863 * Launches the user stub wrapper specified by the RealStubPath
864 * registry value under Installed Components\szParms.
865 *
866 * PARAMS
867 * hWnd [I] Handle to the window used for the display.
868 * hInstance [I] Instance of the process.
869 * szParms [I] The GUID of the installation.
870 * show [I] How the window should be shown.
871 *
872 * RETURNS
873 * Success: S_OK.
874 * Failure: E_FAIL.
875 *
876 * TODO
877 * If the type of the StubRealPath value is REG_EXPAND_SZ, then
878 * we should call ExpandEnvironmentStrings on the value and
879 * launch the result.
880 */
882 LPWSTR pszParms, INT nShow)
883{
884 HKEY setup, guid;
886 DWORD size = sizeof(stub);
887 HRESULT hr = S_OK;
888 BOOL res;
889
890 TRACE("(%p, %p, %s, %i)\n", hWnd, hInstance, debugstr_w(pszParms), nShow);
891
892 if (!pszParms || !*pszParms)
893 return E_INVALIDARG;
894
896 {
897 return E_FAIL;
898 }
899
900 if (RegOpenKeyExW(setup, pszParms, 0, KEY_READ, &guid))
901 {
903 return E_FAIL;
904 }
905
906 res = RegQueryValueExW(guid, L"RealStubPath", NULL, NULL, (BYTE *)stub, &size);
907 if (res || !*stub)
908 goto done;
909
910 /* launch the user stub wrapper */
912
913done:
916
917 return hr;
918}
919
920/***********************************************************************
921 * UserUnInstStubWrapperA (ADVPACK.@)
922 *
923 * See UserUnInstStubWrapperW.
924 */
926 LPSTR pszParms, INT nShow)
927{
928 UNICODE_STRING parmsW;
929 HRESULT res;
930
931 TRACE("(%p, %p, %s, %i)\n", hWnd, hInstance, debugstr_a(pszParms), nShow);
932
933 if (!pszParms)
934 return E_INVALIDARG;
935
936 RtlCreateUnicodeStringFromAsciiz(&parmsW, pszParms);
937
939
940 RtlFreeUnicodeString(&parmsW);
941
942 return res;
943}
944
945/***********************************************************************
946 * UserUnInstStubWrapperW (ADVPACK.@)
947 */
949 LPWSTR pszParms, INT nShow)
950{
951 FIXME("(%p, %p, %s, %i): stub\n", hWnd, hInstance, debugstr_w(pszParms), nShow);
952
953 return E_FAIL;
954}
LPWSTR get_parameter(LPWSTR *params, WCHAR separator, BOOL quoted)
Definition: install.c:178
HRESULT launch_exe(LPCWSTR cmd, LPCWSTR dir, HANDLE *phEXE)
Definition: install.c:850
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
#define FIXME(fmt,...)
Definition: precomp.h:53
#define RegCloseKey(hKey)
Definition: registry.h:49
struct _root root
HINSTANCE hInstance
Definition: charmap.c:19
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
BOOL WINAPI SetupSetDirectoryIdW(HINF hinf, DWORD id, PCWSTR dir)
Definition: dirid.c:256
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3268
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
BOOL WINAPI GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength)
Definition: security.c:411
BOOL WINAPI OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle)
Definition: security.c:294
BOOL WINAPI AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD nSubAuthority0, DWORD nSubAuthority1, DWORD nSubAuthority2, DWORD nSubAuthority3, DWORD nSubAuthority4, DWORD nSubAuthority5, DWORD nSubAuthority6, DWORD nSubAuthority7, PSID *pSid)
Definition: security.c:674
PVOID WINAPI FreeSid(PSID pSid)
Definition: security.c:698
BOOL WINAPI EqualSid(PSID pSid1, PSID pSid2)
Definition: security.c:829
HRESULT WINAPI CloseINFEngine(HINF hInf)
Definition: advpack.c:184
HRESULT WINAPI TranslateInfStringA(LPCSTR pszInfFilename, LPCSTR pszInstallSection, LPCSTR pszTranslateSection, LPCSTR pszTranslateKey, LPSTR pszBuffer, DWORD dwBufferSize, PDWORD pdwRequiredSize, PVOID pvReserved)
Definition: advpack.c:606
#define PREFIX_LEN
Definition: advpack.c:41
HRESULT WINAPI RegisterOCX(HWND hWnd, HINSTANCE hInst, LPCSTR cmdline, INT show)
Definition: advpack.c:465
HRESULT do_ocx_reg(HMODULE hocx, BOOL do_reg, const WCHAR *flags, const WCHAR *param)
Definition: advpack.c:427
HRESULT WINAPI SetPerUserSecValuesA(PERUSERSECTIONA *pPerUser)
Definition: advpack.c:506
HRESULT WINAPI RebootCheckOnInstallA(HWND hWnd, LPCSTR pszINF, LPCSTR pszSec, DWORD dwReserved)
Definition: advpack.c:371
HRESULT WINAPI TranslateInfStringW(LPCWSTR pszInfFilename, LPCWSTR pszInstallSection, LPCWSTR pszTranslateSection, LPCWSTR pszTranslateKey, LPWSTR pszBuffer, DWORD dwBufferSize, PDWORD pdwRequiredSize, PVOID pvReserved)
Definition: advpack.c:686
HRESULT(WINAPI * DLLREGISTER)(void)
Definition: advpack.c:38
BOOL WINAPI NeedReboot(DWORD dwRebootCheck)
Definition: advpack.c:296
void set_ldids(HINF hInf, LPCWSTR pszInstallSection, LPCWSTR pszWorkingDir)
Definition: advpack.c:100
HRESULT WINAPI TranslateInfStringExW(HINF hInf, LPCWSTR pszInfFilename, LPCWSTR pszTranslateSection, LPCWSTR pszTranslateKey, LPWSTR pszBuffer, DWORD dwBufferSize, PDWORD pdwRequiredSize, PVOID pvReserved)
Definition: advpack.c:811
HRESULT WINAPI RebootCheckOnInstallW(HWND hWnd, LPCWSTR pszINF, LPCWSTR pszSec, DWORD dwReserved)
Definition: advpack.c:417
#define MAX_FIELD_LENGTH
Definition: advpack.c:40
HRESULT WINAPI TranslateInfStringExA(HINF hInf, LPCSTR pszInfFilename, LPCSTR pszTranslateSection, LPCSTR pszTranslateKey, LPSTR pszBuffer, DWORD dwBufferSize, PDWORD pdwRequiredSize, PVOID pvReserved)
Definition: advpack.c:726
HRESULT WINAPI UserInstStubWrapperW(HWND hWnd, HINSTANCE hInstance, LPWSTR pszParms, INT nShow)
Definition: advpack.c:881
static const WCHAR setup_key[]
Definition: advpack.c:44
HRESULT WINAPI UserUnInstStubWrapperA(HWND hWnd, HINSTANCE hInstance, LPSTR pszParms, INT nShow)
Definition: advpack.c:925
HRESULT WINAPI OpenINFEngineA(LPCSTR pszInfFilename, LPCSTR pszInstallSection, DWORD dwFlags, HINF *phInf, PVOID pvReserved)
Definition: advpack.c:307
HRESULT WINAPI OpenINFEngineW(LPCWSTR pszInfFilename, LPCWSTR pszInstallSection, DWORD dwFlags, HINF *phInf, PVOID pvReserved)
Definition: advpack.c:348
HRESULT WINAPI UserUnInstStubWrapperW(HWND hWnd, HINSTANCE hInstance, LPWSTR pszParms, INT nShow)
Definition: advpack.c:948
static void get_dest_dir(HINF hInf, PCWSTR pszSection, PWSTR pszBuffer, DWORD dwSize)
Definition: advpack.c:62
HRESULT WINAPI UserInstStubWrapperA(HWND hWnd, HINSTANCE hInstance, LPSTR pszParms, INT nShow)
Definition: advpack.c:840
HRESULT WINAPI SetPerUserSecValuesW(PERUSERSECTIONW *pPerUser)
Definition: advpack.c:540
static void strip_quotes(WCHAR *buffer, DWORD *size)
Definition: advpack.c:47
DWORD WINAPI NeedRebootInit(VOID)
Definition: advpack.c:276
BOOL WINAPI IsNTAdmin(DWORD reserved, LPDWORD pReserved)
Definition: advpack.c:207
#define CloseHandle
Definition: compat.h:739
#define wcschr
Definition: compat.h:17
#define CP_ACP
Definition: compat.h:109
#define GetProcAddress(x, y)
Definition: compat.h:753
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define FreeLibrary(x)
Definition: compat.h:748
#define GetCurrentProcess()
Definition: compat.h:759
#define MAX_PATH
Definition: compat.h:34
#define WideCharToMultiByte
Definition: compat.h:111
#define MultiByteToWideChar
Definition: compat.h:110
#define lstrcpynW
Definition: compat.h:738
#define lstrlenW
Definition: compat.h:750
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
Definition: loader.c:288
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4171
GUID guid
Definition: version.c:147
_ACRTIMP __msvcrt_long __cdecl wcstol(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2752
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
HINF WINAPI SetupOpenInfFileW(PCWSTR name, PCWSTR class, DWORD style, UINT *error)
Definition: parser.c:1229
BOOL WINAPI SetupGetLineTextW(PINFCONTEXT context, HINF hinf, PCWSTR section_name, PCWSTR key_name, PWSTR buffer, DWORD size, PDWORD required)
Definition: parser.c:1763
#define L(x)
Definition: resources.c:13
r reserved
Definition: btrfs.c:3006
HINSTANCE hInst
Definition: dxdiag.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint res
Definition: glext.h:9613
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLbitfield flags
Definition: glext.h:7161
GLfloat param
Definition: glext.h:5796
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define INF_STYLE_WIN4
Definition: infsupp.h:43
#define S_OK
Definition: intsafe.h:52
#define debugstr_a
Definition: kernel32.h:31
#define debugstr_w
Definition: kernel32.h:32
#define REG_SZ
Definition: layer.c:22
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static PVOID ptr
Definition: dispmode.c:27
static PSID pSid
Definition: security.c:85
static const WCHAR filenameW[]
Definition: amstream.c:41
static LPCWSTR LPVOID pvReserved
Definition: asmcache.c:749
static char * dest
Definition: rtl.c:149
static BOOL setup(void)
Definition: enum_files.c:97
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz(_Out_ PUNICODE_STRING Destination, _In_ PCSZ Source)
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
_Out_ PVOID pReserved
Definition: netsh.h:77
#define KEY_ALL_ACCESS
Definition: nt_native.h:1044
#define KEY_READ
Definition: nt_native.h:1026
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define KEY_WRITE
Definition: nt_native.h:1034
short WCHAR
Definition: pedump.c:58
DWORD * PDWORD
Definition: pedump.c:68
#define REG_DWORD
Definition: sdbapi.c:615
#define TRACE(s)
Definition: solgame.cpp:4
TCHAR * cmdline
Definition: stretchblt.cpp:32
CHAR szVersion[32]
Definition: advpub.h:59
CHAR szDispName[128]
Definition: advpub.h:56
DWORD dwIsInstalled
Definition: advpub.h:61
CHAR szCompID[128]
Definition: advpub.h:60
CHAR szGUID[39+20]
Definition: advpub.h:55
CHAR szStub[MAX_PATH *4]
Definition: advpub.h:58
CHAR szLocale[10]
Definition: advpub.h:57
BOOL bRollback
Definition: advpub.h:62
WCHAR szStub[MAX_PATH *4]
Definition: advpub.h:70
BOOL bRollback
Definition: advpub.h:74
DWORD dwIsInstalled
Definition: advpub.h:73
WCHAR szLocale[10]
Definition: advpub.h:69
WCHAR szGUID[39+20]
Definition: advpub.h:67
WCHAR szVersion[32]
Definition: advpub.h:71
WCHAR szDispName[128]
Definition: advpub.h:68
WCHAR szCompID[128]
Definition: advpub.h:72
SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY]
Definition: setypes.h:1030
$ULONG GroupCount
Definition: setypes.h:1026
Definition: stubgen.c:11
Definition: http.c:7252
Definition: parser.c:44
Definition: copy.c:22
Definition: parser.c:49
struct _stub stub
Character const *const prefix
Definition: tempnam.cpp:195
uint16_t * PWSTR
Definition: typedefs.h:56
const char * LPCSTR
Definition: typedefs.h:52
const uint16_t * PCWSTR
Definition: typedefs.h:57
const uint16_t * LPCWSTR
Definition: typedefs.h:57
unsigned char * LPBYTE
Definition: typedefs.h:53
uint16_t * LPWSTR
Definition: typedefs.h:56
uint32_t * LPDWORD
Definition: typedefs.h:59
char * LPSTR
Definition: typedefs.h:51
int32_t INT
Definition: typedefs.h:58
Definition: pdh_main.c:96
BOOL WINAPI SetupGetStringFieldW(IN PINFCONTEXT Context, IN ULONG FieldIndex, OUT PWSTR ReturnBuffer, IN ULONG ReturnBufferSize, OUT PULONG RequiredSize)
Definition: infsupp.c:186
BOOL WINAPI SetupFindFirstLineW(IN HINF InfHandle, IN PCWSTR Section, IN PCWSTR Key, IN OUT PINFCONTEXT Context)
Definition: infsupp.c:56
BOOL WINAPI SetupFindNextLine(IN PINFCONTEXT ContextIn, OUT PINFCONTEXT ContextOut)
Definition: infsupp.c:82
VOID WINAPI SetupCloseInfFile(IN HINF InfHandle)
Definition: infsupp.c:45
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define LOAD_WITH_ALTERED_SEARCH_PATH
Definition: winbase.h:340
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define E_NOT_SUFFICIENT_BUFFER
Definition: winerror.h:3437
#define SPAPI_E_LINE_NOT_FOUND
Definition: winerror.h:4677
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define SECURITY_BUILTIN_DOMAIN_RID
Definition: setypes.h:581
#define TOKEN_QUERY
Definition: setypes.h:940
#define SECURITY_NT_AUTHORITY
Definition: setypes.h:554
@ TokenGroups
Definition: setypes.h:979
#define DOMAIN_ALIAS_RID_ADMINS
Definition: setypes.h:652
unsigned char BYTE
Definition: xxhash.c:193