ReactOS 0.4.17-dev-301-g9127a53
main.c
Go to the documentation of this file.
1/*
2 * Copyright 2008 Juan Lang
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#include <stdarg.h>
20#include <wchar.h>
21
22#define COBJMACROS
23#include "windef.h"
24#include "winbase.h"
25#include "winnls.h"
26#include "winuser.h"
27#include "softpub.h"
28#include "wingdi.h"
29#include "richedit.h"
30#include "ole2.h"
31#include "richole.h"
32#include "commdlg.h"
33#include "commctrl.h"
34#include "cryptuiapi.h"
35#include "cryptuires.h"
36#include "urlmon.h"
37#include "hlink.h"
38#include "winreg.h"
39#include "wine/debug.h"
40
42
44
45static const WCHAR empty[] = {0};
46
48{
49 TRACE("(0x%p, %ld, %p)\n", hinstDLL, fdwReason, lpvReserved);
50
51 switch (fdwReason)
52 {
54 hInstance = hinstDLL;
56 break;
57 }
58 return TRUE;
59}
60
61static WCHAR *strdupAtoW( const char *str )
62{
63 DWORD len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );
64 WCHAR *ret = malloc( len * sizeof(WCHAR) );
65 if (ret) MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len );
66 return ret;
67}
68
69#define MAX_STRING_LEN 512
70
72{
74 RECT rc;
77
79 GetWindowRect(lv, &rc);
82 column.cx = (rc.right - rc.left) * 29 / 100 - 2;
83 column.pszText = buf;
87 column.cx = (rc.right - rc.left) * 16 / 100 - 2;
90 column.cx = (rc.right - rc.left) * 23 / 100 - 1;
93}
94
95static void add_cert_to_view(HWND lv, PCCERT_CONTEXT cert, DWORD *allocatedLen,
96 LPWSTR *str)
97{
98 DWORD len;
100 WCHAR dateFmt[80]; /* sufficient for LOCALE_SSHORTDATE */
101 WCHAR date[80];
102 SYSTEMTIME sysTime;
103 LPWSTR none;
104
106 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
107 item.iSubItem = 0;
108 item.iImage = 0;
111 NULL, 0);
112 if (len > *allocatedLen)
113 {
114 free(*str);
115 *str = malloc(len * sizeof(WCHAR));
116 if (*str)
117 *allocatedLen = len;
118 }
119 if (*str)
120 {
122 *str, len);
123 item.pszText = *str;
125 }
126
127 item.mask = LVIF_TEXT;
130 if (len > *allocatedLen)
131 {
132 free(*str);
133 *str = malloc(len * sizeof(WCHAR));
134 if (*str)
135 *allocatedLen = len;
136 }
137 if (*str)
138 {
141 item.pszText = *str;
142 item.iSubItem = 1;
144 }
145
147 FileTimeToSystemTime(&cert->pCertInfo->NotAfter, &sysTime);
148 GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, dateFmt, date, ARRAY_SIZE(date));
149 item.pszText = date;
150 item.iSubItem = 2;
152
154 NULL, &len))
156 if (len > *allocatedLen)
157 {
158 free(*str);
159 *str = malloc(len * sizeof(WCHAR));
160 if (*str)
161 *allocatedLen = len;
162 }
163 if (*str)
164 {
166 *str, &len))
167 item.pszText = none;
168 else
169 item.pszText = *str;
170 item.iSubItem = 3;
172 }
173}
174
176{
177 static const WCHAR keyName[] = { 'S','o','f','t','w','a','r','e','\\','M',
178 'i','c','r','o','s','o','f','t','\\','C','r','y','p','t','o','g','r','a',
179 'p','h','y','\\','U','I','\\','C','e','r','t','m','g','r','\\','P','u',
180 'r','p','o','s','e',0 };
181 LPSTR str = NULL;
182 HKEY key;
183
184 if (!RegCreateKeyExW(HKEY_CURRENT_USER, keyName, 0, NULL, 0, KEY_READ,
185 NULL, &key, NULL))
186 {
187 LONG rc;
188 DWORD type, size;
189
190 rc = RegQueryValueExA(key, "Purpose", NULL, &type, NULL, &size);
191 if ((!rc || rc == ERROR_MORE_DATA) && type == REG_SZ)
192 {
193 str = malloc(size);
194 if (str)
195 {
196 rc = RegQueryValueExA(key, "Purpose", NULL, NULL, (LPBYTE)str,
197 &size);
198 if (rc)
199 {
200 free(str);
201 str = NULL;
202 }
203 }
204 }
206 }
207 return str;
208}
209
210typedef enum {
215
217{
221 int index;
222
230 if ((usages = get_cert_mgr_usages()))
231 {
232 LPSTR ptr, comma;
233
234 for (ptr = usages, comma = strchr(ptr, ','); ptr && *ptr;
235 ptr = comma ? comma + 1 : NULL,
236 comma = ptr ? strchr(ptr, ',') : NULL)
237 {
239
240 if (comma)
241 *comma = 0;
243 {
245 (LPARAM)info->pwszName);
247 }
248 }
249 free(usages);
250 }
251}
252
255
257{
258 usage->rgpszUsageIdentifier = realloc(usage->rgpszUsageIdentifier,
259 (usage->cUsageIdentifier + 1) * sizeof(char *));
260 if (usage->rgpszUsageIdentifier)
261 usage->rgpszUsageIdentifier[usage->cUsageIdentifier++] = oid;
262 else
263 {
264 free(usage);
265 usage = NULL;
266 }
267 return usage;
268}
269
271{
273
274 if (usage)
275 {
276 LPSTR ptr, comma;
277
278 for (ptr = usageStr, comma = strchr(ptr, ','); usage && ptr && *ptr;
279 ptr = comma ? comma + 1 : NULL,
280 comma = ptr ? strchr(ptr, ',') : NULL)
281 {
282 if (comma)
283 *comma = 0;
285 }
286 }
287 return usage;
288}
289
291{
292 CERT_ENHKEY_USAGE *advancedUsage = calloc(1, sizeof(CERT_ENHKEY_USAGE));
293
294 if (advancedUsage)
295 {
297
299 {
300 LPSTR disabledUsagesStr;
301
302 if ((disabledUsagesStr = get_cert_mgr_usages()))
303 {
304 CERT_ENHKEY_USAGE *disabledUsages =
305 convert_usages_str_to_usage(disabledUsagesStr);
306
307 if (disabledUsages)
308 {
310
311 for (ptr = usages; advancedUsage && *ptr; ptr++)
312 {
313 DWORD i;
314 BOOL disabled = FALSE;
315
316 for (i = 0; !disabled &&
317 i < disabledUsages->cUsageIdentifier; i++)
318 if (!strcmp(disabledUsages->rgpszUsageIdentifier[i],
319 (*ptr)->pszOID))
320 disabled = TRUE;
321 if (!disabled)
322 advancedUsage = add_oid_to_usage(advancedUsage,
323 (LPSTR)(*ptr)->pszOID);
324 }
325 /* The individual strings are pointers to disabledUsagesStr,
326 * so they're freed when it is.
327 */
328 free(disabledUsages->rgpszUsageIdentifier);
329 free(disabledUsages);
330 }
331 free(disabledUsagesStr);
332 }
334 }
335 }
336 return advancedUsage;
337}
338
339static int CALLBACK cert_mgr_sort_by_subject(LPARAM lp1, LPARAM lp2, LPARAM lp);
340
342{
346 DWORD allocatedLen = 0;
347 LPWSTR str = NULL;
348 int index;
350 LPCSTR oid = NULL;
351 CERT_ENHKEY_USAGE *advanced = NULL;
352
354 if (index >= 0)
355 {
357
358 if (!HIWORD(data))
359 filter = data;
360 else
361 {
363
365 oid = info->pszOID;
366 }
367 }
369 advanced = create_advanced_filter();
370 do {
372 if (cert)
373 {
374 BOOL show = FALSE;
375
377 show = TRUE;
378 else
379 {
380 int numOIDs;
381 DWORD cbOIDs = 0;
382
383 if (CertGetValidUsages(1, &cert, &numOIDs, NULL, &cbOIDs))
384 {
385 if (numOIDs == -1)
386 {
387 /* -1 implies all usages are valid */
388 show = TRUE;
389 }
390 else
391 {
392 char **oids = malloc(cbOIDs);
393
394 if (oids)
395 {
396 if (CertGetValidUsages(1, &cert, &numOIDs, oids,
397 &cbOIDs))
398 {
399 int i;
400
402 {
403 for (i = 0; !show && i < numOIDs; i++)
404 if (!strcmp(oids[i], oid))
405 show = TRUE;
406 }
407 else
408 {
409 for (i = 0; !show && i < numOIDs; i++)
410 {
411 DWORD j;
412
413 for (j = 0; !show &&
414 j < advanced->cUsageIdentifier; j++)
415 if (!strcmp(oids[i],
416 advanced->rgpszUsageIdentifier[j]))
417 show = TRUE;
418 }
419 }
420 }
421 free(oids);
422 }
423 }
424 }
425 }
426 if (show)
427 add_cert_to_view(lv, cert, &allocatedLen, &str);
428 }
429 } while (cert);
430 free(str);
431 if (advanced)
432 {
433 free(advanced->rgpszUsageIdentifier);
434 free(advanced);
435 }
438}
439
440static const WCHAR my[] = { 'M','y',0 };
441static const WCHAR addressBook[] = {
442 'A','d','d','r','e','s','s','B','o','o','k',0 };
443static const WCHAR ca[] = { 'C','A',0 };
444static const WCHAR root[] = { 'R','o','o','t',0 };
445static const WCHAR trustedPublisher[] = {
446 'T','r','u','s','t','e','d','P','u','b','l','i','s','h','e','r',0 };
447static const WCHAR disallowed[] = { 'D','i','s','a','l','l','o','w','e','d',0 };
448
450{
454};
455
456static const struct CertMgrStoreInfo defaultStoreList[] = {
465};
466
467static const struct CertMgrStoreInfo publisherStoreList[] = {
472};
473
475{
480};
481
483{
484 const struct CertMgrStoreInfo *storeList;
485 int cStores, i;
487
489 {
490 storeList = publisherStoreList;
492 }
493 else
494 {
495 storeList = defaultStoreList;
496 cStores = ARRAY_SIZE(defaultStoreList);
497 }
499 cStores = 1;
500 data->nStores = cStores;
501 data->stores = storeList;
502 for (i = 0; i < cStores; i++)
503 {
506 HCERTSTORE store;
507
508 if (!(name = CryptFindLocalizedName(storeList[i].name)))
509 name = storeList[i].name;
512 item.mask = TCIF_TEXT | TCIF_PARAM;
513 item.pszText = (LPWSTR)name;
514 item.lParam = (LPARAM)store;
516 }
517}
518
519static void free_certs(HWND lv)
520{
522 int items = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0), i;
523
524 for (i = 0; i < items; i++)
525 {
526 item.mask = LVIF_PARAM;
527 item.iItem = i;
528 item.iSubItem = 0;
531 }
532}
533
535{
537
538 item.mask = TCIF_PARAM;
540 return (HCERTSTORE)item.lParam;
541}
542
544{
546
548}
549
551{
552 int i, tabs = SendMessageW(tab, TCM_GETITEMCOUNT, 0, 0);
553
554 for (i = 0; i < tabs; i++)
556}
557
559{
561
562 free_certs(lv);
565}
566
567typedef enum {
573
576{
578
581 item.stateMask = LVIS_STATEIMAGEMASK;
582 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
583 item.iSubItem = 0;
584 item.lParam = (LPARAM)info;
585 item.pszText = (LPWSTR)info->pwszName;
587}
588
590{
592
594 {
596
597 for (ptr = usages; *ptr; ptr++)
600 }
601}
602
603static void toggle_usage(HWND hwnd, int iItem)
604{
606 int res;
608
609 item.mask = LVIF_STATE;
610 item.iItem = iItem;
611 item.iSubItem = 0;
612 item.stateMask = LVIS_STATEIMAGEMASK;
614 if (res)
615 {
616 int state = item.state >> 12;
617
622 }
623}
624
626{
630
631 if (oidInfo)
632 {
633 LVFINDINFOW findInfo;
634
635 findInfo.flags = LVFI_PARAM;
636 findInfo.lParam = (LPARAM)oidInfo;
637 ret = SendMessageW(lv, LVM_FINDITEMW, -1, (LPARAM)&findInfo);
638 }
639 else
640 {
641 LVFINDINFOA findInfo;
642
643 findInfo.flags = LVFI_STRING;
644 findInfo.psz = oid;
645 ret = SendMessageW(lv, LVM_FINDITEMA, -1, (LPARAM)&findInfo);
646 }
647 return ret;
648}
649
651{
652 static const WCHAR keyName[] = { 'S','o','f','t','w','a','r','e','\\','M',
653 'i','c','r','o','s','o','f','t','\\','C','r','y','p','t','o','g','r','a',
654 'p','h','y','\\','U','I','\\','C','e','r','t','m','g','r','\\','P','u',
655 'r','p','o','s','e',0 };
656 HKEY key;
658 int purposes = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0), i;
660 LPSTR str = NULL;
661
662 item.mask = LVIF_STATE | LVIF_PARAM;
663 item.iSubItem = 0;
664 item.stateMask = LVIS_STATEIMAGEMASK;
665 for (i = 0; i < purposes; i++)
666 {
667 item.iItem = i;
668 if (SendMessageW(lv, LVM_GETITEMW, 0, (LPARAM)&item))
669 {
670 int state = item.state >> 12;
671
673 {
675 BOOL firstString = TRUE;
676
677 if (!str)
678 str = malloc(strlen(info->pszOID) + 1);
679 else
680 {
681 str = realloc(str, strlen(str) + 1 + strlen(info->pszOID) + 1);
682 firstString = FALSE;
683 }
684 if (str)
685 {
686 LPSTR ptr = firstString ? str : str + strlen(str);
687
688 if (!firstString)
689 *ptr++ = ',';
690 strcpy(ptr, info->pszOID);
691 }
692 }
693 }
694 }
696 NULL, &key, NULL))
697 {
698 if (str)
699 RegSetValueExA(key, "Purpose", 0, REG_SZ, (const BYTE *)str,
700 strlen(str) + 1);
701 else
702 RegDeleteValueA(key, "Purpose");
704 }
705 free(str);
706}
707
709 WPARAM wp, LPARAM lp)
710{
711 switch (msg)
712 {
713 case WM_INITDIALOG:
714 {
715 RECT rc;
718 HIMAGELIST imageList;
719 LPSTR disabledUsages;
720
721 GetWindowRect(lv, &rc);
722 column.mask = LVCF_WIDTH;
723 column.cx = rc.right - rc.left;
725 imageList = ImageList_Create(16, 16, ILC_COLOR4 | ILC_MASK, 4, 0);
726 if (imageList)
727 {
728 HBITMAP bmp;
729 COLORREF backColor = RGB(255, 0, 255);
730
732 ImageList_AddMasked(imageList, bmp, backColor);
734 ImageList_SetBkColor(imageList, CLR_NONE);
737 }
739 if ((disabledUsages = get_cert_mgr_usages()))
740 {
741 LPSTR ptr, comma;
742
743 for (ptr = disabledUsages, comma = strchr(ptr, ','); ptr && *ptr;
744 ptr = comma ? comma + 1 : NULL,
745 comma = ptr ? strchr(ptr, ',') : NULL)
746 {
748
749 if (comma)
750 *comma = 0;
751 if ((index = find_oid_in_list(lv, ptr)) != -1)
753 }
754 free(disabledUsages);
755 }
756 break;
757 }
758 case WM_NOTIFY:
759 {
760 NMHDR *hdr = (NMHDR *)lp;
761 NMITEMACTIVATE *nm;
762
763 switch (hdr->code)
764 {
765 case NM_CLICK:
766 nm = (NMITEMACTIVATE *)lp;
767 toggle_usage(hwnd, nm->iItem);
769 break;
770 }
771 break;
772 }
773 case WM_COMMAND:
774 switch (wp)
775 {
776 case IDOK:
778#ifndef __REACTOS__
780#endif
782 break;
783 case IDCANCEL:
784#ifndef __REACTOS__
786#endif
788 break;
789 }
790 break;
791 }
792 return 0;
793}
794
796{
801 (LPARAM)empty);
803}
804
806{
809
810 item.mask = LVIF_PARAM;
811 item.iItem = index;
812 item.iSubItem = 0;
814 (LPARAM)&item))
815 cert = (PCCERT_CONTEXT)item.lParam;
816 return cert;
817}
818
820{
822
823 if (cert)
824 {
826
827 memset(&viewInfo, 0, sizeof(viewInfo));
828 viewInfo.dwSize = sizeof(viewInfo);
829 viewInfo.hwndParent = hwnd;
830 viewInfo.pCertContext = cert;
831 /* FIXME: this should be modal */
833 }
834}
835
837{
839 DWORD size;
840
841 /* Get enhanced key usage. Have to check for a property and an extension
842 * separately, because CertGetEnhancedKeyUsage will succeed and return an
843 * empty usage if neither is set. Unfortunately an empty usage implies
844 * no usage is allowed, so we have to distinguish between the two cases.
845 */
847 NULL, &size))
848 {
849 usage = malloc(size);
852 {
853 free(usage);
854 usage = NULL;
855 }
856 }
858 NULL, &size))
859 {
860 usage = malloc(size);
863 {
864 free(usage);
865 usage = NULL;
866 }
867 }
868 else
869 usage = NULL;
870 if (usage)
871 {
872 if (usage->cUsageIdentifier)
873 {
874 static const WCHAR commaSpace[] = { ',',' ',0 };
875 DWORD i, len = 1;
876 LPWSTR ptr;
877
878 for (i = 0; i < usage->cUsageIdentifier; i++)
879 {
882 usage->rgpszUsageIdentifier[i],
884
885 if (info)
886 len += lstrlenW(info->pwszName);
887 else
888 len += strlen(usage->rgpszUsageIdentifier[i]);
889 if (i < usage->cUsageIdentifier - 1)
891 }
892 *str = malloc(len * sizeof(WCHAR));
893 if (*str)
894 {
895 for (i = 0, ptr = *str; i < usage->cUsageIdentifier; i++)
896 {
899 usage->rgpszUsageIdentifier[i],
901
902 if (info)
903 {
904 lstrcpyW(ptr, info->pwszName);
905 ptr += lstrlenW(info->pwszName);
906 }
907 else
908 {
909 LPCSTR src = usage->rgpszUsageIdentifier[i];
910
911 for (; *src; ptr++, src++)
912 *ptr = *src;
913 *ptr = 0;
914 }
915 if (i < usage->cUsageIdentifier - 1)
916 {
919 }
920 }
921 *ptr = 0;
922 }
923 free(usage);
924 }
925 else
926 {
927 size = MAX_STRING_LEN * sizeof(WCHAR);
928 *str = malloc(size);
929 if (*str)
931 }
932 }
933 else
934 {
935 size = MAX_STRING_LEN * sizeof(WCHAR);
936 *str = malloc(size);
937 if (*str)
939 }
940}
941
943{
946 LPWSTR str = NULL;
947
949 if (str)
950 {
952 free(str);
953 }
954}
955
957{
959 TCM_GETCURSEL, 0, 0);
960 struct CertMgrData *data =
962
963 if (tabIndex < data->nStores)
964 {
967 LPCWSTR pTitle;
968 int warningID;
969
970 if (SendMessageW(lv, LVM_GETSELECTEDCOUNT, 0, 0) > 1)
971 warningID = data->stores[tabIndex].removePluralWarning;
972 else
973 warningID = data->stores[tabIndex].removeWarning;
974 if (data->title)
975 pTitle = data->title;
976 else
977 {
979 pTitle = title;
980 }
982 if (MessageBoxW(hwnd, warning, pTitle, MB_YESNO) == IDYES)
983 {
984 int selection = -1;
985
986 do {
989 if (selection >= 0)
990 {
992 selection);
993
995 }
996 } while (selection >= 0);
998 }
999 }
1000}
1001
1003{
1005 int selectionCount = SendMessageW(lv, LVM_GETSELECTEDCOUNT, 0, 0);
1006
1007 if (selectionCount == 1)
1008 {
1011
1012 if (selection >= 0)
1013 {
1015
1016 if (cert)
1017 {
1019
1020 info.dwSize = sizeof(info);
1021 info.pwszExportFileName = NULL;
1022 info.dwSubjectChoice = CRYPTUI_WIZ_EXPORT_CERT_CONTEXT;
1023 info.pCertContext = cert;
1024 info.cStores = 0;
1026 }
1027 }
1028 }
1029 else if (selectionCount > 1)
1030 {
1033
1034 if (store)
1035 {
1037 int selection = -1;
1038
1039 info.dwSize = sizeof(info);
1040 info.pwszExportFileName = NULL;
1041 info.dwSubjectChoice =
1043 info.hCertStore = store;
1044 info.cStores = 0;
1045 do {
1048 if (selection >= 0)
1049 {
1051 selection);
1052
1055 }
1056 } while (selection >= 0);
1058 CertCloseStore(store, 0);
1059 }
1060 }
1061}
1062
1063static int cert_mgr_sort_by_text(HWND lv, int col, int index1, int index2)
1064{
1065 LVITEMW item;
1066 WCHAR buf1[MAX_STRING_LEN];
1067 WCHAR buf2[MAX_STRING_LEN];
1068
1069 item.cchTextMax = ARRAY_SIZE(buf1);
1070 item.mask = LVIF_TEXT;
1071 item.pszText = buf1;
1072 item.iItem = index1;
1073 item.iSubItem = col;
1075 item.pszText = buf2;
1076 item.iItem = index2;
1078 return lstrcmpW(buf1, buf2);
1079}
1080
1082{
1083 return cert_mgr_sort_by_text((HWND)lp, 0, lp1, lp2);
1084}
1085
1087{
1088 return cert_mgr_sort_by_text((HWND)lp, 1, lp1, lp2);
1089}
1090
1092{
1095 return CompareFileTime(&cert1->pCertInfo->NotAfter,
1096 &cert2->pCertInfo->NotAfter);
1097}
1098
1100 LPARAM lp)
1101{
1102 return cert_mgr_sort_by_text((HWND)lp, 3, lp1, lp2);
1103}
1104
1106 LPARAM lp)
1107{
1108 struct CertMgrData *data;
1109
1110 switch (msg)
1111 {
1112 case WM_INITDIALOG:
1113 {
1114 PCCRYPTUI_CERT_MGR_STRUCT pCryptUICertMgr =
1117
1118 data = malloc(sizeof(struct CertMgrData));
1119 if (!data)
1120 return 0;
1121 data->imageList = ImageList_Create(16, 16, ILC_COLOR4 | ILC_MASK, 2, 0);
1122 if (data->imageList)
1123 {
1124 HBITMAP bmp;
1125 COLORREF backColor = RGB(255, 0, 255);
1126
1128 ImageList_AddMasked(data->imageList, bmp, backColor);
1130 ImageList_SetBkColor(data->imageList, CLR_NONE);
1132 LVSIL_SMALL, (LPARAM)data->imageList);
1133 }
1135 data->title = pCryptUICertMgr->pwszTitle;
1136
1139 if (pCryptUICertMgr->pwszTitle)
1141 (LPARAM)pCryptUICertMgr->pwszTitle);
1142 show_cert_stores(hwnd, pCryptUICertMgr->dwFlags, data);
1144 break;
1145 }
1146#ifdef __REACTOS__
1147 case WM_DESTROY:
1152 break;
1153#endif
1154 case WM_NOTIFY:
1155 {
1156 NMHDR *hdr = (NMHDR *)lp;
1157
1158 switch (hdr->code)
1159 {
1160 case TCN_SELCHANGE:
1162 break;
1163 case LVN_ITEMCHANGED:
1164 {
1165 NMITEMACTIVATE *nm = (NMITEMACTIVATE*)lp;
1167 int numSelected = SendMessageW(lv, LVM_GETSELECTEDCOUNT, 0, 0);
1168
1169 EnableWindow(GetDlgItem(hwnd, IDC_MGR_EXPORT), numSelected > 0);
1170 EnableWindow(GetDlgItem(hwnd, IDC_MGR_REMOVE), numSelected > 0);
1171 EnableWindow(GetDlgItem(hwnd, IDC_MGR_VIEW), numSelected == 1);
1172 if (numSelected == 1)
1174 else
1176 (LPARAM)empty);
1177 break;
1178 }
1179 case NM_DBLCLK:
1180 show_selected_cert(hwnd, ((NMITEMACTIVATE *)lp)->iItem);
1181 break;
1182 case LVN_KEYDOWN:
1183 {
1184 NMLVKEYDOWN *lvk = (NMLVKEYDOWN *)lp;
1185
1186 if (lvk->wVKey == VK_DELETE)
1188 break;
1189 }
1190 case LVN_COLUMNCLICK:
1191 {
1192 NMLISTVIEW *nmlv = (NMLISTVIEW *)lp;
1194
1195 /* FIXME: doesn't support swapping sort order between ascending
1196 * and descending.
1197 */
1198 switch (nmlv->iSubItem)
1199 {
1200 case 0:
1203 break;
1204 case 1:
1207 break;
1208 case 2:
1211 break;
1212 case 3:
1215 break;
1216 }
1217 break;
1218 }
1219 }
1220 break;
1221 }
1222 case WM_COMMAND:
1223 switch (wp)
1224 {
1227 break;
1228 case IDC_MGR_IMPORT:
1229 if (CryptUIWizImport(0, hwnd, NULL, NULL,
1232 break;
1233 case IDC_MGR_ADVANCED:
1236 {
1238 int index, len;
1239 LPWSTR curString = NULL;
1240
1242 if (index >= 0)
1243 {
1245 curString = malloc((len + 1) * sizeof(WCHAR));
1246 SendMessageW(cb, CB_GETLBTEXT, index, (LPARAM)curString);
1247 }
1250 if (curString)
1251 {
1253 (LPARAM)curString);
1254 if (index >= 0)
1256 free(curString);
1257 }
1259 }
1260 break;
1261 case IDC_MGR_VIEW:
1262 {
1266
1267 if (selection >= 0)
1269 break;
1270 }
1271 case IDC_MGR_EXPORT:
1273 break;
1274 case IDC_MGR_REMOVE:
1276 break;
1277 case IDCANCEL:
1278#ifndef __REACTOS__
1282 ImageList_Destroy(data->imageList);
1283 free(data);
1284#endif
1286 break;
1287 }
1288 break;
1289 }
1290 return 0;
1291}
1292
1293/***********************************************************************
1294 * CryptUIDlgCertMgr (CRYPTUI.@)
1295 */
1297{
1298 TRACE("(%p)\n", pCryptUICertMgr);
1299
1300 if (pCryptUICertMgr->dwSize != sizeof(CRYPTUI_CERT_MGR_STRUCT))
1301 {
1302 WARN("unexpected size %ld\n", pCryptUICertMgr->dwSize);
1304 return FALSE;
1305 }
1307 pCryptUICertMgr->hwndParent, cert_mgr_dlg_proc, (LPARAM)pCryptUICertMgr);
1308 return TRUE;
1309}
1310
1311/* FIXME: real names are unknown, functions are undocumented */
1313{
1317
1319{
1325
1327 void *pvArg);
1328
1329/* Values for dwFlags */
1330#define CRYPTUI_ENABLE_SHOW_PHYSICAL_STORE 0x00000001
1331
1333{
1341 void *pvArg;
1343
1345{
1353 void *pvArg;
1355
1357{
1358 enum {
1362 union {
1366};
1367
1368static BOOL WINAPI enum_store_callback(const void *pvSystemStore,
1370 void *pvArg)
1371{
1373 TVINSERTSTRUCTW tvis;
1374 LPCWSTR localizedName;
1375 BOOL ret = TRUE;
1376
1377 tvis.hParent = NULL;
1378 tvis.hInsertAfter = TVI_LAST;
1379 tvis.item.mask = TVIF_TEXT;
1380 if ((localizedName = CryptFindLocalizedName(pvSystemStore)))
1381 {
1382 struct StoreInfo *storeInfo = malloc(sizeof(struct StoreInfo));
1383
1384 if (storeInfo)
1385 {
1386 storeInfo->type = SystemStore;
1387 storeInfo->name = wcsdup(pvSystemStore);
1388 if (storeInfo->name)
1389 {
1390 tvis.item.mask |= TVIF_PARAM;
1391 tvis.item.lParam = (LPARAM)storeInfo;
1392 }
1393 else
1394 {
1395 free(storeInfo);
1396 ret = FALSE;
1397 }
1398 }
1399 else
1400 ret = FALSE;
1401 tvis.item.pszText = (LPWSTR)localizedName;
1402 }
1403 else
1404 tvis.item.pszText = (LPWSTR)pvSystemStore;
1405 /* FIXME: need a folder icon for the store too */
1406 if (ret)
1408 return ret;
1409}
1410
1412{
1413 DWORD i;
1415
1416 for (i = 0; i < pEnumData->cEnumArgs; i++)
1420 for (i = 0; i < pEnumData->cStores; i++)
1421 {
1422 DWORD size;
1423
1424 if (CertGetStoreProperty(pEnumData->rghStore[i],
1426 {
1427 WCHAR *name = malloc(size);
1428
1429 if (name)
1430 {
1431 if (CertGetStoreProperty(pEnumData->rghStore[i],
1433 {
1434 struct StoreInfo *storeInfo = malloc(sizeof(struct StoreInfo));
1435
1436 if (storeInfo)
1437 {
1438 TVINSERTSTRUCTW tvis;
1439
1440 storeInfo->type = StoreHandle;
1441 storeInfo->store = pEnumData->rghStore[i];
1442 tvis.hParent = NULL;
1443 tvis.hInsertAfter = TVI_LAST;
1444 tvis.item.mask = TVIF_TEXT | TVIF_PARAM;
1445 tvis.item.pszText = name;
1446 tvis.item.lParam = (LPARAM)storeInfo;
1448 }
1449 }
1450 free(name);
1451 }
1452 }
1453 }
1454}
1455
1457{
1459 0);
1460
1461 while (next)
1462 {
1463 TVITEMW item;
1464
1465 memset(&item, 0, sizeof(item));
1466 item.mask = TVIF_HANDLE | TVIF_PARAM;
1467 item.hItem = next;
1469 if (item.lParam)
1470 {
1471 struct StoreInfo *storeInfo = (struct StoreInfo *)item.lParam;
1472
1473 if (storeInfo->type == SystemStore)
1474 free(storeInfo->name);
1475 free(storeInfo);
1476 }
1478 (LPARAM)next);
1479 }
1480}
1481
1483{
1485 TVITEMW item;
1487
1488 memset(&item, 0, sizeof(item));
1490 item.hItem = hItem;
1491 item.cchTextMax = ARRAY_SIZE(buf);
1492 item.pszText = buf;
1494 if (item.lParam)
1495 {
1496 struct StoreInfo *storeInfo = (struct StoreInfo *)item.lParam;
1497
1498 if (storeInfo->type == StoreHandle)
1499 store = storeInfo->store;
1500 else
1501 store = CertOpenSystemStoreW(0, storeInfo->name);
1502 }
1503 else
1504 {
1505 /* It's implicitly a system store */
1507 }
1508 return store;
1509}
1510
1512{
1515};
1516
1518 LPARAM lp)
1519{
1520 struct SelectStoreInfo *selectInfo;
1521 INT_PTR ret = 0;
1522
1523 switch (msg)
1524 {
1525 case WM_INITDIALOG:
1526 {
1527 selectInfo = (struct SelectStoreInfo *)lp;
1529 if (selectInfo->info->pwszTitle)
1531 (LPARAM)selectInfo->info->pwszTitle);
1532 if (selectInfo->info->pwszText)
1534 (LPARAM)selectInfo->info->pwszText);
1535 if (!(selectInfo->info->dwFlags & CRYPTUI_ENABLE_SHOW_PHYSICAL_STORE))
1537 enumerate_stores(hwnd, selectInfo->info->pEnumData);
1538 break;
1539 }
1540 case WM_COMMAND:
1541 switch (wp)
1542 {
1543 case IDOK:
1544 {
1548
1549 selectInfo = (struct SelectStoreInfo *)GetWindowLongPtrW(hwnd,
1550 DWLP_USER);
1551 if (!selection)
1552 {
1554
1555 if (selectInfo->info->pwszTitle)
1556 pTitle = selectInfo->info->pwszTitle;
1557 else
1558 {
1560 pTitle = title;
1561 }
1564 }
1565 else
1566 {
1568
1569 if (!selectInfo->info->pfnSelectedStoreCallback ||
1571 selectInfo->info->pvArg))
1572 {
1573 selectInfo->store = store;
1576 }
1577 else
1579 }
1580 ret = TRUE;
1581 break;
1582 }
1583 case IDCANCEL:
1586 ret = TRUE;
1587 break;
1588 }
1589 break;
1590 }
1591 return ret;
1592}
1593
1594/***********************************************************************
1595 * CryptUIDlgSelectStoreW (CRYPTUI.@)
1596 */
1598{
1599 struct SelectStoreInfo selectInfo = { info, NULL };
1600
1601 TRACE("(%p)\n", info);
1602
1603 if (info->dwSize != sizeof(CRYPTUI_SELECTSTORE_INFO_W))
1604 {
1605 WARN("unexpected size %ld\n", info->dwSize);
1607 return NULL;
1608 }
1610 select_store_dlg_proc, (LPARAM)&selectInfo);
1611 return selectInfo.store;
1612}
1613
1614/***********************************************************************
1615 * CryptUIDlgSelectStoreA (CRYPTUI.@)
1616 */
1618{
1621 int len;
1622
1623 TRACE("(%p)\n", info);
1624
1625 if (info->dwSize != sizeof(CRYPTUI_SELECTSTORE_INFO_A))
1626 {
1627 WARN("unexpected size %ld\n", info->dwSize);
1629 return NULL;
1630 }
1631 memcpy(&infoW, info, sizeof(*info));
1632 if (info->pszTitle)
1633 {
1634 len = MultiByteToWideChar(CP_ACP, 0, info->pszTitle, -1, NULL, 0);
1635 infoW.pwszTitle = malloc(len * sizeof(WCHAR));
1636 MultiByteToWideChar(CP_ACP, 0, info->pszTitle, -1, infoW.pwszTitle,
1637 len);
1638 }
1639 if (info->pszText)
1640 {
1641 len = MultiByteToWideChar(CP_ACP, 0, info->pszText, -1, NULL, 0);
1642 infoW.pwszText = malloc(len * sizeof(WCHAR));
1643 MultiByteToWideChar(CP_ACP, 0, info->pszText, -1, infoW.pwszText, len);
1644 }
1646 free(infoW.pwszText);
1647 free(infoW.pwszTitle);
1648 return ret;
1649}
1650
1651/***********************************************************************
1652 * CryptUIDlgViewCertificateA (CRYPTUI.@)
1653 */
1655 PCCRYPTUI_VIEWCERTIFICATE_STRUCTA pCertViewInfo, BOOL *pfPropertiesChanged)
1656{
1658 LPWSTR title = NULL;
1659 BOOL ret;
1660
1661 TRACE("(%p, %p)\n", pCertViewInfo, pfPropertiesChanged);
1662
1663 memcpy(&viewInfo, pCertViewInfo, sizeof(viewInfo));
1664 if (pCertViewInfo->szTitle)
1665 {
1666 int len = MultiByteToWideChar(CP_ACP, 0, pCertViewInfo->szTitle, -1,
1667 NULL, 0);
1668
1669 title = malloc(len * sizeof(WCHAR));
1670 if (title)
1671 {
1672 MultiByteToWideChar(CP_ACP, 0, pCertViewInfo->szTitle, -1, title,
1673 len);
1674 viewInfo.szTitle = title;
1675 }
1676 else
1677 {
1678 ret = FALSE;
1679 goto error;
1680 }
1681 }
1682 if (pCertViewInfo->cPropSheetPages)
1683 {
1684 FIXME("ignoring additional prop sheet pages\n");
1685 viewInfo.cPropSheetPages = 0;
1686 }
1687 ret = CryptUIDlgViewCertificateW(&viewInfo, pfPropertiesChanged);
1688 free(title);
1689error:
1690 return ret;
1691}
1692
1694{
1698};
1699
1701 LONG cb, LONG *pcb)
1702{
1703 struct ReadStringStruct *string = (struct ReadStringStruct *)dwCookie;
1704 LONG cch = min(cb / sizeof(WCHAR), string->len - string->pos);
1705
1706 TRACE("(%p, %p, %ld, %p)\n", string, buf, cb, pcb);
1707
1708 memmove(buf, string->buf + string->pos, cch * sizeof(WCHAR));
1709 string->pos += cch;
1710 *pcb = cch * sizeof(WCHAR);
1711 return 0;
1712}
1713
1715{
1716 struct ReadStringStruct string;
1717 EDITSTREAM editstream;
1718
1719 TRACE("(%p, %s)\n", hwnd, debugstr_wn(text, len));
1720
1721 string.buf = text;
1722 string.pos = 0;
1723 string.len = len;
1724 editstream.dwCookie = (DWORD_PTR)&string;
1725 editstream.dwError = 0;
1726 editstream.pfnCallback = read_text_callback;
1728 (LPARAM)&editstream);
1729}
1730
1732{
1733 LPWSTR str;
1734 LONG len;
1735
1736 len = LoadStringW(hInstance, id, (LPWSTR)&str, 0);
1738}
1739
1741 LONG len, const PARAFORMAT2 *fmt)
1742{
1745}
1746
1748 const PARAFORMAT2 *fmt)
1749{
1750 LPWSTR str;
1751 LONG len;
1752
1753 len = LoadStringW(hInstance, id, (LPWSTR)&str, 0);
1755}
1756
1758 DWORD dwFlags)
1759{
1760 LPWSTR buf = NULL;
1761 DWORD len;
1762
1763 len = CertGetNameStringW(pCertContext, dwType, dwFlags, NULL, NULL, 0);
1764 if (len)
1765 {
1766 buf = malloc(len * sizeof(WCHAR));
1767 if (buf)
1768 CertGetNameStringW(pCertContext, dwType, dwFlags, NULL, buf, len);
1769 }
1770 return buf;
1771}
1772
1774 DWORD dwType, DWORD dwFlags)
1775{
1776 LPWSTR name = get_cert_name_string(pCertContext, dwType, dwFlags);
1777
1778 if (name)
1779 {
1780 /* Don't include NULL-terminator in output */
1782
1784 free(name);
1785 }
1786}
1787
1788static void add_icon_to_control(HWND hwnd, int id)
1789{
1790 HRESULT hr;
1791 IRichEditOle *richEditOle = NULL;
1792 IOleObject *object = NULL;
1793 CLSID clsid;
1794 LPOLECACHE oleCache = NULL;
1795 FORMATETC formatEtc;
1796 DWORD conn;
1797 IDataObject *dataObject = NULL;
1799 STGMEDIUM stgm;
1800 IOleClientSite *clientSite = NULL;
1801 REOBJECT reObject;
1802
1803 TRACE("(%p, %d)\n", hwnd, id);
1804
1805 SendMessageW(hwnd, EM_GETOLEINTERFACE, 0, (LPARAM)&richEditOle);
1806 if (!richEditOle)
1807 goto end;
1809 (void**)&object);
1810 if (FAILED(hr))
1811 goto end;
1812 hr = IOleObject_GetUserClassID(object, &clsid);
1813 if (FAILED(hr))
1814 goto end;
1815 hr = IOleObject_QueryInterface(object, &IID_IOleCache, (void**)&oleCache);
1816 if (FAILED(hr))
1817 goto end;
1818 formatEtc.cfFormat = CF_BITMAP;
1819 formatEtc.ptd = NULL;
1820 formatEtc.dwAspect = DVASPECT_CONTENT;
1821 formatEtc.lindex = -1;
1822 formatEtc.tymed = TYMED_GDI;
1823 hr = IOleCache_Cache(oleCache, &formatEtc, 0, &conn);
1824 if (FAILED(hr))
1825 goto end;
1826 hr = IOleObject_QueryInterface(object, &IID_IDataObject,
1827 (void**)&dataObject);
1828 if (FAILED(hr))
1829 goto end;
1830 hr = IRichEditOle_GetClientSite(richEditOle, &clientSite);
1831 if (FAILED(hr))
1832 goto end;
1835 if (!bitmap)
1836 goto end;
1837 stgm.tymed = TYMED_GDI;
1838 stgm.hBitmap = bitmap;
1839 stgm.pUnkForRelease = NULL;
1840 hr = IDataObject_SetData(dataObject, &formatEtc, &stgm, TRUE);
1841 if (FAILED(hr))
1842 goto end;
1843
1844 reObject.cbStruct = sizeof(reObject);
1845 reObject.cp = REO_CP_SELECTION;
1846 reObject.clsid = clsid;
1847 reObject.poleobj = object;
1848 reObject.pstg = NULL;
1849 reObject.polesite = clientSite;
1850 reObject.sizel.cx = reObject.sizel.cy = 0;
1851 reObject.dvaspect = DVASPECT_CONTENT;
1852 reObject.dwFlags = 0;
1853 reObject.dwUser = 0;
1854
1855 IRichEditOle_InsertObject(richEditOle, &reObject);
1856
1857end:
1858 if (clientSite)
1859 IOleClientSite_Release(clientSite);
1860 if (dataObject)
1861 IDataObject_Release(dataObject);
1862 if (oleCache)
1863 IOleCache_Release(oleCache);
1864 if (object)
1865 IOleObject_Release(object);
1866 if (richEditOle)
1867 IRichEditOle_Release(richEditOle);
1868}
1869
1870#define MY_INDENT 200
1871
1872static void add_oid_text_to_control(HWND hwnd, char *oid)
1873{
1874 WCHAR nl = '\n';
1876 PARAFORMAT2 parFmt;
1877
1878 parFmt.cbSize = sizeof(parFmt);
1879 parFmt.dwMask = PFM_STARTINDENT;
1880 parFmt.dxStartIndent = MY_INDENT * 3;
1881 if (oidInfo)
1882 {
1884 lstrlenW(oidInfo->pwszName), &parFmt);
1886 }
1887}
1888
1890{
1892 int id;
1893};
1894
1895/* The following list MUST be lexicographically sorted by OID */
1896static struct OIDToString oidMap[] = {
1897 /* 1.3.6.1.4.1.311.10.3.1 */
1899 /* 1.3.6.1.4.1.311.10.3.4 */
1901 /* 1.3.6.1.4.1.311.10.3.4.1 */
1903 /* 1.3.6.1.4.1.311.10.3.5 */
1905 /* 1.3.6.1.4.1.311.10.3.6 */
1907 /* 1.3.6.1.4.1.311.10.3.7 */
1909 /* 1.3.6.1.4.1.311.10.3.8 */
1911 /* 1.3.6.1.4.1.311.10.3.9 */
1913 /* 1.3.6.1.4.1.311.10.3.10 */
1915 /* 1.3.6.1.4.1.311.10.3.11 */
1917 /* 1.3.6.1.4.1.311.10.3.12 */
1919 /* 1.3.6.1.4.1.311.10.3.13 */
1921 /* 1.3.6.1.4.1.311.10.5.1 */
1923 /* 1.3.6.1.4.1.311.10.6.1 */
1925 /* 1.3.6.1.4.1.311.10.6.2 */
1927 /* 1.3.6.1.4.1.311.20.2.1 */
1929 /* 1.3.6.1.4.1.311.20.2.2 */
1931 /* 1.3.6.1.4.1.311.21.5 */
1933 /* 1.3.6.1.4.1.311.21.6 */
1935 /* 1.3.6.1.4.1.311.21.19 */
1937 /* 1.3.6.1.5.5.7.3.1 */
1939 /* 1.3.6.1.5.5.7.3.2 */
1941 /* 1.3.6.1.5.5.7.3.3 */
1943 /* 1.3.6.1.5.5.7.3.4 */
1945 /* 1.3.6.1.5.5.7.3.5 */
1947 /* 1.3.6.1.5.5.7.3.6 */
1949 /* 1.3.6.1.5.5.7.3.7 */
1951 /* 1.3.6.1.5.5.7.3.8 */
1953};
1954
1956{
1957 int indexHigh = ARRAY_SIZE(oidMap) - 1, indexLow = 0;
1958
1959 while (indexLow <= indexHigh)
1960 {
1961 int cmp, i = (indexLow + indexHigh) / 2;
1962 if (!(cmp = strcmp(oid, oidMap[i].oid)))
1963 return &oidMap[i];
1964 if (cmp > 0)
1965 indexLow = i + 1;
1966 else
1967 indexHigh = i - 1;
1968 }
1969 return NULL;
1970}
1971
1973{
1974 struct OIDToString *entry;
1975 WCHAR nl = '\n';
1976 PARAFORMAT2 parFmt;
1977
1978 parFmt.cbSize = sizeof(parFmt);
1979 parFmt.dwMask = PFM_STARTINDENT;
1980 parFmt.dxStartIndent = MY_INDENT * 3;
1981 if ((entry = findSupportedOID(oid)))
1982 {
1983 WCHAR *str, *linebreak, *ptr;
1984 BOOL multiline = FALSE;
1985 int len;
1986
1987 len = LoadStringW(hInstance, entry->id, (LPWSTR)&str, 0);
1988 ptr = str;
1989 do {
1990 if ((linebreak = wmemchr(ptr, '\n', len)))
1991 {
1993
1994 multiline = TRUE;
1995 /* The source string contains a newline, which the richedit
1996 * control won't find since it's interpreted as a paragraph
1997 * break. Therefore copy up to the newline. lstrcpynW always
1998 * NULL-terminates, so pass one more than the length of the
1999 * source line so the copy includes the entire line and the
2000 * NULL-terminator.
2001 */
2002 lstrcpynW(copy, ptr, linebreak - ptr + 1);
2004 linebreak - ptr, &parFmt);
2005 ptr = linebreak + 1;
2007 }
2008 else if (multiline && *ptr)
2009 {
2010 /* Add the last line */
2012 len - (ptr - str), &parFmt);
2014 }
2015 } while (linebreak);
2016 if (!multiline)
2017 {
2020 }
2021 }
2022 else
2023 {
2024 WCHAR *oidW = malloc((strlen(oid) + 1) * sizeof(WCHAR));
2025
2026 if (oidW)
2027 {
2028 LPCSTR src;
2029 WCHAR *dst;
2030
2031 for (src = oid, dst = oidW; *src; src++, dst++)
2032 *dst = *src;
2033 *dst = 0;
2035 &parFmt);
2037 free(oidW);
2038 }
2039 }
2040}
2041
2043 BOOL *anyUsageAdded)
2044{
2045 static char any_app_policy[] = szOID_ANY_APPLICATION_POLICY;
2046 WCHAR nl = '\n';
2047 CHARFORMATW charFmt;
2048 PCERT_EXTENSION policyExt;
2049 if (!*anyUsageAdded)
2050 {
2051 PARAFORMAT2 parFmt;
2052
2053 parFmt.cbSize = sizeof(parFmt);
2054 parFmt.dwMask = PFM_STARTINDENT;
2055 parFmt.dxStartIndent = MY_INDENT;
2057 IDS_CERT_INFO_PURPOSES, &parFmt);
2059 *anyUsageAdded = TRUE;
2060 }
2061 memset(&charFmt, 0, sizeof(charFmt));
2062 charFmt.cbSize = sizeof(charFmt);
2063 charFmt.dwMask = CFM_BOLD;
2064 charFmt.dwEffects = 0;
2067 cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
2068 {
2069 CERT_POLICIES_INFO *policies;
2070 DWORD size;
2071
2073 policyExt->Value.pbData, policyExt->Value.cbData,
2074 CRYPT_DECODE_ALLOC_FLAG, NULL, &policies, &size))
2075 {
2076 DWORD i;
2077
2078 for (i = 0; i < policies->cPolicyInfo; i++)
2079 {
2080 DWORD j;
2081
2082 for (j = 0; j < policies->rgPolicyInfo[i].cPolicyQualifier; j++)
2084 policies->rgPolicyInfo[i].rgPolicyQualifier[j].
2085 pszPolicyQualifierId);
2086 }
2087 LocalFree(policies);
2088 }
2089 }
2090 else
2091 add_oid_text_to_control(text, any_app_policy);
2092}
2093
2095 BOOL *anyUsageAdded)
2096{
2097 WCHAR nl = '\n';
2098 DWORD size;
2099 BOOL badUsages = FALSE;
2100
2102 {
2103 CHARFORMATW charFmt;
2104 static char any_cert_policy[] = szOID_ANY_CERT_POLICY;
2106
2107 if (usage)
2108 {
2110 {
2111 DWORD i;
2112
2113 if (!*anyUsageAdded)
2114 {
2115 PARAFORMAT2 parFmt;
2116
2117 parFmt.cbSize = sizeof(parFmt);
2118 parFmt.dwMask = PFM_STARTINDENT;
2119 parFmt.dxStartIndent = MY_INDENT;
2121 IDS_CERT_INFO_PURPOSES, &parFmt);
2123 *anyUsageAdded = TRUE;
2124 }
2125 memset(&charFmt, 0, sizeof(charFmt));
2126 charFmt.cbSize = sizeof(charFmt);
2127 charFmt.dwMask = CFM_BOLD;
2128 charFmt.dwEffects = 0;
2130 (LPARAM)&charFmt);
2131 if (!usage->cUsageIdentifier)
2132 add_oid_text_to_control(text, any_cert_policy);
2133 else
2134 for (i = 0; i < usage->cUsageIdentifier; i++)
2136 usage->rgpszUsageIdentifier[i]);
2137 }
2138 else
2139 badUsages = TRUE;
2140 free(usage);
2141 }
2142 else
2143 badUsages = TRUE;
2144 }
2145 else
2146 badUsages = TRUE;
2147 return badUsages;
2148}
2149
2152{
2153 BOOL includeCertUsages = FALSE, includeAppUsages = FALSE;
2154 BOOL badUsages = FALSE, anyUsageAdded = FALSE;
2155
2156 if (pCertViewInfo->cPurposes)
2157 {
2158 DWORD i;
2159
2160 for (i = 0; i < pCertViewInfo->cPurposes; i++)
2161 {
2162 if (!strcmp(pCertViewInfo->rgszPurposes[i], szOID_ANY_CERT_POLICY))
2163 includeCertUsages = TRUE;
2164 else if (!strcmp(pCertViewInfo->rgszPurposes[i],
2166 includeAppUsages = TRUE;
2167 else
2168 badUsages = TRUE;
2169 }
2170 }
2171 else
2172 includeAppUsages = includeCertUsages = TRUE;
2173 if (includeAppUsages)
2174 display_app_usages(text, pCertViewInfo->pCertContext, &anyUsageAdded);
2175 if (includeCertUsages)
2176 badUsages = display_cert_usages(text, pCertViewInfo->pCertContext,
2177 &anyUsageAdded);
2178 if (badUsages)
2179 {
2180 PARAFORMAT2 parFmt;
2181
2182 parFmt.cbSize = sizeof(parFmt);
2183 parFmt.dwMask = PFM_STARTINDENT;
2184 parFmt.dxStartIndent = MY_INDENT;
2187 }
2188}
2189
2191 LPCSTR policyOid)
2192{
2194 DWORD i;
2195
2196 for (i = 0; !ret && i < policies->cPolicyInfo; i++)
2197 {
2198 DWORD j;
2199
2200 for (j = 0; !ret && j < policies->rgPolicyInfo[i].cPolicyQualifier; j++)
2201 if (!strcmp(policies->rgPolicyInfo[i].rgPolicyQualifier[j].
2202 pszPolicyQualifierId, policyOid))
2203 ret = &policies->rgPolicyInfo[i].rgPolicyQualifier[j].
2204 Qualifier;
2205 }
2206 return ret;
2207}
2208
2210{
2211 LPWSTR qualifierStr = NULL;
2212 CERT_NAME_VALUE *qualifierValue;
2213 DWORD size;
2214
2217 &qualifierValue, &size))
2218 {
2219 size = CertRDNValueToStrW(qualifierValue->dwValueType,
2220 &qualifierValue->Value, NULL, 0);
2221 qualifierStr = malloc(size * sizeof(WCHAR));
2222 if (qualifierStr)
2223 CertRDNValueToStrW(qualifierValue->dwValueType,
2224 &qualifierValue->Value, qualifierStr, size);
2225 LocalFree(qualifierValue);
2226 }
2227 return qualifierStr;
2228}
2229
2231{
2232 LPWSTR str = NULL;
2233 CERT_POLICY_QUALIFIER_USER_NOTICE *qualifierValue;
2234 DWORD size;
2235
2239 &qualifierValue, &size))
2240 {
2241 str = wcsdup(qualifierValue->pszDisplayText);
2242 LocalFree(qualifierValue);
2243 }
2244 return str;
2245}
2246
2248{
2251};
2252
2255{
2256 PCERT_EXTENSION policyExt;
2257
2258 if (!(pCertViewInfo->dwFlags & CRYPTUI_DISABLE_ISSUERSTATEMENT) &&
2260 pCertViewInfo->pCertContext->pCertInfo->cExtension,
2261 pCertViewInfo->pCertContext->pCertInfo->rgExtension)))
2262 {
2263 CERT_POLICIES_INFO *policies;
2264 DWORD size;
2265
2267 policyExt->Value.pbData, policyExt->Value.cbData,
2268 CRYPT_DECODE_ALLOC_FLAG, NULL, &policies, &size))
2269 {
2271 LPWSTR cps = NULL, userNotice = NULL;
2272
2273 if ((qualifier = find_policy_qualifier(policies,
2276 if ((qualifier = find_policy_qualifier(policies,
2279 if (cps || userNotice)
2280 {
2281 struct IssuerStatement *issuerStatement = malloc(sizeof(struct IssuerStatement));
2282
2283 if (issuerStatement)
2284 {
2285 issuerStatement->cps = cps;
2286 issuerStatement->userNotice = userNotice;
2289 (ULONG_PTR)issuerStatement);
2290 }
2291 }
2292 LocalFree(policies);
2293 }
2294 }
2295}
2296
2299{
2300 CHARFORMATW charFmt;
2301 PARAFORMAT2 parFmt;
2305 (CRYPT_PROVIDER_DATA *)pCertViewInfo->pCryptProviderData,
2306 pCertViewInfo->idxSigner, pCertViewInfo->fCounterSigner,
2307 pCertViewInfo->idxCounterSigner);
2309 &provSigner->pasCertChain[provSigner->csCertChain - 1];
2310
2311 if (!provSigner->pChainContext ||
2315 else if (!root->fTrustedRoot)
2317 else
2319
2320 memset(&charFmt, 0, sizeof(charFmt));
2321 charFmt.cbSize = sizeof(charFmt);
2322 charFmt.dwMask = CFM_BOLD;
2323 charFmt.dwEffects = CFE_BOLD;
2325 /* FIXME: vertically center text */
2326 parFmt.cbSize = sizeof(parFmt);
2327 parFmt.dwMask = PFM_STARTINDENT;
2328 parFmt.dxStartIndent = MY_INDENT;
2331
2334 if (provSigner->dwError == TRUST_E_CERT_SIGNATURE)
2336 IDS_CERT_INFO_BAD_SIG, &parFmt);
2337 else if (!provSigner->pChainContext ||
2342 else if (!root->fTrustedRoot)
2343 {
2344 if (provSigner->csCertChain == 1 && root->fSelfSigned)
2347 else
2350 }
2351 else
2352 {
2353 set_policy_text(text, pCertViewInfo);
2354 set_issuer_statement(hwnd, pCertViewInfo);
2355 }
2356}
2357
2359 DWORD nameFlags, int heading)
2360{
2361 WCHAR nl = '\n';
2363 CHARFORMATW charFmt;
2364 PARAFORMAT2 parFmt;
2365
2366 memset(&charFmt, 0, sizeof(charFmt));
2367 charFmt.cbSize = sizeof(charFmt);
2368 charFmt.dwMask = CFM_BOLD;
2369 charFmt.dwEffects = CFE_BOLD;
2371 parFmt.cbSize = sizeof(parFmt);
2372 parFmt.dwMask = PFM_STARTINDENT;
2373 parFmt.dxStartIndent = MY_INDENT * 3;
2375 charFmt.dwEffects = 0;
2378 nameFlags);
2382
2383}
2384
2385static void add_date_string_to_control(HWND hwnd, const FILETIME *fileTime)
2386{
2387 WCHAR dateFmt[80]; /* sufficient for all versions of LOCALE_SSHORTDATE */
2388 WCHAR date[80];
2389 SYSTEMTIME sysTime;
2390
2392 FileTimeToSystemTime(fileTime, &sysTime);
2393 GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, dateFmt, date, ARRAY_SIZE(date));
2395}
2396
2398{
2399 WCHAR nl = '\n';
2401 CHARFORMATW charFmt;
2402 PARAFORMAT2 parFmt;
2403
2404 memset(&charFmt, 0, sizeof(charFmt));
2405 charFmt.cbSize = sizeof(charFmt);
2406 charFmt.dwMask = CFM_BOLD;
2407 charFmt.dwEffects = CFE_BOLD;
2409 parFmt.cbSize = sizeof(parFmt);
2410 parFmt.dwMask = PFM_STARTINDENT;
2411 parFmt.dxStartIndent = MY_INDENT * 3;
2413 &parFmt);
2414 charFmt.dwEffects = 0;
2416 add_date_string_to_control(text, &cert->pCertInfo->NotBefore);
2417 charFmt.dwEffects = CFE_BOLD;
2420 charFmt.dwEffects = 0;
2422 add_date_string_to_control(text, &cert->pCertInfo->NotAfter);
2424}
2425
2428{
2429 set_cert_info(hwnd, pCertViewInfo);
2430 set_cert_name_string(hwnd, pCertViewInfo->pCertContext, 0,
2432 set_cert_name_string(hwnd, pCertViewInfo->pCertContext,
2435}
2436
2438 LPARAM lp)
2439{
2440 INT_PTR ret = 0;
2441 HWND text;
2442 struct IssuerStatement *issuerStatement;
2443
2444 switch (msg)
2445 {
2446 case WM_INITDIALOG:
2448 issuerStatement = (struct IssuerStatement *)lp;
2450 lstrlenW(issuerStatement->userNotice));
2451 if (issuerStatement->cps)
2452 SetWindowLongPtrW(hwnd, DWLP_USER, (LPARAM)issuerStatement->cps);
2453 else
2455 break;
2456 case WM_COMMAND:
2457 switch (wp)
2458 {
2459 case IDOK:
2461 ret = TRUE;
2462 break;
2463 case IDC_CPS:
2464 {
2465 IBindCtx *bctx = NULL;
2466 LPWSTR cps;
2467
2468 CreateBindCtx(0, &bctx);
2471 HLNF_OPENINNEWWINDOW, 0);
2472 IBindCtx_Release(bctx);
2473 break;
2474 }
2475 }
2476 }
2477 return ret;
2478}
2479
2480static void show_user_notice(HWND hwnd, struct IssuerStatement *issuerStatement)
2481{
2483 user_notice_dlg_proc, (LPARAM)issuerStatement);
2484}
2485
2487 LPARAM lp)
2488{
2491
2492 TRACE("(%p, %08x, %08Ix, %08Ix)\n", hwnd, msg, wp, lp);
2493
2494 switch (msg)
2495 {
2496 case WM_INITDIALOG:
2497 page = (PROPSHEETPAGEW *)lp;
2498 pCertViewInfo = (PCCRYPTUI_VIEWCERTIFICATE_STRUCTW)page->lParam;
2499 if (pCertViewInfo->dwFlags & CRYPTUI_DISABLE_ADDTOSTORE)
2502 set_general_info(hwnd, pCertViewInfo);
2503 break;
2504 case WM_COMMAND:
2505 switch (wp)
2506 {
2507 case IDC_ADDTOSTORE:
2509 break;
2511 {
2512 struct IssuerStatement *issuerStatement =
2514
2515 if (issuerStatement)
2516 {
2517 if (issuerStatement->userNotice)
2518 show_user_notice(hwnd, issuerStatement);
2519 else if (issuerStatement->cps)
2520 {
2521 IBindCtx *bctx = NULL;
2522
2523 CreateBindCtx(0, &bctx);
2524 HlinkSimpleNavigateToString(issuerStatement->cps, NULL,
2525 NULL, NULL, bctx, NULL, HLNF_OPENINNEWWINDOW, 0);
2526 IBindCtx_Release(bctx);
2527 }
2528 }
2529 break;
2530 }
2531 }
2532 break;
2533 }
2534 return 0;
2535}
2536
2539{
2540 struct IssuerStatement *issuerStatement;
2541
2542 switch (msg)
2543 {
2544 case PSPCB_RELEASE:
2545 issuerStatement =
2547 if (issuerStatement)
2548 {
2549 free(issuerStatement->cps);
2550 free(issuerStatement->userNotice);
2551 free(issuerStatement);
2552 }
2553 break;
2554 }
2555 return 1;
2556}
2557
2560{
2561 memset(page, 0, sizeof(PROPSHEETPAGEW));
2562 page->dwSize = sizeof(PROPSHEETPAGEW);
2563 page->dwFlags = PSP_USECALLBACK;
2564 page->pfnCallback = general_callback_proc;
2565 page->hInstance = hInstance;
2566 page->pszTemplate = MAKEINTRESOURCEW(IDD_GENERAL);
2567 page->pfnDlgProc = general_dlg_proc;
2568 page->lParam = (LPARAM)pCertViewInfo;
2569}
2570
2571typedef WCHAR * (*field_format_func)(PCCERT_CONTEXT cert);
2572
2574{
2575 static const WCHAR fmt[] = { 'V','%','d',0 };
2576 WCHAR *buf = malloc(12 * sizeof(WCHAR));
2577
2578 if (buf)
2579 swprintf(buf, 12, fmt, cert->pCertInfo->dwVersion);
2580 return buf;
2581}
2582
2584{
2585 WCHAR *buf = malloc((cb * 3 + 1) * sizeof(WCHAR));
2586
2587 if (buf)
2588 {
2589 static const WCHAR fmt[] = { '%','0','2','x',' ',0 };
2590 DWORD i;
2591 WCHAR *ptr;
2592
2593 for (i = 0, ptr = buf; i < cb; i++, ptr += 3)
2594 swprintf(ptr, 4, fmt, ((BYTE *)pb)[i]);
2595 }
2596 return buf;
2597}
2598
2600{
2601 return format_hex_string(cert->pCertInfo->SerialNumber.pbData,
2602 cert->pCertInfo->SerialNumber.cbData);
2603}
2604
2606{
2609}
2610
2612{
2613 WCHAR *str = NULL;
2616
2617 if (len)
2618 {
2619 str = malloc(len * sizeof(WCHAR));
2620 if (str)
2623 }
2624 return str;
2625}
2626
2628{
2629 return field_format_detailed_cert_name(&cert->pCertInfo->Issuer);
2630}
2631
2633{
2635}
2636
2638{
2639 return field_format_detailed_cert_name(&cert->pCertInfo->Subject);
2640}
2641
2642static WCHAR *format_long_date(const FILETIME *fileTime)
2643{
2644 WCHAR dateFmt[80]; /* long enough for LOCALE_SLONGDATE */
2645 DWORD len;
2646 WCHAR *buf = NULL;
2647 SYSTEMTIME sysTime;
2648
2649 /* FIXME: format isn't quite right, want time too */
2651 FileTimeToSystemTime(fileTime, &sysTime);
2652 len = GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, dateFmt, NULL, 0);
2653 if (len)
2654 {
2655 buf = malloc(len * sizeof(WCHAR));
2656 if (buf)
2657 GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, dateFmt, buf,
2658 len);
2659 }
2660 return buf;
2661}
2662
2664{
2665 return format_long_date(&cert->pCertInfo->NotBefore);
2666}
2667
2669{
2670 return format_long_date(&cert->pCertInfo->NotAfter);
2671}
2672
2674{
2676 WCHAR *buf = NULL;
2677
2679 cert->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId, 0);
2680 if (oidInfo)
2681 {
2683
2685 {
2686 DWORD len;
2687
2688 /* Allocate the output buffer. Use the number of bytes in the
2689 * public key as a conservative (high) estimate for the number of
2690 * digits in its output.
2691 * The output is of the form (in English)
2692 * "<public key algorithm> (<public key bit length> bits)".
2693 * Ordinarily having two positional parameters in a string is not a
2694 * good idea, but as this isn't a sentence fragment, it shouldn't
2695 * be word-order dependent.
2696 */
2697 len = lstrlenW(fmt) + lstrlenW(oidInfo->pwszName) +
2698 cert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData * 8;
2699 buf = malloc(len * sizeof(*buf));
2700 if (buf)
2701 {
2702 DWORD_PTR args[2];
2703 args[0] = (DWORD_PTR)oidInfo->pwszName;
2705 &cert->pCertInfo->SubjectPublicKeyInfo);
2707 fmt, 0, 0, buf, len, (va_list *)args);
2708 }
2709 }
2710 }
2711 return buf;
2712}
2713
2715{
2716 return format_hex_string(
2717 cert->pCertInfo->SubjectPublicKeyInfo.PublicKey.pbData,
2718 cert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData);
2719}
2720
2721struct field_value_data;
2723{
2728};
2729
2731
2732typedef WCHAR *(*create_detailed_value_func)(PCCERT_CONTEXT cert, void *param);
2733
2735{
2738 void *param;
2739};
2740
2743{
2744 data->fields = realloc(data->fields, (data->cFields + 1) * sizeof(struct field_value_data));
2745 if (data->fields)
2746 {
2747 data->fields[data->cFields].create = create;
2748 data->fields[data->cFields].detailed_value = NULL;
2749 data->fields[data->cFields].param = param;
2750 data->cFields++;
2751 }
2752}
2753
2756{
2757 LVITEMW item;
2758 int iItem = SendMessageW(hwnd, LVM_GETITEMCOUNT, 0, 0);
2759
2760 item.mask = LVIF_TEXT | LVIF_PARAM;
2761 item.iItem = iItem;
2762 item.iSubItem = 0;
2763 item.pszText = field;
2764 item.lParam = (LPARAM)data;
2766 if (value)
2767 {
2768 item.pszText = value;
2769 item.iSubItem = 1;
2771 }
2773}
2774
2777{
2779
2782}
2783
2785{
2786 int id;
2789};
2790
2792 const struct v1_field *field)
2793{
2794 WCHAR *val = field->format(data->pCertViewInfo->pCertContext);
2795
2796 if (val)
2797 {
2799 field->create_detailed_value, NULL);
2800 free(val);
2801 }
2802}
2803
2804static const struct v1_field v1_fields[] = {
2813};
2814
2816{
2817 unsigned int i;
2818 PCCERT_CONTEXT cert = data->pCertViewInfo->pCertContext;
2819
2820 /* The last item in v1_fields is the public key, which is not in the loop
2821 * because it's a special case.
2822 */
2823 for (i = 0; i < ARRAY_SIZE(v1_fields) - 1; i++)
2825 if (cert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData)
2827}
2828
2830{
2831 WCHAR *str = NULL;
2832 DWORD size;
2833
2834 if (CryptFormatObject(X509_ASN_ENCODING, 0, formatStrType, NULL,
2835 ext->pszObjId, ext->Value.pbData, ext->Value.cbData, NULL, &size))
2836 {
2837 str = malloc(size);
2838 CryptFormatObject(X509_ASN_ENCODING, 0, formatStrType, NULL,
2839 ext->pszObjId, ext->Value.pbData, ext->Value.cbData, str, &size);
2840 }
2841 return str;
2842}
2843
2845{
2846 WCHAR *str = NULL;
2847
2848 if (ext->Value.cbData)
2849 {
2850 /* The output is formatted as:
2851 * <hex bytes> <ascii bytes>\n
2852 * where <hex bytes> is a string of up to 8 bytes, output as %02x,
2853 * and <ascii bytes> is the ASCII equivalent of each byte, or '.' if
2854 * the byte is not printable.
2855 * So, for example, the extension value consisting of the following
2856 * bytes:
2857 * 0x30,0x14,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04,0x03,
2858 * 0x13,0x09,0x4a,0x75,0x61,0x6e,0x20,0x4c,0x61,0x6e,0x67
2859 * is output as:
2860 * 30 14 31 12 30 10 06 03 0.1.0...
2861 * 55 04 03 13 09 4a 75 61 U....Jua
2862 * 6e 20 4c 61 6e 67 n Lang
2863 * The allocation size therefore requires:
2864 * - 4 characters per character in an 8-byte line
2865 * (2 for the hex format, one for the space, one for the ASCII value)
2866 * - 3 more characters per 8-byte line (two spaces and a newline)
2867 * - 1 character for the terminating nul
2868 * FIXME: should use a fixed-width font for this
2869 */
2870 DWORD lines = (ext->Value.cbData + 7) / 8;
2871
2872 str = malloc((lines * 8 * 4 + lines * 3 + 1) * sizeof(WCHAR));
2873 if (str)
2874 {
2875 static const WCHAR fmt[] = { '%','0','2','x',' ',0 };
2876 DWORD i, j;
2877 WCHAR *ptr;
2878
2879 for (i = 0, ptr = str; i < ext->Value.cbData; i += 8)
2880 {
2881 /* Output as hex bytes first */
2882 for (j = i; j < min(i + 8, ext->Value.cbData); j++, ptr += 3)
2883 swprintf(ptr, 4, fmt, ext->Value.pbData[j]);
2884 /* Pad the hex output with spaces for alignment */
2885 if (j == ext->Value.cbData && j % 8)
2886 {
2887 static const WCHAR pad[] = { ' ',' ',' ' };
2888
2889 for (; j % 8; j++, ptr += ARRAY_SIZE(pad))
2890 memcpy(ptr, pad, sizeof(pad));
2891 }
2892 /* The last swprintf included a space, so just insert one
2893 * more space between the hex bytes and the ASCII output
2894 */
2895 *ptr++ = ' ';
2896 /* Output as ASCII bytes */
2897 for (j = i; j < min(i + 8, ext->Value.cbData); j++, ptr++)
2898 {
2899 if (iswprint(ext->Value.pbData[j]) &&
2900 !iswspace(ext->Value.pbData[j]))
2901 *ptr = ext->Value.pbData[j];
2902 else
2903 *ptr = '.';
2904 }
2905 *ptr++ = '\n';
2906 }
2907 *ptr++ = '\0';
2908 }
2909 }
2910 return str;
2911}
2912
2914{
2918
2919 if (!str)
2921 return str;
2922}
2923
2926{
2928 ext->pszObjId, 0);
2930
2931 if (oidInfo)
2934 else
2935 {
2936 DWORD len = strlen(ext->pszObjId);
2937 WCHAR *oidW = malloc((len + 1) * sizeof(WCHAR));
2938
2939 if (oidW)
2940 {
2941 DWORD i;
2942
2943 for (i = 0; i <= len; i++)
2944 oidW[i] = ext->pszObjId[i];
2947 free(oidW);
2948 }
2949 }
2950 free(val);
2951}
2952
2954{
2955 DWORD i;
2956 PCCERT_CONTEXT cert = data->pCertViewInfo->pCertContext;
2957
2958 for (i = 0; i < cert->pCertInfo->cExtension; i++)
2959 add_cert_extension_detail(hwnd, data, &cert->pCertInfo->rgExtension[i]);
2960}
2961
2963{
2964 DWORD i;
2965 PCCERT_CONTEXT cert = data->pCertViewInfo->pCertContext;
2966
2967 for (i = 0; i < cert->pCertInfo->cExtension; i++)
2968 if (cert->pCertInfo->rgExtension[i].fCritical)
2970 &cert->pCertInfo->rgExtension[i]);
2971}
2972
2973typedef WCHAR * (*prop_to_value_func)(void *pb, DWORD cb);
2974
2976{
2978 int id;
2981};
2982
2984{
2986
2987 ext.pszObjId = (LPSTR)X509_ENHANCED_KEY_USAGE;
2988 ext.fCritical = FALSE;
2989 ext.Value.pbData = pb;
2990 ext.Value.cbData = cb;
2991 return crypt_format_extension(&ext, 0);
2992}
2993
2994/* Logically the access state should also be checked, and IDC_EDITPROPERTIES
2995 * disabled for read-only certificates, but native doesn't appear to do that.
2996 */
2997static const struct prop_id_to_string_id prop_id_map[] = {
3003};
3004
3006{
3007 DWORD i;
3008 PCCERT_CONTEXT cert = data->pCertViewInfo->pCertContext;
3009
3010 for (i = 0; i < ARRAY_SIZE(prop_id_map); i++)
3011 {
3012 DWORD cb;
3013
3015 &cb))
3016 {
3017 BYTE *pb;
3018 WCHAR *val = NULL;
3019
3020 /* FIXME: MS adds a separate value for the signature hash
3021 * algorithm.
3022 */
3023 pb = malloc(cb);
3024 if (pb)
3025 {
3027 prop_id_map[i].prop, pb, &cb))
3028 {
3030 {
3031 val = (LPWSTR)pb;
3032 /* Don't double-free pb */
3033 pb = NULL;
3034 }
3035 else
3036 val = prop_id_map[i].prop_to_value(pb, cb);
3037 }
3038 free(pb);
3039 }
3041 NULL, NULL);
3042 }
3043 }
3044}
3045
3047{
3051}
3052
3054{
3055 int id;
3057};
3058
3059static const struct selection_list_item listItems[] = {
3065};
3066
3068{
3071 int i;
3072
3073 for (i = 0; i < ARRAY_SIZE(listItems); i++)
3074 {
3075 int index;
3076
3080 }
3082}
3083
3085{
3087 RECT rc;
3090
3092 GetWindowRect(lv, &rc);
3094 column.mask = LVCF_WIDTH | LVCF_TEXT;
3095 column.cx = (rc.right - rc.left) / 2 - 2;
3096 column.pszText = buf;
3100}
3101
3102static void set_fields_selection(HWND hwnd, struct detail_data *data, int sel)
3103{
3105
3106 if (sel >= 0 && sel < ARRAY_SIZE(listItems))
3107 {
3109 listItems[sel].add(list, data);
3110 }
3111}
3112
3114{
3118}
3119
3120static void add_purpose(HWND hwnd, LPCSTR oid)
3121{
3124
3125 if (info)
3126 {
3127 char *oidCopy = strdup(oid);
3128
3129 if (oidCopy)
3130 {
3131 LVITEMA item;
3132
3133 info->cbSize = sizeof(CRYPT_OID_INFO);
3134 info->pszOID = oidCopy;
3137 item.stateMask = LVIS_STATEIMAGEMASK;
3138 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
3139 item.iSubItem = 0;
3140 item.lParam = (LPARAM)info;
3141 item.pszText = oidCopy;
3143 }
3144 else
3145 free(info);
3146 }
3147}
3148
3150{
3151 BOOL ret;
3152
3153 if (oid[0] != '0' && oid[0] != '1' && oid[0] != '2')
3154 ret = FALSE;
3155 else if (oid[1] != '.')
3156 ret = FALSE;
3157 else if (!oid[2])
3158 ret = FALSE;
3159 else
3160 {
3161 const char *ptr;
3162 BOOL expectNum = TRUE;
3163
3164 for (ptr = oid + 2, ret = TRUE; ret && *ptr; ptr++)
3165 {
3166 if (expectNum)
3167 {
3168 if (!isdigit(*ptr))
3169 ret = FALSE;
3170 else if (*(ptr + 1) == '.')
3171 expectNum = FALSE;
3172 }
3173 else
3174 {
3175 if (*ptr != '.')
3176 ret = FALSE;
3177 else if (!(*(ptr + 1)))
3178 ret = FALSE;
3179 else
3180 expectNum = TRUE;
3181 }
3182 }
3183 }
3184 return ret;
3185}
3186
3188{
3190 != -1;
3191}
3192
3193#define MAX_PURPOSE 255
3194
3196 WPARAM wp, LPARAM lp)
3197{
3198 INT_PTR ret = 0;
3199 char buf[MAX_PURPOSE + 1];
3200
3201 switch (msg)
3202 {
3203 case WM_INITDIALOG:
3205 MAX_PURPOSE, 0);
3208 break;
3209 case WM_COMMAND:
3210 switch (HIWORD(wp))
3211 {
3212 case EN_CHANGE:
3213 if (LOWORD(wp) == IDC_NEW_PURPOSE)
3214 {
3215 /* Show/hide scroll bar on description depending on how much
3216 * text it has.
3217 */
3220
3222 }
3223 break;
3224 case BN_CLICKED:
3225 switch (LOWORD(wp))
3226 {
3227 case IDOK:
3229 (LPARAM)buf);
3230 if (!buf[0])
3231 {
3232 /* An empty purpose is the same as cancelling */
3234 ret = TRUE;
3235 }
3236 else if (!is_valid_oid(buf))
3237 {
3239
3243 }
3244 else if (is_oid_in_list(
3246 {
3248
3250 ARRAY_SIZE(error));
3253 }
3254 else
3255 {
3257
3259 EndDialog(hwnd, wp);
3260 ret = TRUE;
3261 }
3262 break;
3263 case IDCANCEL:
3264 EndDialog(hwnd, wp);
3265 ret = TRUE;
3266 break;
3267 }
3268 break;
3269 }
3270 break;
3271 }
3272 return ret;
3273}
3274
3276{
3277 WCHAR *name = NULL;
3278 DWORD cb;
3279
3281 {
3282 name = malloc(cb);
3283 if (name)
3284 {
3286 {
3287 free(name);
3288 name = NULL;
3289 }
3290 }
3291 }
3292 return name;
3293}
3294
3296{
3297 int items = SendMessageW(list, LVM_GETITEMCOUNT, 0, 0), i;
3298
3299 for (i = 0; i < items; i++)
3300 {
3301 BOOL change = FALSE;
3302 int state;
3303
3305 /* This reverses the INDEXTOSTATEIMAGEMASK shift. There doesn't appear
3306 * to be a handy macro for it.
3307 */
3308 state >>= 12;
3309 if (enabled)
3310 {
3312 {
3314 change = TRUE;
3315 }
3317 {
3319 change = TRUE;
3320 }
3321 }
3322 else
3323 {
3325 {
3327 change = TRUE;
3328 }
3330 {
3332 change = TRUE;
3333 }
3334 }
3335 if (change)
3336 {
3337 LVITEMW item;
3338
3340 item.stateMask = LVIS_STATEIMAGEMASK;
3342 }
3343 }
3344}
3345
3346typedef enum {
3351
3353{
3355
3356 switch (selection)
3357 {
3358 case PurposeEnableAll:
3359 case PurposeDisableAll:
3360 EnableWindow(lv, FALSE);
3361 redraw_states(lv, FALSE);
3363 break;
3365 EnableWindow(lv, TRUE);
3366 redraw_states(lv, TRUE);
3368 }
3369}
3370
3372{
3376};
3377
3379{
3380 PCCERT_CONTEXT cert = data->cert;
3383 DWORD size;
3384 RECT rc;
3386 PurposeSelection purposeSelection = PurposeEnableAll;
3387
3388 GetWindowRect(lv, &rc);
3389 column.mask = LVCF_WIDTH;
3390 column.cx = rc.right - rc.left;
3393
3394 /* Get enhanced key usage. Have to check for a property and an extension
3395 * separately, because CertGetEnhancedKeyUsage will succeed and return an
3396 * empty usage if neither is set. Unfortunately an empty usage implies
3397 * no usage is allowed, so we have to distinguish between the two cases.
3398 */
3400 NULL, &size))
3401 {
3402 usage = malloc(size);
3405 {
3406 free(usage);
3407 usage = NULL;
3408 }
3409 else if (usage->cUsageIdentifier)
3410 purposeSelection = PurposeEnableSelected;
3411 else
3412 purposeSelection = PurposeDisableAll;
3413 }
3415 NULL, &size))
3416 {
3417 usage = malloc(size);
3420 {
3421 free(usage);
3422 usage = NULL;
3423 }
3424 else if (usage->cUsageIdentifier)
3425 purposeSelection = PurposeEnableAll;
3426 else
3427 purposeSelection = PurposeDisableAll;
3428 }
3429 else
3430 {
3431 purposeSelection = PurposeEnableAll;
3432 usage = NULL;
3433 }
3434 if (usage)
3435 {
3436 DWORD i;
3437
3438 for (i = 0; i < usage->cUsageIdentifier; i++)
3439 {
3441 usage->rgpszUsageIdentifier[i], CRYPT_ENHKEY_USAGE_OID_GROUP_ID);
3442
3443 if (info)
3445 else
3446 add_purpose(hwnd, usage->rgpszUsageIdentifier[i]);
3447 }
3448 free(usage);
3449 }
3450 else
3452 select_purposes(hwnd, purposeSelection);
3454 BM_CLICK, 0, 0);
3455}
3456
3458{
3459 PCCERT_CONTEXT cert = data->cert;
3460 WCHAR *str;
3461
3463 {
3465 (LPARAM)str);
3466 free(str);
3467 }
3469 {
3471 (LPARAM)str);
3472 free(str);
3473 }
3475}
3476
3478 LPWSTR str)
3479{
3480 if (str && *str)
3481 {
3483
3484 blob.pbData = (BYTE *)str;
3485 blob.cbData = (lstrlenW(str) + 1) * sizeof(WCHAR);
3487 }
3488 else
3490}
3491
3492#define WM_REFRESH_VIEW WM_USER + 0
3493
3495{
3498 return TRUE;
3499}
3500
3501#define MAX_FRIENDLY_NAME 40
3502#define MAX_DESCRIPTION 255
3503
3505{
3507 struct edit_cert_data *data =
3509
3515 {
3516 /* Setting a NULL usage removes the enhanced key usage property. */
3518 }
3520 {
3521 CERT_ENHKEY_USAGE usage = { 0, NULL };
3522
3524 }
3526 {
3528 CERT_ENHKEY_USAGE usage = { 0, NULL };
3529 int purposes = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0), i;
3530 LVITEMW item;
3531
3532 item.mask = LVIF_STATE | LVIF_PARAM;
3533 item.iSubItem = 0;
3534 item.stateMask = LVIS_STATEIMAGEMASK;
3535 for (i = 0; i < purposes; i++)
3536 {
3537 item.iItem = i;
3538 if (SendMessageW(lv, LVM_GETITEMW, 0, (LPARAM)&item))
3539 {
3540 int state = item.state >> 12;
3541
3543 {
3545
3546 usage.rgpszUsageIdentifier = realloc(usage.rgpszUsageIdentifier,
3547 (usage.cUsageIdentifier + 1) * sizeof(char *));
3548 if (usage.rgpszUsageIdentifier)
3549 usage.rgpszUsageIdentifier[usage.cUsageIdentifier++] =
3550 (LPSTR)info->pszOID;
3551 }
3552 }
3553 }
3555 free(usage.rgpszUsageIdentifier);
3556 }
3558 if (data->pfPropertiesChanged)
3559 *data->pfPropertiesChanged = TRUE;
3560}
3561
3563 WPARAM wp, LPARAM lp)
3564{
3566
3567 TRACE("(%p, %08x, %08Ix, %08Ix)\n", hwnd, msg, wp, lp);
3568
3569 switch (msg)
3570 {
3571 case WM_INITDIALOG:
3572 {
3574 struct detail_data *detailData;
3575 struct edit_cert_data *editData;
3576
3577 page = (PROPSHEETPAGEW *)lp;
3578 detailData = (struct detail_data *)page->lParam;
3583 editData = malloc(sizeof(struct edit_cert_data));
3584 if (editData)
3585 {
3586 editData->imageList = ImageList_Create(16, 16,
3587 ILC_COLOR4 | ILC_MASK, 4, 0);
3588 if (editData->imageList)
3589 {
3590 HBITMAP bmp;
3591 COLORREF backColor = RGB(255, 0, 255);
3592
3594 ImageList_AddMasked(editData->imageList, bmp, backColor);
3597 }
3598 editData->cert = detailData->pCertViewInfo->pCertContext;
3599 editData->pfPropertiesChanged = detailData->pfPropertiesChanged;
3602 }
3603 break;
3604 }
3605 case WM_NOTIFY:
3606 {
3607 NMHDR *hdr = (NMHDR *)lp;
3608 NMITEMACTIVATE *nm;
3609
3610 switch (hdr->code)
3611 {
3612 case NM_CLICK:
3613 nm = (NMITEMACTIVATE *)lp;
3614 toggle_usage(hwnd, nm->iItem);
3616 break;
3617 case PSN_APPLY:
3619 break;
3620 }
3621 break;
3622 }
3623 case WM_COMMAND:
3624 switch (HIWORD(wp))
3625 {
3626 case EN_CHANGE:
3628 if (LOWORD(wp) == IDC_DESCRIPTION)
3629 {
3630 /* Show/hide scroll bar on description depending on how much
3631 * text it has.
3632 */
3635
3637 }
3638 break;
3639 case BN_CLICKED:
3640 switch (LOWORD(wp))
3641 {
3642 case IDC_ADD_PURPOSE:
3647 break;
3653 break;
3654 }
3655 break;
3656 }
3657 break;
3658 }
3659 return 0;
3660}
3661
3664{
3665 HWND lv;
3666 int cItem, i;
3667 struct edit_cert_data *data;
3668
3669 switch (msg)
3670 {
3671 case PSPCB_RELEASE:
3673 cItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
3674 for (i = 0; i < cItem; i++)
3675 {
3676 LVITEMW item;
3677
3678 item.mask = LVIF_PARAM;
3679 item.iItem = i;
3680 item.iSubItem = 0;
3681 if (SendMessageW(lv, LVM_GETITEMW, 0, (LPARAM)&item) && item.lParam)
3682 {
3684
3685 if (info->cbSize == sizeof(CRYPT_OID_INFO) && !info->dwGroupId)
3686 {
3687 free((char *)info->pszOID);
3688 free(info);
3689 }
3690 }
3691 }
3693 if (data)
3694 {
3695#ifndef __REACTOS__
3696 ImageList_Destroy(data->imageList);
3697#endif
3698 free(data);
3699 }
3700 break;
3701 }
3702 return 1;
3703}
3704
3706 struct detail_data *data)
3707{
3709 PROPSHEETPAGEW page; /* FIXME: need to add a cross-certificate page */
3710
3711 TRACE("(%p)\n", data);
3712
3713 memset(&page, 0, sizeof(PROPSHEETPAGEW));
3714 page.dwSize = sizeof(page);
3715 page.dwFlags = PSP_USECALLBACK;
3717 page.hInstance = hInstance;
3720 page.lParam = (LPARAM)data;
3721
3722 memset(&hdr, 0, sizeof(hdr));
3723 hdr.dwSize = sizeof(hdr);
3724 hdr.hwndParent = parent;
3725 hdr.dwFlags = PSH_PROPSHEETPAGE;
3726 hdr.hInstance = hInstance;
3728 hdr.ppsp = &page;
3729 hdr.nPages = 1;
3731}
3732
3734{
3735 int i;
3736
3737 for (i = 0; i < data->cFields; i++)
3738 free(data->fields[i].detailed_value);
3739 free(data->fields);
3740 data->fields = NULL;
3741 data->cFields = 0;
3742}
3743
3745{
3747 int curSel;
3748 struct detail_data *data;
3749
3750 curSel = SendMessageW(cb, CB_GETCURSEL, 0, 0);
3751 /* Actually, any index will do, since they all store the same data value */
3752 data = (struct detail_data *)SendMessageW(cb, CB_GETITEMDATA, curSel, 0);
3754 set_fields_selection(hwnd, data, curSel);
3755}
3756
3758 LPARAM lp)
3759{
3761 struct detail_data *data;
3762
3763 TRACE("(%p, %08x, %08Ix, %08Ix)\n", hwnd, msg, wp, lp);
3764
3765 switch (msg)
3766 {
3767 case WM_INITDIALOG:
3768 page = (PROPSHEETPAGEW *)lp;
3769 data = (struct detail_data *)page->lParam;
3771 if (!(data->pCertViewInfo->dwFlags & CRYPTUI_ENABLE_EDITPROPERTIES))
3773 if (data->pCertViewInfo->dwFlags & CRYPTUI_DISABLE_EXPORT)
3775 break;
3776 case WM_NOTIFY:
3777 {
3778 NMITEMACTIVATE *nm;
3780
3781 nm = (NMITEMACTIVATE*)lp;
3782 if (nm->hdr.hwndFrom == list && nm->uNewState & LVN_ITEMACTIVATE
3783 && nm->hdr.code == LVN_ITEMCHANGED)
3784 {
3785 data = (struct detail_data *)nm->lParam;
3786 if (nm->iItem >= 0 && data && nm->iItem < data->cFields)
3787 {
3789 HWND valueCtl = GetDlgItem(hwnd, IDC_DETAIL_VALUE);
3790
3791 if (data->fields[nm->iItem].create)
3792 val = data->fields[nm->iItem].create(
3793 data->pCertViewInfo->pCertContext,
3794 data->fields[nm->iItem].param);
3795 else
3796 {
3797 LVITEMW item;
3798 int res;
3799
3800 item.cchTextMax = ARRAY_SIZE(buf);
3801 item.mask = LVIF_TEXT;
3802 item.pszText = buf;
3803 item.iItem = nm->iItem;
3804 item.iSubItem = 1;
3806 if (res)
3807 val = buf;
3808 }
3809 /* Select all the text in the control, the next update will
3810 * replace it
3811 */
3812 SendMessageW(valueCtl, EM_SETSEL, 0, -1);
3814 val ? lstrlenW(val) : 0);
3815 if (val != buf)
3816 free(val);
3817 }
3818 }
3819 break;
3820 }
3821 case WM_COMMAND:
3822 switch (wp)
3823 {
3824 case IDC_EXPORT:
3825 {
3828
3829 data = (struct detail_data *)SendMessageW(cb, CB_GETITEMDATA, 0, 0);
3830 info.dwSize = sizeof(info);
3831 info.pwszExportFileName = NULL;
3832 info.dwSubjectChoice = CRYPTUI_WIZ_EXPORT_CERT_CONTEXT;
3833 info.pCertContext = data->pCertViewInfo->pCertContext;
3834 info.cStores = 0;
3836 break;
3837 }
3838 case IDC_EDITPROPERTIES:
3839 {
3841 int curSel;
3842
3843 curSel = SendMessageW(cb, CB_GETCURSEL, 0, 0);
3844 /* Actually, any index will do, since they all store the same
3845 * data value
3846 */
3848 curSel, 0);
3850 break;
3851 }
3852 case ((CBN_SELCHANGE << 16) | IDC_DETAIL_SELECT):
3854 break;
3855 }
3856 break;
3857 case WM_REFRESH_VIEW:
3859 break;
3860 }
3861 return 0;
3862}
3863
3866{
3867 struct detail_data *data;
3868
3869 switch (msg)
3870 {
3871 case PSPCB_RELEASE:
3872 data = (struct detail_data *)page->lParam;
3874 free(data);
3875 break;
3876 }
3877 return 0;
3878}
3879
3882{
3883 BOOL ret;
3884 struct detail_data *data = malloc(sizeof(struct detail_data));
3885
3886 if (data)
3887 {
3888 data->pCertViewInfo = pCertViewInfo;
3889 data->pfPropertiesChanged = pfPropertiesChanged;
3890 data->cFields = 0;
3891 data->fields = NULL;
3892 memset(page, 0, sizeof(PROPSHEETPAGEW));
3893 page->dwSize = sizeof(PROPSHEETPAGEW);
3894 page->dwFlags = PSP_USECALLBACK;
3895 page->pfnCallback = detail_callback;
3896 page->hInstance = hInstance;
3897 page->pszTemplate = MAKEINTRESOURCEW(IDD_DETAIL);
3898 page->pfnDlgProc = detail_dlg_proc;
3899 page->lParam = (LPARAM)data;
3900 ret = TRUE;
3901 }
3902 else
3903 ret = FALSE;
3904 return ret;
3905}
3906
3908{
3912};
3913
3915{
3917 (CRYPT_PROVIDER_DATA *)data->pCertViewInfo->pCryptProviderData,
3918 data->pCertViewInfo->idxSigner, data->pCertViewInfo->fCounterSigner,
3919 data->pCertViewInfo->idxCounterSigner);
3920
3921 /* Takes advantage of the fact that a pointer is 32-bit aligned, and
3922 * therefore always even.
3923 */
3924 if (index == provSigner->csCertChain - 1)
3925 return (LPARAM)data;
3926 return index << 1 | 1;
3927}
3928
3930{
3932 (CRYPT_PROVIDER_DATA *)data->pCertViewInfo->pCryptProviderData,
3933 data->pCertViewInfo->idxSigner, data->pCertViewInfo->fCounterSigner,
3934 data->pCertViewInfo->idxCounterSigner);
3935
3936 if (!(lp & 1))
3937 return provSigner->csCertChain - 1;
3938 return lp >> 1;
3939}
3940
3943{
3944 struct hierarchy_data *data = NULL;
3946
3947 do {
3950
3951 if (!parent)
3952 root = hItem;
3953 hItem = parent;
3954 } while (hItem);
3955 if (root)
3956 {
3957 TVITEMW item;
3958
3959 item.mask = TVIF_PARAM;
3960 item.hItem = root;
3962 data = (struct hierarchy_data *)item.lParam;
3963 }
3964 return data;
3965}
3966
3968{
3970
3971 if (!name)
3973 return name;
3974}
3975
3977{
3980 (CRYPT_PROVIDER_DATA *)data->pCertViewInfo->pCryptProviderData,
3981 data->pCertViewInfo->idxSigner, data->pCertViewInfo->fCounterSigner,
3982 data->pCertViewInfo->idxCounterSigner);
3983 DWORD i;
3985
3987 for (i = provSigner->csCertChain; i; i--)
3988 {
3989 LPWSTR name;
3990
3991 name = get_cert_display_name(provSigner->pasCertChain[i - 1].pCert);
3992 if (name)
3993 {
3994 TVINSERTSTRUCTW tvis;
3995
3996 tvis.hParent = parent;
3997 tvis.hInsertAfter = TVI_LAST;
3998 tvis.item.mask = TVIF_TEXT | TVIF_STATE | TVIF_IMAGE |
4000 tvis.item.pszText = name;
4001 tvis.item.state = TVIS_EXPANDED;
4002 tvis.item.stateMask = TVIS_EXPANDED;
4003 if (i == 1 && (!provSigner->pChainContext ||
4006 {
4007 /* The root of the chain has a special case: if the chain is
4008 * a partial chain, the icon is a warning icon rather than an
4009 * error icon.
4010 */
4011 tvis.item.iImage = 2;
4012 }
4013 else if (provSigner->pasCertChain[i - 1].pChainElement->TrustStatus.
4014 dwErrorStatus == 0)
4015 tvis.item.iImage = 0;
4016 else
4017 tvis.item.iImage = 1;
4018 tvis.item.iSelectedImage = tvis.item.iImage;
4019 tvis.item.lParam = index_to_lparam(data, i - 1);
4021 (LPARAM)&tvis);
4022 free(name);
4023 }
4024 }
4025}
4026
4028{
4029 /* Select all the text in the control, the next update will replace it */
4030 SendMessageW(hwnd, EM_SETSEL, 0, -1);
4031 /* Set the highest priority error messages first. */
4032 if (!(cert->dwConfidence & CERT_CONFIDENCE_SIG))
4034 else if (!(cert->dwConfidence & CERT_CONFIDENCE_TIME))
4036 else if (!(cert->dwConfidence & CERT_CONFIDENCE_TIMENEST))
4038 else if (cert->dwRevokedReason)
4040 else
4042}
4043
4046{
4054
4055 set_certificate_status(status, provCert);
4056}
4057
4059{
4060 /* Disable view certificate button until a certificate is selected */
4064}
4065
4067{
4069 TVITEMW item;
4070 struct hierarchy_data *data;
4072
4073 memset(&item, 0, sizeof(item));
4074 item.mask = TVIF_HANDLE | TVIF_PARAM;
4079 if (selection != 0)
4080 {
4081 CRYPT_PROVIDER_SGNR *provSigner;
4083 BOOL changed = FALSE;
4084
4085 provSigner = WTHelperGetProvSignerFromChain(
4086 (CRYPT_PROVIDER_DATA *)data->pCertViewInfo->pCryptProviderData,
4087 data->pCertViewInfo->idxSigner,
4088 data->pCertViewInfo->fCounterSigner,
4089 data->pCertViewInfo->idxCounterSigner);
4090 memset(&viewInfo, 0, sizeof(viewInfo));
4091 viewInfo.dwSize = sizeof(viewInfo);
4092 viewInfo.dwFlags = data->pCertViewInfo->dwFlags;
4093 viewInfo.szTitle = data->pCertViewInfo->szTitle;
4094 viewInfo.pCertContext = provSigner->pasCertChain[selection].pCert;
4095 viewInfo.cStores = data->pCertViewInfo->cStores;
4096 viewInfo.rghStores = data->pCertViewInfo->rghStores;
4097 viewInfo.cPropSheetPages = data->pCertViewInfo->cPropSheetPages;
4098 viewInfo.rgPropSheetPages = data->pCertViewInfo->rgPropSheetPages;
4099 viewInfo.nStartPage = data->pCertViewInfo->nStartPage;
4100 CryptUIDlgViewCertificateW(&viewInfo, &changed);
4101 if (changed)
4102 {
4103 /* Delete the contents of the tree */
4105 /* Reinitialize the tree */
4107 }
4108 }
4109}
4110
4112 LPARAM lp)
4113{
4115 struct hierarchy_data *data;
4116 INT_PTR ret = 0;
4118
4119 TRACE("(%p, %08x, %08Ix, %08Ix)\n", hwnd, msg, wp, lp);
4120
4121 switch (msg)
4122 {
4123 case WM_INITDIALOG:
4124 page = (PROPSHEETPAGEW *)lp;
4125 data = (struct hierarchy_data *)page->lParam;
4127 break;
4128 case WM_NOTIFY:
4129 {
4130 NMHDR *hdr;
4131
4132 hdr = (NMHDR *)lp;
4133 switch (hdr->code)
4134 {
4135 case TVN_SELCHANGEDW:
4136 {
4137 NMTREEVIEWW *nm = (NMTREEVIEWW*)lp;
4139 CRYPT_PROVIDER_SGNR *provSigner;
4140
4143 provSigner = WTHelperGetProvSignerFromChain(
4144 (CRYPT_PROVIDER_DATA *)data->pCertViewInfo->pCryptProviderData,
4145 data->pCertViewInfo->idxSigner,
4146 data->pCertViewInfo->fCounterSigner,
4147 data->pCertViewInfo->idxCounterSigner);
4150 &provSigner->pasCertChain[selection]);
4151 break;
4152 }
4153 case NM_DBLCLK:
4156 ret = 1;
4157 break;
4158 }
4159 break;
4160 }
4161 case WM_COMMAND:
4162 switch (wp)
4163 {
4166 break;
4167 }
4168 break;
4169 case WM_REFRESH_VIEW:
4170 {
4171 TVITEMW item;
4172
4173 /* Get hierarchy data */
4174 memset(&item, 0, sizeof(item));
4175 item.mask = TVIF_HANDLE | TVIF_PARAM;
4177 0);
4179 /* Delete the contents of the tree */
4181 /* Reinitialize the tree */
4183 break;
4184 }
4185 }
4186 return ret;
4187}
4188
4191{
4192 struct hierarchy_data *data;
4193
4194 switch (msg)
4195 {
4196 case PSPCB_RELEASE:
4197 data = (struct hierarchy_data *)page->lParam;
4198#ifndef __REACTOS__
4199 ImageList_Destroy(data->imageList);
4200#endif
4201 free(data);
4202 break;
4203 }
4204 return 0;
4205}
4206
4209{
4210 struct hierarchy_data *data = malloc(sizeof(struct hierarchy_data));
4211 BOOL ret = FALSE;
4212
4213 if (data)
4214 {
4215 data->imageList = ImageList_Create(16, 16, ILC_COLOR4 | ILC_MASK, 2, 0);
4216 if (data->imageList)
4217 {
4218 HBITMAP bmp;
4219 COLORREF backColor = RGB(255, 0, 255);
4220
4221 data->pCertViewInfo = pCertViewInfo;
4222 data->selectedCert = 0xffffffff;
4223
4225 ImageList_AddMasked(data->imageList, bmp, backColor);
4227 ImageList_SetBkColor(data->imageList, CLR_NONE);
4228
4229 memset(page, 0, sizeof(PROPSHEETPAGEW));
4230 page->dwSize = sizeof(PROPSHEETPAGEW);
4231 page->dwFlags = PSP_USECALLBACK;
4232 page->hInstance = hInstance;
4233 page->pszTemplate = MAKEINTRESOURCEW(IDD_HIERARCHY);
4234 page->pfnDlgProc = hierarchy_dlg_proc;
4235 page->lParam = (LPARAM)data;
4236 page->pfnCallback = hierarchy_callback;
4237 ret = TRUE;
4238 }
4239 else
4240 free(data);
4241 }
4242 return ret;
4243}
4244
4246{
4247 RECT rc;
4248
4249 TRACE("(%p, %08x, %08Ix)\n", hwnd, msg, lp);
4250
4251 switch (msg)
4252 {
4253 case PSCB_INITIALIZED:
4254 /* Get cancel button's position.. */
4256 MapWindowPoints( 0, hwnd, (POINT *)&rc, 2 );
4257 /* hide the cancel button.. */
4259 /* and move the OK button to the cancel button's original position. */
4260 SetWindowPos(GetDlgItem(hwnd, IDOK), 0, rc.left, rc.top, 0, 0,
4262 break;
4263 }
4264 return 0;
4265}
4266
4268 CRYPT_PROVIDER_CERT *provCert, BOOL *pfPropertiesChanged)
4269{
4270 static const WCHAR riched[] = { 'r','i','c','h','e','d','2','0',0 };
4271 DWORD nPages;
4272 PROPSHEETPAGEW *pages;
4273 BOOL ret = FALSE;
4274 HMODULE lib = LoadLibraryW(riched);
4275
4276 nPages = pCertViewInfo->cPropSheetPages + 1; /* one for the General tab */
4278 nPages++;
4280 nPages++;
4281 pages = malloc(nPages * sizeof(PROPSHEETPAGEW));
4282 if (pages)
4283 {
4286 DWORD i;
4287
4288 memset(&hdr, 0, sizeof(hdr));
4289 hdr.dwSize = sizeof(hdr);
4291 hdr.hInstance = hInstance;
4293 hdr.pszCaption = pCertViewInfo->szTitle;
4294 else
4295 hdr.pszCaption = MAKEINTRESOURCEW(IDS_CERTIFICATE);
4296 init_general_page(pCertViewInfo, &pages[hdr.nPages++]);
4298 {
4299 if (init_detail_page(pCertViewInfo, pfPropertiesChanged,
4300 &pages[hdr.nPages]))
4301 hdr.nPages++;
4302 }
4304 {
4305 if (init_hierarchy_page(pCertViewInfo, &pages[hdr.nPages]))
4306 hdr.nPages++;
4307 }
4308 /* Copy each additional page, and create the init dialog struct for it
4309 */
4311 {
4313 if (init)
4314 {
4315 for (i = 0; i < pCertViewInfo->cPropSheetPages; i++)
4316 {
4317 memcpy(&pages[hdr.nPages + i],
4319 sizeof(PROPSHEETPAGEW));
4321 init[i].pCertContext = pCertViewInfo->pCertContext;
4322 pages[hdr.nPages + i].lParam = (LPARAM)&init[i];
4323 }
4324 if (pCertViewInfo->nStartPage & 0x8000)
4325 {
4326 /* Start page index is relative to the number of default
4327 * pages
4328 */
4329 hdr.nStartPage = pCertViewInfo->nStartPage + hdr.nPages;
4330 }
4331 else
4332 hdr.nStartPage = pCertViewInfo->nStartPage;
4333 hdr.nPages = nPages;
4334 ret = TRUE;
4335 }
4336 else
4338 }
4339 else
4340 {
4341 /* Ignore the relative flag if there aren't any additional pages */
4342 hdr.nStartPage = pCertViewInfo->nStartPage & 0x7fff;
4343 ret = TRUE;
4344 }
4345 if (ret)
4346 {
4347 INT_PTR l;
4348
4349 hdr.ppsp = pages;
4350 hdr.pfnCallback = cert_prop_sheet_proc;
4351 l = PropertySheetW(&hdr);
4352 if (l == 0)
4353 {
4355 ret = FALSE;
4356 }
4357 }
4358 free(init);
4359 free(pages);
4360 }
4361 else
4363 FreeLibrary(lib);
4364 return ret;
4365}
4366
4367/***********************************************************************
4368 * CryptUIDlgViewCertificateW (CRYPTUI.@)
4369 */
4372{
4373 static GUID generic_cert_verify = WINTRUST_ACTION_GENERIC_CERT_VERIFY;
4375 WINTRUST_DATA wvt;
4377 BOOL ret = FALSE;
4378 CRYPT_PROVIDER_SGNR *signer;
4379 CRYPT_PROVIDER_CERT *provCert = NULL;
4380
4381 TRACE("(%p, %p)\n", pCertViewInfo, pfPropertiesChanged);
4382
4384 {
4386 return FALSE;
4387 }
4388 /* Make a local copy in case we have to call WinVerifyTrust ourselves */
4389 memcpy(&viewInfo, pCertViewInfo, sizeof(viewInfo));
4391 {
4392 memset(&wvt, 0, sizeof(wvt));
4393 wvt.cbStruct = sizeof(wvt);
4394 wvt.dwUIChoice = WTD_UI_NONE;
4395 if (viewInfo.dwFlags &
4403 memset(&cert, 0, sizeof(cert));
4404 cert.cbStruct = sizeof(cert);
4405 cert.psCertContext = (CERT_CONTEXT *)viewInfo.pCertContext;
4406 cert.chStores = viewInfo.cStores;
4407 cert.pahStores = viewInfo.rghStores;
4408 wvt.pCert = &cert;
4410 WinVerifyTrust(NULL, &generic_cert_verify, &wvt);
4411 viewInfo.pCryptProviderData =
4414 (CRYPT_PROVIDER_DATA *)viewInfo.pCryptProviderData, 0, FALSE, 0);
4415 provCert = WTHelperGetProvCertFromChain(signer, 0);
4416 ret = TRUE;
4417 }
4418 else
4419 {
4420 viewInfo.pCryptProviderData =
4424 viewInfo.idxSigner, viewInfo.fCounterSigner,
4425 viewInfo.idxCounterSigner);
4426 provCert = WTHelperGetProvCertFromChain(signer, viewInfo.idxCert);
4427 ret = TRUE;
4428 }
4429 if (ret)
4430 {
4431 ret = show_cert_dialog(&viewInfo, provCert, pfPropertiesChanged);
4433 {
4435 WinVerifyTrust(NULL, &generic_cert_verify, &wvt);
4436 }
4437 }
4438 return ret;
4439}
4440
4441/***********************************************************************
4442 * CryptUIDlgViewContext (CRYPTUI.@)
4443 */
4446{
4447 BOOL ret;
4448
4449 TRACE("(%ld, %p, %p, %s, %08lx, %p)\n", dwContextType, pvContext, hwnd,
4450 debugstr_w(pwszTitle), dwFlags, pvReserved);
4451
4452 switch (dwContextType)
4453 {
4455 {
4457
4458 memset(&viewInfo, 0, sizeof(viewInfo));
4459 viewInfo.dwSize = sizeof(viewInfo);
4460 viewInfo.hwndParent = hwnd;
4461 viewInfo.szTitle = pwszTitle;
4462 viewInfo.pCertContext = pvContext;
4463 ret = CryptUIDlgViewCertificateW(&viewInfo, NULL);
4464 break;
4465 }
4466 default:
4467 FIXME("unimplemented for context type %ld\n", dwContextType);
4469 ret = FALSE;
4470 }
4471 return ret;
4472}
4473
4474/* Decodes a cert's basic constraints extension (either szOID_BASIC_CONSTRAINTS
4475 * or szOID_BASIC_CONSTRAINTS2, whichever is present) to determine if it
4476 * should be a CA. If neither extension is present, returns
4477 * defaultIfNotSpecified.
4478 */
4479static BOOL is_ca_cert(PCCERT_CONTEXT cert, BOOL defaultIfNotSpecified)
4480{
4481 BOOL isCA = defaultIfNotSpecified;
4483 cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension);
4484
4485 if (ext)
4486 {
4488 DWORD size = 0;
4489
4491 ext->Value.pbData, ext->Value.cbData, CRYPT_DECODE_ALLOC_FLAG,
4492 NULL, &info, &size))
4493 {
4494 if (info->SubjectType.cbData == 1)
4495 isCA = info->SubjectType.pbData[0] & CERT_CA_SUBJECT_FLAG;
4496 LocalFree(info);
4497 }
4498 }
4499 else
4500 {
4502 cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension);
4503 if (ext)
4504 {
4507
4509 szOID_BASIC_CONSTRAINTS2, ext->Value.pbData, ext->Value.cbData,
4510 0, NULL, &info, &size))
4511 isCA = info.fCA;
4512 }
4513 }
4514 return isCA;
4515}
4516
4518{
4519 LPCWSTR storeName;
4520
4521 if (is_ca_cert(cert, TRUE))
4522 storeName = ca;
4523 else
4524 storeName = addressBook;
4527}
4528
4530{
4531 HCERTSTORE store;
4532 BOOL ret;
4533
4534 if (!cert)
4535 {
4537 return FALSE;
4538 }
4539 if (hDestCertStore) store = hDestCertStore;
4540 else
4541 {
4542 if (!(store = choose_store_for_cert(cert)))
4543 {
4544 WARN("unable to open certificate store\n");
4545 return FALSE;
4546 }
4547 }
4550 if (!hDestCertStore) CertCloseStore(store, 0);
4551 return ret;
4552}
4553
4555{
4556 HCERTSTORE store;
4557 BOOL ret;
4558
4559 if (!crl)
4560 {
4562 return FALSE;
4563 }
4564 if (hDestCertStore) store = hDestCertStore;
4565 else
4566 {
4567 if (!(store = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, 0,
4569 {
4570 WARN("unable to open certificate store\n");
4571 return FALSE;
4572 }
4573 }
4576 if (!hDestCertStore) CertCloseStore(store, 0);
4577 return ret;
4578}
4579
4581{
4582 HCERTSTORE store;
4583 BOOL ret;
4584
4585 if (!ctl)
4586 {
4588 return FALSE;
4589 }
4590 if (hDestCertStore) store = hDestCertStore;
4591 else
4592 {
4593 static const WCHAR trust[] = { 'T','r','u','s','t',0 };
4594
4595 if (!(store = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, 0,
4597 {
4598 WARN("unable to open certificate store\n");
4599 return FALSE;
4600 }
4601 }
4602 ret = CertAddCTLContextToStore(store, ctl,
4604 if (!hDestCertStore) CertCloseStore(store, 0);
4605 return ret;
4606}
4607
4608/* Checks type, a type such as CERT_QUERY_CONTENT_CERT returned by
4609 * CryptQueryObject, against the allowed types. Returns TRUE if the
4610 * type is allowed, FALSE otherwise.
4611 */
4613{
4614 BOOL ret;
4615
4616 if (dwFlags &
4619 {
4620 switch (type)
4621 {
4625 break;
4629 break;
4633 break;
4634 default:
4635 /* The remaining types contain more than one type, so allow
4636 * any combination.
4637 */
4638 ret = TRUE;
4639 }
4640 }
4641 else
4642 {
4643 /* No allowed types specified, so any type is allowed */
4644 ret = TRUE;
4645 }
4646 if (!ret)
4648 return ret;
4649}
4650
4651
4653 int warningID)
4654{
4655 if (!(dwFlags & CRYPTUI_WIZ_NO_UI))
4656 {
4658 LPCWSTR pTitle;
4659
4660 if (szTitle)
4661 pTitle = szTitle;
4662 else
4663 {
4665 pTitle = title;
4666 }
4669 }
4670}
4671
4673{
4675}
4676
4678{
4679 BOOL ret;
4680
4681 if (dwFlags &
4684 {
4687 PCCTL_CONTEXT ctl;
4688
4689 ret = TRUE;
4690 if ((cert = CertEnumCertificatesInStore(store, NULL)))
4691 {
4694 ret = FALSE;
4695 }
4696 if (ret && (crl = CertEnumCRLsInStore(store, NULL)))
4697 {
4700 ret = FALSE;
4701 }
4702 if (ret && (ctl = CertEnumCTLsInStore(store, NULL)))
4703 {
4704 CertFreeCTLContext(ctl);
4706 ret = FALSE;
4707 }
4708 }
4709 else
4710 ret = TRUE;
4711 if (!ret)
4713 return ret;
4714}
4715
4718{
4719 BOOL ret;
4720
4722 {
4725 PCCTL_CONTEXT ctl = NULL;
4726
4727 do {
4729 if (cert)
4731 } while (ret && cert);
4732 do {
4734 if (crl)
4735 ret = import_crl(crl, dest);
4736 } while (ret && crl);
4737 do {
4738 ctl = CertEnumCTLsInStore(source, ctl);
4739 if (ctl)
4740 ret = import_ctl(ctl, dest);
4741 } while (ret && ctl);
4742 }
4743 else
4745 return ret;
4746}
4747
4749 DWORD *pContentType)
4750{
4751 HCERTSTORE store = NULL;
4752 DWORD contentType = 0, expectedContentTypeFlags;
4753
4754 if (dwFlags &
4757 {
4758 expectedContentTypeFlags =
4763 expectedContentTypeFlags |=
4767 expectedContentTypeFlags |=
4771 expectedContentTypeFlags |=
4774 }
4775 else
4776 expectedContentTypeFlags =
4786
4788 expectedContentTypeFlags, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL,
4789 &contentType, NULL, &store, NULL, NULL);
4790 if (pContentType)
4791 *pContentType = contentType;
4792 return store;
4793}
4794
4796 LPCWSTR fileName, HCERTSTORE dest)
4797{
4799 BOOL ret;
4800
4801 if ((source = open_store_from_file(dwFlags, fileName, NULL)))
4802 {
4805 }
4806 else
4807 ret = FALSE;
4808 return ret;
4809}
4810
4812{
4824};
4825
4827 LPARAM lp)
4828{
4829 INT_PTR ret = 0;
4830
4831 switch (msg)
4832 {
4833 case WM_INITDIALOG:
4834 {
4835 struct ImportWizData *data;
4837 WCHAR fontFace[MAX_STRING_LEN];
4838 HDC hDC = GetDC(hwnd);
4839 int height;
4840
4841 data = (struct ImportWizData *)page->lParam;
4844 data->titleFont = CreateFontW(height, 0, 0, 0, FW_BOLD, 0, 0, 0,
4848 (WPARAM)data->titleFont, TRUE);
4849 ReleaseDC(hwnd, hDC);
4850 break;
4851 }
4852 case WM_NOTIFY:
4853 {
4854 NMHDR *hdr = (NMHDR *)lp;
4855
4856 switch (hdr->code)
4857 {
4858 case PSN_SETACTIVE:
4860 ret = TRUE;
4861 break;
4862 }
4863 break;
4864 }
4865 }
4866 return ret;
4867}
4868
4869static const WCHAR filter_cert[] = { '*','.','c','e','r',';','*','.',
4870 'c','r','t',0 };
4871static const WCHAR filter_pfx[] = { '*','.','p','f','x',';','*','.',
4872 'p','1','2',0 };
4873static const WCHAR filter_crl[] = { '*','.','c','r','l',0 };
4874static const WCHAR filter_ctl[] = { '*','.','s','t','l',0 };
4875static const WCHAR filter_serialized_store[] = { '*','.','s','s','t',0 };
4876static const WCHAR filter_cms[] = { '*','.','s','p','c',';','*','.',
4877 'p','7','b',0 };
4878static const WCHAR filter_all[] = { '*','.','*',0 };
4879
4880static const struct
4881{
4882 int id;
4885} import_filters[] = {
4894
4896{
4897 DWORD i;
4898 int len, totalLen = 2;
4899 LPWSTR filter = NULL, str;
4900
4901 for (i = 0; i < ARRAY_SIZE(import_filters); i++)
4902 {
4903 if (!import_filters[i].allowFlags || !dwFlags ||
4905 {
4907 totalLen += len + lstrlenW(import_filters[i].filter) + 2;
4908 }
4909 }
4910 filter = malloc(totalLen * sizeof(WCHAR));
4911 if (filter)
4912 {
4913 LPWSTR ptr;
4914
4915 ptr = filter;
4916 for (i = 0; i < ARRAY_SIZE(import_filters); i++)
4917 {
4918 if (!import_filters[i].allowFlags || !dwFlags ||
4920 {
4922 (LPWSTR)&str, 0);
4923 memcpy(ptr, str, len * sizeof(WCHAR));
4924 ptr += len;
4925 *ptr++ = 0;
4928 }
4929 }
4930 *ptr++ = 0;
4931 }
4932 return filter;
4933}
4934
4937{
4938 HANDLE file;
4939 BOOL ret = FALSE;
4940
4942 OPEN_EXISTING, 0, NULL);
4944 {
4946 &data->contentType);
4947 int warningID = 0;
4948
4949 if (!source)
4950 warningID = IDS_IMPORT_BAD_FORMAT;
4951 else if (!check_store_context_type(data->dwFlags, source))
4952 warningID = IDS_IMPORT_TYPE_MISMATCH;
4953 else
4954 {
4955 data->importSrc.dwSubjectChoice =
4957 data->importSrc.hCertStore = source;
4958 data->freeSource = TRUE;
4959 ret = TRUE;
4960 }
4961 if (warningID)
4962 {
4963 import_warning(data->dwFlags, hwnd, data->pwszWizardTitle,
4964 warningID);
4965 }
4967 }
4968 else
4969 {
4971 LPCWSTR pTitle;
4972 LPWSTR msgBuf, fullError;
4973
4974 if (data->pwszWizardTitle)
4975 pTitle = data->pwszWizardTitle;
4976 else
4977 {
4979 pTitle = title;
4980 }
4984 GetLastError(), 0, (LPWSTR) &msgBuf, 0, NULL);
4985 fullError = malloc((wcslen(error) + wcslen(fileName) + wcslen(msgBuf) + 3) * sizeof(WCHAR));
4986 if (fullError)
4987 {
4988 LPWSTR ptr = fullError;
4989
4990 lstrcpyW(ptr, error);
4991 ptr += lstrlenW(error);
4993 ptr += lstrlenW(fileName);
4994 *ptr++ = ':';
4995 *ptr++ = '\n';
4996 lstrcpyW(ptr, msgBuf);
4997 MessageBoxW(hwnd, fullError, pTitle, MB_ICONERROR | MB_OK);
4998 free(fullError);
4999 }
5000 LocalFree(msgBuf);
5001 }
5002 return ret;
5003}
5004
5006 LPARAM lp)
5007{
5008 INT_PTR ret = 0;
5009 struct ImportWizData *data;
5010
5011 switch (msg)
5012 {
5013 case WM_INITDIALOG:
5014 {
5016
5017 data = (struct ImportWizData *)page->lParam;
5019 if (data->fileName)
5020 {
5021 HWND fileNameEdit = GetDlgItem(hwnd, IDC_IMPORT_FILENAME);
5022
5023 SendMessageW(fileNameEdit, WM_SETTEXT, 0, (LPARAM)data->fileName);
5024 }
5025 break;
5026 }
5027 case WM_NOTIFY:
5028 {
5029 NMHDR *hdr = (NMHDR *)lp;
5030
5031 switch (hdr->code)
5032 {
5033 case PSN_SETACTIVE:
5036 ret = TRUE;
5037 break;
5038 case PSN_WIZNEXT:
5039 {
5040 HWND fileNameEdit = GetDlgItem(hwnd, IDC_IMPORT_FILENAME);
5041 DWORD len = SendMessageW(fileNameEdit, WM_GETTEXTLENGTH, 0, 0);
5042
5044 if (!len)
5045 {
5046 import_warning(data->dwFlags, hwnd, data->pwszWizardTitle,
5049 ret = 1;
5050 }
5051 else
5052 {
5053 WCHAR *fileName = malloc((len + 1) * sizeof(WCHAR));
5054
5055 if (fileName)
5056 {
5057 SendMessageW(fileNameEdit, WM_GETTEXT, len + 1,
5058 (LPARAM)fileName);
5060 {
5061 free(fileName);
5063 ret = 1;
5064 }
5065 else
5066 data->fileName = fileName;
5067 }
5068 }
5069 break;
5070 }
5071 }
5072 break;
5073 }
5074 case WM_COMMAND:
5075 switch (wp)
5076 {
5078 {
5080 WCHAR fileBuf[MAX_PATH];
5081
5083 memset(&ofn, 0, sizeof(ofn));
5084 ofn.lStructSize = sizeof(ofn);
5085 ofn.hwndOwner = hwnd;
5087 ofn.lpstrFile = fileBuf;
5088 ofn.nMaxFile = ARRAY_SIZE(fileBuf);
5089#ifdef __REACTOS__
5091#endif
5092 fileBuf[0] = 0;
5093 if (GetOpenFileNameW(&ofn))
5095 0, (LPARAM)ofn.lpstrFile);
5097 break;
5098 }
5099 }
5100 break;
5101 }
5102 return ret;
5103}
5104
5106 LPARAM lp)
5107{
5108 INT_PTR ret = 0;
5109 struct ImportWizData *data;
5110
5111 switch (msg)
5112 {
5113 case WM_INITDIALOG:
5114 {
5116
5117 data = (struct ImportWizData *)page->lParam;
5119 if (!data->hDestCertStore)
5120 {
5122 0, 0);
5126 }
5127 else
5128 {
5129 WCHAR storeTitle[MAX_STRING_LEN];
5130
5132 0, 0);
5139 0, (LPARAM)storeTitle);
5140 }
5141 break;
5142 }
5143 case WM_NOTIFY:
5144 {
5145 NMHDR *hdr = (NMHDR *)lp;
5146
5147 switch (hdr->code)
5148 {
5149 case PSN_SETACTIVE:
5152 ret = TRUE;
5153 break;
5154 case PSN_WIZNEXT:
5155 {
5158 !data->hDestCertStore)
5159 {
5160 import_warning(data->dwFlags, hwnd, data->pwszWizardTitle,
5163 ret = 1;
5164 }
5165 break;
5166 }
5167 }
5168 break;
5169 }
5170 case WM_COMMAND:
5171 switch (wp)
5172 {
5175 data->autoDest = TRUE;
5178 break;
5181 data->autoDest = FALSE;
5184 break;
5186 {
5189 CRYPTUI_ENUM_DATA enumData = { 0, NULL, 1, &enumArgs };
5190 CRYPTUI_SELECTSTORE_INFO_W selectInfo;
5191 HCERTSTORE store;
5192
5194 selectInfo.dwSize = sizeof(selectInfo);
5195 selectInfo.parent = hwnd;
5197 selectInfo.pwszTitle = NULL;
5198 selectInfo.pwszText = NULL;
5199 selectInfo.pEnumData = &enumData;
5200 selectInfo.pfnSelectedStoreCallback = NULL;
5201 if ((store = CryptUIDlgSelectStoreW(&selectInfo)))
5202 {
5203 WCHAR storeTitle[MAX_STRING_LEN];
5204
5206 ARRAY_SIZE(storeTitle));
5208 0, (LPARAM)storeTitle);
5209 data->hDestCertStore = store;
5210 data->freeDest = TRUE;
5211 }
5212 break;
5213 }
5214 }
5215 break;
5216 }
5217 return ret;
5218}
5219
5221{
5223 LVITEMW item;
5224 int contentID;
5225
5226 item.mask = LVIF_TEXT;
5227 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
5228 item.iSubItem = 0;
5230 item.pszText = text;
5232 item.iSubItem = 1;
5233 if (data->autoDest)
5235 else
5238 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
5239 item.iSubItem = 0;
5242 switch (data->contentType)
5243 {
5246 contentID = IDS_IMPORT_CONTENT_CERT;
5247 break;
5250 contentID = IDS_IMPORT_CONTENT_CRL;
5251 break;
5254 contentID = IDS_IMPORT_CONTENT_CTL;
5255 break;
5257 contentID = IDS_IMPORT_CONTENT_CMS;
5258 break;
5260 contentID = IDS_IMPORT_CONTENT_PFX;
5261 break;
5262 default:
5263 contentID = IDS_IMPORT_CONTENT_STORE;
5264 break;
5265 }
5266 LoadStringW(hInstance, contentID, text, ARRAY_SIZE(text));
5267 item.iSubItem = 1;
5269 if (data->fileName)
5270 {
5271 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
5272 item.iSubItem = 0;
5275 item.iSubItem = 1;
5276 item.pszText = data->fileName;
5278 }
5279}
5280
5283{
5284 BOOL ret;
5285
5286 switch (pImportSrc->dwSubjectChoice)
5287 {
5290 pImportSrc->pwszFileName, hDestCertStore);
5291 break;
5294 ret = import_cert(pImportSrc->pCertContext, hDestCertStore);
5295 else
5297 break;
5300 ret = import_crl(pImportSrc->pCRLContext, hDestCertStore);
5301 else
5303 break;
5306 ret = import_ctl(pImportSrc->pCTLContext, hDestCertStore);
5307 else
5309 break;
5312 pImportSrc->hCertStore, hDestCertStore);
5313 break;
5314 default:
5315 WARN("unknown source type: %lu\n", pImportSrc->dwSubjectChoice);
5317 ret = FALSE;
5318 }
5319 return ret;
5320}
5321
5323 LPARAM lp)
5324{
5325 INT_PTR ret = 0;
5326 struct ImportWizData *data;
5327
5328 switch (msg)
5329 {
5330 case WM_INITDIALOG:
5331 {
5334 RECT rc;
5336
5337 data = (struct ImportWizData *)page->lParam;
5340 (WPARAM)data->titleFont, TRUE);
5341 GetWindowRect(lv, &rc);
5342 column.mask = LVCF_WIDTH;
5343 column.cx = (rc.right - rc.left) / 2 - 2;
5347 break;
5348 }
5349 case WM_NOTIFY:
5350 {
5351 NMHDR *hdr = (NMHDR *)lp;
5352
5353 switch (hdr->code)
5354 {
5355 case PSN_SETACTIVE:
5356 {
5358
5364 ret = TRUE;
5365 break;
5366 }
5367 case PSN_WIZFINISH:
5368 {
5370 if ((data->success = do_import(data->dwFlags, hwnd,
5371 data->pwszWizardTitle, &data->importSrc, data->hDestCertStore)))
5372 {
5374 LPCWSTR pTitle;
5375
5376 if (data->pwszWizardTitle)
5377 pTitle = data->pwszWizardTitle;
5378 else
5379 {
5381 pTitle = title;
5382 }
5384 MessageBoxW(hwnd, message, pTitle, MB_OK);
5385 }
5386 else
5387 import_warning(data->dwFlags, hwnd, data->pwszWizardTitle,
5389 break;
5390 }
5391 }
5392 break;
5393 }
5394 }
5395 return ret;
5396}
5397
5401{
5403 PROPSHEETPAGEW pages[4];
5404 struct ImportWizData data;
5405 int nPages = 0;
5406
5408 data.pwszWizardTitle = pwszWizardTitle;
5409 if (pImportSrc)
5410 {
5411 memcpy(&data.importSrc, pImportSrc, sizeof(data.importSrc));
5412 data.fileName = (LPWSTR)pImportSrc->pwszFileName;
5413 }
5414 else
5415 {
5416 memset(&data.importSrc, 0, sizeof(data.importSrc));
5417 data.fileName = NULL;
5418 }
5419 data.freeSource = FALSE;
5420 data.hDestCertStore = hDestCertStore;
5421 data.freeDest = FALSE;
5422 data.autoDest = TRUE;
5423 data.success = TRUE;
5424
5425 memset(pages, 0, sizeof(pages));
5426
5427 pages[nPages].dwSize = sizeof(pages[0]);
5428 pages[nPages].hInstance = hInstance;
5430 pages[nPages].pfnDlgProc = import_welcome_dlg_proc;
5431 pages[nPages].dwFlags = PSP_HIDEHEADER;
5432 pages[nPages].lParam = (LPARAM)&data;
5433 nPages++;
5434
5435 if (!pImportSrc ||
5436 pImportSrc->dwSubjectChoice == CRYPTUI_WIZ_IMPORT_SUBJECT_FILE)
5437 {
5438 pages[nPages].dwSize = sizeof(pages[0]);
5439 pages[nPages].hInstance = hInstance;
5441 pages[nPages].pfnDlgProc = import_file_dlg_proc;
5442 pages[nPages].dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
5443 pages[nPages].pszHeaderTitle = MAKEINTRESOURCEW(IDS_IMPORT_FILE_TITLE);
5444 pages[nPages].pszHeaderSubTitle =
5446 pages[nPages].lParam = (LPARAM)&data;
5447 nPages++;
5448 }
5449 else
5450 {
5451 switch (pImportSrc->dwSubjectChoice)
5452 {
5454 data.contentType = CERT_QUERY_CONTENT_CERT;
5455 break;
5457 data.contentType = CERT_QUERY_CONTENT_CRL;
5458 break;
5460 data.contentType = CERT_QUERY_CONTENT_CTL;
5461 break;
5464 break;
5465 }
5466 }
5467
5468 pages[nPages].dwSize = sizeof(pages[0]);
5469 pages[nPages].hInstance = hInstance;
5471 pages[nPages].pfnDlgProc = import_store_dlg_proc;
5472 pages[nPages].dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
5473 pages[nPages].pszHeaderTitle = MAKEINTRESOURCEW(IDS_IMPORT_STORE_TITLE);
5474 pages[nPages].pszHeaderSubTitle =
5476 pages[nPages].lParam = (LPARAM)&data;
5477 nPages++;
5478
5479 pages[nPages].dwSize = sizeof(pages[0]);
5480 pages[nPages].hInstance = hInstance;
5482 pages[nPages].pfnDlgProc = import_finish_dlg_proc;
5483 pages[nPages].dwFlags = PSP_HIDEHEADER;
5484 pages[nPages].lParam = (LPARAM)&data;
5485 nPages++;
5486
5487 memset(&hdr, 0, sizeof(hdr));
5488 hdr.dwSize = sizeof(hdr);
5489 hdr.hwndParent = hwndParent;
5490 hdr.dwFlags = PSH_PROPSHEETPAGE | PSH_WIZARD97_NEW | PSH_HEADER |
5491 PSH_WATERMARK;
5492 hdr.hInstance = hInstance;
5493 if (pwszWizardTitle)
5494 hdr.pszCaption = pwszWizardTitle;
5495 else
5497 hdr.ppsp = pages;
5498 hdr.nPages = nPages;
5499 hdr.pszbmWatermark = MAKEINTRESOURCEW(IDB_CERT_WATERMARK);
5500 hdr.pszbmHeader = MAKEINTRESOURCEW(IDB_CERT_HEADER);
5502 if (data.fileName != data.importSrc.pwszFileName)
5503 free(data.fileName);
5504 if (data.freeSource &&
5505 data.importSrc.dwSubjectChoice == CRYPTUI_WIZ_IMPORT_SUBJECT_CERT_STORE)
5506 CertCloseStore(data.importSrc.hCertStore, 0);
5507 DeleteObject(data.titleFont);
5508 return data.success;
5509}
5510
5513{
5514 BOOL ret;
5515
5516 TRACE("(0x%08lx, %p, %s, %p, %p)\n", dwFlags, hwndParent, debugstr_w(pwszWizardTitle),
5518
5519 if (pImportSrc &&
5520 pImportSrc->dwSize != sizeof(CRYPTUI_WIZ_IMPORT_SRC_INFO))
5521 {
5523 return FALSE;
5524 }
5525
5526 if (!(dwFlags & CRYPTUI_WIZ_NO_UI))
5529 else if (pImportSrc)
5532 else
5533 {
5534 /* Can't have no UI without specifying source */
5536 ret = FALSE;
5537 }
5538
5539 return ret;
5540}
5541
5543{
5555};
5556
5558 LPARAM lp)
5559{
5560 INT_PTR ret = 0;
5561
5562 switch (msg)
5563 {
5564 case WM_INITDIALOG:
5565 {
5566 struct ExportWizData *data;
5568 WCHAR fontFace[MAX_STRING_LEN];
5569 HDC hDC = GetDC(hwnd);
5570 int height;
5571
5572 data = (struct ExportWizData *)page->lParam;
5575 data->titleFont = CreateFontW(height, 0, 0, 0, FW_BOLD, 0, 0, 0,
5579 (WPARAM)data->titleFont, TRUE);
5580 ReleaseDC(hwnd, hDC);
5581 break;
5582 }
5583 case WM_NOTIFY:
5584 {
5585 NMHDR *hdr = (NMHDR *)lp;
5586
5587 switch (hdr->code)
5588 {
5589 case PSN_SETACTIVE:
5591 ret = TRUE;
5592 break;
5593 }
5594 break;
5595 }
5596 }
5597 return ret;
5598}
5599
5601{
5603 DWORD size;
5604
5606 NULL, &size))
5607 {
5608 info = malloc(size);
5609 if (info)
5610 {
5613 {
5614 free(info);
5615 info = NULL;
5616 }
5617 }
5618 }
5619 return info;
5620}
5621
5623 HCRYPTPROV *phProv)
5624{
5625 BOOL ret;
5626
5627 ret = CryptAcquireContextW(phProv, info->pwszContainerName,
5628 info->pwszProvName, info->dwProvType, 0);
5629 if (ret)
5630 {
5631 DWORD i;
5632
5633 for (i = 0; i < info->cProvParam; i++)
5634 CryptSetProvParam(*phProv, info->rgProvParam[i].dwParam,
5635 info->rgProvParam[i].pbData, info->rgProvParam[i].dwFlags);
5636 }
5637 return ret;
5638}
5639
5641{
5642 BOOL ret;
5643 HCRYPTKEY key;
5644
5645 if ((ret = CryptGetUserKey(hProv, keySpec, &key)))
5646 {
5647 DWORD permissions, size = sizeof(permissions);
5648
5649 if ((ret = CryptGetKeyParam(key, KP_PERMISSIONS, (BYTE *)&permissions,
5650 &size, 0)) && !(permissions & CRYPT_EXPORT))
5651 ret = FALSE;
5653 }
5654 return ret;
5655}
5656
5658 WPARAM wp, LPARAM lp)
5659{
5660 INT_PTR ret = 0;
5661 struct ExportWizData *data;
5662
5663 switch (msg)
5664 {
5665 case WM_INITDIALOG:
5666 {
5669 HCRYPTPROV hProv = 0;
5670 int errorID = 0;
5671
5672 data = (struct ExportWizData *)page->lParam;
5674 /* Get enough information about a key to see whether it's exportable.
5675 */
5677 data->exportInfo.pCertContext)))
5681 else if (!export_is_key_exportable(hProv, info->dwKeySpec))
5683
5684 if (errorID)
5685 {
5687
5690 WM_SETTEXT, 0, (LPARAM)error);
5692 }
5693 else
5694 data->keyProvInfo = info;
5695 if (hProv)
5698 0, 0);
5699 break;
5700 }
5701 case WM_NOTIFY:
5702 {
5703 NMHDR *hdr = (NMHDR *)lp;
5704
5705 switch (hdr->code)
5706 {
5707 case PSN_SETACTIVE:
5710 ret = TRUE;
5711 break;
5712 case PSN_WIZNEXT:
5715 {
5716 data->contextInfo.dwExportFormat =
5718 data->contextInfo.fExportPrivateKeys = FALSE;
5719 }
5720 else
5721 {
5722 data->contextInfo.dwExportFormat =
5724 data->contextInfo.fExportPrivateKeys = TRUE;
5725 }
5726 break;
5727 }
5728 break;
5729 }
5730 }
5731 return ret;
5732}
5733
5735{
5736 BOOL ret = FALSE;
5737
5739 {
5740 DWORD size;
5741
5742 /* If there's a CRYPT_KEY_PROV_INFO set for this cert, assume the
5743 * cert has a private key.
5744 */
5747 ret = TRUE;
5748 }
5749 return ret;
5750}
5751
5753{
5754 int defaultFormatID;
5755
5756 switch (data->contextInfo.dwExportFormat)
5757 {
5759 defaultFormatID = IDC_EXPORT_FORMAT_BASE64;
5760 break;
5762 defaultFormatID = IDC_EXPORT_FORMAT_CMS;
5763 break;
5765 defaultFormatID = IDC_EXPORT_FORMAT_PFX;
5766 break;
5767 default:
5768 defaultFormatID = IDC_EXPORT_FORMAT_DER;
5769 }
5770 SendMessageW(GetDlgItem(hwnd, defaultFormatID), BM_CLICK, 0, 0);
5771 if (defaultFormatID == IDC_EXPORT_FORMAT_PFX)
5772 {
5777 }
5778 else
5779 {
5784 }
5785}
5786
5788 LPARAM lp)
5789{
5790 INT_PTR ret = 0;
5791 struct ExportWizData *data;
5792
5793 switch (msg)
5794 {
5795 case WM_INITDIALOG:
5796 {
5798
5799 data = (struct ExportWizData *)page->lParam;
5802 break;
5803 }
5804 case WM_NOTIFY:
5805 {
5806 NMHDR *hdr = (NMHDR *)lp;
5807
5808 switch (hdr->code)
5809 {
5810 case PSN_SETACTIVE:
5815 ret = TRUE;
5816 break;
5817 case PSN_WIZNEXT:
5818 {
5819 BOOL skipPasswordPage = TRUE;
5820
5823 data->contextInfo.dwExportFormat =
5826 data->contextInfo.dwExportFormat =
5829 {
5830 data->contextInfo.dwExportFormat =
5833 data->contextInfo.fExportChain =
5835 }
5836 else
5837 {
5838 data->contextInfo.dwExportFormat =
5841 data->contextInfo.fExportChain = TRUE;
5843 data->contextInfo.fStrongEncryption = TRUE;
5845 data->deleteKeys = TRUE;
5846 skipPasswordPage = FALSE;
5847 }
5849 skipPasswordPage ? IDD_EXPORT_FILE : 0);
5850 ret = 1;
5851 break;
5852 }
5853 }
5854 break;
5855 }
5856 case WM_COMMAND:
5857 switch (HIWORD(wp))
5858 {
5859 case BN_CLICKED:
5860 switch (LOWORD(wp))
5861 {
5865 FALSE);
5867 FALSE);
5869 FALSE);
5872 break;
5875 TRUE);
5876 break;
5879 TRUE);
5881 TRUE);
5884 break;
5885 }
5886 break;
5887 }
5888 break;
5889 }
5890 return ret;
5891}
5892
5894{
5896 LPCWSTR pTitle;
5897
5898 if (data->pwszWizardTitle)
5899 pTitle = data->pwszWizardTitle;
5900 else
5901 {
5903 pTitle = title;
5904 }
5908}
5909
5911 WPARAM wp, LPARAM lp)
5912{
5913 INT_PTR ret = 0;
5914 struct ExportWizData *data;
5915
5916 switch (msg)
5917 {
5918 case WM_INITDIALOG:
5919 {
5921
5922 data = (struct ExportWizData *)page->lParam;
5924 break;
5925 }
5926 case WM_NOTIFY:
5927 {
5928 NMHDR *hdr = (NMHDR *)lp;
5929
5930 switch (hdr->code)
5931 {
5932 case PSN_SETACTIVE:
5935 ret = TRUE;
5936 break;
5937 case PSN_WIZNEXT:
5938 {
5939 HWND passwordEdit = GetDlgItem(hwnd, IDC_EXPORT_PASSWORD);
5940 HWND passwordConfirmEdit = GetDlgItem(hwnd,
5942 DWORD passwordLen = SendMessageW(passwordEdit, WM_GETTEXTLENGTH,
5943 0, 0);
5944 DWORD passwordConfirmLen = SendMessageW(passwordConfirmEdit,
5945 WM_GETTEXTLENGTH, 0, 0);
5946
5948 if (!passwordLen && !passwordConfirmLen)
5949 data->contextInfo.pwszPassword = NULL;
5950 else if (passwordLen != passwordConfirmLen)
5951 {
5954 ret = 1;
5955 }
5956 else
5957 {
5958 WCHAR *password = malloc((passwordLen + 1) * sizeof(WCHAR));
5959 WCHAR *passwordConfirm = malloc((passwordConfirmLen + 1) * sizeof(WCHAR));
5961
5962 if (password && passwordConfirm)
5963 {
5964 SendMessageW(passwordEdit, WM_GETTEXT, passwordLen + 1,
5965 (LPARAM)password);
5966 SendMessageW(passwordConfirmEdit, WM_GETTEXT,
5967 passwordConfirmLen + 1, (LPARAM)passwordConfirm);
5968 if (lstrcmpW(password, passwordConfirm))
5969 {
5972 ret = 1;
5973 }
5974 else
5975 {
5976 data->contextInfo.pwszPassword = password;
5978 data->freePassword = TRUE;
5979 }
5980 }
5981 if (freePassword)
5982 free(password);
5983 free(passwordConfirm);
5984 }
5985 break;
5986 }
5987 }
5988 break;
5989 }
5990 }
5991 return ret;
5992}
5993
5996{
5997 static const WCHAR cer[] = { '.','c','e','r',0 };
5998 static const WCHAR crl[] = { '.','c','r','l',0 };
5999 static const WCHAR ctl[] = { '.','c','t','l',0 };
6000 static const WCHAR p7b[] = { '.','p','7','b',0 };
6001 static const WCHAR pfx[] = { '.','p','f','x',0 };
6002 static const WCHAR sst[] = { '.','s','s','t',0 };
6003 LPCWSTR extension;
6004 LPWSTR dot;
6005 BOOL appendExtension;
6006
6007 switch (data->contextInfo.dwExportFormat)
6008 {
6010 extension = p7b;
6011 break;
6013 extension = pfx;
6014 break;
6015 default:
6016 switch (data->exportInfo.dwSubjectChoice)
6017 {
6019 extension = crl;
6020 break;
6022 extension = ctl;
6023 break;
6025 extension = sst;
6026 break;
6027 default:
6028 extension = cer;
6029 }
6030 }
6031 dot = wcsrchr(fileName, '.');
6032 if (dot)
6033 appendExtension = wcsicmp(dot, extension) != 0;
6034 else
6035 appendExtension = TRUE;
6036 if (appendExtension)
6037 {
6038 fileName = realloc(fileName, (wcslen(fileName) + wcslen(extension) + 1) * sizeof(WCHAR));
6039 if (fileName)
6040 lstrcatW(fileName, extension);
6041 }
6042 return fileName;
6043}
6044
6047{
6048 HANDLE file;
6049 BOOL tryCreate = TRUE, forceCreate = FALSE, ret = FALSE;
6050
6054 {
6056 LPCWSTR pTitle;
6057
6058 if (data->pwszWizardTitle)
6059 pTitle = data->pwszWizardTitle;
6060 else
6061 {
6063 pTitle = title;
6064 }
6066 if (MessageBoxW(hwnd, warning, pTitle, MB_YESNO) == IDYES)
6067 forceCreate = TRUE;
6068 else
6069 tryCreate = FALSE;
6071 }
6072 if (tryCreate)
6073 {
6076 forceCreate ? CREATE_ALWAYS : CREATE_NEW,
6077 0, NULL);
6079 {
6080 data->file = file;
6081 ret = TRUE;
6082 }
6083 else
6084 {
6086 LPCWSTR pTitle;
6087 LPWSTR msgBuf, fullError;
6088
6089 if (data->pwszWizardTitle)
6090 pTitle = data->pwszWizardTitle;
6091 else
6092 {
6094 pTitle = title;
6095 }
6099 GetLastError(), 0, (LPWSTR) &msgBuf, 0, NULL);
6100 fullError = malloc((wcslen(error) + wcslen(fileName) + wcslen(msgBuf) + 3) * sizeof(WCHAR));
6101 if (fullError)
6102 {
6103 LPWSTR ptr = fullError;
6104
6105 lstrcpyW(ptr, error);
6106 ptr += lstrlenW(error);
6108 ptr += lstrlenW(fileName);
6109 *ptr++ = ':';
6110 *ptr++ = '\n';
6111 lstrcpyW(ptr, msgBuf);
6112 MessageBoxW(hwnd, fullError, pTitle, MB_ICONERROR | MB_OK);
6113 free(fullError);
6114 }
6115 LocalFree(msgBuf);
6116 }
6117 }
6118 return ret;
6119}
6120
6121static const WCHAR export_filter_cert[] = { '*','.','c','e','r',0 };
6122static const WCHAR export_filter_crl[] = { '*','.','c','r','l',0 };
6123static const WCHAR export_filter_ctl[] = { '*','.','s','t','l',0 };
6124static const WCHAR export_filter_cms[] = { '*','.','p','7','b',0 };
6125static const WCHAR export_filter_pfx[] = { '*','.','p','f','x',0 };
6126static const WCHAR export_filter_sst[] = { '*','.','s','s','t',0 };
6127
6128static WCHAR *make_export_file_filter(DWORD exportFormat, DWORD subjectChoice)
6129{
6130 int baseLen, allLen, totalLen = 2, baseID;
6131 LPWSTR filter = NULL, baseFilter, all;
6132 LPCWSTR filterStr;
6133
6134 switch (exportFormat)
6135 {
6138 filterStr = export_filter_cert;
6139 break;
6141 baseID = IDS_EXPORT_FILTER_PFX;
6142 filterStr = export_filter_pfx;
6143 break;
6145 baseID = IDS_EXPORT_FILTER_CMS;
6146 filterStr = export_filter_cms;
6147 break;
6148 default:
6149 switch (subjectChoice)
6150 {
6152 baseID = IDS_EXPORT_FILTER_CRL;
6153 filterStr = export_filter_crl;
6154 break;
6156 baseID = IDS_EXPORT_FILTER_CTL;
6157 filterStr = export_filter_ctl;
6158 break;
6161 filterStr = export_filter_sst;
6162 break;
6163 default:
6164 baseID = IDS_EXPORT_FILTER_CERT;
6165 filterStr = export_filter_cert;
6166 break;
6167 }
6168 }
6169 baseLen = LoadStringW(hInstance, baseID, (LPWSTR)&baseFilter, 0);
6170 totalLen += baseLen + lstrlenW(filterStr) + 2;
6172 totalLen += allLen + lstrlenW(filter_all) + 2;
6173 filter = malloc(totalLen * sizeof(WCHAR));
6174 if (filter)
6175 {
6176 LPWSTR ptr;
6177
6178 ptr = filter;
6179 memcpy(ptr, baseFilter, baseLen * sizeof(WCHAR));
6180 ptr += baseLen;
6181 *ptr++ = 0;
6182 lstrcpyW(ptr, filterStr);
6183 ptr += lstrlenW(filterStr) + 1;
6184 memcpy(ptr, all, allLen * sizeof(WCHAR));
6185 ptr += allLen;
6186 *ptr++ = 0;
6188 ptr += lstrlenW(filter_all) + 1;
6189 *ptr++ = 0;
6190 }
6191 return filter;
6192}
6193
6195 LPARAM lp)
6196{
6197 INT_PTR ret = 0;
6198 struct ExportWizData *data;
6199
6200 switch (msg)
6201 {
6202 case WM_INITDIALOG:
6203 {
6205
6206 data = (struct ExportWizData *)page->lParam;
6208 if (data->exportInfo.pwszExportFileName)
6210 (LPARAM)data->exportInfo.pwszExportFileName);
6211 break;
6212 }
6213 case WM_NOTIFY:
6214 {
6215 NMHDR *hdr = (NMHDR *)lp;
6216
6217 switch (hdr->code)
6218 {
6219 case PSN_WIZBACK:
6221 if (data->contextInfo.dwExportFormat !=
6223 {
6225 ret = 1;
6226 }
6227 break;
6228 case PSN_WIZNEXT:
6229 {
6230 HWND fileNameEdit = GetDlgItem(hwnd, IDC_EXPORT_FILENAME);
6231 DWORD len = SendMessageW(fileNameEdit, WM_GETTEXTLENGTH, 0, 0);
6232
6234 if (!len)
6235 {
6237 LPCWSTR pTitle;
6238
6239 if (data->pwszWizardTitle)
6240 pTitle = data->pwszWizardTitle;
6241 else
6242 {
6244 pTitle = title;
6245 }
6249 ret = 1;
6250 }
6251 else
6252 {
6253 WCHAR *fileName = malloc((len + 1) * sizeof(WCHAR));
6254
6255 if (fileName)
6256 {
6257 SendMessageW(fileNameEdit, WM_GETTEXT, len + 1,
6258 (LPARAM)fileName);
6261 {
6262 free(fileName);
6264 ret = 1;
6265 }
6266 else
6267 data->fileName = fileName;
6268 }
6269 }
6270 break;
6271 }
6272 case PSN_SETACTIVE:
6275 ret = TRUE;
6276 break;
6277 }
6278 break;
6279 }
6280 case WM_COMMAND:
6281 switch (wp)
6282 {
6284 {
6286 WCHAR fileBuf[MAX_PATH];
6287
6289 memset(&ofn, 0, sizeof(ofn));
6290 ofn.lStructSize = sizeof(ofn);
6291 ofn.hwndOwner = hwnd;
6293 data->contextInfo.dwExportFormat,
6294 data->exportInfo.dwSubjectChoice);
6295 ofn.lpstrFile = fileBuf;
6296 ofn.nMaxFile = ARRAY_SIZE(fileBuf);
6297 fileBuf[0] = 0;
6298 if (GetSaveFileNameW(&ofn))
6300 0, (LPARAM)ofn.lpstrFile);
6302 break;
6303 }
6304 }
6305 break;
6306 }
6307 return ret;
6308}
6309
6310static void show_export_details(HWND lv, const struct ExportWizData *data)
6311{
6313 LVITEMW item;
6314 int contentID;
6315
6316 item.mask = LVIF_TEXT;
6317 if (data->fileName)
6318 {
6319 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
6320 item.iSubItem = 0;
6322 item.pszText = text;
6324 item.iSubItem = 1;
6325 item.pszText = data->fileName;
6327 }
6328
6329 item.pszText = text;
6330 switch (data->exportInfo.dwSubjectChoice)
6331 {
6336 /* do nothing */
6337 break;
6338 default:
6339 {
6340 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
6341 item.iSubItem = 0;
6344 item.iSubItem = 1;
6345 LoadStringW(hInstance, data->contextInfo.fExportChain ? IDS_YES : IDS_NO, text,
6346 ARRAY_SIZE(text));
6348
6349 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
6350 item.iSubItem = 0;
6353 item.iSubItem = 1;
6354 LoadStringW(hInstance, data->contextInfo.fExportPrivateKeys ? IDS_YES : IDS_NO, text,
6355 ARRAY_SIZE(text));
6357 }
6358 }
6359
6360 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
6361 item.iSubItem = 0;
6364
6365 item.iSubItem = 1;
6366 switch (data->exportInfo.dwSubjectChoice)
6367 {
6369 contentID = IDS_EXPORT_FILTER_CRL;
6370 break;
6372 contentID = IDS_EXPORT_FILTER_CTL;
6373 break;
6376 break;
6377 default:
6378 switch (data->contextInfo.dwExportFormat)
6379 {
6382 break;
6384 contentID = IDS_EXPORT_FILTER_CMS;
6385 break;
6387 contentID = IDS_EXPORT_FILTER_PFX;
6388 break;
6389 default:
6390 contentID = IDS_EXPORT_FILTER_CERT;
6391 }
6392 }
6393 LoadStringW(hInstance, contentID, text, ARRAY_SIZE(text));
6395}
6396
6397static inline BOOL save_der(HANDLE file, const BYTE *pb, DWORD cb)
6398{
6400
6401 return WriteFile(file, pb, cb, &bytesWritten, NULL);
6402}
6403
6405{
6406 BOOL ret;
6407 DWORD size = 0;
6408
6410 {
6411 char *buf = malloc(size);
6412
6413 if (buf)
6414 {
6416 &size)))
6417 ret = WriteFile(file, buf, size, &size, NULL);
6418 free(buf);
6419 }
6420 else
6421 {
6423 ret = FALSE;
6424 }
6425 }
6426 return ret;
6427}
6428
6430{
6433}
6434
6436 BOOL includeChain)
6437{
6438 BOOL ret;
6441
6442 if (store)
6443 {
6444 if (includeChain)
6445 {
6448
6449 if (addlStore)
6450 {
6451 DWORD i;
6452
6453 ret = TRUE;
6454 for (i = 0; ret && i < pExportInfo->cStores; i++)
6455 ret = CertAddStoreToCollection(addlStore,
6456 pExportInfo->rghStores, 0, 0);
6457 if (ret)
6458 {
6460
6462 pExportInfo->pCertContext, NULL, addlStore, NULL, 0,
6463 NULL, &chain);
6464 if (ret)
6465 {
6466 DWORD j;
6467
6468 for (i = 0; ret && i < chain->cChain; i++)
6469 for (j = 0; ret && j < chain->rgpChain[i]->cElement;
6470 j++)
6472 chain->rgpChain[i]->rgpElement[j]->pCertContext,
6475 }
6476 else
6477 {
6478 /* No chain could be created, just add the individual
6479 * cert to the message.
6480 */
6482 pExportInfo->pCertContext, CERT_STORE_ADD_ALWAYS,
6483 NULL);
6484 }
6485 }
6486 CertCloseStore(addlStore, 0);
6487 }
6488 else
6489 ret = FALSE;
6490 }
6491 else
6493 pExportInfo->pCertContext, CERT_STORE_ADD_ALWAYS, NULL);
6494 if (ret)
6495 ret = save_store_as_cms(file, store);
6496 CertCloseStore(store, 0);
6497 }
6498 else
6499 ret = FALSE;
6500 return ret;
6501}
6502
6504{
6507}
6508
6512{
6515 BOOL ret = FALSE;
6516
6517 if (store)
6518 {
6519 CRYPT_DATA_BLOB pfxBlob = { 0, NULL };
6521 BOOL freeKeyProvInfo = FALSE;
6522
6523 if (pContextInfo->fExportChain)
6524 {
6525 HCERTCHAINENGINE engine = NULL;
6526
6527 if (pExportInfo->cStores)
6528 {
6530
6531 memset(&config, 0, sizeof(config));
6532 config.cbSize = sizeof(config);
6533 config.cAdditionalStore = pExportInfo->cStores;
6534 config.rghAdditionalStore = pExportInfo->rghStores;
6536 }
6537 else
6538 ret = TRUE;
6539 if (ret)
6540 {
6541 CERT_CHAIN_PARA chainPara;
6543
6544 memset(&chainPara, 0, sizeof(chainPara));
6545 chainPara.cbSize = sizeof(chainPara);
6547 pExportInfo->pCertContext, NULL, NULL, &chainPara, 0, NULL,
6548 &chain);
6549 if (ret)
6550 {
6551 DWORD i, j;
6552
6553 for (i = 0; ret && i < chain->cChain; i++)
6554 for (j = 0; ret && j < chain->rgpChain[i]->cElement;
6555 j++)
6556 {
6557 if (i == 0 && j == 0)
6559 chain->rgpChain[i]->rgpElement[j]->pCertContext,
6561 else
6563 chain->rgpChain[i]->rgpElement[j]->pCertContext,
6565 }
6567 }
6568 }
6569 if (engine)
6571 }
6572 else
6574 pExportInfo->pCertContext, CERT_STORE_ADD_ALWAYS, &cert);
6575 /* Copy private key info to newly created cert, so it'll get exported
6576 * along with the cert.
6577 */
6578 if (ret && pContextInfo->fExportPrivateKeys)
6579 {
6580 if (keyProvInfo)
6583 else
6584 {
6586 ret = FALSE;
6587 else
6588 {
6591 freeKeyProvInfo = TRUE;
6592 }
6593 }
6594 }
6595 if (ret)
6596 {
6597 DWORD exportFlags =
6599
6600 ret = PFXExportCertStore(store, &pfxBlob,
6601 pContextInfo->pwszPassword, exportFlags);
6602 if (ret)
6603 {
6604 pfxBlob.pbData = malloc(pfxBlob.cbData);
6605 if (pfxBlob.pbData)
6606 {
6607 ret = PFXExportCertStore(store, &pfxBlob,
6608 pContextInfo->pwszPassword, exportFlags);
6609 if (ret)
6610 {
6612
6613 ret = WriteFile(file, pfxBlob.pbData, pfxBlob.cbData,
6614 &bytesWritten, NULL);
6615 }
6616 }
6617 else
6618 {
6620 ret = FALSE;
6621 }
6622 }
6623 }
6624 if (ret && deleteKeys)
6625 {
6626 HCRYPTPROV prov;
6627
6631 }
6632 if (freeKeyProvInfo)
6635 CertCloseStore(store, 0);
6636 }
6637 return ret;
6638}
6639
6643{
6644 BOOL ret;
6645
6646 if (pContextInfo->dwSize != sizeof(CRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO))
6647 {
6649 return FALSE;
6650 }
6651 switch (pExportInfo->dwSubjectChoice)
6652 {
6654 ret = save_der(file,
6655 pExportInfo->pCRLContext->pbCrlEncoded,
6656 pExportInfo->pCRLContext->cbCrlEncoded);
6657 break;
6659 ret = save_der(file,
6660 pExportInfo->pCTLContext->pbCtlEncoded,
6661 pExportInfo->pCTLContext->cbCtlEncoded);
6662 break;
6664 ret = save_serialized_store(file, pExportInfo->hCertStore);
6665 break;
6667 ret = save_store_as_cms(file, pExportInfo->hCertStore);
6668 break;
6669 default:
6670 switch (pContextInfo->dwExportFormat)
6671 {
6673 ret = save_der(file, pExportInfo->pCertContext->pbCertEncoded,
6674 pExportInfo->pCertContext->cbCertEncoded);
6675 break;
6678 pExportInfo->pCertContext->pbCertEncoded,
6679 pExportInfo->pCertContext->cbCertEncoded);
6680 break;
6682 ret = save_cert_as_cms(file, pExportInfo,
6683 pContextInfo->fExportChain);
6684 break;
6686 ret = save_pfx(file, pExportInfo, pContextInfo, keyProvInfo,
6687 deleteKeys);
6688 break;
6689 default:
6691 ret = FALSE;
6692 }
6693 }
6694 return ret;
6695}
6696
6698 LPARAM lp)
6699{
6700 INT_PTR ret = 0;
6701 struct ExportWizData *data;
6702
6703 switch (msg)
6704 {
6705 case WM_INITDIALOG:
6706 {
6709 RECT rc;
6711
6712 data = (struct ExportWizData *)page->lParam;
6715 (WPARAM)data->titleFont, TRUE);
6716 GetWindowRect(lv, &rc);
6717 column.mask = LVCF_WIDTH;
6718 column.cx = (rc.right - rc.left) / 2 - 2;
6722 break;
6723 }
6724 case WM_NOTIFY:
6725 {
6726 NMHDR *hdr = (NMHDR *)lp;
6727
6728 switch (hdr->code)
6729 {
6730 case PSN_SETACTIVE:
6731 {
6733
6739 ret = TRUE;
6740 break;
6741 }
6742 case PSN_WIZFINISH:
6743 {
6744 int messageID;
6746 LPCWSTR pTitle;
6747 DWORD mbFlags;
6748
6750 if ((data->success = do_export(data->file, &data->exportInfo,
6751 &data->contextInfo, data->keyProvInfo, data->deleteKeys)))
6752 {
6753 messageID = IDS_EXPORT_SUCCEEDED;
6754 mbFlags = MB_OK;
6755 }
6756 else
6757 {
6758 messageID = IDS_EXPORT_FAILED;
6759 mbFlags = MB_OK | MB_ICONERROR;
6760 }
6761 if (data->pwszWizardTitle)
6762 pTitle = data->pwszWizardTitle;
6763 else
6764 {
6766 pTitle = title;
6767 }
6769 MessageBoxW(hwnd, message, pTitle, mbFlags);
6770 break;
6771 }
6772 }
6773 break;
6774 }
6775 }
6776 return ret;
6777}
6778
6780 LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, const void *pvoid)
6781{
6783 PROPSHEETPAGEW pages[6];
6784 struct ExportWizData data;
6785 int nPages = 0;
6786 BOOL hasPrivateKey, showFormatPage = TRUE;
6787 INT_PTR l;
6788
6789 data.dwFlags = dwFlags;
6790 data.pwszWizardTitle = pwszWizardTitle;
6791 memset(&data.exportInfo, 0, sizeof(data.exportInfo));
6792 memcpy(&data.exportInfo, pExportInfo,
6793 min(sizeof(data.exportInfo), pExportInfo->dwSize));
6794 if (pExportInfo->dwSize > sizeof(data.exportInfo))
6795 data.exportInfo.dwSize = sizeof(data.exportInfo);
6796 data.contextInfo.dwSize = sizeof(data.contextInfo);
6797 data.contextInfo.dwExportFormat = CRYPTUI_WIZ_EXPORT_FORMAT_DER;
6798 data.contextInfo.fExportChain = FALSE;
6799 data.contextInfo.fStrongEncryption = FALSE;
6800 data.contextInfo.fExportPrivateKeys = FALSE;
6801 data.contextInfo.pwszPassword = NULL;
6802 data.freePassword = FALSE;
6804 pvoid)
6805 memcpy(&data.contextInfo, pvoid,
6807 sizeof(data.contextInfo)));
6808 data.keyProvInfo = NULL;
6809 data.deleteKeys = FALSE;
6810 data.fileName = NULL;
6812 data.success = FALSE;
6813
6814 memset(pages, 0, sizeof(pages));
6815
6816 pages[nPages].dwSize = sizeof(pages[0]);
6817 pages[nPages].hInstance = hInstance;
6819 pages[nPages].pfnDlgProc = export_welcome_dlg_proc;
6820 pages[nPages].dwFlags = PSP_HIDEHEADER;
6821 pages[nPages].lParam = (LPARAM)&data;
6822 nPages++;
6823
6824 hasPrivateKey = export_info_has_private_key(pExportInfo);
6825 switch (pExportInfo->dwSubjectChoice)
6826 {
6829 showFormatPage = FALSE;
6830 data.contextInfo.dwExportFormat = CRYPTUI_WIZ_EXPORT_FORMAT_DER;
6831 break;
6833 showFormatPage = FALSE;
6834 data.contextInfo.dwExportFormat =
6836 break;
6838 showFormatPage = FALSE;
6839 data.contextInfo.dwExportFormat = CRYPTUI_WIZ_EXPORT_FORMAT_PKCS7;
6840 break;
6841 }
6842
6843 if (hasPrivateKey && showFormatPage)
6844 {
6845 pages[nPages].dwSize = sizeof(pages[0]);
6846 pages[nPages].hInstance = hInstance;
6849 pages[nPages].dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
6850 pages[nPages].pszHeaderTitle =
6852 pages[nPages].pszHeaderSubTitle =
6854 pages[nPages].lParam = (LPARAM)&data;
6855 nPages++;
6856 }
6857 if (showFormatPage)
6858 {
6859 pages[nPages].dwSize = sizeof(pages[0]);
6860 pages[nPages].hInstance = hInstance;
6862 pages[nPages].pfnDlgProc = export_format_dlg_proc;
6863 pages[nPages].dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
6864 pages[nPages].pszHeaderTitle =
6866 pages[nPages].pszHeaderSubTitle =
6868 pages[nPages].lParam = (LPARAM)&data;
6869 nPages++;
6870 }
6871 if (hasPrivateKey && showFormatPage)
6872 {
6873 pages[nPages].dwSize = sizeof(pages[0]);
6874 pages[nPages].hInstance = hInstance;
6876 pages[nPages].pfnDlgProc = export_password_dlg_proc;
6877 pages[nPages].dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
6878 pages[nPages].pszHeaderTitle =
6880 pages[nPages].pszHeaderSubTitle =
6882 pages[nPages].lParam = (LPARAM)&data;
6883 nPages++;
6884 }
6885
6886 pages[nPages].dwSize = sizeof(pages[0]);
6887 pages[nPages].hInstance = hInstance;
6889 pages[nPages].pfnDlgProc = export_file_dlg_proc;
6890 pages[nPages].dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
6891 pages[nPages].pszHeaderTitle = MAKEINTRESOURCEW(IDS_EXPORT_FILE_TITLE);
6892 pages[nPages].pszHeaderSubTitle =
6894 pages[nPages].lParam = (LPARAM)&data;
6895 nPages++;
6896
6897 pages[nPages].dwSize = sizeof(pages[0]);
6898 pages[nPages].hInstance = hInstance;
6900 pages[nPages].pfnDlgProc = export_finish_dlg_proc;
6901 pages[nPages].dwFlags = PSP_HIDEHEADER;
6902 pages[nPages].lParam = (LPARAM)&data;
6903 nPages++;
6904
6905 memset(&hdr, 0, sizeof(hdr));
6906 hdr.dwSize = sizeof(hdr);
6907 hdr.hwndParent = hwndParent;
6908 hdr.dwFlags = PSH_PROPSHEETPAGE | PSH_WIZARD97_NEW | PSH_HEADER |
6909 PSH_WATERMARK;
6910 hdr.hInstance = hInstance;
6911 if (pwszWizardTitle)
6912 hdr.pszCaption = pwszWizardTitle;
6913 else
6915 hdr.ppsp = pages;
6916 hdr.nPages = nPages;
6917 hdr.pszbmWatermark = MAKEINTRESOURCEW(IDB_CERT_WATERMARK);
6918 hdr.pszbmHeader = MAKEINTRESOURCEW(IDB_CERT_HEADER);
6919 l = PropertySheetW(&hdr);
6920 DeleteObject(data.titleFont);
6921 if (data.freePassword)
6922 free((WCHAR *)data.contextInfo.pwszPassword);
6923 free(data.keyProvInfo);
6924 CloseHandle(data.file);
6925 free(data.fileName);
6926 if (l == 0)
6927 {
6929 return FALSE;
6930 }
6931 else
6932 return data.success;
6933}
6934
6936 LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, void *pvoid)
6937{
6938 BOOL ret;
6939
6940 TRACE("(%08lx, %p, %s, %p, %p)\n", dwFlags, hwndParent,
6941 debugstr_w(pwszWizardTitle), pExportInfo, pvoid);
6942
6943 if (!(dwFlags & CRYPTUI_WIZ_NO_UI))
6945 pvoid);
6946 else
6947 {
6950 CREATE_ALWAYS, 0, NULL);
6951
6953 {
6954 ret = do_export(file, pExportInfo, pvoid, NULL, FALSE);
6956 }
6957 else
6958 ret = FALSE;
6959 }
6960 return ret;
6961}
6962
6964{
6965 FIXME("%p: stub\n", pcvsi);
6966 return FALSE;
6967}
6968
6970{
6973 DWORD i = 0;
6974
6976 column.mask = LVCF_WIDTH | LVCF_TEXT;
6977 column.cx = 90;
6978 column.pszText = buf;
6980 {
6983 }
6985 {
6988 }
6990 {
6993 }
6995 {
6998 }
7000 {
7003 }
7005 {
7008 }
7009}
7010
7011static void add_cert_to_list(HWND lv, PCCERT_CONTEXT cert, DWORD flags, DWORD *allocatedLen,
7012 LPWSTR *str)
7013{
7014 DWORD len;
7015 LVITEMW item;
7016 WCHAR dateFmt[80]; /* sufficient for LOCALE_SSHORTDATE */
7017 WCHAR buf[80];
7018 SYSTEMTIME sysTime;
7019 LPWSTR none, usages;
7020
7022 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
7023 item.iSubItem = 0;
7024 item.iImage = 0;
7026 if (!item.iItem)
7027 {
7028 item.mask |= LVIF_STATE;
7029 item.state = LVIS_SELECTED;
7030 item.stateMask = -1;
7031 }
7033 {
7035 if (len > *allocatedLen)
7036 {
7037 free(*str);
7038 *str = malloc(len * sizeof(WCHAR));
7039 if (*str)
7040 *allocatedLen = len;
7041 }
7042 if (*str)
7043 {
7045 item.pszText = *str;
7047 }
7048 item.mask = LVIF_TEXT;
7049 ++item.iSubItem;
7050 }
7052 {
7054 NULL, 0);
7055 if (len > *allocatedLen)
7056 {
7057 free(*str);
7058 *str = malloc(len * sizeof(WCHAR));
7059 if (*str)
7060 *allocatedLen = len;
7061 }
7062 if (*str)
7063 {
7065 *str, len);
7066 item.pszText = *str;
7067 if (!item.iSubItem)
7069 else
7071 }
7072 item.mask = LVIF_TEXT;
7073 ++item.iSubItem;
7074 }
7076 {
7078 if (usages)
7079 {
7080 item.pszText = usages;
7081 if (!item.iSubItem)
7083 else
7085 free(usages);
7086 }
7087 item.mask = LVIF_TEXT;
7088 ++item.iSubItem;
7089 }
7091 {
7094 if (len > *allocatedLen)
7095 {
7096 free(*str);
7097 *str = malloc(len * sizeof(WCHAR));
7098 if (*str)
7099 *allocatedLen = len;
7100 }
7101 if (*str)
7102 {
7104 item.pszText = none;
7105 else
7106 item.pszText = *str;
7107 if (!item.iSubItem)
7109 else
7111 }
7112 item.mask = LVIF_TEXT;
7113 ++item.iSubItem;
7114 }
7116 {
7118 FileTimeToSystemTime(&cert->pCertInfo->NotAfter, &sysTime);
7119 GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, dateFmt, buf, ARRAY_SIZE(buf));
7120 item.pszText = buf;
7121 if (!item.iSubItem)
7123 else
7125 item.mask = LVIF_TEXT;
7126 ++item.iSubItem;
7127 }
7129 {
7130 static int show_fixme;
7131 if (!show_fixme++)
7132 FIXME("showing location is not implemented\n");
7134 if (!item.iSubItem)
7136 else
7138 }
7139}
7140
7142 void *callback_data)
7143{
7145 BOOL select = FALSE;
7146 DWORD allocatedLen = 0;
7147 LPWSTR str = NULL;
7148
7149 do {
7151 if (cert && (!filter || filter(cert, &select, callback_data)))
7152 add_cert_to_list(lv, cert, flags, &allocatedLen, &str);
7153 } while (cert);
7154 free(str);
7155}
7156
7158{
7161 LVITEMW item;
7162
7163 if (selection < 0)
7165 if (selection < 0)
7166 return NULL;
7167 item.mask = LVIF_PARAM;
7168 item.iItem = selection;
7169 item.iSubItem = 0;
7170 if (SendMessageW(lv, LVM_GETITEMW, 0, (LPARAM)&item))
7171 cert = (PCCERT_CONTEXT)item.lParam;
7172 return cert;
7173}
7174
7176{
7178 int numSelected = SendMessageW(lv, LVM_GETSELECTEDCOUNT, 0, 0);
7179
7180 EnableWindow(GetDlgItem(hwnd, IDC_SELECT_VIEW_CERT), numSelected == 1);
7181}
7182
7184{
7195};
7196
7198{
7200
7201 if (data->displayProc && data->displayProc(cert, hwnd, data->callbackData))
7202 return;
7203 memset(&viewInfo, 0, sizeof(viewInfo));
7204 viewInfo.dwSize = sizeof(viewInfo);
7205 viewInfo.hwndParent = hwnd;
7206 viewInfo.pCertContext = cert;
7207 viewInfo.cStores = data->cStores;
7208 viewInfo.rghStores = data->rghStores;
7209 viewInfo.cPropSheetPages = data->cPropSheetPages;
7210 viewInfo.rgPropSheetPages = data->rgPropSheetPages;
7211 /* FIXME: this should be modal */
7212 CryptUIDlgViewCertificateW(&viewInfo, NULL);
7213}
7214
7216{
7219};
7220
7222{
7223 struct SortData *data = (struct SortData *)lp;
7224 return cert_mgr_sort_by_text(data->hwnd, data->column, lp1, lp2);
7225}
7226
7228{
7231};
7232
7234{
7235 struct SelectCertData *data;
7236
7237 switch (msg)
7238 {
7239 case WM_INITDIALOG:
7240 {
7241 struct SelectCertParam *param = (struct SelectCertParam *)lp;
7244 DWORD i = 0;
7245
7246 data = malloc(sizeof(*data));
7247 if (!data)
7248 return 0;
7249 data->cert = &param->cert;
7250 data->dateColumn = 4 -
7255 data->imageList = ImageList_Create(16, 16, ILC_COLOR4 | ILC_MASK, 2, 0);
7256 if (data->imageList)
7257 {
7258 HBITMAP bmp;
7259 COLORREF backColor = RGB(255, 0, 255);
7260
7262 ImageList_AddMasked(data->imageList, bmp, backColor);
7264 ImageList_SetBkColor(data->imageList, CLR_NONE);
7266 (LPARAM)data->imageList);
7267 }
7268 data->title = pcsc->szTitle;
7269 data->cStores = pcsc->cStores;
7270 data->rghStores = pcsc->rghStores;
7271 data->cPropSheetPages = pcsc->cPropSheetPages;
7272 data->rgPropSheetPages = pcsc->rgPropSheetPages;
7273 data->displayProc = pcsc->pDisplayCallback;
7274 data->callbackData = pcsc->pvCallbackData;
7276
7277 if (pcsc->szTitle)
7279 if (pcsc->szDisplayString)
7283 while (i < pcsc->cDisplayStores)
7287 break;
7288 }
7289#ifdef __REACTOS__
7290 case WM_DESTROY:
7294 break;
7295#endif
7296 case WM_NOTIFY:
7297 {
7298 NMHDR *hdr = (NMHDR *)lp;
7299
7300 switch (hdr->code)
7301 {
7302 case NM_DBLCLK:
7303 {
7305
7307 if (cert)
7309 break;
7310 }
7311 case LVN_COLUMNCLICK:
7312 {
7313 NMLISTVIEW *nmlv = (NMLISTVIEW *)lp;
7315
7316 /* FIXME: doesn't support swapping sort order between ascending and descending. */
7318 if (nmlv->iSubItem == data->dateColumn)
7320 else
7321 {
7322 struct SortData sortData;
7323
7324 sortData.hwnd = lv;
7325 sortData.column = nmlv->iSubItem;
7326 SendMessageW(lv, LVM_SORTITEMSEX, (WPARAM)&sortData,
7328 }
7329 break;
7330 }
7331 }
7332 break;
7333 }
7334 case WM_COMMAND:
7335 switch (wp)
7336 {
7337 case IDOK:
7338 {
7340
7342 if (!cert)
7343 {
7344 WCHAR buf[40], title[40];
7345
7347 if (!data->title)
7349 MessageBoxW(hwnd, buf, data->title ? data->title : title, MB_OK | MB_ICONWARNING);
7350 break;
7351 }
7353#ifndef __REACTOS__
7355 ImageList_Destroy(data->imageList);
7356 free(data);
7357#endif
7359 break;
7360 }
7361 case IDCANCEL:
7362#ifndef __REACTOS__
7365 ImageList_Destroy(data->imageList);
7366 free(data);
7367#endif
7369 break;
7371 {
7373
7375 if (cert)
7377 break;
7378 }
7379 }
7380 break;
7381 }
7382 return 0;
7383}
7384
7386{
7387 struct SelectCertParam param;
7388
7389 TRACE("%p\n", pcsc);
7390
7391 if (pcsc->dwSize != sizeof(*pcsc) && pcsc->dwSize != sizeof(*pcsc) - sizeof(HCERTSTORE))
7392 {
7393 WARN("unexpected size %ld\n", pcsc->dwSize);
7395 return NULL;
7396 }
7398 FIXME("ignoring CRYPTUI_SELECTCERT_MULTISELECT\n");
7399 param.pcsc = pcsc;
7400 param.cert = NULL;
7403 return param.cert;
7404}
7405
7407{
7408 DWORD i;
7409
7410 for (i = 0; i < num; i++)
7411 {
7412 if (!(pages[i].dwFlags & PSP_DLGINDIRECT) && !IS_INTRESOURCE(pages[i].pszTemplate))
7413 free((void *)pages[i].pszTemplate);
7414 if ((pages[i].dwFlags & PSP_USEICONID) && !IS_INTRESOURCE(pages[i].pszIcon))
7415 free((void *)pages[i].pszIcon);
7416 if ((pages[i].dwFlags & PSP_USETITLE) && !IS_INTRESOURCE(pages[i].pszTitle))
7417 free((void *)pages[i].pszTitle);
7418 if ((pages[i].dwFlags & PSP_USEHEADERTITLE) && !IS_INTRESOURCE(pages[i].pszHeaderTitle))
7419 free((void *)pages[i].pszHeaderTitle);
7420 if ((pages[i].dwFlags & PSP_USEHEADERSUBTITLE) &&
7421 !IS_INTRESOURCE(pages[i].pszHeaderSubTitle))
7422 free((void *)pages[i].pszHeaderSubTitle);
7423 }
7424 free(pages);
7425}
7426
7428{
7429 PROPSHEETPAGEW *psp;
7430 DWORD i, size = sizeof(*psp) * num;
7431
7432 psp = malloc(size);
7433 if (!psp)
7434 return NULL;
7435 memcpy(psp, pages, size);
7436 for (i = 0; i < num; i++)
7437 {
7438 if (!(pages[i].dwFlags & PSP_DLGINDIRECT) && !IS_INTRESOURCE(pages[i].pszTemplate))
7439 psp[i].pszTemplate = NULL;
7440 if ((pages[i].dwFlags & PSP_USEICONID) && !IS_INTRESOURCE(pages[i].pszIcon))
7441 psp[i].pszIcon = NULL;
7442 if ((pages[i].dwFlags & PSP_USETITLE) && !IS_INTRESOURCE(pages[i].pszTitle))
7443 psp[i].pszTitle = NULL;
7444 if (pages[i].dwFlags & PSP_USECALLBACK)
7445 psp[i].pfnCallback = NULL;
7446 if ((pages[i].dwFlags & PSP_USEHEADERTITLE) && !IS_INTRESOURCE(pages[i].pszHeaderTitle))
7447 psp[i].pszHeaderTitle = NULL;
7448 if ((pages[i].dwFlags & PSP_USEHEADERSUBTITLE) &&
7449 !IS_INTRESOURCE(pages[i].pszHeaderSubTitle))
7450 psp[i].pszHeaderSubTitle = NULL;
7451 }
7452 for (i = 0; i < num; i++)
7453 {
7454 if (!(pages[i].dwFlags & PSP_DLGINDIRECT) && !IS_INTRESOURCE(pages[i].pszTemplate))
7455 {
7456 if (!(psp[i].pszTemplate = strdupAtoW( pages[i].pszTemplate ))) goto error;
7457 }
7458 if ((pages[i].dwFlags & PSP_USEICONID) && !IS_INTRESOURCE(pages[i].pszIcon))
7459 {
7460 if (!(psp[i].pszIcon = strdupAtoW( pages[i].pszIcon ))) goto error;
7461 }
7462 if ((pages[i].dwFlags & PSP_USETITLE) && !IS_INTRESOURCE(pages[i].pszTitle))
7463 {
7464 if (!(psp[i].pszTitle = strdupAtoW( pages[i].pszTitle ))) goto error;
7465 }
7466 if (pages[i].dwFlags & PSP_USECALLBACK)
7467 FIXME("ignoring pfnCallback\n");
7468 if ((pages[i].dwFlags & PSP_USEHEADERTITLE) && !IS_INTRESOURCE(pages[i].pszHeaderTitle))
7469 {
7470 if (!(psp[i].pszHeaderTitle = strdupAtoW( pages[i].pszHeaderTitle ))) goto error;
7471 }
7472 if ((pages[i].dwFlags & PSP_USEHEADERSUBTITLE) &&
7473 !IS_INTRESOURCE(pages[i].pszHeaderSubTitle))
7474 {
7475 if (!(psp[i].pszHeaderSubTitle = strdupAtoW( pages[i].pszHeaderSubTitle ))) goto error;
7476 }
7477 }
7478 return psp;
7479error:
7481 return NULL;
7482}
7483
7485{
7488 LPWSTR title = NULL, display_str = NULL;
7489 PROPSHEETPAGEW *pages = NULL;
7490
7491 TRACE("%p\n", pcsc);
7492
7493 if (pcsc->dwSize != sizeof(*pcsc) && pcsc->dwSize != sizeof(*pcsc) - sizeof(HCERTSTORE))
7494 {
7495 WARN("unexpected size %ld\n", pcsc->dwSize);
7497 return NULL;
7498 }
7499 memcpy(&selCertInfo, pcsc, pcsc->dwSize);
7500 if (pcsc->szTitle)
7501 {
7502 if (!(title = strdupAtoW( pcsc->szTitle ))) goto error;
7503 selCertInfo.szTitle = title;
7504 }
7505 if (pcsc->szDisplayString)
7506 {
7507 if (!(display_str = strdupAtoW( pcsc->szDisplayString ))) goto error;
7508 selCertInfo.szDisplayString = display_str;
7509 }
7510 if (pcsc->cPropSheetPages)
7511 {
7513 if (!pages)
7514 goto error;
7515 selCertInfo.rgPropSheetPages = pages;
7516 }
7517 cert = CryptUIDlgSelectCertificateW(&selCertInfo);
7518error:
7519 free(title);
7520 free(display_str);
7521 if (pcsc->cPropSheetPages)
7523 return cert;
7524}
7525
7527 LPCWSTR pwszDisplayString, DWORD dwDontUseColumn,
7528 DWORD dwFlags, void *pvReserved)
7529{
7531
7532 TRACE("%p %p %s %s %lx %lx %p\n", hCertStore, hwnd, debugstr_w(pwszTitle), debugstr_w(pwszDisplayString), dwDontUseColumn, dwFlags, pvReserved);
7533
7534 memset(&sc, 0, sizeof(sc));
7535
7536 sc.dwSize = sizeof(sc);
7537 sc.hwndParent = hwnd;
7538 sc.dwFlags = dwFlags;
7539 sc.szTitle = pwszTitle;
7540 sc.szDisplayString = pwszDisplayString;
7541 sc.dwDontUseColumn = dwDontUseColumn;
7542 sc.cDisplayStores = 1;
7543 sc.rghDisplayStores = &hCertStore;
7544 return CryptUIDlgSelectCertificateW(&sc);
7545}
7546
7549{
7550 FIXME("%ld %p %s %p %p: stub\n", flags, parent, debugstr_w(title), info, context);
7551 return FALSE;
7552}
static HDC hDC
Definition: 3dtext.c:33
#define isdigit(c)
Definition: acclib.h:68
static DWORD const fdwReason
static int state
Definition: maze.c:121
#define msg(x)
Definition: auth_time.c:54
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define IDC_DESCRIPTION
Definition: resource.h:17
#define MAX_STRING_LEN
Definition: precomp.h:36
#define IDS_YES
Definition: resource.h:16
#define IDS_NO
Definition: resource.h:17
#define CF_BITMAP
Definition: constants.h:397
#define IDD_GENERAL
Definition: resource.h:12
#define index(s, c)
Definition: various.h:29
WCHAR szTitle[MAX_LOADSTRING]
Definition: main.c:30
#define ARRAY_SIZE(A)
Definition: main.h:20
BOOL NTAPI DllMain(_In_ HINSTANCE hDll, _In_ ULONG dwReason, _In_opt_ PVOID pReserved)
Definition: main.c:33
INT copy(TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], INT append, DWORD lpdwFlags, BOOL bTouch)
Definition: copy.c:51
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define RegCloseKey(hKey)
Definition: registry.h:49
struct _root root
r l[0]
Definition: byte_order.h:168
HINSTANCE hInstance
Definition: charmap.c:19
Definition: list.h:37
BOOL WINAPI CertAddStoreToCollection(HCERTSTORE hCollectionStore, HCERTSTORE hSiblingStore, DWORD dwUpdateFlags, DWORD dwPriority)
LPARAM lParam
Definition: combotst.c:139
#define OFN_EXPLORER
Definition: commdlg.h:104
BOOL WINAPI CryptDecodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
Definition: decode.c:6286
static HWND hwndParent
Definition: cryptui.c:299
static HWND LPCWSTR pwszWizardTitle
Definition: cryptui.c:300
static HWND LPCWSTR PCCRYPTUI_WIZ_IMPORT_SRC_INFO HCERTSTORE hDestCertStore
Definition: cryptui.c:301
static HWND LPCWSTR PCCRYPTUI_WIZ_IMPORT_SRC_INFO pImportSrc
Definition: cryptui.c:300
const CRYPTUI_VIEWCERTIFICATE_STRUCTW * PCCRYPTUI_VIEWCERTIFICATE_STRUCTW
Definition: cryptuiapi.h:143
#define CRYPTUI_WIZ_EXPORT_CRL_CONTEXT
Definition: cryptuiapi.h:260
#define CRYPTUI_WIZ_EXPORT_CERT_STORE
Definition: cryptuiapi.h:261
#define CRYPTUI_WIZ_EXPORT_FORMAT_PFX
Definition: cryptuiapi.h:284
#define CRYPTUI_SELECT_ISSUEDTO_COLUMN
Definition: cryptuiapi.h:35
#define CRYPTUI_SELECT_ISSUEDBY_COLUMN
Definition: cryptuiapi.h:36
#define CRYPTUI_WIZ_EXPORT_CERT_CONTEXT
Definition: cryptuiapi.h:258
#define CRYPTUI_WIZ_IMPORT_ALLOW_CRL
Definition: cryptuiapi.h:330
#define CRYPTUI_WIZ_EXPORT_FORMAT_SERIALIZED_CERT_STORE
Definition: cryptuiapi.h:287
#define CRYPTUI_WIZ_IMPORT_SUBJECT_CERT_CONTEXT
Definition: cryptuiapi.h:306
#define CRYPTUI_WIZ_EXPORT_FORMAT_BASE64
Definition: cryptuiapi.h:286
#define CRYPTUI_DISABLE_EXPORT
Definition: cryptuiapi.h:86
BOOL(WINAPI * PFNCCERTDISPLAYPROC)(PCCERT_CONTEXT pCertContext, HWND hWndSelCertDlg, void *pvCallbackData)
Definition: cryptuiapi.h:341
#define CRYPTUI_WIZ_EXPORT_CERT_STORE_CERTIFICATES_ONLY
Definition: cryptuiapi.h:262
#define CRYPTUI_WIZ_EXPORT_FORMAT_DER
Definition: cryptuiapi.h:283
#define CRYPTUI_HIDE_DETAILPAGE
Definition: cryptuiapi.h:74
#define CRYPTUI_WIZ_NO_UI
Definition: cryptuiapi.h:246
#define CRYPTUI_WIZ_IMPORT_SUBJECT_CTL_CONTEXT
Definition: cryptuiapi.h:307
#define CRYPTUI_SELECT_FRIENDLYNAME_COLUMN
Definition: cryptuiapi.h:38
#define CRYPTUI_SELECTCERT_MULTISELECT
Definition: cryptuiapi.h:345
#define CRYPTUI_SELECT_EXPIRATION_COLUMN
Definition: cryptuiapi.h:40
#define CRYPTUI_WIZ_IMPORT_SUBJECT_CERT_STORE
Definition: cryptuiapi.h:309
#define CRYPTUI_WIZ_IMPORT_ALLOW_CTL
Definition: cryptuiapi.h:331
#define CRYPTUI_ENABLE_EDITPROPERTIES
Definition: cryptuiapi.h:76
#define CRYPTUI_ENABLE_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT
Definition: cryptuiapi.h:89
#define CRYPTUI_HIDE_HIERARCHYPAGE
Definition: cryptuiapi.h:73
#define CRYPTUI_SELECT_LOCATION_COLUMN
Definition: cryptuiapi.h:39
#define CRYPTUI_CERT_MGR_PUBLISHER_TAB
Definition: cryptuiapi.h:47
BOOL(WINAPI * PFNCFILTERPROC)(PCCERT_CONTEXT pCertContext, BOOL *pfInitialSelectedCert, void *pvCallbackData)
Definition: cryptuiapi.h:63
#define CRYPTUI_CERT_MGR_SINGLE_TAB_FLAG
Definition: cryptuiapi.h:49
#define CRYPTUI_DISABLE_ADDTOSTORE
Definition: cryptuiapi.h:77
#define CRYPTUI_ENABLE_REVOCATION_CHECK_END_CERT
Definition: cryptuiapi.h:87
#define CRYPTUI_ENABLE_REVOCATION_CHECK_CHAIN
Definition: cryptuiapi.h:88
#define CRYPTUI_WIZ_IMPORT_SUBJECT_CRL_CONTEXT
Definition: cryptuiapi.h:308
#define CRYPTUI_WIZ_EXPORT_CTL_CONTEXT
Definition: cryptuiapi.h:259
#define CRYPTUI_WIZ_IMPORT_SUBJECT_FILE
Definition: cryptuiapi.h:305
#define CRYPTUI_WIZ_EXPORT_FORMAT_PKCS7
Definition: cryptuiapi.h:285
#define CRYPTUI_WIZ_IMPORT_ALLOW_CERT
Definition: cryptuiapi.h:329
#define CRYPTUI_SELECT_INTENDEDUSE_COLUMN
Definition: cryptuiapi.h:37
#define CRYPTUI_DISABLE_ISSUERSTATEMENT
Definition: cryptuiapi.h:91
const struct _CRYPTUI_CERT_MGR_STRUCT * PCCRYPTUI_CERT_MGR_STRUCT
Definition: cryptuiapi.h:59
#define CRYPTUI_WIZ_IMPORT_NO_CHANGE_DEST_STORE
Definition: cryptuiapi.h:328
#define IDS_IMPORT_DEST_DETERMINED
Definition: cryptuires.h:83
#define IDS_PURPOSE_KEY_RECOVERY
Definition: cryptuires.h:136
#define IDS_PURPOSE_NT5
Definition: cryptuires.h:131
#define IDS_PURPOSE_OEM_WHQL
Definition: cryptuires.h:132
#define IDC_EXPORT
Definition: cryptuires.h:223
#define IDS_IMPORT_CONTENT_CERT
Definition: cryptuires.h:89
#define IDC_EXPORT_PASSWORD_CONFIRM
Definition: cryptuires.h:282
#define IDD_EXPORT_FILE
Definition: cryptuires.h:200
#define IDC_IMPORT_AUTO_STORE
Definition: cryptuires.h:250
#define IDS_PURPOSE_ALL
Definition: cryptuires.h:98
#define IDS_WARN_REMOVE_PLURAL_CA
Definition: cryptuires.h:111
#define IDC_EXPORT_BROWSE_FILE
Definition: cryptuires.h:276
#define IDC_MGR_ADVANCED
Definition: cryptuires.h:262
#define IDS_WARN_REMOVE_ROOT
Definition: cryptuires.h:112
#define IDS_IMPORT_FILTER_CERT
Definition: cryptuires.h:73
#define IDS_EXPORT_PASSWORD_MISMATCH
Definition: cryptuires.h:172
#define IDS_PURPOSE_EFS
Definition: cryptuires.h:128
#define IDS_FRIENDLY_NAME_NONE
Definition: cryptuires.h:119
#define IDS_ISSUER_HEADING
Definition: cryptuires.h:35
#define IDS_PURPOSE_QUALIFIED_SUBORDINATION
Definition: cryptuires.h:135
#define IDS_PURPOSE_CTL_USAGE_SIGNING
Definition: cryptuires.h:127
#define IDS_EXPORT_FILTER_CMS
Definition: cryptuires.h:158
#define IDS_EXPIRATION_COLUMN
Definition: cryptuires.h:102
#define IDC_CERTIFICATE_USAGES
Definition: cryptuires.h:238
#define IDS_CERT_MGR
Definition: cryptuires.h:118
#define IDS_CERT_INFO_PURPOSES
Definition: cryptuires.h:32
#define IDC_EXPORT_PRIVATE_KEY_YES
Definition: cryptuires.h:278
#define IDS_CERTIFICATE_BAD_TIMENEST
Definition: cryptuires.h:40
#define IDS_ALLOWED_PURPOSE_ALL
Definition: cryptuires.h:104
#define IDC_EXPORT_FORMAT_CMS
Definition: cryptuires.h:269
#define IDS_IMPORT_WIZARD
Definition: cryptuires.h:67
#define IDD_ADD_CERT_PURPOSE
Definition: cryptuires.h:188
#define IDC_CPS
Definition: cryptuires.h:231
#define IDS_PURPOSE_TIMESTAMP_SIGNING
Definition: cryptuires.h:126
#define IDS_INTENDED_USE_COLUMN
Definition: cryptuires.h:176
#define IDS_IMPORT_FILTER_ALL
Definition: cryptuires.h:79
#define IDS_IMPORT_FILTER_CMS
Definition: cryptuires.h:78
#define IDC_EXPORT_FILENAME
Definition: cryptuires.h:275
#define IDC_MGR_STORES
Definition: cryptuires.h:257
#define IDD_EXPORT_PRIVATE_KEY
Definition: cryptuires.h:197
#define IDS_SUBJECT_HEADING
Definition: cryptuires.h:34
#define IDC_IMPORT_SPECIFY_STORE
Definition: cryptuires.h:251
#define IDS_IMPORT_FILTER_PFX
Definition: cryptuires.h:74
#define IDS_WARN_REMOVE_PLURAL_ADDRESSBOOK
Definition: cryptuires.h:109
#define IDS_CERT_INFO_PARTIAL_CHAIN
Definition: cryptuires.h:30
#define IDS_IMPORT_EMPTY_FILE
Definition: cryptuires.h:80
#define IDS_IMPORT_CONTENT_CMS
Definition: cryptuires.h:92
#define IDS_PURPOSE_EFS_RECOVERY
Definition: cryptuires.h:129
#define IDS_EXPORT_FORMAT_TITLE
Definition: cryptuires.h:149
#define IDS_WARN_REMOVE_PLURAL_TRUSTEDPUBLISHER
Definition: cryptuires.h:115
#define IDS_WARN_REMOVE_TRUSTEDPUBLISHER
Definition: cryptuires.h:114
#define IDS_EXPORT_PRIVATE_KEY_NON_EXPORTABLE
Definition: cryptuires.h:174
#define IDS_CERTIFICATE_REVOKED
Definition: cryptuires.h:41
#define IDC_EXPORT_PFX_DELETE_PRIVATE_KEY
Definition: cryptuires.h:274
#define IDS_EXPORT_FORMAT_SUBTITLE
Definition: cryptuires.h:150
#define IDS_EXPORT_PRIVATE_KEY_UNAVAILABLE
Definition: cryptuires.h:173
#define IDS_IMPORT_CONTENT
Definition: cryptuires.h:88
#define IDS_PROP_HASH
Definition: cryptuires.h:58
#define IDC_SHOW_PHYSICAL_STORES
Definition: cryptuires.h:245
#define IDS_IMPORT_SELECT_STORE
Definition: cryptuires.h:84
#define IDS_FIELD_SERIAL_NUMBER
Definition: cryptuires.h:51
#define IDS_FIELDS_V1
Definition: cryptuires.h:46
#define IDS_FIELD_SUBJECT
Definition: cryptuires.h:55
#define IDC_EXPORT_SETTINGS
Definition: cryptuires.h:277
#define IDC_CERTIFICATESTATUSTEXT
Definition: cryptuires.h:228
#define IDS_PURPOSE_ROOT_LIST_SIGNER
Definition: cryptuires.h:134
#define IDC_IMPORT_SETTINGS
Definition: cryptuires.h:254
#define IDS_CERT_INFO_BAD_SIG
Definition: cryptuires.h:27
#define IDC_CERTIFICATE_ICON
Definition: cryptuires.h:212
#define IDC_IMPORT_TITLE
Definition: cryptuires.h:247
#define IDS_PURPOSE_IPSEC
Definition: cryptuires.h:125
#define IDS_FIELD_VALID_FROM
Definition: cryptuires.h:53
#define IDS_SELECT_STORE
Definition: cryptuires.h:66
#define IDC_STORE_LIST
Definition: cryptuires.h:244
#define IDS_EXPORT_FAILED
Definition: cryptuires.h:167
#define IDS_IMPORT_FILTER_CTL
Definition: cryptuires.h:76
#define IDD_IMPORT_STORE
Definition: cryptuires.h:192
#define IDC_MGR_EXPORT
Definition: cryptuires.h:260
#define IDS_VALID_TO
Definition: cryptuires.h:37
#define IDC_EXPORT_TITLE
Definition: cryptuires.h:266
#define IDS_CERT_INFO_UNTRUSTED_ROOT
Definition: cryptuires.h:29
#define IDC_USERNOTICE
Definition: cryptuires.h:230
#define IDS_CERT_INFO_BAD_PURPOSES
Definition: cryptuires.h:31
#define IDS_IMPORT_FILE_TITLE
Definition: cryptuires.h:69
#define IDS_PURPOSE_WHQL
Definition: cryptuires.h:130
#define IDS_SELECT_CERT
Definition: cryptuires.h:179
#define IDS_PURPOSE_KEY_RECOVERY_AGENT
Definition: cryptuires.h:145
#define IDS_PROP_DESCRIPTION
Definition: cryptuires.h:61
#define IDC_EXPORT_PRIVATE_KEY_UNAVAILABLE
Definition: cryptuires.h:280
#define IDC_EXPORT_PFX_INCLUDE_CHAIN
Definition: cryptuires.h:272
#define IDC_MGR_VIEW
Definition: cryptuires.h:264
#define IDS_IMPORT_FILE_SUBTITLE
Definition: cryptuires.h:70
#define IDS_EXPORT_FILE_EXISTS
Definition: cryptuires.h:153
#define IDS_FRIENDLY_NAME_COLUMN
Definition: cryptuires.h:103
#define IDS_FIELD
Definition: cryptuires.h:43
#define IDS_WARN_REMOVE_CA
Definition: cryptuires.h:110
#define IDS_EXPORT_FILTER_BASE64_CERT
Definition: cryptuires.h:155
#define IDB_CHECKS
Definition: cryptuires.h:208
#define IDC_DETAIL_LIST
Definition: cryptuires.h:220
#define IDS_EXPORT_FILTER_CTL
Definition: cryptuires.h:157
#define IDS_EXPORT_WIZARD
Definition: cryptuires.h:148
#define IDC_SELECT_VIEW_CERT
Definition: cryptuires.h:286
#define IDS_PURPOSE_LICENSES
Definition: cryptuires.h:140
#define IDD_CERT_MGR_ADVANCED
Definition: cryptuires.h:195
#define IDS_PURPOSE_DRM
Definition: cryptuires.h:139
#define IDS_IMPORT_FILTER_SERIALIZED_STORE
Definition: cryptuires.h:77
#define IDD_EXPORT_PASSWORD
Definition: cryptuires.h:198
#define IDC_CERTIFICATE_STATUS
Definition: cryptuires.h:214
#define IDS_PURPOSE_LICENSE_SERVER
Definition: cryptuires.h:141
#define IDS_IMPORT_CONTENT_STORE
Definition: cryptuires.h:94
#define IDS_WARN_REMOVE_ADDRESSBOOK
Definition: cryptuires.h:108
#define IDS_WARN_REMOVE_PLURAL_DEFAULT
Definition: cryptuires.h:117
#define IDS_IMPORT_CONTENT_PFX
Definition: cryptuires.h:93
#define IDS_FIELDS_PROPERTIES
Definition: cryptuires.h:49
#define IDD_SELECT_STORE
Definition: cryptuires.h:189
#define IDS_IMPORT_CONTENT_CRL
Definition: cryptuires.h:90
#define IDD_EXPORT_FINISH
Definition: cryptuires.h:201
#define IDC_SELECT_CERTS
Definition: cryptuires.h:285
#define IDD_IMPORT_WELCOME
Definition: cryptuires.h:190
#define IDS_PURPOSE_CA_EXCHANGE
Definition: cryptuires.h:144
#define IDC_CERTIFICATE_NAMES
Definition: cryptuires.h:215
#define IDS_CERTIFICATEINFORMATION
Definition: cryptuires.h:26
#define IDD_IMPORT_FILE
Definition: cryptuires.h:191
#define IDC_ENABLE_SELECTED_PURPOSES
Definition: cryptuires.h:237
#define IDS_IMPORT_FILTER_CRL
Definition: cryptuires.h:75
#define IDD_EXPORT_WELCOME
Definition: cryptuires.h:196
#define IDS_EXPORT_INCLUDE_CHAIN
Definition: cryptuires.h:162
#define IDS_PURPOSE_EMAIL_PROTECTION
Definition: cryptuires.h:124
#define IDC_CERTIFICATE_INFO
Definition: cryptuires.h:213
#define IDC_MGR_REMOVE
Definition: cryptuires.h:261
#define IDS_FIELD_PUBLIC_KEY
Definition: cryptuires.h:56
#define IDS_EXPORT_PASSWORD_SUBTITLE
Definition: cryptuires.h:171
#define IDS_NO_IMPL
Definition: cryptuires.h:181
#define IDC_IMPORT_STORE
Definition: cryptuires.h:252
#define IDC_EXPORT_FORMAT_DER
Definition: cryptuires.h:267
#define IDC_CERTPATH
Definition: cryptuires.h:226
#define IDS_IMPORT_STORE_SUBTITLE
Definition: cryptuires.h:72
#define IDS_PURPOSE_SERVER_AUTH
Definition: cryptuires.h:121
#define IDB_CERT_HEADER
Definition: cryptuires.h:210
#define IDS_EXPORT_FILE_SUBTITLE
Definition: cryptuires.h:152
#define IDC_ENABLE_ALL_PURPOSES
Definition: cryptuires.h:235
#define IDC_ADDTOSTORE
Definition: cryptuires.h:216
#define IDS_LOCATION_COLUMN
Definition: cryptuires.h:177
#define IDC_ISSUERSTATEMENT
Definition: cryptuires.h:217
#define IDS_WARN_REMOVE_PLURAL_ROOT
Definition: cryptuires.h:113
#define IDS_CERTIFICATE_BAD_TIME
Definition: cryptuires.h:39
#define IDS_EXPORT_FORMAT
Definition: cryptuires.h:161
#define IDS_EXPORT_FILTER_SERIALIZED_CERT_STORE
Definition: cryptuires.h:160
#define IDD_HIERARCHY
Definition: cryptuires.h:185
#define IDS_EXPORT_FILTER_PFX
Definition: cryptuires.h:159
#define IDB_CERT_WATERMARK
Definition: cryptuires.h:209
#define IDS_IMPORT_FAILED
Definition: cryptuires.h:96
#define IDC_FRIENDLY_NAME
Definition: cryptuires.h:233
#define IDC_VIEWCERTIFICATE
Definition: cryptuires.h:225
#define IDC_DETAIL_SELECT
Definition: cryptuires.h:219
#define IDB_CERT
Definition: cryptuires.h:205
#define IDD_DETAIL
Definition: cryptuires.h:184
#define IDS_SELECT_STORE_TITLE
Definition: cryptuires.h:65
#define IDS_SELECT_CERT_TITLE
Definition: cryptuires.h:178
#define IDS_EXPORT_FILTER_CERT
Definition: cryptuires.h:154
#define IDS_CERT_INFO_UNTRUSTED_CA
Definition: cryptuires.h:28
#define IDS_FIELD_VERSION
Definition: cryptuires.h:50
#define IDS_IMPORT_STORE_TITLE
Definition: cryptuires.h:71
#define IDS_CERTIFICATE_PURPOSE_EXISTS
Definition: cryptuires.h:64
#define IDS_FIELD_PUBLIC_KEY_FORMAT
Definition: cryptuires.h:57
#define IDS_PURPOSE_EMBEDDED_NT
Definition: cryptuires.h:133
#define IDS_WARN_REMOVE_MY
Definition: cryptuires.h:106
#define IDS_ALLOWED_PURPOSE_NONE
Definition: cryptuires.h:105
#define IDS_PURPOSE_DS_EMAIL_REPLICATION
Definition: cryptuires.h:146
#define IDS_EXPORT_PRIVATE_KEY_SUBTITLE
Definition: cryptuires.h:169
#define IDS_IMPORT_STORE_SELECTION
Definition: cryptuires.h:85
#define IDC_IMPORT_BROWSE_STORE
Definition: cryptuires.h:253
#define IDS_PROP_FRIENDLY_NAME
Definition: cryptuires.h:60
#define IDS_IMPORT_BAD_FORMAT
Definition: cryptuires.h:81
#define IDS_PROP_ENHKEY_USAGE
Definition: cryptuires.h:59
#define IDC_EXPORT_PRIVATE_KEY_NO
Definition: cryptuires.h:279
#define IDC_EXPORT_PFX_STRONG_ENCRYPTION
Definition: cryptuires.h:273
#define IDS_CERTIFICATE
Definition: cryptuires.h:25
#define IDC_EXPORT_PASSWORD
Definition: cryptuires.h:281
#define IDS_EXPORT_FILTER_CRL
Definition: cryptuires.h:156
#define IDS_SUBJECT_COLUMN
Definition: cryptuires.h:100
#define IDS_PURPOSE_SMARTCARD_LOGON
Definition: cryptuires.h:143
#define IDS_PURPOSE_ENROLLMENT_AGENT
Definition: cryptuires.h:142
#define IDS_CERTIFICATE_VALID
Definition: cryptuires.h:42
#define IDD_EXPORT_FORMAT
Definition: cryptuires.h:199
#define IDS_EXPORT_PASSWORD_TITLE
Definition: cryptuires.h:170
#define IDC_EXPORT_FORMAT_BASE64
Definition: cryptuires.h:268
#define IDS_IMPORT_CONTENT_CTL
Definition: cryptuires.h:91
#define IDS_IMPORT_SUCCEEDED
Definition: cryptuires.h:95
#define IDD_CERT_MGR
Definition: cryptuires.h:194
#define IDC_EXPORT_CMS_INCLUDE_CHAIN
Definition: cryptuires.h:271
#define IDD_USERNOTICE
Definition: cryptuires.h:186
#define IDC_MGR_CERTS
Definition: cryptuires.h:258
#define IDS_WIZARD_TITLE_FONT
Definition: cryptuires.h:97
#define IDC_IMPORT_FILENAME
Definition: cryptuires.h:248
#define IDS_EXPORT_SUCCEEDED
Definition: cryptuires.h:166
#define IDC_MGR_PURPOSE_SELECTION
Definition: cryptuires.h:256
#define IDS_FIELDS_ALL
Definition: cryptuires.h:45
#define IDS_IMPORT_TYPE_MISMATCH
Definition: cryptuires.h:68
#define IDS_PURPOSE_DOCUMENT_SIGNING
Definition: cryptuires.h:137
#define IDB_SMALL_ICONS
Definition: cryptuires.h:204
#define IDS_CERTIFICATE_BAD_SIGNATURE
Definition: cryptuires.h:38
#define IDS_PURPOSE_LIFETIME_SIGNING
Definition: cryptuires.h:138
#define IDS_IMPORT_DEST_AUTOMATIC
Definition: cryptuires.h:86
#define IDS_FIELD_ISSUER
Definition: cryptuires.h:52
#define IDS_FIELDS_EXTENSIONS
Definition: cryptuires.h:47
#define IDS_IMPORT_FILE
Definition: cryptuires.h:87
#define IDC_MGR_IMPORT
Definition: cryptuires.h:259
#define IDC_EXPORT_FORMAT_PFX
Definition: cryptuires.h:270
#define IDS_FIELDS_CRITICAL_EXTENSIONS
Definition: cryptuires.h:48
#define IDC_EDITPROPERTIES
Definition: cryptuires.h:222
#define IDC_STORE_TEXT
Definition: cryptuires.h:243
#define IDS_PURPOSE_ADVANCED
Definition: cryptuires.h:99
#define IDS_CERTIFICATE_PURPOSE_ERROR
Definition: cryptuires.h:63
#define IDD_CERT_PROPERTIES_GENERAL
Definition: cryptuires.h:187
#define IDC_ADD_PURPOSE
Definition: cryptuires.h:239
#define IDC_MGR_PURPOSES
Definition: cryptuires.h:263
#define IDS_WARN_REMOVE_DEFAULT
Definition: cryptuires.h:116
#define IDS_ISSUER_COLUMN
Definition: cryptuires.h:101
#define IDS_EXPORT_PRIVATE_KEY_TITLE
Definition: cryptuires.h:168
#define IDS_FIELD_VALID_TO
Definition: cryptuires.h:54
#define IDS_PURPOSE_CODE_SIGNING
Definition: cryptuires.h:123
#define IDS_PURPOSE_CLIENT_AUTH
Definition: cryptuires.h:122
#define IDC_IMPORT_BROWSE_FILE
Definition: cryptuires.h:249
#define IDS_EXPORT_FILE_TITLE
Definition: cryptuires.h:151
#define IDB_CERT_WARNING
Definition: cryptuires.h:207
#define IDC_DETAIL_VALUE
Definition: cryptuires.h:221
#define IDD_IMPORT_FINISH
Definition: cryptuires.h:193
#define IDS_IMPORT_OPEN_FAILED
Definition: cryptuires.h:82
#define IDD_SELECT_CERT
Definition: cryptuires.h:202
#define IDB_CERT_ERROR
Definition: cryptuires.h:206
#define IDS_CERTIFICATE_PROPERTIES
Definition: cryptuires.h:62
#define IDS_VALID_FROM
Definition: cryptuires.h:36
#define IDS_EXPORT_KEYS
Definition: cryptuires.h:163
#define IDC_DISABLE_ALL_PURPOSES
Definition: cryptuires.h:236
#define IDC_NEW_PURPOSE
Definition: cryptuires.h:241
#define IDS_WARN_REMOVE_PLURAL_MY
Definition: cryptuires.h:107
#define IDC_SELECT_DISPLAY_STRING
Definition: cryptuires.h:284
int selection
Definition: ctm.c:92
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_FAIL
Definition: ddrawi.h:102
#define realloc
Definition: debug_ros.c:6
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
struct config_s config
HRESULT hr
Definition: delayimp.cpp:582
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define IDS_VALUE
Definition: resource.h:28
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 RegSetValueExA(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE *lpData, DWORD cbData)
Definition: reg.c:4799
LONG WINAPI RegDeleteValueA(HKEY hKey, LPCSTR lpValueName)
Definition: reg.c:2287
LONG WINAPI RegQueryValueExA(_In_ HKEY hkeyorg, _In_ LPCSTR name, _In_ LPDWORD reserved, _Out_opt_ LPDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ LPDWORD count)
Definition: reg.c:4009
BOOL WINAPI CryptSetProvParam(HCRYPTPROV hProv, DWORD dwParam, const BYTE *pbData, DWORD dwFlags)
Definition: crypt.c:2153
BOOL WINAPI CryptDestroyKey(HCRYPTKEY hKey)
Definition: crypt.c:911
BOOL WINAPI CryptReleaseContext(HCRYPTPROV hProv, DWORD dwFlags)
Definition: crypt.c:641
BOOL WINAPI CryptGetUserKey(HCRYPTPROV hProv, DWORD dwKeySpec, HCRYPTKEY *phUserKey)
Definition: crypt.c:1694
BOOL WINAPI CryptGetKeyParam(HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
Definition: crypt.c:1626
BOOL WINAPI CryptAcquireContextW(HCRYPTPROV *phProv, LPCWSTR pszContainer, LPCWSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
Definition: crypt.c:362
COLORREF WINAPI ImageList_SetBkColor(HIMAGELIST himl, COLORREF clrBk)
Definition: imagelist.c:2949
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
Definition: imagelist.c:941
INT WINAPI ImageList_AddMasked(HIMAGELIST himl, HBITMAP hBitmap, COLORREF clrMask)
Definition: imagelist.c:573
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
Definition: imagelist.c:814
INT_PTR WINAPI PropertySheetW(LPCPROPSHEETHEADERW lppsh)
Definition: propsheet.c:2916
BOOL WINAPI GetOpenFileNameW(OPENFILENAMEW *ofn)
Definition: filedlg.c:4736
BOOL WINAPI GetSaveFileNameW(LPOPENFILENAMEW ofn)
Definition: filedlg.c:4801
BOOL WINAPI CryptBinaryToStringA(const BYTE *pbBinary, DWORD cbBinary, DWORD dwFlags, LPSTR pszString, DWORD *pcchString)
Definition: base64.c:253
DWORD WINAPI CertGetPublicKeyLength(DWORD dwCertEncodingType, PCERT_PUBLIC_KEY_INFO pPublicKey)
Definition: cert.c:1305
BOOL WINAPI CertAddCertificateContextToStore(HCERTSTORE hCertStore, PCCERT_CONTEXT pCertContext, DWORD dwAddDisposition, PCCERT_CONTEXT *ppStoreContext)
Definition: cert.c:286
BOOL WINAPI CertFreeCertificateContext(PCCERT_CONTEXT pCertContext)
Definition: cert.c:371
BOOL WINAPI CertSetEnhancedKeyUsage(PCCERT_CONTEXT pCertContext, PCERT_ENHKEY_USAGE pUsage)
Definition: cert.c:2952
PCERT_EXTENSION WINAPI CertFindExtension(LPCSTR pszObjId, DWORD cExtensions, CERT_EXTENSION rgExtensions[])
Definition: cert.c:2028
BOOL WINAPI CertSetCertificateContextProperty(PCCERT_CONTEXT pCertContext, DWORD dwPropId, DWORD dwFlags, const void *pvData)
Definition: cert.c:799
BOOL WINAPI CertGetCertificateContextProperty(PCCERT_CONTEXT pCertContext, DWORD dwPropId, void *pvData, DWORD *pcbData)
Definition: cert.c:551
PCCERT_CONTEXT WINAPI CertDuplicateCertificateContext(PCCERT_CONTEXT pCertContext)
Definition: cert.c:360
BOOL WINAPI CertGetValidUsages(DWORD cCerts, PCCERT_CONTEXT *rghCerts, int *cNumOIDs, LPSTR *rghOIDs, DWORD *pcbOIDs)
Definition: cert.c:3159
BOOL WINAPI CertGetEnhancedKeyUsage(PCCERT_CONTEXT pCertContext, DWORD dwFlags, PCERT_ENHKEY_USAGE pUsage, DWORD *pcbUsage)
Definition: cert.c:2847
BOOL WINAPI CertGetCertificateChain(HCERTCHAINENGINE hChainEngine, PCCERT_CONTEXT pCertContext, LPFILETIME pTime, HCERTSTORE hAdditionalStore, PCERT_CHAIN_PARA pChainPara, DWORD dwFlags, LPVOID pvReserved, PCCERT_CHAIN_CONTEXT *ppChainContext)
Definition: chain.c:2879
VOID WINAPI CertFreeCertificateChain(PCCERT_CHAIN_CONTEXT pChainContext)
Definition: chain.c:2960
void WINAPI CertFreeCertificateChainEngine(HCERTCHAINENGINE hChainEngine)
Definition: chain.c:249
BOOL WINAPI CertCreateCertificateChainEngine(PCERT_CHAIN_ENGINE_CONFIG pConfig, HCERTCHAINENGINE *phChainEngine)
Definition: chain.c:225
BOOL WINAPI CertFreeCRLContext(PCCRL_CONTEXT pCrlContext)
Definition: crl.c:386
BOOL WINAPI CertFreeCTLContext(PCCTL_CONTEXT pCTLContext)
Definition: ctl.c:499
PCCTL_CONTEXT WINAPI CertEnumCTLsInStore(HCERTSTORE hCertStore, PCCTL_CONTEXT pPrev)
Definition: ctl.c:200
BOOL WINAPI CertAddCTLContextToStore(HCERTSTORE hCertStore, PCCTL_CONTEXT pCtlContext, DWORD dwAddDisposition, PCCTL_CONTEXT *ppStoreContext)
Definition: ctl.c:63
BOOL WINAPI PFXExportCertStore(HCERTSTORE hStore, CRYPT_DATA_BLOB *pPFX, LPCWSTR szPassword, DWORD dwFlags)
Definition: encode.c:4761
static const WCHAR commaSpace[]
Definition: object.c:838
BOOL WINAPI CryptFormatObject(DWORD dwCertEncodingType, DWORD dwFormatType, DWORD dwFormatStrType, void *pFormatStruct, LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, void *pbFormat, DWORD *pcbFormat)
Definition: object.c:2549
BOOL WINAPI CryptQueryObject(DWORD dwObjectType, const void *pvObject, DWORD dwExpectedContentTypeFlags, DWORD dwExpectedFormatTypeFlags, DWORD dwFlags, DWORD *pdwMsgAndCertEncodingType, DWORD *pdwContentType, DWORD *pdwFormatType, HCERTSTORE *phCertStore, HCRYPTMSG *phMsg, const void **ppvContext)
Definition: object.c:699
static struct list oidInfo
Definition: oid.c:1206
PCCRYPT_OID_INFO WINAPI CryptFindOIDInfo(DWORD dwKeyType, void *pvKey, DWORD dwGroupId)
Definition: oid.c:1799
LPCWSTR WINAPI CryptFindLocalizedName(LPCWSTR pwszCryptName)
Definition: oid.c:1182
BOOL WINAPI CertAddCRLContextToStore(HCERTSTORE hCertStore, PCCRL_CONTEXT pCrlContext, DWORD dwAddDisposition, PCCRL_CONTEXT *ppStoreContext)
Definition: store.c:960
HCERTSTORE WINAPI CertOpenStore(LPCSTR lpszStoreProvider, DWORD dwMsgAndCertEncodingType, HCRYPTPROV_LEGACY hCryptProv, DWORD dwFlags, const void *pvPara)
Definition: store.c:815
BOOL WINAPI CertEnumSystemStore(DWORD dwFlags, void *pvSystemStoreLocationPara, void *pvArg, PFN_CERT_ENUM_SYSTEM_STORE pfnEnum)
Definition: store.c:1321
PCCRL_CONTEXT WINAPI CertEnumCRLsInStore(HCERTSTORE hCertStore, PCCRL_CONTEXT pPrev)
Definition: store.c:1101
PCCERT_CONTEXT WINAPI CertEnumCertificatesInStore(HCERTSTORE hCertStore, PCCERT_CONTEXT pPrev)
Definition: store.c:928
BOOL WINAPI CertCloseStore(HCERTSTORE hCertStore, DWORD dwFlags)
Definition: store.c:1127
BOOL WINAPI CertGetStoreProperty(HCERTSTORE hCertStore, DWORD dwPropId, void *pvData, DWORD *pcbData)
Definition: store.c:1172
BOOL WINAPI CertDeleteCertificateFromStore(PCCERT_CONTEXT pCertContext)
Definition: store.c:943
HCERTSTORE WINAPI CertOpenSystemStoreW(HCRYPTPROV_LEGACY hProv, LPCWSTR szSubSystemProtocol)
Definition: store.c:916
DWORD WINAPI CertNameToStrW(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, DWORD dwStrType, LPWSTR psz, DWORD csz)
Definition: str.c:702
DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType, DWORD dwFlags, void *pvTypePara, LPWSTR pszNameString, DWORD cchNameString)
Definition: str.c:1220
DWORD WINAPI CertRDNValueToStrW(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue, LPWSTR psz, DWORD csz)
Definition: str.c:100
static CRYPT_OBJID_BLOB * find_policy_qualifier(CERT_POLICIES_INFO *policies, LPCSTR policyOid)
Definition: main.c:2190
BOOL WINAPI CryptUIDlgViewCertificateW(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo, BOOL *pfPropertiesChanged)
Definition: main.c:4370
#define MAX_FRIENDLY_NAME
Definition: main.c:3501
static void add_purpose(HWND hwnd, LPCSTR oid)
Definition: main.c:3120
static void add_string_resource_with_paraformat_to_control(HWND hwnd, int id, const PARAFORMAT2 *fmt)
Definition: main.c:1747
static void init_general_page(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo, PROPSHEETPAGEW *page)
Definition: main.c:2558
static INT_PTR CALLBACK import_file_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:5005
static void export_format_enable_controls(HWND hwnd, const struct ExportWizData *data)
Definition: main.c:5752
static const struct @344 import_filters[]
static void show_dialog_for_selected_cert(HWND hwnd)
Definition: main.c:4066
static HCERTSTORE selected_item_to_store(HWND tree, HTREEITEM hItem)
Definition: main.c:1482
static int CALLBACK cert_prop_sheet_proc(HWND hwnd, UINT msg, LPARAM lp)
Definition: main.c:4245
static const WCHAR export_filter_pfx[]
Definition: main.c:6125
static const WCHAR ca[]
Definition: main.c:443
static WCHAR * get_cert_display_name(PCCERT_CONTEXT cert)
Definition: main.c:3967
static WCHAR * field_format_detailed_issuer(PCCERT_CONTEXT cert, void *param)
Definition: main.c:2627
BOOL WINAPI CryptUIDlgViewCertificateA(PCCRYPTUI_VIEWCERTIFICATE_STRUCTA pCertViewInfo, BOOL *pfPropertiesChanged)
Definition: main.c:1654
static const WCHAR my[]
Definition: main.c:440
static WCHAR * get_user_notice_from_qualifier(const CRYPT_OBJID_BLOB *qualifier)
Definition: main.c:2230
static void select_purposes(HWND hwnd, PurposeSelection selection)
Definition: main.c:3352
static void import_warn_type_mismatch(DWORD dwFlags, HWND hwnd, LPCWSTR szTitle)
Definition: main.c:4672
static void set_general_info(HWND hwnd, PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo)
Definition: main.c:2426
static void add_field_value_data(struct detail_data *data, create_detailed_value_func create, void *param)
Definition: main.c:2741
static BOOL export_validate_filename(HWND hwnd, struct ExportWizData *data, LPCWSTR fileName)
Definition: main.c:6045
static void add_local_oid_text_to_control(HWND text, LPCSTR oid)
Definition: main.c:1972
static void select_cert_update_view_button(HWND hwnd)
Definition: main.c:7175
static void create_show_list(HWND hwnd, struct detail_data *data)
Definition: main.c:3067
void(* add_fields_func)(HWND hwnd, struct detail_data *data)
Definition: main.c:2730
static WCHAR * make_export_file_filter(DWORD exportFormat, DWORD subjectChoice)
Definition: main.c:6128
static void set_certificate_status_for_end_cert(HWND hwnd, PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo)
Definition: main.c:4044
static INT_PTR CALLBACK select_store_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:1517
static void show_import_details(HWND lv, struct ImportWizData *data)
Definition: main.c:5220
BOOL WINAPI WTHelperGetKnownUsages(DWORD action, PCCRYPT_OID_INFO **usages)
static WCHAR * field_format_subject(PCCERT_CONTEXT cert)
Definition: main.c:2632
WCHAR *(* prop_to_value_func)(void *pb, DWORD cb)
Definition: main.c:2973
static BOOL export_info_has_private_key(PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo)
Definition: main.c:5734
static void cert_mgr_clear_cert_selection(HWND hwnd)
Definition: main.c:795
static PCCERT_CONTEXT cert_mgr_index_to_cert(HWND hwnd, int index)
Definition: main.c:805
static BOOL display_cert_usages(HWND text, PCCERT_CONTEXT cert, BOOL *anyUsageAdded)
Definition: main.c:2094
static const WCHAR filter_crl[]
Definition: main.c:4873
static void redraw_states(HWND list, BOOL enabled)
Definition: main.c:3295
static void add_cert_string_to_control(HWND hwnd, PCCERT_CONTEXT pCertContext, DWORD dwType, DWORD dwFlags)
Definition: main.c:1773
static PCCERT_CONTEXT select_cert_get_selected(HWND hwnd, int selection)
Definition: main.c:7157
static const WCHAR filter_cms[]
Definition: main.c:4876
WCHAR *(* create_detailed_value_func)(PCCERT_CONTEXT cert, void *param)
Definition: main.c:2732
static LPWSTR export_append_extension(const struct ExportWizData *data, LPWSTR fileName)
Definition: main.c:5994
static void add_critical_extensions(HWND hwnd, struct detail_data *data)
Definition: main.c:2962
static void init_columns(HWND lv, DWORD flags)
Definition: main.c:6969
#define MAX_DESCRIPTION
Definition: main.c:3502
static BOOL export_is_key_exportable(HCRYPTPROV hProv, DWORD keySpec)
Definition: main.c:5640
BOOL WINAPI CryptUIWizImport(DWORD dwFlags, HWND hwndParent, LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_IMPORT_SRC_INFO pImportSrc, HCERTSTORE hDestCertStore)
Definition: main.c:5511
static INT_PTR CALLBACK cert_mgr_advanced_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:708
static int cert_mgr_sort_by_text(HWND lv, int col, int index1, int index2)
Definition: main.c:1063
struct _CRYPTUI_ENUM_SYSTEM_STORE_ARGS * PCRYPTUI_ENUM_SYSTEM_STORE_ARGS
static BOOL do_import(DWORD dwFlags, HWND hwndParent, LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_IMPORT_SRC_INFO pImportSrc, HCERTSTORE hDestCertStore)
Definition: main.c:5281
static const struct CertMgrStoreInfo defaultStoreList[]
Definition: main.c:456
static WCHAR * field_format_extension_hex_with_ascii(const CERT_EXTENSION *ext)
Definition: main.c:2844
BOOL WINAPI CryptUIWizExport(DWORD dwFlags, HWND hwndParent, LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, void *pvoid)
Definition: main.c:6935
static HCERTSTORE open_store_from_file(DWORD dwFlags, LPCWSTR fileName, DWORD *pContentType)
Definition: main.c:4748
static BOOL is_oid_in_list(HWND hwnd, LPCSTR oid)
Definition: main.c:3187
static PCRYPT_KEY_PROV_INFO export_get_private_key_info(PCCERT_CONTEXT cert)
Definition: main.c:5600
static void toggle_usage(HWND hwnd, int iItem)
Definition: main.c:603
static void create_cert_details_list(HWND hwnd, struct detail_data *data)
Definition: main.c:3113
static void free_detail_fields(struct detail_data *data)
Definition: main.c:3733
struct _CRYPTUI_SELECTSTORE_INFO_W * PCRYPTUI_SELECTSTORE_INFO_W
static BOOL save_cert_as_cms(HANDLE file, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, BOOL includeChain)
Definition: main.c:6435
static WCHAR * field_format_public_key(PCCERT_CONTEXT cert)
Definition: main.c:2673
static void initialize_purpose_selection(HWND hwnd)
Definition: main.c:216
static INT_PTR CALLBACK hierarchy_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:4111
static int CALLBACK cert_mgr_sort_by_issuer(LPARAM lp1, LPARAM lp2, LPARAM lp)
Definition: main.c:1086
static BOOL is_valid_oid(LPCSTR oid)
Definition: main.c:3149
static WCHAR * field_format_to_date(PCCERT_CONTEXT cert)
Definition: main.c:2668
DWORD allowFlags
Definition: main.c:4883
static INT_PTR CALLBACK export_finish_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:6697
static void set_issuer_statement(HWND hwnd, PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo)
Definition: main.c:2253
static UINT CALLBACK hierarchy_callback(HWND hwnd, UINT msg, PROPSHEETPAGEW *page)
Definition: main.c:4189
static INT_PTR CALLBACK user_notice_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:2437
static UINT CALLBACK detail_callback(HWND hwnd, UINT msg, PROPSHEETPAGEW *page)
Definition: main.c:3864
#define WM_REFRESH_VIEW
Definition: main.c:3492
static const WCHAR filter_serialized_store[]
Definition: main.c:4875
static void add_all_fields(HWND hwnd, struct detail_data *data)
Definition: main.c:3046
static struct OIDToString oidMap[]
Definition: main.c:1896
static INT_PTR CALLBACK export_private_key_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:5657
HCERTSTORE WINAPI CryptUIDlgSelectStoreW(PCRYPTUI_SELECTSTORE_INFO_W info)
Definition: main.c:1597
struct _CRYPTUI_ENUM_DATA * PCRYPTUI_ENUM_DATA
static const struct v1_field v1_fields[]
Definition: main.c:2804
PCCERT_CONTEXT WINAPI CryptUIDlgSelectCertificateA(PCCRYPTUI_SELECTCERTIFICATE_STRUCTA pcsc)
Definition: main.c:7484
static BOOL init_detail_page(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo, BOOL *pfPropertiesChanged, PROPSHEETPAGEW *page)
Definition: main.c:3880
static BOOL show_import_ui(DWORD dwFlags, HWND hwndParent, LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_IMPORT_SRC_INFO pImportSrc, HCERTSTORE hDestCertStore)
Definition: main.c:5398
static void set_fields_selection(HWND hwnd, struct detail_data *data, int sel)
Definition: main.c:3102
PurposeFilter
Definition: main.c:210
@ PurposeFilterShowAdvanced
Definition: main.c:212
@ PurposeFilterShowAll
Definition: main.c:211
@ PurposeFilterShowOID
Definition: main.c:213
static void show_export_details(HWND lv, const struct ExportWizData *data)
Definition: main.c:6310
struct _CRYPTUI_SELECTSTORE_INFO_A * PCRYPTUI_SELECTSTORE_INFO_A
static BOOL import_crl(PCCRL_CONTEXT crl, HCERTSTORE hDestCertStore)
Definition: main.c:4554
static INT_PTR CALLBACK general_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:2486
static void add_cert_to_view(HWND lv, PCCERT_CONTEXT cert, DWORD *allocatedLen, LPWSTR *str)
Definition: main.c:95
static void set_cert_validity_period(HWND hwnd, PCCERT_CONTEXT cert)
Definition: main.c:2397
static void set_cert_string_property(PCCERT_CONTEXT cert, DWORD prop, LPWSTR str)
Definition: main.c:3477
static LPSTR get_cert_mgr_usages(void)
Definition: main.c:175
static const WCHAR disallowed[]
Definition: main.c:447
static int CALLBACK cert_mgr_sort_by_friendly_name(LPARAM lp1, LPARAM lp2, LPARAM lp)
Definition: main.c:1099
static void set_cert_name_string(HWND hwnd, PCCERT_CONTEXT cert, DWORD nameFlags, int heading)
Definition: main.c:2358
static BOOL import_cert(PCCERT_CONTEXT cert, HCERTSTORE hDestCertStore)
Definition: main.c:4529
static void set_cert_info(HWND hwnd, PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo)
Definition: main.c:2297
static void display_app_usages(HWND text, PCCERT_CONTEXT cert, BOOL *anyUsageAdded)
Definition: main.c:2042
static const WCHAR addressBook[]
Definition: main.c:441
static void add_known_usages_to_list(HWND lv, CheckBitmapIndex state)
Definition: main.c:589
static BOOL show_export_ui(DWORD dwFlags, HWND hwndParent, LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, const void *pvoid)
Definition: main.c:6779
static INT_PTR CALLBACK select_cert_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:7233
static const struct CertMgrStoreInfo publisherStoreList[]
Definition: main.c:467
static WCHAR * format_hex_string(void *pb, DWORD cb)
Definition: main.c:2583
static HCERTSTORE choose_store_for_cert(PCCERT_CONTEXT cert)
Definition: main.c:4517
static BOOL save_serialized_store(HANDLE file, HCERTSTORE store)
Definition: main.c:6503
BOOL WINAPI CryptUIWizDigitalSign(DWORD flags, HWND parent, LPCWSTR title, PCCRYPTUI_WIZ_DIGITAL_SIGN_INFO info, PCCRYPTUI_WIZ_DIGITAL_SIGN_CONTEXT *context)
Definition: main.c:7547
PCCERT_CONTEXT WINAPI CryptUIDlgSelectCertificateW(PCCRYPTUI_SELECTCERTIFICATE_STRUCTW pcsc)
Definition: main.c:7385
static const WCHAR trustedPublisher[]
Definition: main.c:445
static WCHAR * field_format_from_date(PCCERT_CONTEXT cert)
Definition: main.c:2663
static const WCHAR export_filter_ctl[]
Definition: main.c:6123
static void set_certificate_status(HWND hwnd, const CRYPT_PROVIDER_CERT *cert)
Definition: main.c:4027
int id
Definition: main.c:4882
static const WCHAR export_filter_cert[]
Definition: main.c:6121
static void add_string_id_and_value_to_list(HWND hwnd, struct detail_data *data, int id, LPWSTR value, create_detailed_value_func create, void *param)
Definition: main.c:2775
static BOOL save_pfx(HANDLE file, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, PCCRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO pContextInfo, PCRYPT_KEY_PROV_INFO keyProvInfo, BOOL deleteKeys)
Definition: main.c:6509
static void show_store_certs(HWND hwnd, HCERTSTORE store)
Definition: main.c:341
static void show_cert_chain(HWND hwnd, struct hierarchy_data *data)
Definition: main.c:3976
static BOOL import_validate_filename(HWND hwnd, struct ImportWizData *data, LPCWSTR fileName)
Definition: main.c:4935
HCERTSTORE WINAPI CryptUIDlgSelectStoreA(PCRYPTUI_SELECTSTORE_INFO_A info)
Definition: main.c:1617
static BOOL import_ctl(PCCTL_CONTEXT ctl, HCERTSTORE hDestCertStore)
Definition: main.c:4580
static void close_stores(HWND tab)
Definition: main.c:550
static const struct selection_list_item listItems[]
Definition: main.c:3059
static void show_cert_hierarchy(HWND hwnd, struct hierarchy_data *data)
Definition: main.c:4058
static void add_icon_to_control(HWND hwnd, int id)
Definition: main.c:1788
static HCERTSTORE cert_mgr_current_store(HWND hwnd)
Definition: main.c:543
static void cert_mgr_do_export(HWND hwnd)
Definition: main.c:1002
static INT_PTR CALLBACK export_file_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:6194
static void add_date_string_to_control(HWND hwnd, const FILETIME *fileTime)
Definition: main.c:2385
static void add_cert_extension_detail(HWND hwnd, struct detail_data *data, PCERT_EXTENSION ext)
Definition: main.c:2924
static void add_field_and_value_to_list(HWND hwnd, struct detail_data *data, LPWSTR field, LPWSTR value, create_detailed_value_func create, void *param)
Definition: main.c:2754
static void cert_mgr_do_remove(HWND hwnd)
Definition: main.c:956
static void show_selected_cert(HWND hwnd, int index)
Definition: main.c:819
static void add_string_resource_to_control(HWND hwnd, int id)
Definition: main.c:1731
static const WCHAR export_filter_sst[]
Definition: main.c:6126
static WCHAR * format_enhanced_key_usage_value(void *pb, DWORD cb)
Definition: main.c:2983
static const WCHAR filter_cert[]
Definition: main.c:4869
static CERT_ENHKEY_USAGE * add_oid_to_usage(CERT_ENHKEY_USAGE *usage, LPSTR oid)
Definition: main.c:256
static void add_v1_fields(HWND hwnd, struct detail_data *data)
Definition: main.c:2815
static void add_store_certs(HWND lv, HCERTSTORE store, DWORD flags, PFNCFILTERPROC filter, void *callback_data)
Definition: main.c:7141
static BOOL check_context_type(DWORD dwFlags, DWORD type)
Definition: main.c:4612
static BOOL save_der(HANDLE file, const BYTE *pb, DWORD cb)
Definition: main.c:6397
static void set_policy_text(HWND text, PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo)
Definition: main.c:2150
static const WCHAR filter_pfx[]
Definition: main.c:4871
static void add_text_with_paraformat_to_control(HWND hwnd, LPCWSTR text, LONG len, const PARAFORMAT2 *fmt)
Definition: main.c:1740
static int CALLBACK select_cert_sort_by_text(LPARAM lp1, LPARAM lp2, LPARAM lp)
Definition: main.c:7221
struct _CRYPTUI_ENUM_SYSTEM_STORE_ARGS CRYPTUI_ENUM_SYSTEM_STORE_ARGS
PurposeSelection
Definition: main.c:3346
@ PurposeEnableAll
Definition: main.c:3347
@ PurposeEnableSelected
Definition: main.c:3349
@ PurposeDisableAll
Definition: main.c:3348
static UINT CALLBACK general_callback_proc(HWND hwnd, UINT msg, PROPSHEETPAGEW *page)
Definition: main.c:2537
static void import_warning(DWORD dwFlags, HWND hwnd, LPCWSTR szTitle, int warningID)
Definition: main.c:4652
static const WCHAR empty[]
Definition: main.c:45
static void add_known_usage(HWND lv, PCCRYPT_OID_INFO info, CheckBitmapIndex state)
Definition: main.c:574
static BOOL is_ca_cert(PCCERT_CONTEXT cert, BOOL defaultIfNotSpecified)
Definition: main.c:4479
static BOOL WINAPI enum_store_callback(const void *pvSystemStore, DWORD dwFlags, PCERT_SYSTEM_STORE_INFO pStoreInfo, void *pvReserved, void *pvArg)
Definition: main.c:1368
static void export_password_mismatch(HWND hwnd, const struct ExportWizData *data)
Definition: main.c:5893
#define MAX_PURPOSE
Definition: main.c:3193
static void cert_mgr_show_cert_usages(HWND hwnd, int index)
Definition: main.c:942
static BOOL CALLBACK refresh_propsheet_pages(HWND hwnd, LPARAM lParam)
Definition: main.c:3494
static int CALLBACK cert_mgr_sort_by_date(LPARAM lp1, LPARAM lp2, LPARAM lp)
Definition: main.c:1091
static BOOL show_cert_dialog(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo, CRYPT_PROVIDER_CERT *provCert, BOOL *pfPropertiesChanged)
Definition: main.c:4267
static INT_PTR CALLBACK detail_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:3757
static WCHAR * field_format_serial_number(PCCERT_CONTEXT cert)
Definition: main.c:2599
static void show_cert_stores(HWND hwnd, DWORD dwFlags, struct CertMgrData *data)
Definition: main.c:482
BOOL WINAPI CryptUIDlgViewContext(DWORD dwContextType, LPVOID pvContext, HWND hwnd, LPCWSTR pwszTitle, DWORD dwFlags, LPVOID pvReserved)
Definition: main.c:4444
PCCERT_CONTEXT WINAPI CryptUIDlgSelectCertificateFromStore(HCERTSTORE hCertStore, HWND hwnd, LPCWSTR pwszTitle, LPCWSTR pwszDisplayString, DWORD dwDontUseColumn, DWORD dwFlags, void *pvReserved)
Definition: main.c:7526
static void select_cert_view(HWND hwnd, PCCERT_CONTEXT cert, struct SelectCertData *data)
Definition: main.c:7197
static void show_user_notice(HWND hwnd, struct IssuerStatement *issuerStatement)
Definition: main.c:2480
static INT_PTR CALLBACK cert_properties_general_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:3562
WCHAR *(* field_format_func)(PCCERT_CONTEXT cert)
Definition: main.c:2571
static WCHAR * make_import_file_filter(DWORD dwFlags)
Definition: main.c:4895
static void free_prop_sheet_pages(PROPSHEETPAGEW *pages, DWORD num)
Definition: main.c:7406
static LPARAM index_to_lparam(struct hierarchy_data *data, DWORD index)
Definition: main.c:3914
static void add_oid_text_to_control(HWND hwnd, char *oid)
Definition: main.c:1872
static DWORD lparam_to_index(struct hierarchy_data *data, LPARAM lp)
Definition: main.c:3929
struct _CRYPTUI_SELECTSTORE_INFO_A CRYPTUI_SELECTSTORE_INFO_A
static WCHAR * field_format_detailed_public_key(PCCERT_CONTEXT cert, void *param)
Definition: main.c:2714
#define CRYPTUI_ENABLE_SHOW_PHYSICAL_STORE
Definition: main.c:1330
static void add_properties(HWND hwnd, struct detail_data *data)
Definition: main.c:3005
static const struct prop_id_to_string_id prop_id_map[]
Definition: main.c:2997
static UINT CALLBACK cert_properties_general_callback(HWND hwnd, UINT msg, PROPSHEETPAGEW *page)
Definition: main.c:3662
static void save_cert_mgr_usages(HWND hwnd)
Definition: main.c:650
static BOOL do_export(HANDLE file, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, PCCRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO pContextInfo, PCRYPT_KEY_PROV_INFO keyProvInfo, BOOL deleteKeys)
Definition: main.c:6640
static void enumerate_stores(HWND hwnd, CRYPTUI_ENUM_DATA *pEnumData)
Definition: main.c:1411
static void add_cert_to_list(HWND lv, PCCERT_CONTEXT cert, DWORD flags, DWORD *allocatedLen, LPWSTR *str)
Definition: main.c:7011
static INT_PTR CALLBACK import_welcome_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:4826
static void set_general_cert_properties(HWND hwnd, struct edit_cert_data *data)
Definition: main.c:3457
static void show_cert_usages(HWND hwnd, struct edit_cert_data *data)
Definition: main.c:3378
static WCHAR * field_format_detailed_extension(PCCERT_CONTEXT cert, void *param)
Definition: main.c:2913
BOOL WINAPI CryptUIDlgCertMgr(PCCRYPTUI_CERT_MGR_STRUCT pCryptUICertMgr)
Definition: main.c:1296
static WCHAR * get_cps_str_from_qualifier(const CRYPT_OBJID_BLOB *qualifier)
Definition: main.c:2209
static void refresh_store_certs(HWND hwnd)
Definition: main.c:558
static void add_all_extensions(HWND hwnd, struct detail_data *data)
Definition: main.c:2953
static void show_edit_cert_properties_dialog(HWND parent, struct detail_data *data)
Definition: main.c:3705
struct _CRYPTUI_SELECTSTORE_INFO_W CRYPTUI_SELECTSTORE_INFO_W
static LPWSTR get_cert_name_string(PCCERT_CONTEXT pCertContext, DWORD dwType, DWORD dwFlags)
Definition: main.c:1757
static WCHAR * strdupAtoW(const char *str)
Definition: main.c:61
static const WCHAR filter_ctl[]
Definition: main.c:4874
static WCHAR * get_cert_property_as_string(PCCERT_CONTEXT cert, DWORD prop)
Definition: main.c:3275
static void create_listview_columns(HWND hwnd)
Definition: main.c:3084
static CERT_ENHKEY_USAGE * convert_usages_str_to_usage(LPSTR usageStr)
Definition: main.c:270
static PROPSHEETPAGEW * prop_sheet_pages_AtoW(LPCPROPSHEETPAGEA pages, DWORD num)
Definition: main.c:7427
static WCHAR * field_format_detailed_subject(PCCERT_CONTEXT cert, void *param)
Definition: main.c:2637
static void free_store_info(HWND tree)
Definition: main.c:1456
static void apply_general_changes(HWND hwnd)
Definition: main.c:3504
static INT_PTR CALLBACK import_store_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:5105
static const WCHAR filter_all[]
Definition: main.c:4878
#define MY_INDENT
Definition: main.c:1870
static WCHAR * field_format_issuer(PCCERT_CONTEXT cert)
Definition: main.c:2605
static void add_unformatted_text_to_control(HWND hwnd, LPCWSTR text, LONG len)
Definition: main.c:1714
struct _CRYPTUI_ENUM_DATA CRYPTUI_ENUM_DATA
CheckBitmapIndex
Definition: main.c:567
@ CheckBitmapIndexChecked
Definition: main.c:569
@ CheckBitmapIndexUnchecked
Definition: main.c:568
@ CheckBitmapIndexDisabledUnchecked
Definition: main.c:570
@ CheckBitmapIndexDisabledChecked
Definition: main.c:571
static BOOL save_base64(HANDLE file, const BYTE *pb, DWORD cb)
Definition: main.c:6404
static DWORD CALLBACK read_text_callback(DWORD_PTR dwCookie, LPBYTE buf, LONG cb, LONG *pcb)
Definition: main.c:1700
static void add_cert_columns(HWND hwnd)
Definition: main.c:71
static BOOL export_acquire_private_key(const CRYPT_KEY_PROV_INFO *info, HCRYPTPROV *phProv)
Definition: main.c:5622
static BOOL import_store(DWORD dwFlags, HWND hwnd, LPCWSTR szTitle, HCERTSTORE source, HCERTSTORE dest)
Definition: main.c:4716
BOOL WINAPI CryptUIDlgViewSignerInfoA(CRYPTUI_VIEWSIGNERINFO_STRUCTA *pcvsi)
Definition: main.c:6963
static INT_PTR CALLBACK export_password_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:5910
static struct hierarchy_data * get_hierarchy_data_from_tree_item(HWND tree, HTREEITEM hItem)
Definition: main.c:3941
static WCHAR * crypt_format_extension(const CERT_EXTENSION *ext, DWORD formatStrType)
Definition: main.c:2829
static void add_v1_field(HWND hwnd, struct detail_data *data, const struct v1_field *field)
Definition: main.c:2791
static INT_PTR CALLBACK cert_mgr_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:1105
static struct OIDToString * findSupportedOID(LPCSTR oid)
Definition: main.c:1955
static int CALLBACK cert_mgr_sort_by_subject(LPARAM lp1, LPARAM lp2, LPARAM lp)
Definition: main.c:1081
static INT_PTR CALLBACK export_welcome_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:5557
static WCHAR * field_format_version(PCCERT_CONTEXT cert)
Definition: main.c:2573
static void get_cert_usages(PCCERT_CONTEXT cert, LPWSTR *str)
Definition: main.c:836
static INT_PTR CALLBACK add_purpose_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:3195
static INT_PTR CALLBACK export_format_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:5787
static const WCHAR export_filter_cms[]
Definition: main.c:6124
static const WCHAR export_filter_crl[]
Definition: main.c:6122
static WCHAR * format_long_date(const FILETIME *fileTime)
Definition: main.c:2642
static WCHAR * field_format_detailed_cert_name(PCERT_NAME_BLOB name)
Definition: main.c:2611
static void free_certs(HWND lv)
Definition: main.c:519
static CERT_ENHKEY_USAGE * create_advanced_filter(void)
Definition: main.c:290
static HCERTSTORE cert_mgr_index_to_store(HWND tab, int index)
Definition: main.c:534
static BOOL init_hierarchy_page(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo, PROPSHEETPAGEW *page)
Definition: main.c:4207
static BOOL save_store_as_cms(HANDLE file, HCERTSTORE store)
Definition: main.c:6429
static INT_PTR CALLBACK import_finish_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:5322
LPCWSTR filter
Definition: main.c:4884
BOOL(WINAPI * PFN_SELECTED_STORE_CB)(HCERTSTORE store, HWND hwnd, void *pvArg)
Definition: main.c:1326
static void refresh_details_view(HWND hwnd)
Definition: main.c:3744
static BOOL import_file(DWORD dwFlags, HWND hwnd, LPCWSTR szTitle, LPCWSTR fileName, HCERTSTORE dest)
Definition: main.c:4795
static LONG_PTR find_oid_in_list(HWND lv, LPCSTR oid)
Definition: main.c:625
static BOOL check_store_context_type(DWORD dwFlags, HCERTSTORE store)
Definition: main.c:4677
#define CloseHandle
Definition: compat.h:739
#define GetProcessHeap()
Definition: compat.h:736
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define wcsrchr
Definition: compat.h:16
#define CP_ACP
Definition: compat.h:109
#define OPEN_EXISTING
Definition: compat.h:775
#define SetLastError(x)
Definition: compat.h:752
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define FreeLibrary(x)
Definition: compat.h:748
#define GENERIC_READ
Definition: compat.h:135
HANDLE HWND
Definition: compat.h:19
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CreateFileW
Definition: compat.h:741
#define CALLBACK
Definition: compat.h:35
#define lstrcpyW
Definition: compat.h:749
#define MultiByteToWideChar
Definition: compat.h:110
#define LoadLibraryW(x)
Definition: compat.h:747
#define FILE_SHARE_READ
Definition: compat.h:136
#define wcsicmp
Definition: compat.h:15
#define lstrcpynW
Definition: compat.h:738
#define lstrlenW
Definition: compat.h:750
static const WCHAR *const ext[]
Definition: module.c:53
BOOL WINAPI WriteFile(_In_ HANDLE hFile, _In_reads_bytes_opt_(nNumberOfBytesToWrite) LPCVOID lpBuffer, _In_ DWORD nNumberOfBytesToWrite, _Out_opt_ LPDWORD lpNumberOfBytesWritten, _Inout_opt_ LPOVERLAPPED lpOverlapped)
Definition: rw.c:25
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:183
LONG WINAPI CompareFileTime(IN CONST FILETIME *lpFileTime1, IN CONST FILETIME *lpFileTime2)
Definition: time.c:106
DWORD WINAPI FormatMessageW(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPWSTR lpBuffer, DWORD nSize, __ms_va_list *args)
Definition: format_msg.c:583
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: locale.c:1675
#define IS_INTRESOURCE(x)
Definition: loader.c:613
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
const WCHAR * text
Definition: package.c:1794
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
_ACRTIMP char *__cdecl strchr(const char *, int)
Definition: string.c:3291
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3324
static char * strdup(const char *buf)
Definition: string.h:83
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
char * va_list
Definition: vadefs.h:50
static wchar_t * wmemchr(const wchar_t *s, wchar_t c, size_t n)
Definition: wchar.h:48
HRESULT WINAPI OleCreateDefaultHandler(REFCLSID clsid, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObj)
#define swprintf
Definition: precomp.h:40
INT WSAAPI select(IN INT s, IN OUT LPFD_SET readfds, IN OUT LPFD_SET writefds, IN OUT LPFD_SET exceptfds, IN CONST struct timeval *timeout)
Definition: select.c:41
#define RGB(r, g, b)
Definition: precomp.h:67
return ret
Definition: mutex.c:146
action
Definition: namespace.c:707
r parent
Definition: btrfs.c:3010
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
pKey DeleteObject()
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLuint GLuint end
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLenum GLenum GLsizei const GLuint GLboolean enabled
Definition: glext.h:7750
GLuint res
Definition: glext.h:9613
GLenum src
Definition: glext.h:6340
GLenum GLsizei GLuint GLint * bytesWritten
Definition: glext.h:11123
GLsizeiptr size
Definition: glext.h:5919
GLuint index
Definition: glext.h:6031
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum GLenum dst
Definition: glext.h:6340
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition: glext.h:7005
GLbitfield flags
Definition: glext.h:7161
GLuint GLfloat * val
Definition: glext.h:7180
GLuint GLuint num
Definition: glext.h:9618
GLfloat param
Definition: glext.h:5796
GLenum GLsizei len
Definition: glext.h:6722
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
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
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 GLint GLint j
Definition: glfuncs.h:250
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
#define FAILED(hr)
Definition: intsafe.h:51
char hdr[14]
Definition: iptest.cpp:33
uint32_t entry
Definition: isohybrid.c:63
static const SecPkgInfoW infoW
Definition: kerberos.c:293
#define debugstr_wn
Definition: kernel32.h:33
#define debugstr_w
Definition: kernel32.h:32
#define REG_SZ
Definition: layer.c:22
INT WINAPI GetDateFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpDateStr, INT cchOut)
Definition: lcformat.c:1001
if(dx< 0)
Definition: linetemp.h:194
static IN DWORD IN LPVOID lpvReserved
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
LONG_PTR LPARAM
Definition: minwindef.h:175
UINT_PTR WPARAM
Definition: minwindef.h:174
__u16 date
Definition: mkdosfs.c:8
#define error(str)
Definition: mkdosfs.c:1605
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
#define CREATE_ALWAYS
Definition: disk.h:72
#define CREATE_NEW
Definition: disk.h:69
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static PVOID ptr
Definition: dispmode.c:27
BITMAP bmp
Definition: alphablend.c:62
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:88
static const BYTE cert2[]
Definition: message.c:797
static const BYTE crl[]
Definition: message.c:817
static const BYTE cert1[]
Definition: message.c:781
static BYTE cert[]
Definition: msg.c:1374
static LPCWSTR LPVOID pvReserved
Definition: asmcache.c:749
static const struct access_res create[16]
Definition: package.c:7505
#define cmp(status, error)
Definition: error.c:118
static char * dest
Definition: rtl.c:149
static APTTYPEQUALIFIER * qualifier
Definition: compobj.c:77
static HCRYPTPROV hProv
Definition: rsaenh.c:32
static WCHAR password[]
Definition: url.c:33
static PCCRYPT_OID_INFO ** usages
Definition: softpub.c:81
#define min(a, b)
Definition: monoChain.cc:55
const CLSID * clsid
Definition: msctf.cpp:50
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
Definition: muldiv.c:25
unsigned int UINT
Definition: ndis.h:50
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define KEY_ALL_ACCESS
Definition: nt_native.h:1044
#define KEY_READ
Definition: nt_native.h:1026
#define BOOL
Definition: nt_native.h:43
#define GENERIC_WRITE
Definition: nt_native.h:90
#define LOCALE_SYSTEM_DEFAULT
HRESULT WINAPI CreateBindCtx(DWORD reserved, IBindCtx **bind_context)
Definition: bindctx.c:491
const GUID IID_IOleCache
const GUID IID_IDataObject
const GUID IID_IOleObject
static TCHAR * items[]
Definition: page1.c:45
#define LOWORD(l)
Definition: pedump.c:82
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
#define PSP_USEICONID
Definition: prsht.h:25
#define PSM_CHANGED
Definition: prsht.h:164
#define PSM_SETWIZBUTTONS
Definition: prsht.h:157
#define PSH_USECALLBACK
Definition: prsht.h:48
#define PSP_USETITLE
Definition: prsht.h:26
#define PSN_WIZNEXT
Definition: prsht.h:121
#define PSWIZB_NEXT
Definition: prsht.h:154
#define PSWIZB_FINISH
Definition: prsht.h:155
#define PSN_APPLY
Definition: prsht.h:117
#define PSWIZB_BACK
Definition: prsht.h:153
struct _PROPSHEETPAGEW PROPSHEETPAGEW
#define PSPCB_RELEASE
Definition: prsht.h:37
#define PSN_WIZFINISH
Definition: prsht.h:122
#define PSP_USECALLBACK
Definition: prsht.h:30
#define PSH_PROPSHEETPAGE
Definition: prsht.h:43
#define PSP_DLGINDIRECT
Definition: prsht.h:23
#define PSCB_INITIALIZED
Definition: prsht.h:75
#define PSN_WIZBACK
Definition: prsht.h:120
#define PSN_SETACTIVE
Definition: prsht.h:115
#define PSH_NOAPPLYNOW
Definition: prsht.h:47
static char title[]
Definition: ps.c:92
#define LVM_DELETEALLITEMS
Definition: commctrl.h:2418
#define ILC_COLOR4
Definition: commctrl.h:354
#define LVSIL_SMALL
Definition: commctrl.h:2304
#define LVM_SETITEMTEXTW
Definition: commctrl.h:2692
#define TVGN_PARENT
Definition: commctrl.h:3460
#define TVI_LAST
Definition: commctrl.h:3375
#define LVFI_STRING
Definition: commctrl.h:2442
#define TVIF_TEXT
Definition: commctrl.h:3271
#define LVM_GETITEMCOUNT
Definition: commctrl.h:2311
#define LVM_GETITEMSTATE
Definition: commctrl.h:2680
#define LVN_COLUMNCLICK
Definition: commctrl.h:3144
#define TCM_GETCURSEL
Definition: commctrl.h:4067
#define NM_DBLCLK
Definition: commctrl.h:131
#define LVIF_STATE
Definition: commctrl.h:2317
#define LVNI_SELECTED
Definition: commctrl.h:2429
#define TVM_GETITEMW
Definition: commctrl.h:3491
#define TVIF_IMAGE
Definition: commctrl.h:3272
#define LVM_SETITEMSTATE
Definition: commctrl.h:2677
#define CLR_NONE
Definition: commctrl.h:319
#define LVFI_PARAM
Definition: commctrl.h:2441
#define LVM_FINDITEMW
Definition: commctrl.h:2471
#define TVSIL_NORMAL
Definition: commctrl.h:3448
#define LVCF_WIDTH
Definition: commctrl.h:2592
#define TVN_SELCHANGEDW
Definition: commctrl.h:3653
#define LVM_SETIMAGELIST
Definition: commctrl.h:2308
#define TCM_INSERTITEMW
Definition: commctrl.h:4052
#define LVM_GETNEXTITEM
Definition: commctrl.h:2438
struct _TREEITEM * HTREEITEM
Definition: commctrl.h:3269
#define NM_CLICK
Definition: commctrl.h:130
#define LVS_EX_FULLROWSELECT
Definition: commctrl.h:2739
#define TVI_ROOT
Definition: commctrl.h:3373
#define TVM_DELETEITEM
Definition: commctrl.h:3419
#define LVM_INSERTITEMA
Definition: commctrl.h:2408
#define LVIS_SELECTED
Definition: commctrl.h:2324
#define TCIF_PARAM
Definition: commctrl.h:3979
#define TCM_GETITEMCOUNT
Definition: commctrl.h:3973
#define LVIF_PARAM
Definition: commctrl.h:2316
#define TVM_INSERTITEMW
Definition: commctrl.h:3413
#define TVIF_HANDLE
Definition: commctrl.h:3275
#define TVGN_ROOT
Definition: commctrl.h:3457
#define LVM_INSERTCOLUMNW
Definition: commctrl.h:2637
#define LVIF_TEXT
Definition: commctrl.h:2314
#define TVGN_CHILD
Definition: commctrl.h:3461
#define TCN_SELCHANGE
Definition: commctrl.h:4137
#define TVIS_EXPANDED
Definition: commctrl.h:3289
#define TVM_SETIMAGELIST
Definition: commctrl.h:3451
#define TVGN_CARET
Definition: commctrl.h:3466
#define ILC_MASK
Definition: commctrl.h:351
#define INDEXTOSTATEIMAGEMASK(i)
Definition: commctrl.h:2333
#define LVN_KEYDOWN
Definition: commctrl.h:3189
#define LVM_GETSELECTEDCOUNT
Definition: commctrl.h:2713
#define LVSIL_STATE
Definition: commctrl.h:2305
#define TCM_GETITEMW
Definition: commctrl.h:4038
#define LVIF_IMAGE
Definition: commctrl.h:2315
#define LVM_SORTITEMSEX
Definition: commctrl.h:2805
#define TVIF_PARAM
Definition: commctrl.h:3273
#define LVN_ITEMCHANGED
Definition: commctrl.h:3136
#define LVM_INSERTITEMW
Definition: commctrl.h:2409
#define LVCF_TEXT
Definition: commctrl.h:2593
#define LVIS_STATEIMAGEMASK
Definition: commctrl.h:2331
#define LVM_GETITEMW
Definition: commctrl.h:2395
#define LVM_SORTITEMS
Definition: commctrl.h:2707
#define LVM_FINDITEMA
Definition: commctrl.h:2470
#define TVIF_SELECTEDIMAGE
Definition: commctrl.h:3276
#define TCIF_TEXT
Definition: commctrl.h:3976
#define TVIF_STATE
Definition: commctrl.h:3274
#define LVN_ITEMACTIVATE
Definition: commctrl.h:3152
#define TVGN_NEXT
Definition: commctrl.h:3458
#define LVM_SETEXTENDEDLISTVIEWSTYLE
Definition: commctrl.h:2729
#define TVM_GETNEXTITEM
Definition: commctrl.h:3454
#define CLSID_NULL
Definition: guiddef.h:99
static unsigned __int64 next
Definition: rand_nt.c:6
#define SFF_SELECTION
Definition: richedit.h:979
#define CFE_BOLD
Definition: richedit.h:406
#define EM_STREAMIN
Definition: richedit.h:106
#define SCF_SELECTION
Definition: richedit.h:235
#define EM_SETCHARFORMAT
Definition: richedit.h:101
#define SF_TEXT
Definition: richedit.h:720
#define SF_UNICODE
Definition: richedit.h:724
#define CFM_BOLD
Definition: richedit.h:332
#define EM_GETOLEINTERFACE
Definition: richedit.h:93
#define WM_NOTIFY
Definition: richedit.h:61
#define EM_SETPARAFORMAT
Definition: richedit.h:104
#define PFM_STARTINDENT
Definition: richedit.h:838
#define calloc
Definition: rosglue.h:14
const WCHAR * str
#define iswspace(_c)
Definition: ctype.h:669
#define iswprint(_c)
Definition: ctype.h:672
#define warning(s)
Definition: debug.h:83
strcpy
Definition: string.h:131
#define LoadStringW
Definition: utils.h:64
#define memset(x, y, z)
Definition: compat.h:39
BOOL WINAPI CertSaveStore(HCERTSTORE hCertStore, DWORD dwMsgAndCertEncodingType, DWORD dwSaveAs, DWORD dwSaveTo, void *pvSaveToPara, DWORD dwFlags)
Definition: serialize.c:895
_In_ UINT _In_ UINT cch
Definition: shellapi.h:432
OPENFILENAME ofn
Definition: sndrec32.cpp:56
#define WINTRUST_ACTION_GENERIC_CERT_VERIFY
Definition: softpub.h:24
#define TRACE(s)
Definition: solgame.cpp:4
DWORD nStores
Definition: main.c:478
LPCWSTR title
Definition: main.c:477
HIMAGELIST imageList
Definition: main.c:476
const struct CertMgrStoreInfo * stores
Definition: main.c:479
int removePluralWarning
Definition: main.c:453
int removeWarning
Definition: main.c:452
LPCWSTR name
Definition: main.c:451
DWORD dwFlags
Definition: main.c:5545
LPWSTR fileName
Definition: main.c:5552
BOOL deleteKeys
Definition: main.c:5551
HANDLE file
Definition: main.c:5553
CRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO contextInfo
Definition: main.c:5548
LPCWSTR pwszWizardTitle
Definition: main.c:5546
HFONT titleFont
Definition: main.c:5544
PCRYPT_KEY_PROV_INFO keyProvInfo
Definition: main.c:5550
CRYPTUI_WIZ_EXPORT_INFO exportInfo
Definition: main.c:5547
BOOL success
Definition: main.c:5554
BOOL freePassword
Definition: main.c:5549
BOOL freeDest
Definition: main.c:4821
LPWSTR fileName
Definition: main.c:4817
HFONT titleFont
Definition: main.c:4813
DWORD dwFlags
Definition: main.c:4814
HCERTSTORE hDestCertStore
Definition: main.c:4820
BOOL autoDest
Definition: main.c:4822
BOOL success
Definition: main.c:4823
BOOL freeSource
Definition: main.c:4819
DWORD contentType
Definition: main.c:4818
LPCWSTR pwszWizardTitle
Definition: main.c:4815
CRYPTUI_WIZ_IMPORT_SRC_INFO importSrc
Definition: main.c:4816
LPWSTR cps
Definition: main.c:2249
LPWSTR userNotice
Definition: main.c:2250
int id
Definition: main.c:1892
LPCSTR oid
Definition: main.c:1891
LPCWSTR buf
Definition: main.c:1695
DWORD dateColumn
Definition: main.c:7186
DWORD cStores
Definition: main.c:7189
HIMAGELIST imageList
Definition: main.c:7187
PFNCCERTDISPLAYPROC displayProc
Definition: main.c:7193
HCERTSTORE * rghStores
Definition: main.c:7190
void * callbackData
Definition: main.c:7194
DWORD cPropSheetPages
Definition: main.c:7191
PCCERT_CONTEXT * cert
Definition: main.c:7185
LPCPROPSHEETPAGEW rgPropSheetPages
Definition: main.c:7192
LPCWSTR title
Definition: main.c:7188
PCCERT_CONTEXT cert
Definition: main.c:7230
PCCRYPTUI_SELECTCERTIFICATE_STRUCTW pcsc
Definition: main.c:7229
PCRYPTUI_SELECTSTORE_INFO_W info
Definition: main.c:1513
HCERTSTORE store
Definition: main.c:1514
int column
Definition: main.c:7218
HWND hwnd
Definition: main.c:7217
union StoreInfo::@346 DUMMYUNIONNAME
@ StoreHandle
Definition: main.c:1359
@ SystemStore
Definition: main.c:1360
HCERTSTORE store
Definition: main.c:1363
enum StoreInfo::@345 type
LPWSTR name
Definition: main.c:1364
CERT_TRUST_STATUS TrustStatus
Definition: wincrypt.h:1051
CERT_TRUST_STATUS TrustStatus
Definition: wincrypt.h:1029
PCERT_INFO pCertInfo
Definition: wincrypt.h:491
BYTE * pbCertEncoded
Definition: wincrypt.h:489
DWORD cbCertEncoded
Definition: wincrypt.h:490
LPSTR pszObjId
Definition: wincrypt.h:239
CRYPT_OBJID_BLOB Value
Definition: wincrypt.h:241
PCERT_EXTENSION rgExtension
Definition: wincrypt.h:261
DWORD cExtension
Definition: wincrypt.h:260
DWORD dwValueType
Definition: wincrypt.h:281
CERT_RDN_VALUE_BLOB Value
Definition: wincrypt.h:282
CERT_POLICY_INFO * rgPolicyInfo
Definition: wincrypt.h:409
CERT_POLICY_QUALIFIER_INFO * rgPolicyQualifier
Definition: wincrypt.h:404
DWORD cPolicyQualifier
Definition: wincrypt.h:403
DWORD cbCrlEncoded
Definition: wincrypt.h:733
BYTE * pbCrlEncoded
Definition: wincrypt.h:732
BYTE * pbData
Definition: wincrypt.h:112
PCRYPTUI_ENUM_SYSTEM_STORE_ARGS rgEnumArgs
Definition: main.c:1323
DWORD cEnumArgs
Definition: main.c:1322
HCERTSTORE * rghStore
Definition: main.c:1321
LPCPROPSHEETPAGEW rgPropSheetPages
Definition: cryptuiapi.h:385
PFNCCERTDISPLAYPROC pDisplayCallback
Definition: cryptuiapi.h:378
CRYPTUI_ENUM_DATA * pEnumData
Definition: main.c:1339
PFN_SELECTED_STORE_CB pfnSelectedStoreCallback
Definition: main.c:1340
CRYPTUI_ENUM_DATA * pEnumData
Definition: main.c:1351
PFN_SELECTED_STORE_CB pfnSelectedStoreCallback
Definition: main.c:1352
PCCTL_CONTEXT pCTLContext
Definition: cryptuiapi.h:273
PCCERT_CONTEXT pCertContext
Definition: cryptuiapi.h:272
PCCRL_CONTEXT pCRLContext
Definition: cryptuiapi.h:274
HCERTSTORE * rghStores
Definition: cryptuiapi.h:278
LPWSTR pwszContainerName
Definition: wincrypt.h:218
PCERT_CHAIN_ELEMENT pChainElement
Definition: wintrust.h:221
PCCERT_CONTEXT pCert
Definition: wintrust.h:208
PCCERT_CHAIN_CONTEXT pChainContext
Definition: wintrust.h:241
CRYPT_PROVIDER_CERT * pasCertChain
Definition: wintrust.h:235
DWORD cbCtlEncoded
Definition: wincrypt.h:858
BYTE * pbCtlEncoded
Definition: wincrypt.h:857
DWORD cUsageIdentifier
Definition: wincrypt.h:831
LPSTR * rgpszUsageIdentifier
Definition: wincrypt.h:832
DLGPROC pfnDlgProc
Definition: prsht.h:226
DWORD dwSize
Definition: prsht.h:214
DWORD dwFlags
Definition: prsht.h:215
LPCWSTR pszIcon
Definition: prsht.h:223
LPARAM lParam
Definition: prsht.h:227
LPCWSTR pszTemplate
Definition: prsht.h:218
LPCWSTR pszTitle
Definition: prsht.h:225
HINSTANCE hInstance
Definition: prsht.h:216
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
struct WINTRUST_CERT_INFO_ * pCert
Definition: wintrust.h:111
DWORD dwUnionChoice
Definition: wintrust.h:104
DWORD dwStateAction
Definition: wintrust.h:114
HANDLE hWVTStateData
Definition: wintrust.h:115
DWORD fdwRevocationChecks
Definition: wintrust.h:103
DWORD cbStruct
Definition: wintrust.h:99
DWORD dwUIChoice
Definition: wintrust.h:102
UINT cbSize
Definition: richedit.h:268
DWORD dwMask
Definition: richedit.h:269
DWORD dwEffects
Definition: richedit.h:270
DWORD dwMask
Definition: richedit.h:667
UINT cbSize
Definition: richedit.h:666
LONG dxStartIndent
Definition: richedit.h:670
DWORD dwUser
Definition: richole.idl:67
CLSID clsid
Definition: richole.idl:60
DWORD dwFlags
Definition: richole.idl:66
LPSTORAGE pstg
Definition: richole.idl:62
LPOLEOBJECT poleobj
Definition: richole.idl:61
DWORD dvaspect
Definition: richole.idl:65
LPOLECLIENTSITE polesite
Definition: richole.idl:63
DWORD cbStruct
Definition: richole.idl:58
LONG cp
Definition: richole.idl:59
SIZEL sizel
Definition: richole.idl:64
Definition: match.c:390
Definition: uimain.c:89
Definition: image.c:134
Definition: http.c:7252
int cFields
Definition: main.c:2726
BOOL * pfPropertiesChanged
Definition: main.c:2725
struct field_value_data * fields
Definition: main.c:2727
PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo
Definition: main.c:2724
HIMAGELIST imageList
Definition: main.c:3375
BOOL * pfPropertiesChanged
Definition: main.c:3374
PCCERT_CONTEXT cert
Definition: main.c:3373
void * param
Definition: main.c:2738
LPWSTR detailed_value
Definition: main.c:2737
create_detailed_value_func create
Definition: main.c:2736
Definition: parser.c:44
Definition: fci.c:127
Definition: dsound.c:943
DWORD selectedCert
Definition: main.c:3911
PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo
Definition: main.c:3909
HIMAGELIST imageList
Definition: main.c:3910
Definition: copy.c:22
Definition: tftpd.h:60
Definition: name.c:39
Definition: module.h:576
prop_to_value_func prop_to_value
Definition: main.c:2980
add_fields_func add
Definition: main.c:3056
Definition: ps.c:97
CRYPT_PROVIDER_DATA const * pCryptProviderData
Definition: cryptuiapi.h:129
LPCPROPSHEETPAGEW rgPropSheetPages
Definition: cryptuiapi.h:140
LPARAM lParam
Definition: commctrl.h:2463
UINT code
Definition: winuser.h:3267
HWND hwndFrom
Definition: winuser.h:3265
TVITEMW itemNew
Definition: commctrl.h:3643
HWND hwndOwner
Definition: commdlg.h:330
LPSTR lpstrFile
Definition: commdlg.h:336
DWORD Flags
Definition: commdlg.h:342
DWORD lStructSize
Definition: commdlg.h:329
LPCSTR lpstrFilter
Definition: commdlg.h:332
DWORD nMaxFile
Definition: commdlg.h:337
LONG right
Definition: windef.h:108
LONG left
Definition: windef.h:106
HTREEITEM hParent
Definition: commctrl.h:3398
HTREEITEM hInsertAfter
Definition: commctrl.h:3399
HTREEITEM hItem
Definition: commctrl.h:3322
LPARAM lParam
Definition: commctrl.h:3330
create_detailed_value_func create_detailed_value
Definition: main.c:2788
int id
Definition: main.c:2786
field_format_func format
Definition: main.c:2787
struct sock * chain
Definition: tcpcore.h:1
#define DWORD_PTR
Definition: treelist.c:76
HTREEITEM hItem
Definition: treelist.h:37
eMaj lines
Definition: tritemp.h:206
const char * LPCSTR
Definition: typedefs.h:52
int32_t INT_PTR
Definition: typedefs.h:64
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint32_t DWORD_PTR
Definition: typedefs.h:65
unsigned char * LPBYTE
Definition: typedefs.h:53
uint16_t * LPWSTR
Definition: typedefs.h:56
char * LPSTR
Definition: typedefs.h:51
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define HIWORD(l)
Definition: typedefs.h:247
HRESULT WINAPI HlinkSimpleNavigateToString(LPCWSTR szTarget, LPCWSTR szLocation, LPCWSTR szTargetFrameName, IUnknown *pUnk, IBindCtx *pbc, IBindStatusCallback *pbsc, DWORD grfHLNF, DWORD dwReserved)
Definition: umon.c:922
#define WC_DIALOG
Definition: undocuser.h:13
Definition: pdh_main.c:96
static struct wctab tab[]
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define FORMAT_MESSAGE_FROM_STRING
Definition: winbase.h:398
#define FORMAT_MESSAGE_FROM_SYSTEM
Definition: winbase.h:400
#define FORMAT_MESSAGE_ALLOCATE_BUFFER
Definition: winbase.h:396
#define FORMAT_MESSAGE_ARGUMENT_ARRAY
Definition: winbase.h:401
#define szOID_PKIX_KP_IPSEC_END_SYSTEM
Definition: wincrypt.h:3454
#define szOID_NT5_CRYPTO
Definition: wincrypt.h:3377
#define szOID_KP_DOCUMENT_SIGNING
Definition: wincrypt.h:3383
#define CERT_NAME_STR_NO_QUOTING_FLAG
Definition: wincrypt.h:3647
#define CERT_ENHKEY_USAGE_PROP_ID
Definition: wincrypt.h:2841
#define szOID_EFS_RECOVERY
Definition: wincrypt.h:3375
#define CRYPT_FORMAT_STR_MULTI_LINE
Definition: wincrypt.h:3670
#define CERT_QUERY_CONTENT_SERIALIZED_CERT
Definition: wincrypt.h:3693
#define szOID_KP_KEY_RECOVERY_AGENT
Definition: wincrypt.h:3427
#define CERT_QUERY_CONTENT_FLAG_CTL
Definition: wincrypt.h:3704
#define CERT_STORE_SAVE_AS_STORE
Definition: wincrypt.h:2793
#define CERT_NAME_SIMPLE_DISPLAY_TYPE
Definition: wincrypt.h:3658
#define CERT_STORE_PROV_COLLECTION
Definition: wincrypt.h:2465
#define szOID_PKIX_POLICY_QUALIFIER_CPS
Definition: wincrypt.h:3447
struct _CRYPT_OID_INFO CRYPT_OID_INFO
#define CERT_STORE_LOCALIZED_NAME_PROP_ID
Definition: wincrypt.h:2977
#define szOID_LICENSES
Definition: wincrypt.h:3394
#define CERT_QUERY_OBJECT_FILE
Definition: wincrypt.h:3686
#define CERT_X500_NAME_STR
Definition: wincrypt.h:3644
#define szOID_DRM
Definition: wincrypt.h:3388
ULONG_PTR HCRYPTPROV
Definition: wincrypt.h:55
#define szOID_BASIC_CONSTRAINTS2
Definition: wincrypt.h:3345
#define CERT_QUERY_CONTENT_FLAG_CRL
Definition: wincrypt.h:3705
#define CERT_STORE_SAVE_AS_PKCS7
Definition: wincrypt.h:2794
#define CERT_QUERY_CONTENT_FLAG_CERT
Definition: wincrypt.h:3703
#define CERT_KEY_PROV_INFO_PROP_ID
Definition: wincrypt.h:2833
#define CERT_QUERY_CONTENT_CRL
Definition: wincrypt.h:3691
#define szOID_ENROLLMENT_AGENT
Definition: wincrypt.h:3412
#define CERT_DESCRIPTION_PROP_ID
Definition: wincrypt.h:2846
#define CERT_STORE_CREATE_NEW_FLAG
Definition: wincrypt.h:2633
#define CERT_QUERY_CONTENT_SERIALIZED_STORE
Definition: wincrypt.h:3692
#define szOID_KP_LIFETIME_SIGNING
Definition: wincrypt.h:3384
#define CRYPT_STRING_BASE64
Definition: wincrypt.h:3132
struct _CRYPT_OID_INFO * PCRYPT_OID_INFO
#define szOID_PKIX_KP_CLIENT_AUTH
Definition: wincrypt.h:3451
#define CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG
Definition: wincrypt.h:3063
#define CRYPT_ENHKEY_USAGE_OID_GROUP_ID
Definition: wincrypt.h:1943
#define CERT_QUERY_CONTENT_CTL
Definition: wincrypt.h:3690
#define szOID_PKIX_KP_CODE_SIGNING
Definition: wincrypt.h:3452
#define CERT_QUERY_CONTENT_SERIALIZED_CTL
Definition: wincrypt.h:3694
#define CRYPT_DELETEKEYSET
Definition: wincrypt.h:2275
#define CRYPT_EXPORT
Definition: wincrypt.h:2401
#define X509_NAME_VALUE
Definition: wincrypt.h:3522
#define szOID_PKIX_KP_IPSEC_USER
Definition: wincrypt.h:3456
#define szOID_PKIX_KP_TIMESTAMP_SIGNING
Definition: wincrypt.h:3457
#define szOID_PKIX_KP_IPSEC_TUNNEL
Definition: wincrypt.h:3455
#define szOID_OEM_WHQL_CRYPTO
Definition: wincrypt.h:3378
#define X509_ASN_ENCODING
Definition: wincrypt.h:2501
#define szOID_ANY_CERT_POLICY
Definition: wincrypt.h:3354
#define szOID_BASIC_CONSTRAINTS
Definition: wincrypt.h:3339
#define CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG
Definition: wincrypt.h:3065
#define CRYPT_DECODE_ALLOC_FLAG
Definition: wincrypt.h:3612
#define CERT_STORE_PROV_MEMORY
Definition: wincrypt.h:2455
#define CERT_NAME_STR_CRLF_FLAG
Definition: wincrypt.h:3648
#define szOID_KP_CTL_USAGE_SIGNING
Definition: wincrypt.h:3366
#define CERT_FRIENDLY_NAME_PROP_ID
Definition: wincrypt.h:2844
#define CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT
Definition: wincrypt.h:3708
#define X509_CERT_POLICIES
Definition: wincrypt.h:3533
#define CERT_STORE_CERTIFICATE_CONTEXT
Definition: wincrypt.h:3121
#define CERT_CA_SUBJECT_FLAG
Definition: wincrypt.h:387
#define szOID_KP_QUALIFIED_SUBORDINATION
Definition: wincrypt.h:3381
ULONG_PTR HCRYPTKEY
Definition: wincrypt.h:58
#define szOID_KP_KEY_RECOVERY
Definition: wincrypt.h:3382
#define szOID_CERT_POLICIES
Definition: wincrypt.h:3353
#define szOID_KP_EFS
Definition: wincrypt.h:3374
#define CERT_QUERY_CONTENT_SERIALIZED_CRL
Definition: wincrypt.h:3695
const CERT_CONTEXT * PCCERT_CONTEXT
Definition: wincrypt.h:494
#define szOID_PKIX_KP_SERVER_AUTH
Definition: wincrypt.h:3450
#define EXPORT_PRIVATE_KEYS
Definition: wincrypt.h:4333
#define CERT_QUERY_CONTENT_PKCS7_SIGNED
Definition: wincrypt.h:3696
#define CERT_HASH_PROP_ID
Definition: wincrypt.h:2835
#define szOID_PKIX_KP_EMAIL_PROTECTION
Definition: wincrypt.h:3453
#define szOID_KP_SMARTCARD_LOGON
Definition: wincrypt.h:3414
#define CERT_NAME_ISSUER_FLAG
Definition: wincrypt.h:3664
#define szOID_WHQL_CRYPTO
Definition: wincrypt.h:3376
#define CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED
Definition: wincrypt.h:3714
#define CERT_STORE_ADD_ALWAYS
Definition: wincrypt.h:2654
#define CERT_QUERY_FORMAT_FLAG_ALL
Definition: wincrypt.h:3749
#define CERT_STORE_PROV_SYSTEM_W
Definition: wincrypt.h:2463
const CRYPT_OID_INFO * PCCRYPT_OID_INFO
Definition: wincrypt.h:1632
#define szOID_PKIX_POLICY_QUALIFIER_USERNOTICE
Definition: wincrypt.h:3448
#define szOID_EMBEDDED_NT_CRYPTO
Definition: wincrypt.h:3379
#define REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY
Definition: wincrypt.h:4332
#define CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE
Definition: wincrypt.h:3706
#define CERT_TRUST_IS_PARTIAL_CHAIN
Definition: wincrypt.h:1003
#define CRYPT_OID_INFO_OID_KEY
Definition: wincrypt.h:1955
#define CERT_SYSTEM_STORE_CURRENT_USER
Definition: wincrypt.h:2528
#define PKCS_7_ASN_ENCODING
Definition: wincrypt.h:2503
#define szOID_KP_CA_EXCHANGE
Definition: wincrypt.h:3426
#define KP_PERMISSIONS
Definition: wincrypt.h:2337
#define CERT_STORE_SAVE_TO_FILE
Definition: wincrypt.h:2796
#define CRYPT_FORMAT_STR_NO_HEX
Definition: wincrypt.h:3671
#define szOID_ANY_APPLICATION_POLICY
Definition: wincrypt.h:3403
#define CERT_QUERY_CONTENT_FLAG_PFX
Definition: wincrypt.h:3721
#define szOID_APPLICATION_CERT_POLICIES
Definition: wincrypt.h:3431
#define szOID_DS_EMAIL_REPLICATION
Definition: wincrypt.h:3439
#define CERT_QUERY_CONTENT_CERT
Definition: wincrypt.h:3689
struct _CERT_BASIC_CONSTRAINTS2_INFO CERT_BASIC_CONSTRAINTS2_INFO
#define X509_ENHANCED_KEY_USAGE
Definition: wincrypt.h:3555
#define X509_PKIX_POLICY_QUALIFIER_USERNOTICE
Definition: wincrypt.h:3566
#define CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL
Definition: wincrypt.h:3712
#define CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL
Definition: wincrypt.h:3710
#define CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES
Definition: wincrypt.h:2655
#define szOID_ROOT_LIST_SIGNER
Definition: wincrypt.h:3380
#define szOID_LICENSE_SERVER
Definition: wincrypt.h:3397
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
DWORD COLORREF
Definition: windef.h:100
#define WINAPI
Definition: msvc.h:6
const char * description
Definition: directx.c:2497
#define ERROR_CANCELLED
Definition: winerror.h:1055
#define TRUST_E_CERT_SIGNATURE
Definition: winerror.h:4588
#define DEFAULT_PITCH
Definition: wingdi.h:443
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
#define DEFAULT_QUALITY
Definition: wingdi.h:436
#define FW_BOLD
Definition: wingdi.h:378
#define FF_DONTCARE
Definition: wingdi.h:448
#define LOGPIXELSY
Definition: wingdi.h:719
#define DEFAULT_CHARSET
Definition: wingdi.h:384
#define OUT_DEFAULT_PRECIS
Definition: wingdi.h:415
HFONT WINAPI CreateFontW(_In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_opt_ LPCWSTR)
#define CLIP_DEFAULT_PRECIS
Definition: wingdi.h:426
#define LOCALE_SLONGDATE
Definition: winnls.h:71
#define LOCALE_SSHORTDATE
Definition: winnls.h:70
#define HKEY_CURRENT_USER
Definition: winreg.h:11
static int init
Definition: wintirpc.c:33
#define WTD_REVOCATION_CHECK_CHAIN
Definition: wintrust.h:134
#define WTD_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT
Definition: wintrust.h:135
#define WTD_STATEACTION_CLOSE
Definition: wintrust.h:124
#define WTD_STATEACTION_VERIFY
Definition: wintrust.h:123
#define CERT_CONFIDENCE_TIME
Definition: wintrust.h:225
#define WTD_UI_NONE
Definition: wintrust.h:84
#define CERT_CONFIDENCE_TIMENEST
Definition: wintrust.h:226
#define WTD_CHOICE_CERT
Definition: wintrust.h:95
#define WTD_REVOCATION_CHECK_END_CERT
Definition: wintrust.h:133
#define CERT_CONFIDENCE_SIG
Definition: wintrust.h:224
CRYPT_PROVIDER_CERT *WINAPI WTHelperGetProvCertFromChain(CRYPT_PROVIDER_SGNR *pSgnr, DWORD idxCert)
CRYPT_PROVIDER_SGNR *WINAPI WTHelperGetProvSignerFromChain(CRYPT_PROVIDER_DATA *pProvData, DWORD idxSigner, BOOL fCounterSigner, DWORD idxCounterSigner)
CRYPT_PROVIDER_DATA *WINAPI WTHelperProvDataFromStateData(HANDLE hStateData)
LONG WINAPI WinVerifyTrust(HWND hwnd, GUID *ActionID, LPVOID ActionData)
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define CB_SETITEMDATA
Definition: winuser.h:1995
#define WM_GETTEXTLENGTH
Definition: winuser.h:1647
#define SWP_NOACTIVATE
Definition: winuser.h:1253
#define CB_GETLBTEXTLEN
Definition: winuser.h:1982
#define SWP_NOREDRAW
Definition: winuser.h:1257
#define IMAGE_BITMAP
Definition: winuser.h:211
#define DWLP_USER
Definition: winuser.h:883
#define GetWindowLongPtrW
Definition: winuser.h:4983
#define LR_LOADTRANSPARENT
Definition: winuser.h:1104
#define CB_GETLBTEXT
Definition: winuser.h:1981
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define IDCANCEL
Definition: winuser.h:842
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define DialogBoxW(i, t, p, f)
Definition: winuser.h:4553
#define SB_VERT
Definition: winuser.h:553
#define WM_COMMAND
Definition: winuser.h:1768
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE hInst, _In_ LPCWSTR name, _In_ UINT type, _In_ int cx, _In_ int cy, _In_ UINT fuLoad)
Definition: cursoricon.c:2572
#define CB_SETCURSEL
Definition: winuser.h:1990
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define SWP_NOSIZE
Definition: winuser.h:1256
#define WM_GETTEXT
Definition: winuser.h:1646
#define CB_RESETCONTENT
Definition: winuser.h:1988
#define CB_FINDSTRINGEXACT
Definition: winuser.h:1969
#define WM_INITDIALOG
Definition: winuser.h:1767
#define MB_YESNO
Definition: winuser.h:828
BOOL WINAPI EnumChildWindows(_In_opt_ HWND, _In_ WNDENUMPROC, _In_ LPARAM)
int WINAPI MapWindowPoints(_In_opt_ HWND hWndFrom, _In_opt_ HWND hWndTo, _Inout_updates_(cPoints) LPPOINT lpPoints, _In_ UINT cPoints)
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define IDOK
Definition: winuser.h:841
#define CBN_SELCHANGE
Definition: winuser.h:2008
#define MB_ICONERROR
Definition: winuser.h:798
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
#define WM_SETTEXT
Definition: winuser.h:1645
HWND WINAPI SetFocus(_In_opt_ HWND)
#define EM_SETLIMITTEXT
Definition: winuser.h:2040
#define WM_SETFONT
Definition: winuser.h:1678
#define BM_CLICK
Definition: winuser.h:1946
#define CB_GETITEMDATA
Definition: winuser.h:1979
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
HDC WINAPI GetDC(_In_opt_ HWND)
#define EM_SETSEL
Definition: winuser.h:2047
#define MB_ICONEXCLAMATION
Definition: winuser.h:796
#define MB_OK
Definition: winuser.h:801
#define MB_ICONWARNING
Definition: winuser.h:797
HWND WINAPI GetParent(_In_ HWND)
#define DWLP_MSGRESULT
Definition: winuser.h:881
#define BN_CLICKED
Definition: winuser.h:1954
#define VK_DELETE
Definition: winuser.h:2269
#define WM_DESTROY
Definition: winuser.h:1637
#define LR_DEFAULTSIZE
Definition: winuser.h:1105
BOOL WINAPI ShowScrollBar(_In_ HWND, _In_ int, _In_ BOOL)
#define EM_GETLINECOUNT
Definition: winuser.h:2021
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define CB_INSERTSTRING
Definition: winuser.h:1986
HBITMAP WINAPI LoadBitmapW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2532
#define IDYES
Definition: winuser.h:846
#define SWP_NOZORDER
Definition: winuser.h:1258
DWORD WINAPI GetClassLongW(_In_ HWND, _In_ int)
#define CB_GETCURSEL
Definition: winuser.h:1972
#define SetWindowLongPtrW
Definition: winuser.h:5512
#define GCW_ATOM
Definition: winuser.h:669
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
#define EN_CHANGE
Definition: winuser.h:2051
unsigned char BYTE
Definition: xxhash.c:193