ReactOS 0.4.16-dev-976-g18fc5a1
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#define NONAMELESSUNION
24
25#include "windef.h"
26#include "winbase.h"
27#include "winnls.h"
28#include "winuser.h"
29#include "softpub.h"
30#include "wingdi.h"
31#include "richedit.h"
32#include "ole2.h"
33#include "richole.h"
34#include "commdlg.h"
35#include "commctrl.h"
36#include "cryptuiapi.h"
37#include "cryptuires.h"
38#include "urlmon.h"
39#include "hlink.h"
40#include "winreg.h"
41#include "wine/debug.h"
42
44
46
47static const WCHAR empty[] = {0};
48
50{
51 TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved);
52
53 switch (fdwReason)
54 {
55#ifndef __REACTOS__
56 case DLL_WINE_PREATTACH:
57 return FALSE; /* prefer native version */
58#endif
60 hInstance = hinstDLL;
62 break;
63 }
64 return TRUE;
65}
66
67static WCHAR *strdupAtoW( const char *str )
68{
69 DWORD len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );
70 WCHAR *ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
71 if (ret) MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len );
72 return ret;
73}
74
75#define MAX_STRING_LEN 512
76
78{
80 RECT rc;
83
85 GetWindowRect(lv, &rc);
88 column.cx = (rc.right - rc.left) * 29 / 100 - 2;
89 column.pszText = buf;
93 column.cx = (rc.right - rc.left) * 16 / 100 - 2;
96 column.cx = (rc.right - rc.left) * 23 / 100 - 1;
99}
100
101static void add_cert_to_view(HWND lv, PCCERT_CONTEXT cert, DWORD *allocatedLen,
102 LPWSTR *str)
103{
104 DWORD len;
106 WCHAR dateFmt[80]; /* sufficient for LOCALE_SSHORTDATE */
107 WCHAR date[80];
108 SYSTEMTIME sysTime;
109 LPWSTR none;
110
112 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
113 item.iSubItem = 0;
114 item.iImage = 0;
117 NULL, 0);
118 if (len > *allocatedLen)
119 {
121 *str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
122 if (*str)
123 *allocatedLen = len;
124 }
125 if (*str)
126 {
128 *str, len);
129 item.pszText = *str;
131 }
132
133 item.mask = LVIF_TEXT;
136 if (len > *allocatedLen)
137 {
139 *str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
140 if (*str)
141 *allocatedLen = len;
142 }
143 if (*str)
144 {
147 item.pszText = *str;
148 item.iSubItem = 1;
150 }
151
153 FileTimeToSystemTime(&cert->pCertInfo->NotAfter, &sysTime);
154 GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, dateFmt, date, ARRAY_SIZE(date));
155 item.pszText = date;
156 item.iSubItem = 2;
158
160 NULL, &len))
162 if (len > *allocatedLen)
163 {
165 *str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
166 if (*str)
167 *allocatedLen = len;
168 }
169 if (*str)
170 {
172 *str, &len))
173 item.pszText = none;
174 else
175 item.pszText = *str;
176 item.iSubItem = 3;
178 }
179}
180
182{
183 static const WCHAR keyName[] = { 'S','o','f','t','w','a','r','e','\\','M',
184 'i','c','r','o','s','o','f','t','\\','C','r','y','p','t','o','g','r','a',
185 'p','h','y','\\','U','I','\\','C','e','r','t','m','g','r','\\','P','u',
186 'r','p','o','s','e',0 };
187 LPSTR str = NULL;
188 HKEY key;
189
190 if (!RegCreateKeyExW(HKEY_CURRENT_USER, keyName, 0, NULL, 0, KEY_READ,
191 NULL, &key, NULL))
192 {
193 LONG rc;
194 DWORD type, size;
195
196 rc = RegQueryValueExA(key, "Purpose", NULL, &type, NULL, &size);
197 if ((!rc || rc == ERROR_MORE_DATA) && type == REG_SZ)
198 {
200 if (str)
201 {
202 rc = RegQueryValueExA(key, "Purpose", NULL, NULL, (LPBYTE)str,
203 &size);
204 if (rc)
205 {
207 str = NULL;
208 }
209 }
210 }
212 }
213 return str;
214}
215
216typedef enum {
221
223{
227 int index;
228
236 if ((usages = get_cert_mgr_usages()))
237 {
238 LPSTR ptr, comma;
239
240 for (ptr = usages, comma = strchr(ptr, ','); ptr && *ptr;
241 ptr = comma ? comma + 1 : NULL,
242 comma = ptr ? strchr(ptr, ',') : NULL)
243 {
245
246 if (comma)
247 *comma = 0;
249 {
251 (LPARAM)info->pwszName);
253 }
254 }
256 }
257}
258
261
263{
264 if (!usage->cUsageIdentifier)
266 sizeof(LPSTR));
267 else
268 usage->rgpszUsageIdentifier = HeapReAlloc(GetProcessHeap(), 0,
269 usage->rgpszUsageIdentifier,
270 (usage->cUsageIdentifier + 1) * sizeof(LPSTR));
271 if (usage->rgpszUsageIdentifier)
272 usage->rgpszUsageIdentifier[usage->cUsageIdentifier++] = oid;
273 else
274 {
276 usage = NULL;
277 }
278 return usage;
279}
280
282{
284 sizeof(CERT_ENHKEY_USAGE));
285
286 if (usage)
287 {
288 LPSTR ptr, comma;
289
290 for (ptr = usageStr, comma = strchr(ptr, ','); usage && ptr && *ptr;
291 ptr = comma ? comma + 1 : NULL,
292 comma = ptr ? strchr(ptr, ',') : NULL)
293 {
294 if (comma)
295 *comma = 0;
297 }
298 }
299 return usage;
300}
301
303{
304 CERT_ENHKEY_USAGE *advancedUsage = HeapAlloc(GetProcessHeap(),
306
307 if (advancedUsage)
308 {
310
312 {
313 LPSTR disabledUsagesStr;
314
315 if ((disabledUsagesStr = get_cert_mgr_usages()))
316 {
317 CERT_ENHKEY_USAGE *disabledUsages =
318 convert_usages_str_to_usage(disabledUsagesStr);
319
320 if (disabledUsages)
321 {
323
324 for (ptr = usages; advancedUsage && *ptr; ptr++)
325 {
326 DWORD i;
327 BOOL disabled = FALSE;
328
329 for (i = 0; !disabled &&
330 i < disabledUsages->cUsageIdentifier; i++)
331 if (!strcmp(disabledUsages->rgpszUsageIdentifier[i],
332 (*ptr)->pszOID))
333 disabled = TRUE;
334 if (!disabled)
335 advancedUsage = add_oid_to_usage(advancedUsage,
336 (LPSTR)(*ptr)->pszOID);
337 }
338 /* The individual strings are pointers to disabledUsagesStr,
339 * so they're freed when it is.
340 */
342 disabledUsages->rgpszUsageIdentifier);
343 HeapFree(GetProcessHeap(), 0, disabledUsages);
344 }
345 HeapFree(GetProcessHeap(), 0, disabledUsagesStr);
346 }
348 }
349 }
350 return advancedUsage;
351}
352
353static int CALLBACK cert_mgr_sort_by_subject(LPARAM lp1, LPARAM lp2, LPARAM lp);
354
356{
360 DWORD allocatedLen = 0;
361 LPWSTR str = NULL;
362 int index;
364 LPCSTR oid = NULL;
365 CERT_ENHKEY_USAGE *advanced = NULL;
366
368 if (index >= 0)
369 {
371
372 if (!HIWORD(data))
373 filter = data;
374 else
375 {
377
379 oid = info->pszOID;
380 }
381 }
383 advanced = create_advanced_filter();
384 do {
386 if (cert)
387 {
388 BOOL show = FALSE;
389
391 show = TRUE;
392 else
393 {
394 int numOIDs;
395 DWORD cbOIDs = 0;
396
397 if (CertGetValidUsages(1, &cert, &numOIDs, NULL, &cbOIDs))
398 {
399 if (numOIDs == -1)
400 {
401 /* -1 implies all usages are valid */
402 show = TRUE;
403 }
404 else
405 {
406 LPSTR *oids = HeapAlloc(GetProcessHeap(), 0, cbOIDs);
407
408 if (oids)
409 {
410 if (CertGetValidUsages(1, &cert, &numOIDs, oids,
411 &cbOIDs))
412 {
413 int i;
414
416 {
417 for (i = 0; !show && i < numOIDs; i++)
418 if (!strcmp(oids[i], oid))
419 show = TRUE;
420 }
421 else
422 {
423 for (i = 0; !show && i < numOIDs; i++)
424 {
425 DWORD j;
426
427 for (j = 0; !show &&
428 j < advanced->cUsageIdentifier; j++)
429 if (!strcmp(oids[i],
430 advanced->rgpszUsageIdentifier[j]))
431 show = TRUE;
432 }
433 }
434 }
435 HeapFree(GetProcessHeap(), 0, oids);
436 }
437 }
438 }
439 }
440 if (show)
441 add_cert_to_view(lv, cert, &allocatedLen, &str);
442 }
443 } while (cert);
445 if (advanced)
446 {
448 HeapFree(GetProcessHeap(), 0, advanced);
449 }
452}
453
454static const WCHAR my[] = { 'M','y',0 };
455static const WCHAR addressBook[] = {
456 'A','d','d','r','e','s','s','B','o','o','k',0 };
457static const WCHAR ca[] = { 'C','A',0 };
458static const WCHAR root[] = { 'R','o','o','t',0 };
459static const WCHAR trustedPublisher[] = {
460 'T','r','u','s','t','e','d','P','u','b','l','i','s','h','e','r',0 };
461static const WCHAR disallowed[] = { 'D','i','s','a','l','l','o','w','e','d',0 };
462
464{
468};
469
470static const struct CertMgrStoreInfo defaultStoreList[] = {
479};
480
481static const struct CertMgrStoreInfo publisherStoreList[] = {
486};
487
489{
494};
495
497{
498 const struct CertMgrStoreInfo *storeList;
499 int cStores, i;
501
503 {
504 storeList = publisherStoreList;
506 }
507 else
508 {
509 storeList = defaultStoreList;
510 cStores = ARRAY_SIZE(defaultStoreList);
511 }
513 cStores = 1;
514 data->nStores = cStores;
515 data->stores = storeList;
516 for (i = 0; i < cStores; i++)
517 {
520 HCERTSTORE store;
521
522 if (!(name = CryptFindLocalizedName(storeList[i].name)))
523 name = storeList[i].name;
526 item.mask = TCIF_TEXT | TCIF_PARAM;
527 item.pszText = (LPWSTR)name;
528 item.lParam = (LPARAM)store;
530 }
531}
532
533static void free_certs(HWND lv)
534{
536 int items = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0), i;
537
538 for (i = 0; i < items; i++)
539 {
540 item.mask = LVIF_PARAM;
541 item.iItem = i;
542 item.iSubItem = 0;
545 }
546}
547
549{
551
552 item.mask = TCIF_PARAM;
554 return (HCERTSTORE)item.lParam;
555}
556
558{
560
562}
563
565{
566 int i, tabs = SendMessageW(tab, TCM_GETITEMCOUNT, 0, 0);
567
568 for (i = 0; i < tabs; i++)
570}
571
573{
575
576 free_certs(lv);
579}
580
581typedef enum {
587
590{
592
595 item.stateMask = LVIS_STATEIMAGEMASK;
596 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
597 item.iSubItem = 0;
598 item.lParam = (LPARAM)info;
599 item.pszText = (LPWSTR)info->pwszName;
601}
602
604{
606
608 {
610
611 for (ptr = usages; *ptr; ptr++)
614 }
615}
616
617static void toggle_usage(HWND hwnd, int iItem)
618{
620 int res;
622
623 item.mask = LVIF_STATE;
624 item.iItem = iItem;
625 item.iSubItem = 0;
626 item.stateMask = LVIS_STATEIMAGEMASK;
628 if (res)
629 {
630 int state = item.state >> 12;
631
636 }
637}
638
640{
644
645 if (oidInfo)
646 {
647 LVFINDINFOW findInfo;
648
649 findInfo.flags = LVFI_PARAM;
650 findInfo.lParam = (LPARAM)oidInfo;
651 ret = SendMessageW(lv, LVM_FINDITEMW, -1, (LPARAM)&findInfo);
652 }
653 else
654 {
655 LVFINDINFOA findInfo;
656
657 findInfo.flags = LVFI_STRING;
658 findInfo.psz = oid;
659 ret = SendMessageW(lv, LVM_FINDITEMA, -1, (LPARAM)&findInfo);
660 }
661 return ret;
662}
663
665{
666 static const WCHAR keyName[] = { 'S','o','f','t','w','a','r','e','\\','M',
667 'i','c','r','o','s','o','f','t','\\','C','r','y','p','t','o','g','r','a',
668 'p','h','y','\\','U','I','\\','C','e','r','t','m','g','r','\\','P','u',
669 'r','p','o','s','e',0 };
670 HKEY key;
672 int purposes = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0), i;
674 LPSTR str = NULL;
675
676 item.mask = LVIF_STATE | LVIF_PARAM;
677 item.iSubItem = 0;
678 item.stateMask = LVIS_STATEIMAGEMASK;
679 for (i = 0; i < purposes; i++)
680 {
681 item.iItem = i;
682 if (SendMessageW(lv, LVM_GETITEMW, 0, (LPARAM)&item))
683 {
684 int state = item.state >> 12;
685
687 {
689 BOOL firstString = TRUE;
690
691 if (!str)
693 strlen(info->pszOID) + 1);
694 else
695 {
697 strlen(str) + 1 + strlen(info->pszOID) + 1);
698 firstString = FALSE;
699 }
700 if (str)
701 {
702 LPSTR ptr = firstString ? str : str + strlen(str);
703
704 if (!firstString)
705 *ptr++ = ',';
706 strcpy(ptr, info->pszOID);
707 }
708 }
709 }
710 }
712 NULL, &key, NULL))
713 {
714 if (str)
715 RegSetValueExA(key, "Purpose", 0, REG_SZ, (const BYTE *)str,
716 strlen(str) + 1);
717 else
718 RegDeleteValueA(key, "Purpose");
720 }
722}
723
725 WPARAM wp, LPARAM lp)
726{
727 switch (msg)
728 {
729 case WM_INITDIALOG:
730 {
731 RECT rc;
734 HIMAGELIST imageList;
735 LPSTR disabledUsages;
736
737 GetWindowRect(lv, &rc);
738 column.mask = LVCF_WIDTH;
739 column.cx = rc.right - rc.left;
741 imageList = ImageList_Create(16, 16, ILC_COLOR4 | ILC_MASK, 4, 0);
742 if (imageList)
743 {
744 HBITMAP bmp;
745 COLORREF backColor = RGB(255, 0, 255);
746
748 ImageList_AddMasked(imageList, bmp, backColor);
750 ImageList_SetBkColor(imageList, CLR_NONE);
753 }
755 if ((disabledUsages = get_cert_mgr_usages()))
756 {
757 LPSTR ptr, comma;
758
759 for (ptr = disabledUsages, comma = strchr(ptr, ','); ptr && *ptr;
760 ptr = comma ? comma + 1 : NULL,
761 comma = ptr ? strchr(ptr, ',') : NULL)
762 {
764
765 if (comma)
766 *comma = 0;
767 if ((index = find_oid_in_list(lv, ptr)) != -1)
769 }
770 HeapFree(GetProcessHeap(), 0, disabledUsages);
771 }
772 break;
773 }
774 case WM_NOTIFY:
775 {
776 NMHDR *hdr = (NMHDR *)lp;
777 NMITEMACTIVATE *nm;
778
779 switch (hdr->code)
780 {
781 case NM_CLICK:
782 nm = (NMITEMACTIVATE *)lp;
783 toggle_usage(hwnd, nm->iItem);
785 break;
786 }
787 break;
788 }
789 case WM_COMMAND:
790 switch (wp)
791 {
792 case IDOK:
794#ifndef __REACTOS__
796#endif
798 break;
799 case IDCANCEL:
800#ifndef __REACTOS__
802#endif
804 break;
805 }
806 break;
807 }
808 return 0;
809}
810
812{
817 (LPARAM)empty);
819}
820
822{
825
826 item.mask = LVIF_PARAM;
827 item.iItem = index;
828 item.iSubItem = 0;
830 (LPARAM)&item))
831 cert = (PCCERT_CONTEXT)item.lParam;
832 return cert;
833}
834
836{
838
839 if (cert)
840 {
842
843 memset(&viewInfo, 0, sizeof(viewInfo));
844 viewInfo.dwSize = sizeof(viewInfo);
845 viewInfo.hwndParent = hwnd;
846 viewInfo.pCertContext = cert;
847 /* FIXME: this should be modal */
849 }
850}
851
853{
855 DWORD size;
856
857 /* Get enhanced key usage. Have to check for a property and an extension
858 * separately, because CertGetEnhancedKeyUsage will succeed and return an
859 * empty usage if neither is set. Unfortunately an empty usage implies
860 * no usage is allowed, so we have to distinguish between the two cases.
861 */
863 NULL, &size))
864 {
868 {
870 usage = NULL;
871 }
872 }
874 NULL, &size))
875 {
879 {
881 usage = NULL;
882 }
883 }
884 else
885 usage = NULL;
886 if (usage)
887 {
888 if (usage->cUsageIdentifier)
889 {
890 static const WCHAR commaSpace[] = { ',',' ',0 };
891 DWORD i, len = 1;
892 LPWSTR ptr;
893
894 for (i = 0; i < usage->cUsageIdentifier; i++)
895 {
898 usage->rgpszUsageIdentifier[i],
900
901 if (info)
902 len += lstrlenW(info->pwszName);
903 else
904 len += strlen(usage->rgpszUsageIdentifier[i]);
905 if (i < usage->cUsageIdentifier - 1)
907 }
908 *str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
909 if (*str)
910 {
911 for (i = 0, ptr = *str; i < usage->cUsageIdentifier; i++)
912 {
915 usage->rgpszUsageIdentifier[i],
917
918 if (info)
919 {
920 lstrcpyW(ptr, info->pwszName);
921 ptr += lstrlenW(info->pwszName);
922 }
923 else
924 {
925 LPCSTR src = usage->rgpszUsageIdentifier[i];
926
927 for (; *src; ptr++, src++)
928 *ptr = *src;
929 *ptr = 0;
930 }
931 if (i < usage->cUsageIdentifier - 1)
932 {
935 }
936 }
937 *ptr = 0;
938 }
940 }
941 else
942 {
943 size = MAX_STRING_LEN * sizeof(WCHAR);
945 if (*str)
947 }
948 }
949 else
950 {
951 size = MAX_STRING_LEN * sizeof(WCHAR);
953 if (*str)
955 }
956}
957
959{
962 LPWSTR str = NULL;
963
965 if (str)
966 {
969 }
970}
971
973{
975 TCM_GETCURSEL, 0, 0);
976 struct CertMgrData *data =
978
979 if (tabIndex < data->nStores)
980 {
983 LPCWSTR pTitle;
984 int warningID;
985
986 if (SendMessageW(lv, LVM_GETSELECTEDCOUNT, 0, 0) > 1)
987 warningID = data->stores[tabIndex].removePluralWarning;
988 else
989 warningID = data->stores[tabIndex].removeWarning;
990 if (data->title)
991 pTitle = data->title;
992 else
993 {
995 pTitle = title;
996 }
998 if (MessageBoxW(hwnd, warning, pTitle, MB_YESNO) == IDYES)
999 {
1000 int selection = -1;
1001
1002 do {
1005 if (selection >= 0)
1006 {
1008 selection);
1009
1011 }
1012 } while (selection >= 0);
1014 }
1015 }
1016}
1017
1019{
1021 int selectionCount = SendMessageW(lv, LVM_GETSELECTEDCOUNT, 0, 0);
1022
1023 if (selectionCount == 1)
1024 {
1027
1028 if (selection >= 0)
1029 {
1031
1032 if (cert)
1033 {
1035
1036 info.dwSize = sizeof(info);
1037 info.pwszExportFileName = NULL;
1038 info.dwSubjectChoice = CRYPTUI_WIZ_EXPORT_CERT_CONTEXT;
1039 info.u.pCertContext = cert;
1040 info.cStores = 0;
1042 }
1043 }
1044 }
1045 else if (selectionCount > 1)
1046 {
1049
1050 if (store)
1051 {
1053 int selection = -1;
1054
1055 info.dwSize = sizeof(info);
1056 info.pwszExportFileName = NULL;
1057 info.dwSubjectChoice =
1059 info.u.hCertStore = store;
1060 info.cStores = 0;
1061 do {
1064 if (selection >= 0)
1065 {
1067 selection);
1068
1071 }
1072 } while (selection >= 0);
1074 CertCloseStore(store, 0);
1075 }
1076 }
1077}
1078
1079static int cert_mgr_sort_by_text(HWND lv, int col, int index1, int index2)
1080{
1081 LVITEMW item;
1082 WCHAR buf1[MAX_STRING_LEN];
1083 WCHAR buf2[MAX_STRING_LEN];
1084
1085 item.cchTextMax = ARRAY_SIZE(buf1);
1086 item.mask = LVIF_TEXT;
1087 item.pszText = buf1;
1088 item.iItem = index1;
1089 item.iSubItem = col;
1091 item.pszText = buf2;
1092 item.iItem = index2;
1094 return lstrcmpW(buf1, buf2);
1095}
1096
1098{
1099 return cert_mgr_sort_by_text((HWND)lp, 0, lp1, lp2);
1100}
1101
1103{
1104 return cert_mgr_sort_by_text((HWND)lp, 1, lp1, lp2);
1105}
1106
1108{
1111 return CompareFileTime(&cert1->pCertInfo->NotAfter,
1112 &cert2->pCertInfo->NotAfter);
1113}
1114
1116 LPARAM lp)
1117{
1118 return cert_mgr_sort_by_text((HWND)lp, 3, lp1, lp2);
1119}
1120
1122 LPARAM lp)
1123{
1124 struct CertMgrData *data;
1125
1126 switch (msg)
1127 {
1128 case WM_INITDIALOG:
1129 {
1130 PCCRYPTUI_CERT_MGR_STRUCT pCryptUICertMgr =
1133
1134 data = HeapAlloc(GetProcessHeap(), 0, sizeof(struct CertMgrData));
1135 if (!data)
1136 return 0;
1137 data->imageList = ImageList_Create(16, 16, ILC_COLOR4 | ILC_MASK, 2, 0);
1138 if (data->imageList)
1139 {
1140 HBITMAP bmp;
1141 COLORREF backColor = RGB(255, 0, 255);
1142
1144 ImageList_AddMasked(data->imageList, bmp, backColor);
1146 ImageList_SetBkColor(data->imageList, CLR_NONE);
1148 LVSIL_SMALL, (LPARAM)data->imageList);
1149 }
1151 data->title = pCryptUICertMgr->pwszTitle;
1152
1155 if (pCryptUICertMgr->pwszTitle)
1157 (LPARAM)pCryptUICertMgr->pwszTitle);
1158 show_cert_stores(hwnd, pCryptUICertMgr->dwFlags, data);
1160 break;
1161 }
1162#ifdef __REACTOS__
1163 case WM_DESTROY:
1168 break;
1169#endif
1170 case WM_NOTIFY:
1171 {
1172 NMHDR *hdr = (NMHDR *)lp;
1173
1174 switch (hdr->code)
1175 {
1176 case TCN_SELCHANGE:
1178 break;
1179 case LVN_ITEMCHANGED:
1180 {
1181 NMITEMACTIVATE *nm = (NMITEMACTIVATE*)lp;
1183 int numSelected = SendMessageW(lv, LVM_GETSELECTEDCOUNT, 0, 0);
1184
1185 EnableWindow(GetDlgItem(hwnd, IDC_MGR_EXPORT), numSelected > 0);
1186 EnableWindow(GetDlgItem(hwnd, IDC_MGR_REMOVE), numSelected > 0);
1187 EnableWindow(GetDlgItem(hwnd, IDC_MGR_VIEW), numSelected == 1);
1188 if (numSelected == 1)
1190 else
1192 (LPARAM)empty);
1193 break;
1194 }
1195 case NM_DBLCLK:
1196 show_selected_cert(hwnd, ((NMITEMACTIVATE *)lp)->iItem);
1197 break;
1198 case LVN_KEYDOWN:
1199 {
1200 NMLVKEYDOWN *lvk = (NMLVKEYDOWN *)lp;
1201
1202 if (lvk->wVKey == VK_DELETE)
1204 break;
1205 }
1206 case LVN_COLUMNCLICK:
1207 {
1208 NMLISTVIEW *nmlv = (NMLISTVIEW *)lp;
1210
1211 /* FIXME: doesn't support swapping sort order between ascending
1212 * and descending.
1213 */
1214 switch (nmlv->iSubItem)
1215 {
1216 case 0:
1219 break;
1220 case 1:
1223 break;
1224 case 2:
1227 break;
1228 case 3:
1231 break;
1232 }
1233 break;
1234 }
1235 }
1236 break;
1237 }
1238 case WM_COMMAND:
1239 switch (wp)
1240 {
1243 break;
1244 case IDC_MGR_IMPORT:
1245 if (CryptUIWizImport(0, hwnd, NULL, NULL,
1248 break;
1249 case IDC_MGR_ADVANCED:
1252 {
1254 int index, len;
1255 LPWSTR curString = NULL;
1256
1258 if (index >= 0)
1259 {
1261 curString = HeapAlloc(GetProcessHeap(), 0,
1262 (len + 1) * sizeof(WCHAR));
1263 SendMessageW(cb, CB_GETLBTEXT, index, (LPARAM)curString);
1264 }
1267 if (curString)
1268 {
1270 (LPARAM)curString);
1271 if (index >= 0)
1273 HeapFree(GetProcessHeap(), 0, curString);
1274 }
1276 }
1277 break;
1278 case IDC_MGR_VIEW:
1279 {
1283
1284 if (selection >= 0)
1286 break;
1287 }
1288 case IDC_MGR_EXPORT:
1290 break;
1291 case IDC_MGR_REMOVE:
1293 break;
1294 case IDCANCEL:
1295#ifndef __REACTOS__
1299 ImageList_Destroy(data->imageList);
1301#endif
1303 break;
1304 }
1305 break;
1306 }
1307 return 0;
1308}
1309
1310/***********************************************************************
1311 * CryptUIDlgCertMgr (CRYPTUI.@)
1312 */
1314{
1315 TRACE("(%p)\n", pCryptUICertMgr);
1316
1317 if (pCryptUICertMgr->dwSize != sizeof(CRYPTUI_CERT_MGR_STRUCT))
1318 {
1319 WARN("unexpected size %d\n", pCryptUICertMgr->dwSize);
1321 return FALSE;
1322 }
1324 pCryptUICertMgr->hwndParent, cert_mgr_dlg_proc, (LPARAM)pCryptUICertMgr);
1325 return TRUE;
1326}
1327
1328/* FIXME: real names are unknown, functions are undocumented */
1330{
1334
1336{
1342
1344 void *pvArg);
1345
1346/* Values for dwFlags */
1347#define CRYPTUI_ENABLE_SHOW_PHYSICAL_STORE 0x00000001
1348
1350{
1358 void *pvArg;
1360
1362{
1370 void *pvArg;
1372
1374{
1375 enum {
1379 union {
1383};
1384
1385static BOOL WINAPI enum_store_callback(const void *pvSystemStore,
1387 void *pvArg)
1388{
1390 TVINSERTSTRUCTW tvis;
1391 LPCWSTR localizedName;
1392 BOOL ret = TRUE;
1393
1394 tvis.hParent = NULL;
1395 tvis.hInsertAfter = TVI_LAST;
1396 tvis.u.item.mask = TVIF_TEXT;
1397 if ((localizedName = CryptFindLocalizedName(pvSystemStore)))
1398 {
1399 struct StoreInfo *storeInfo = HeapAlloc(GetProcessHeap(), 0,
1400 sizeof(struct StoreInfo));
1401
1402 if (storeInfo)
1403 {
1404 storeInfo->type = SystemStore;
1405 storeInfo->u.name = HeapAlloc(GetProcessHeap(), 0,
1406 (lstrlenW(pvSystemStore) + 1) * sizeof(WCHAR));
1407 if (storeInfo->u.name)
1408 {
1409 tvis.u.item.mask |= TVIF_PARAM;
1410 tvis.u.item.lParam = (LPARAM)storeInfo;
1411 lstrcpyW(storeInfo->u.name, pvSystemStore);
1412 }
1413 else
1414 {
1415 HeapFree(GetProcessHeap(), 0, storeInfo);
1416 ret = FALSE;
1417 }
1418 }
1419 else
1420 ret = FALSE;
1421 tvis.u.item.pszText = (LPWSTR)localizedName;
1422 }
1423 else
1424 tvis.u.item.pszText = (LPWSTR)pvSystemStore;
1425 /* FIXME: need a folder icon for the store too */
1426 if (ret)
1428 return ret;
1429}
1430
1432{
1433 DWORD i;
1435
1436 for (i = 0; i < pEnumData->cEnumArgs; i++)
1440 for (i = 0; i < pEnumData->cStores; i++)
1441 {
1442 DWORD size;
1443
1444 if (CertGetStoreProperty(pEnumData->rghStore[i],
1446 {
1448
1449 if (name)
1450 {
1451 if (CertGetStoreProperty(pEnumData->rghStore[i],
1453 {
1454 struct StoreInfo *storeInfo = HeapAlloc(GetProcessHeap(),
1455 0, sizeof(struct StoreInfo));
1456
1457 if (storeInfo)
1458 {
1459 TVINSERTSTRUCTW tvis;
1460
1461 storeInfo->type = StoreHandle;
1462 storeInfo->u.store = pEnumData->rghStore[i];
1463 tvis.hParent = NULL;
1464 tvis.hInsertAfter = TVI_LAST;
1465 tvis.u.item.mask = TVIF_TEXT | TVIF_PARAM;
1466 tvis.u.item.pszText = name;
1467 tvis.u.item.lParam = (LPARAM)storeInfo;
1469 }
1470 }
1472 }
1473 }
1474 }
1475}
1476
1478{
1480 0);
1481
1482 while (next)
1483 {
1484 TVITEMW item;
1485
1486 memset(&item, 0, sizeof(item));
1487 item.mask = TVIF_HANDLE | TVIF_PARAM;
1488 item.hItem = next;
1490 if (item.lParam)
1491 {
1492 struct StoreInfo *storeInfo = (struct StoreInfo *)item.lParam;
1493
1494 if (storeInfo->type == SystemStore)
1495 HeapFree(GetProcessHeap(), 0, storeInfo->u.name);
1496 HeapFree(GetProcessHeap(), 0, storeInfo);
1497 }
1499 (LPARAM)next);
1500 }
1501}
1502
1504{
1506 TVITEMW item;
1508
1509 memset(&item, 0, sizeof(item));
1511 item.hItem = hItem;
1512 item.cchTextMax = ARRAY_SIZE(buf);
1513 item.pszText = buf;
1515 if (item.lParam)
1516 {
1517 struct StoreInfo *storeInfo = (struct StoreInfo *)item.lParam;
1518
1519 if (storeInfo->type == StoreHandle)
1520 store = storeInfo->u.store;
1521 else
1522 store = CertOpenSystemStoreW(0, storeInfo->u.name);
1523 }
1524 else
1525 {
1526 /* It's implicitly a system store */
1528 }
1529 return store;
1530}
1531
1533{
1536};
1537
1539 LPARAM lp)
1540{
1541 struct SelectStoreInfo *selectInfo;
1542 LRESULT ret = 0;
1543
1544 switch (msg)
1545 {
1546 case WM_INITDIALOG:
1547 {
1548 selectInfo = (struct SelectStoreInfo *)lp;
1550 if (selectInfo->info->pwszTitle)
1552 (LPARAM)selectInfo->info->pwszTitle);
1553 if (selectInfo->info->pwszText)
1555 (LPARAM)selectInfo->info->pwszText);
1556 if (!(selectInfo->info->dwFlags & CRYPTUI_ENABLE_SHOW_PHYSICAL_STORE))
1558 enumerate_stores(hwnd, selectInfo->info->pEnumData);
1559 break;
1560 }
1561 case WM_COMMAND:
1562 switch (wp)
1563 {
1564 case IDOK:
1565 {
1569
1570 selectInfo = (struct SelectStoreInfo *)GetWindowLongPtrW(hwnd,
1571 DWLP_USER);
1572 if (!selection)
1573 {
1575
1576 if (selectInfo->info->pwszTitle)
1577 pTitle = selectInfo->info->pwszTitle;
1578 else
1579 {
1581 pTitle = title;
1582 }
1585 }
1586 else
1587 {
1589
1590 if (!selectInfo->info->pfnSelectedStoreCallback ||
1592 selectInfo->info->pvArg))
1593 {
1594 selectInfo->store = store;
1597 }
1598 else
1600 }
1601 ret = TRUE;
1602 break;
1603 }
1604 case IDCANCEL:
1607 ret = TRUE;
1608 break;
1609 }
1610 break;
1611 }
1612 return ret;
1613}
1614
1615/***********************************************************************
1616 * CryptUIDlgSelectStoreW (CRYPTUI.@)
1617 */
1619{
1620 struct SelectStoreInfo selectInfo = { info, NULL };
1621
1622 TRACE("(%p)\n", info);
1623
1624 if (info->dwSize != sizeof(CRYPTUI_SELECTSTORE_INFO_W))
1625 {
1626 WARN("unexpected size %d\n", info->dwSize);
1628 return NULL;
1629 }
1631 select_store_dlg_proc, (LPARAM)&selectInfo);
1632 return selectInfo.store;
1633}
1634
1635/***********************************************************************
1636 * CryptUIDlgSelectStoreA (CRYPTUI.@)
1637 */
1639{
1642 int len;
1643
1644 TRACE("(%p)\n", info);
1645
1646 if (info->dwSize != sizeof(CRYPTUI_SELECTSTORE_INFO_A))
1647 {
1648 WARN("unexpected size %d\n", info->dwSize);
1650 return NULL;
1651 }
1652 memcpy(&infoW, info, sizeof(*info));
1653 if (info->pszTitle)
1654 {
1655 len = MultiByteToWideChar(CP_ACP, 0, info->pszTitle, -1, NULL, 0);
1656 infoW.pwszTitle = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
1657 MultiByteToWideChar(CP_ACP, 0, info->pszTitle, -1, infoW.pwszTitle,
1658 len);
1659 }
1660 if (info->pszText)
1661 {
1662 len = MultiByteToWideChar(CP_ACP, 0, info->pszText, -1, NULL, 0);
1663 infoW.pwszText = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
1664 MultiByteToWideChar(CP_ACP, 0, info->pszText, -1, infoW.pwszText, len);
1665 }
1667 HeapFree(GetProcessHeap(), 0, infoW.pwszText);
1668 HeapFree(GetProcessHeap(), 0, infoW.pwszTitle);
1669 return ret;
1670}
1671
1672/***********************************************************************
1673 * CryptUIDlgViewCertificateA (CRYPTUI.@)
1674 */
1676 PCCRYPTUI_VIEWCERTIFICATE_STRUCTA pCertViewInfo, BOOL *pfPropertiesChanged)
1677{
1679 LPWSTR title = NULL;
1680 BOOL ret;
1681
1682 TRACE("(%p, %p)\n", pCertViewInfo, pfPropertiesChanged);
1683
1684 memcpy(&viewInfo, pCertViewInfo, sizeof(viewInfo));
1685 if (pCertViewInfo->szTitle)
1686 {
1687 int len = MultiByteToWideChar(CP_ACP, 0, pCertViewInfo->szTitle, -1,
1688 NULL, 0);
1689
1690 title = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
1691 if (title)
1692 {
1693 MultiByteToWideChar(CP_ACP, 0, pCertViewInfo->szTitle, -1, title,
1694 len);
1695 viewInfo.szTitle = title;
1696 }
1697 else
1698 {
1699 ret = FALSE;
1700 goto error;
1701 }
1702 }
1703 if (pCertViewInfo->cPropSheetPages)
1704 {
1705 FIXME("ignoring additional prop sheet pages\n");
1706 viewInfo.cPropSheetPages = 0;
1707 }
1708 ret = CryptUIDlgViewCertificateW(&viewInfo, pfPropertiesChanged);
1710error:
1711 return ret;
1712}
1713
1715{
1719};
1720
1722 LONG cb, LONG *pcb)
1723{
1724 struct ReadStringStruct *string = (struct ReadStringStruct *)dwCookie;
1725 LONG cch = min(cb / sizeof(WCHAR), string->len - string->pos);
1726
1727 TRACE("(%p, %p, %d, %p)\n", string, buf, cb, pcb);
1728
1729 memmove(buf, string->buf + string->pos, cch * sizeof(WCHAR));
1730 string->pos += cch;
1731 *pcb = cch * sizeof(WCHAR);
1732 return 0;
1733}
1734
1736{
1737 struct ReadStringStruct string;
1738 EDITSTREAM editstream;
1739
1740 TRACE("(%p, %s)\n", hwnd, debugstr_wn(text, len));
1741
1742 string.buf = text;
1743 string.pos = 0;
1744 string.len = len;
1745 editstream.dwCookie = (DWORD_PTR)&string;
1746 editstream.dwError = 0;
1747 editstream.pfnCallback = read_text_callback;
1749 (LPARAM)&editstream);
1750}
1751
1753{
1754 LPWSTR str;
1755 LONG len;
1756
1757 len = LoadStringW(hInstance, id, (LPWSTR)&str, 0);
1759}
1760
1762 LONG len, const PARAFORMAT2 *fmt)
1763{
1766}
1767
1769 const PARAFORMAT2 *fmt)
1770{
1771 LPWSTR str;
1772 LONG len;
1773
1774 len = LoadStringW(hInstance, id, (LPWSTR)&str, 0);
1776}
1777
1779 DWORD dwFlags)
1780{
1781 LPWSTR buf = NULL;
1782 DWORD len;
1783
1785 if (len)
1786 {
1787 buf = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
1788 if (buf)
1790 }
1791 return buf;
1792}
1793
1795 DWORD dwType, DWORD dwFlags)
1796{
1798
1799 if (name)
1800 {
1801 /* Don't include NULL-terminator in output */
1803
1806 }
1807}
1808
1809static void add_icon_to_control(HWND hwnd, int id)
1810{
1811 HRESULT hr;
1812 IRichEditOle *richEditOle = NULL;
1813 IOleObject *object = NULL;
1814 CLSID clsid;
1815 LPOLECACHE oleCache = NULL;
1816 FORMATETC formatEtc;
1817 DWORD conn;
1818 IDataObject *dataObject = NULL;
1820 STGMEDIUM stgm;
1821 IOleClientSite *clientSite = NULL;
1822 REOBJECT reObject;
1823
1824 TRACE("(%p, %d)\n", hwnd, id);
1825
1826 SendMessageW(hwnd, EM_GETOLEINTERFACE, 0, (LPARAM)&richEditOle);
1827 if (!richEditOle)
1828 goto end;
1830 (void**)&object);
1831 if (FAILED(hr))
1832 goto end;
1833 hr = IOleObject_GetUserClassID(object, &clsid);
1834 if (FAILED(hr))
1835 goto end;
1836 hr = IOleObject_QueryInterface(object, &IID_IOleCache, (void**)&oleCache);
1837 if (FAILED(hr))
1838 goto end;
1839 formatEtc.cfFormat = CF_BITMAP;
1840 formatEtc.ptd = NULL;
1841 formatEtc.dwAspect = DVASPECT_CONTENT;
1842 formatEtc.lindex = -1;
1843 formatEtc.tymed = TYMED_GDI;
1844 hr = IOleCache_Cache(oleCache, &formatEtc, 0, &conn);
1845 if (FAILED(hr))
1846 goto end;
1847 hr = IOleObject_QueryInterface(object, &IID_IDataObject,
1848 (void**)&dataObject);
1849 if (FAILED(hr))
1850 goto end;
1851 hr = IRichEditOle_GetClientSite(richEditOle, &clientSite);
1852 if (FAILED(hr))
1853 goto end;
1856 if (!bitmap)
1857 goto end;
1858 stgm.tymed = TYMED_GDI;
1859 stgm.u.hBitmap = bitmap;
1860 stgm.pUnkForRelease = NULL;
1861 hr = IDataObject_SetData(dataObject, &formatEtc, &stgm, TRUE);
1862 if (FAILED(hr))
1863 goto end;
1864
1865 reObject.cbStruct = sizeof(reObject);
1866 reObject.cp = REO_CP_SELECTION;
1867 reObject.clsid = clsid;
1868 reObject.poleobj = object;
1869 reObject.pstg = NULL;
1870 reObject.polesite = clientSite;
1871 reObject.sizel.cx = reObject.sizel.cy = 0;
1872 reObject.dvaspect = DVASPECT_CONTENT;
1873 reObject.dwFlags = 0;
1874 reObject.dwUser = 0;
1875
1876 IRichEditOle_InsertObject(richEditOle, &reObject);
1877
1878end:
1879 if (clientSite)
1880 IOleClientSite_Release(clientSite);
1881 if (dataObject)
1882 IDataObject_Release(dataObject);
1883 if (oleCache)
1884 IOleCache_Release(oleCache);
1885 if (object)
1886 IOleObject_Release(object);
1887 if (richEditOle)
1888 IRichEditOle_Release(richEditOle);
1889}
1890
1891#define MY_INDENT 200
1892
1893static void add_oid_text_to_control(HWND hwnd, char *oid)
1894{
1895 WCHAR nl = '\n';
1897 PARAFORMAT2 parFmt;
1898
1899 parFmt.cbSize = sizeof(parFmt);
1900 parFmt.dwMask = PFM_STARTINDENT;
1901 parFmt.dxStartIndent = MY_INDENT * 3;
1902 if (oidInfo)
1903 {
1905 lstrlenW(oidInfo->pwszName), &parFmt);
1907 }
1908}
1909
1911{
1913 int id;
1914};
1915
1916/* The following list MUST be lexicographically sorted by OID */
1917static struct OIDToString oidMap[] = {
1918 /* 1.3.6.1.4.1.311.10.3.1 */
1920 /* 1.3.6.1.4.1.311.10.3.4 */
1922 /* 1.3.6.1.4.1.311.10.3.4.1 */
1924 /* 1.3.6.1.4.1.311.10.3.5 */
1926 /* 1.3.6.1.4.1.311.10.3.6 */
1928 /* 1.3.6.1.4.1.311.10.3.7 */
1930 /* 1.3.6.1.4.1.311.10.3.8 */
1932 /* 1.3.6.1.4.1.311.10.3.9 */
1934 /* 1.3.6.1.4.1.311.10.3.10 */
1936 /* 1.3.6.1.4.1.311.10.3.11 */
1938 /* 1.3.6.1.4.1.311.10.3.12 */
1940 /* 1.3.6.1.4.1.311.10.3.13 */
1942 /* 1.3.6.1.4.1.311.10.5.1 */
1944 /* 1.3.6.1.4.1.311.10.6.1 */
1946 /* 1.3.6.1.4.1.311.10.6.2 */
1948 /* 1.3.6.1.4.1.311.20.2.1 */
1950 /* 1.3.6.1.4.1.311.20.2.2 */
1952 /* 1.3.6.1.4.1.311.21.5 */
1954 /* 1.3.6.1.4.1.311.21.6 */
1956 /* 1.3.6.1.4.1.311.21.19 */
1958 /* 1.3.6.1.5.5.7.3.1 */
1960 /* 1.3.6.1.5.5.7.3.2 */
1962 /* 1.3.6.1.5.5.7.3.3 */
1964 /* 1.3.6.1.5.5.7.3.4 */
1966 /* 1.3.6.1.5.5.7.3.5 */
1968 /* 1.3.6.1.5.5.7.3.6 */
1970 /* 1.3.6.1.5.5.7.3.7 */
1972 /* 1.3.6.1.5.5.7.3.8 */
1974};
1975
1977{
1978 int indexHigh = ARRAY_SIZE(oidMap) - 1, indexLow = 0;
1979
1980 while (indexLow <= indexHigh)
1981 {
1982 int cmp, i = (indexLow + indexHigh) / 2;
1983 if (!(cmp = strcmp(oid, oidMap[i].oid)))
1984 return &oidMap[i];
1985 if (cmp > 0)
1986 indexLow = i + 1;
1987 else
1988 indexHigh = i - 1;
1989 }
1990 return NULL;
1991}
1992
1994{
1995 struct OIDToString *entry;
1996 WCHAR nl = '\n';
1997 PARAFORMAT2 parFmt;
1998
1999 parFmt.cbSize = sizeof(parFmt);
2000 parFmt.dwMask = PFM_STARTINDENT;
2001 parFmt.dxStartIndent = MY_INDENT * 3;
2002 if ((entry = findSupportedOID(oid)))
2003 {
2004 WCHAR *str, *linebreak, *ptr;
2005 BOOL multiline = FALSE;
2006 int len;
2007
2008 len = LoadStringW(hInstance, entry->id, (LPWSTR)&str, 0);
2009 ptr = str;
2010 do {
2011 if ((linebreak = wmemchr(ptr, '\n', len)))
2012 {
2014
2015 multiline = TRUE;
2016 /* The source string contains a newline, which the richedit
2017 * control won't find since it's interpreted as a paragraph
2018 * break. Therefore copy up to the newline. lstrcpynW always
2019 * NULL-terminates, so pass one more than the length of the
2020 * source line so the copy includes the entire line and the
2021 * NULL-terminator.
2022 */
2023 lstrcpynW(copy, ptr, linebreak - ptr + 1);
2025 linebreak - ptr, &parFmt);
2026 ptr = linebreak + 1;
2028 }
2029 else if (multiline && *ptr)
2030 {
2031 /* Add the last line */
2033 len - (ptr - str), &parFmt);
2035 }
2036 } while (linebreak);
2037 if (!multiline)
2038 {
2041 }
2042 }
2043 else
2044 {
2045 WCHAR *oidW = HeapAlloc(GetProcessHeap(), 0,
2046 (strlen(oid) + 1) * sizeof(WCHAR));
2047
2048 if (oidW)
2049 {
2050 LPCSTR src;
2051 WCHAR *dst;
2052
2053 for (src = oid, dst = oidW; *src; src++, dst++)
2054 *dst = *src;
2055 *dst = 0;
2057 &parFmt);
2059 HeapFree(GetProcessHeap(), 0, oidW);
2060 }
2061 }
2062}
2063
2065 BOOL *anyUsageAdded)
2066{
2067 static char any_app_policy[] = szOID_ANY_APPLICATION_POLICY;
2068 WCHAR nl = '\n';
2069 CHARFORMATW charFmt;
2070 PCERT_EXTENSION policyExt;
2071 if (!*anyUsageAdded)
2072 {
2073 PARAFORMAT2 parFmt;
2074
2075 parFmt.cbSize = sizeof(parFmt);
2076 parFmt.dwMask = PFM_STARTINDENT;
2077 parFmt.dxStartIndent = MY_INDENT;
2079 IDS_CERT_INFO_PURPOSES, &parFmt);
2081 *anyUsageAdded = TRUE;
2082 }
2083 memset(&charFmt, 0, sizeof(charFmt));
2084 charFmt.cbSize = sizeof(charFmt);
2085 charFmt.dwMask = CFM_BOLD;
2086 charFmt.dwEffects = 0;
2089 cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
2090 {
2091 CERT_POLICIES_INFO *policies;
2092 DWORD size;
2093
2095 policyExt->Value.pbData, policyExt->Value.cbData,
2096 CRYPT_DECODE_ALLOC_FLAG, NULL, &policies, &size))
2097 {
2098 DWORD i;
2099
2100 for (i = 0; i < policies->cPolicyInfo; i++)
2101 {
2102 DWORD j;
2103
2104 for (j = 0; j < policies->rgPolicyInfo[i].cPolicyQualifier; j++)
2106 policies->rgPolicyInfo[i].rgPolicyQualifier[j].
2107 pszPolicyQualifierId);
2108 }
2109 LocalFree(policies);
2110 }
2111 }
2112 else
2113 add_oid_text_to_control(text, any_app_policy);
2114}
2115
2117 BOOL *anyUsageAdded)
2118{
2119 WCHAR nl = '\n';
2120 DWORD size;
2121 BOOL badUsages = FALSE;
2122
2124 {
2125 CHARFORMATW charFmt;
2126 static char any_cert_policy[] = szOID_ANY_CERT_POLICY;
2128
2129 if (usage)
2130 {
2132 {
2133 DWORD i;
2134
2135 if (!*anyUsageAdded)
2136 {
2137 PARAFORMAT2 parFmt;
2138
2139 parFmt.cbSize = sizeof(parFmt);
2140 parFmt.dwMask = PFM_STARTINDENT;
2141 parFmt.dxStartIndent = MY_INDENT;
2143 IDS_CERT_INFO_PURPOSES, &parFmt);
2145 *anyUsageAdded = TRUE;
2146 }
2147 memset(&charFmt, 0, sizeof(charFmt));
2148 charFmt.cbSize = sizeof(charFmt);
2149 charFmt.dwMask = CFM_BOLD;
2150 charFmt.dwEffects = 0;
2152 (LPARAM)&charFmt);
2153 if (!usage->cUsageIdentifier)
2154 add_oid_text_to_control(text, any_cert_policy);
2155 else
2156 for (i = 0; i < usage->cUsageIdentifier; i++)
2158 usage->rgpszUsageIdentifier[i]);
2159 }
2160 else
2161 badUsages = TRUE;
2163 }
2164 else
2165 badUsages = TRUE;
2166 }
2167 else
2168 badUsages = TRUE;
2169 return badUsages;
2170}
2171
2174{
2175 BOOL includeCertUsages = FALSE, includeAppUsages = FALSE;
2176 BOOL badUsages = FALSE, anyUsageAdded = FALSE;
2177
2178 if (pCertViewInfo->cPurposes)
2179 {
2180 DWORD i;
2181
2182 for (i = 0; i < pCertViewInfo->cPurposes; i++)
2183 {
2184 if (!strcmp(pCertViewInfo->rgszPurposes[i], szOID_ANY_CERT_POLICY))
2185 includeCertUsages = TRUE;
2186 else if (!strcmp(pCertViewInfo->rgszPurposes[i],
2188 includeAppUsages = TRUE;
2189 else
2190 badUsages = TRUE;
2191 }
2192 }
2193 else
2194 includeAppUsages = includeCertUsages = TRUE;
2195 if (includeAppUsages)
2196 display_app_usages(text, pCertViewInfo->pCertContext, &anyUsageAdded);
2197 if (includeCertUsages)
2198 badUsages = display_cert_usages(text, pCertViewInfo->pCertContext,
2199 &anyUsageAdded);
2200 if (badUsages)
2201 {
2202 PARAFORMAT2 parFmt;
2203
2204 parFmt.cbSize = sizeof(parFmt);
2205 parFmt.dwMask = PFM_STARTINDENT;
2206 parFmt.dxStartIndent = MY_INDENT;
2209 }
2210}
2211
2213 LPCSTR policyOid)
2214{
2216 DWORD i;
2217
2218 for (i = 0; !ret && i < policies->cPolicyInfo; i++)
2219 {
2220 DWORD j;
2221
2222 for (j = 0; !ret && j < policies->rgPolicyInfo[i].cPolicyQualifier; j++)
2223 if (!strcmp(policies->rgPolicyInfo[i].rgPolicyQualifier[j].
2224 pszPolicyQualifierId, policyOid))
2225 ret = &policies->rgPolicyInfo[i].rgPolicyQualifier[j].
2226 Qualifier;
2227 }
2228 return ret;
2229}
2230
2232{
2233 LPWSTR qualifierStr = NULL;
2234 CERT_NAME_VALUE *qualifierValue;
2235 DWORD size;
2236
2239 &qualifierValue, &size))
2240 {
2241 size = CertRDNValueToStrW(qualifierValue->dwValueType,
2242 &qualifierValue->Value, NULL, 0);
2243 qualifierStr = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR));
2244 if (qualifierStr)
2245 CertRDNValueToStrW(qualifierValue->dwValueType,
2246 &qualifierValue->Value, qualifierStr, size);
2247 LocalFree(qualifierValue);
2248 }
2249 return qualifierStr;
2250}
2251
2253{
2254 LPWSTR str = NULL;
2255 CERT_POLICY_QUALIFIER_USER_NOTICE *qualifierValue;
2256 DWORD size;
2257
2261 &qualifierValue, &size))
2262 {
2264 (lstrlenW(qualifierValue->pszDisplayText) + 1) * sizeof(WCHAR));
2265 if (str)
2266 lstrcpyW(str, qualifierValue->pszDisplayText);
2267 LocalFree(qualifierValue);
2268 }
2269 return str;
2270}
2271
2273{
2276};
2277
2280{
2281 PCERT_EXTENSION policyExt;
2282
2283 if (!(pCertViewInfo->dwFlags & CRYPTUI_DISABLE_ISSUERSTATEMENT) &&
2285 pCertViewInfo->pCertContext->pCertInfo->cExtension,
2286 pCertViewInfo->pCertContext->pCertInfo->rgExtension)))
2287 {
2288 CERT_POLICIES_INFO *policies;
2289 DWORD size;
2290
2292 policyExt->Value.pbData, policyExt->Value.cbData,
2293 CRYPT_DECODE_ALLOC_FLAG, NULL, &policies, &size))
2294 {
2296 LPWSTR cps = NULL, userNotice = NULL;
2297
2298 if ((qualifier = find_policy_qualifier(policies,
2301 if ((qualifier = find_policy_qualifier(policies,
2304 if (cps || userNotice)
2305 {
2306 struct IssuerStatement *issuerStatement =
2307 HeapAlloc(GetProcessHeap(), 0, sizeof(struct IssuerStatement));
2308
2309 if (issuerStatement)
2310 {
2311 issuerStatement->cps = cps;
2312 issuerStatement->userNotice = userNotice;
2315 (ULONG_PTR)issuerStatement);
2316 }
2317 }
2318 LocalFree(policies);
2319 }
2320 }
2321}
2322
2325{
2326 CHARFORMATW charFmt;
2327 PARAFORMAT2 parFmt;
2331 (CRYPT_PROVIDER_DATA *)pCertViewInfo->u.pCryptProviderData,
2332 pCertViewInfo->idxSigner, pCertViewInfo->fCounterSigner,
2333 pCertViewInfo->idxCounterSigner);
2335 &provSigner->pasCertChain[provSigner->csCertChain - 1];
2336
2337 if (!provSigner->pChainContext ||
2341 else if (!root->fTrustedRoot)
2343 else
2345
2346 memset(&charFmt, 0, sizeof(charFmt));
2347 charFmt.cbSize = sizeof(charFmt);
2348 charFmt.dwMask = CFM_BOLD;
2349 charFmt.dwEffects = CFE_BOLD;
2351 /* FIXME: vertically center text */
2352 parFmt.cbSize = sizeof(parFmt);
2353 parFmt.dwMask = PFM_STARTINDENT;
2354 parFmt.dxStartIndent = MY_INDENT;
2357
2360 if (provSigner->dwError == TRUST_E_CERT_SIGNATURE)
2362 IDS_CERT_INFO_BAD_SIG, &parFmt);
2363 else if (!provSigner->pChainContext ||
2368 else if (!root->fTrustedRoot)
2369 {
2370 if (provSigner->csCertChain == 1 && root->fSelfSigned)
2373 else
2376 }
2377 else
2378 {
2379 set_policy_text(text, pCertViewInfo);
2380 set_issuer_statement(hwnd, pCertViewInfo);
2381 }
2382}
2383
2385 DWORD nameFlags, int heading)
2386{
2387 WCHAR nl = '\n';
2389 CHARFORMATW charFmt;
2390 PARAFORMAT2 parFmt;
2391
2392 memset(&charFmt, 0, sizeof(charFmt));
2393 charFmt.cbSize = sizeof(charFmt);
2394 charFmt.dwMask = CFM_BOLD;
2395 charFmt.dwEffects = CFE_BOLD;
2397 parFmt.cbSize = sizeof(parFmt);
2398 parFmt.dwMask = PFM_STARTINDENT;
2399 parFmt.dxStartIndent = MY_INDENT * 3;
2401 charFmt.dwEffects = 0;
2404 nameFlags);
2408
2409}
2410
2411static void add_date_string_to_control(HWND hwnd, const FILETIME *fileTime)
2412{
2413 WCHAR dateFmt[80]; /* sufficient for all versions of LOCALE_SSHORTDATE */
2414 WCHAR date[80];
2415 SYSTEMTIME sysTime;
2416
2418 FileTimeToSystemTime(fileTime, &sysTime);
2419 GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, dateFmt, date, ARRAY_SIZE(date));
2421}
2422
2424{
2425 WCHAR nl = '\n';
2427 CHARFORMATW charFmt;
2428 PARAFORMAT2 parFmt;
2429
2430 memset(&charFmt, 0, sizeof(charFmt));
2431 charFmt.cbSize = sizeof(charFmt);
2432 charFmt.dwMask = CFM_BOLD;
2433 charFmt.dwEffects = CFE_BOLD;
2435 parFmt.cbSize = sizeof(parFmt);
2436 parFmt.dwMask = PFM_STARTINDENT;
2437 parFmt.dxStartIndent = MY_INDENT * 3;
2439 &parFmt);
2440 charFmt.dwEffects = 0;
2442 add_date_string_to_control(text, &cert->pCertInfo->NotBefore);
2443 charFmt.dwEffects = CFE_BOLD;
2446 charFmt.dwEffects = 0;
2448 add_date_string_to_control(text, &cert->pCertInfo->NotAfter);
2450}
2451
2454{
2455 set_cert_info(hwnd, pCertViewInfo);
2456 set_cert_name_string(hwnd, pCertViewInfo->pCertContext, 0,
2458 set_cert_name_string(hwnd, pCertViewInfo->pCertContext,
2461}
2462
2464 LPARAM lp)
2465{
2466 LRESULT ret = 0;
2467 HWND text;
2468 struct IssuerStatement *issuerStatement;
2469
2470 switch (msg)
2471 {
2472 case WM_INITDIALOG:
2474 issuerStatement = (struct IssuerStatement *)lp;
2476 lstrlenW(issuerStatement->userNotice));
2477 if (issuerStatement->cps)
2478 SetWindowLongPtrW(hwnd, DWLP_USER, (LPARAM)issuerStatement->cps);
2479 else
2481 break;
2482 case WM_COMMAND:
2483 switch (wp)
2484 {
2485 case IDOK:
2487 ret = TRUE;
2488 break;
2489 case IDC_CPS:
2490 {
2491 IBindCtx *bctx = NULL;
2492 LPWSTR cps;
2493
2494 CreateBindCtx(0, &bctx);
2497 HLNF_OPENINNEWWINDOW, 0);
2498 IBindCtx_Release(bctx);
2499 break;
2500 }
2501 }
2502 }
2503 return ret;
2504}
2505
2506static void show_user_notice(HWND hwnd, struct IssuerStatement *issuerStatement)
2507{
2509 user_notice_dlg_proc, (LPARAM)issuerStatement);
2510}
2511
2513 LPARAM lp)
2514{
2517
2518 TRACE("(%p, %08x, %08lx, %08lx)\n", hwnd, msg, wp, lp);
2519
2520 switch (msg)
2521 {
2522 case WM_INITDIALOG:
2523 page = (PROPSHEETPAGEW *)lp;
2524 pCertViewInfo = (PCCRYPTUI_VIEWCERTIFICATE_STRUCTW)page->lParam;
2525 if (pCertViewInfo->dwFlags & CRYPTUI_DISABLE_ADDTOSTORE)
2528 set_general_info(hwnd, pCertViewInfo);
2529 break;
2530 case WM_COMMAND:
2531 switch (wp)
2532 {
2533 case IDC_ADDTOSTORE:
2535 break;
2537 {
2538 struct IssuerStatement *issuerStatement =
2540
2541 if (issuerStatement)
2542 {
2543 if (issuerStatement->userNotice)
2544 show_user_notice(hwnd, issuerStatement);
2545 else if (issuerStatement->cps)
2546 {
2547 IBindCtx *bctx = NULL;
2548
2549 CreateBindCtx(0, &bctx);
2550 HlinkSimpleNavigateToString(issuerStatement->cps, NULL,
2551 NULL, NULL, bctx, NULL, HLNF_OPENINNEWWINDOW, 0);
2552 IBindCtx_Release(bctx);
2553 }
2554 }
2555 break;
2556 }
2557 }
2558 break;
2559 }
2560 return 0;
2561}
2562
2565{
2566 struct IssuerStatement *issuerStatement;
2567
2568 switch (msg)
2569 {
2570 case PSPCB_RELEASE:
2571 issuerStatement =
2573 if (issuerStatement)
2574 {
2575 HeapFree(GetProcessHeap(), 0, issuerStatement->cps);
2576 HeapFree(GetProcessHeap(), 0, issuerStatement->userNotice);
2577 HeapFree(GetProcessHeap(), 0, issuerStatement);
2578 }
2579 break;
2580 }
2581 return 1;
2582}
2583
2586{
2587 memset(page, 0, sizeof(PROPSHEETPAGEW));
2588 page->dwSize = sizeof(PROPSHEETPAGEW);
2589 page->dwFlags = PSP_USECALLBACK;
2590 page->pfnCallback = general_callback_proc;
2591 page->hInstance = hInstance;
2592 page->u.pszTemplate = MAKEINTRESOURCEW(IDD_GENERAL);
2593 page->pfnDlgProc = general_dlg_proc;
2594 page->lParam = (LPARAM)pCertViewInfo;
2595}
2596
2597typedef WCHAR * (*field_format_func)(PCCERT_CONTEXT cert);
2598
2600{
2601 static const WCHAR fmt[] = { 'V','%','d',0 };
2602 WCHAR *buf = HeapAlloc(GetProcessHeap(), 0, 12 * sizeof(WCHAR));
2603
2604 if (buf)
2605 swprintf(buf, fmt, cert->pCertInfo->dwVersion);
2606 return buf;
2607}
2608
2610{
2611 WCHAR *buf = HeapAlloc(GetProcessHeap(), 0, (cb * 3 + 1) * sizeof(WCHAR));
2612
2613 if (buf)
2614 {
2615 static const WCHAR fmt[] = { '%','0','2','x',' ',0 };
2616 DWORD i;
2617 WCHAR *ptr;
2618
2619 for (i = 0, ptr = buf; i < cb; i++, ptr += 3)
2620 swprintf(ptr, fmt, ((BYTE *)pb)[i]);
2621 }
2622 return buf;
2623}
2624
2626{
2627 return format_hex_string(cert->pCertInfo->SerialNumber.pbData,
2628 cert->pCertInfo->SerialNumber.cbData);
2629}
2630
2632{
2635}
2636
2638{
2639 WCHAR *str = NULL;
2642
2643 if (len)
2644 {
2645 str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
2646 if (str)
2649 }
2650 return str;
2651}
2652
2654{
2655 return field_format_detailed_cert_name(&cert->pCertInfo->Issuer);
2656}
2657
2659{
2661}
2662
2664{
2665 return field_format_detailed_cert_name(&cert->pCertInfo->Subject);
2666}
2667
2668static WCHAR *format_long_date(const FILETIME *fileTime)
2669{
2670 WCHAR dateFmt[80]; /* long enough for LOCALE_SLONGDATE */
2671 DWORD len;
2672 WCHAR *buf = NULL;
2673 SYSTEMTIME sysTime;
2674
2675 /* FIXME: format isn't quite right, want time too */
2677 FileTimeToSystemTime(fileTime, &sysTime);
2678 len = GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, dateFmt, NULL, 0);
2679 if (len)
2680 {
2681 buf = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
2682 if (buf)
2683 GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, dateFmt, buf,
2684 len);
2685 }
2686 return buf;
2687}
2688
2690{
2691 return format_long_date(&cert->pCertInfo->NotBefore);
2692}
2693
2695{
2696 return format_long_date(&cert->pCertInfo->NotAfter);
2697}
2698
2700{
2702 WCHAR *buf = NULL;
2703
2705 cert->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId, 0);
2706 if (oidInfo)
2707 {
2709
2711 {
2712 DWORD len;
2713
2714 /* Allocate the output buffer. Use the number of bytes in the
2715 * public key as a conservative (high) estimate for the number of
2716 * digits in its output.
2717 * The output is of the form (in English)
2718 * "<public key algorithm> (<public key bit length> bits)".
2719 * Ordinarily having two positional parameters in a string is not a
2720 * good idea, but as this isn't a sentence fragment, it shouldn't
2721 * be word-order dependent.
2722 */
2723 len = lstrlenW(fmt) + lstrlenW(oidInfo->pwszName) +
2724 cert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData * 8;
2725 buf = HeapAlloc(GetProcessHeap(), 0, len * sizeof(*buf));
2726 if (buf)
2727 {
2728 DWORD_PTR args[2];
2729 args[0] = (DWORD_PTR)oidInfo->pwszName;
2731 &cert->pCertInfo->SubjectPublicKeyInfo);
2733 fmt, 0, 0, buf, len, (__ms_va_list*)args);
2734 }
2735 }
2736 }
2737 return buf;
2738}
2739
2741{
2742 return format_hex_string(
2743 cert->pCertInfo->SubjectPublicKeyInfo.PublicKey.pbData,
2744 cert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData);
2745}
2746
2747struct field_value_data;
2749{
2754};
2755
2757
2758typedef WCHAR *(*create_detailed_value_func)(PCCERT_CONTEXT cert, void *param);
2759
2761{
2764 void *param;
2765};
2766
2769{
2770 if (data->cFields)
2771 data->fields = HeapReAlloc(GetProcessHeap(), 0, data->fields,
2772 (data->cFields + 1) * sizeof(struct field_value_data));
2773 else
2774 data->fields = HeapAlloc(GetProcessHeap(), 0,
2775 sizeof(struct field_value_data));
2776 if (data->fields)
2777 {
2778 data->fields[data->cFields].create = create;
2779 data->fields[data->cFields].detailed_value = NULL;
2780 data->fields[data->cFields].param = param;
2781 data->cFields++;
2782 }
2783}
2784
2787{
2788 LVITEMW item;
2789 int iItem = SendMessageW(hwnd, LVM_GETITEMCOUNT, 0, 0);
2790
2791 item.mask = LVIF_TEXT | LVIF_PARAM;
2792 item.iItem = iItem;
2793 item.iSubItem = 0;
2794 item.pszText = field;
2795 item.lParam = (LPARAM)data;
2797 if (value)
2798 {
2799 item.pszText = value;
2800 item.iSubItem = 1;
2802 }
2804}
2805
2808{
2810
2813}
2814
2816{
2817 int id;
2820};
2821
2823 const struct v1_field *field)
2824{
2825 WCHAR *val = field->format(data->pCertViewInfo->pCertContext);
2826
2827 if (val)
2828 {
2830 field->create_detailed_value, NULL);
2832 }
2833}
2834
2835static const struct v1_field v1_fields[] = {
2844};
2845
2847{
2848 unsigned int i;
2849 PCCERT_CONTEXT cert = data->pCertViewInfo->pCertContext;
2850
2851 /* The last item in v1_fields is the public key, which is not in the loop
2852 * because it's a special case.
2853 */
2854 for (i = 0; i < ARRAY_SIZE(v1_fields) - 1; i++)
2856 if (cert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData)
2858}
2859
2861{
2862 WCHAR *str = NULL;
2863 DWORD size;
2864
2865 if (CryptFormatObject(X509_ASN_ENCODING, 0, formatStrType, NULL,
2866 ext->pszObjId, ext->Value.pbData, ext->Value.cbData, NULL, &size))
2867 {
2869 CryptFormatObject(X509_ASN_ENCODING, 0, formatStrType, NULL,
2870 ext->pszObjId, ext->Value.pbData, ext->Value.cbData, str, &size);
2871 }
2872 return str;
2873}
2874
2876{
2877 WCHAR *str = NULL;
2878
2879 if (ext->Value.cbData)
2880 {
2881 /* The output is formatted as:
2882 * <hex bytes> <ascii bytes>\n
2883 * where <hex bytes> is a string of up to 8 bytes, output as %02x,
2884 * and <ascii bytes> is the ASCII equivalent of each byte, or '.' if
2885 * the byte is not printable.
2886 * So, for example, the extension value consisting of the following
2887 * bytes:
2888 * 0x30,0x14,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04,0x03,
2889 * 0x13,0x09,0x4a,0x75,0x61,0x6e,0x20,0x4c,0x61,0x6e,0x67
2890 * is output as:
2891 * 30 14 31 12 30 10 06 03 0.1.0...
2892 * 55 04 03 13 09 4a 75 61 U....Jua
2893 * 6e 20 4c 61 6e 67 n Lang
2894 * The allocation size therefore requires:
2895 * - 4 characters per character in an 8-byte line
2896 * (2 for the hex format, one for the space, one for the ASCII value)
2897 * - 3 more characters per 8-byte line (two spaces and a newline)
2898 * - 1 character for the terminating nul
2899 * FIXME: should use a fixed-width font for this
2900 */
2901 DWORD lines = (ext->Value.cbData + 7) / 8;
2902
2904 (lines * 8 * 4 + lines * 3 + 1) * sizeof(WCHAR));
2905 if (str)
2906 {
2907 static const WCHAR fmt[] = { '%','0','2','x',' ',0 };
2908 DWORD i, j;
2909 WCHAR *ptr;
2910
2911 for (i = 0, ptr = str; i < ext->Value.cbData; i += 8)
2912 {
2913 /* Output as hex bytes first */
2914 for (j = i; j < min(i + 8, ext->Value.cbData); j++, ptr += 3)
2915 swprintf(ptr, fmt, ext->Value.pbData[j]);
2916 /* Pad the hex output with spaces for alignment */
2917 if (j == ext->Value.cbData && j % 8)
2918 {
2919 static const WCHAR pad[] = { ' ',' ',' ' };
2920
2921 for (; j % 8; j++, ptr += ARRAY_SIZE(pad))
2922 memcpy(ptr, pad, sizeof(pad));
2923 }
2924 /* The last swprintf included a space, so just insert one
2925 * more space between the hex bytes and the ASCII output
2926 */
2927 *ptr++ = ' ';
2928 /* Output as ASCII bytes */
2929 for (j = i; j < min(i + 8, ext->Value.cbData); j++, ptr++)
2930 {
2931 if (iswprint(ext->Value.pbData[j]) &&
2932 !iswspace(ext->Value.pbData[j]))
2933 *ptr = ext->Value.pbData[j];
2934 else
2935 *ptr = '.';
2936 }
2937 *ptr++ = '\n';
2938 }
2939 *ptr++ = '\0';
2940 }
2941 }
2942 return str;
2943}
2944
2946{
2950
2951 if (!str)
2953 return str;
2954}
2955
2958{
2960 ext->pszObjId, 0);
2962
2963 if (oidInfo)
2966 else
2967 {
2968 DWORD len = strlen(ext->pszObjId);
2969 LPWSTR oidW = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR));
2970
2971 if (oidW)
2972 {
2973 DWORD i;
2974
2975 for (i = 0; i <= len; i++)
2976 oidW[i] = ext->pszObjId[i];
2979 HeapFree(GetProcessHeap(), 0, oidW);
2980 }
2981 }
2983}
2984
2986{
2987 DWORD i;
2988 PCCERT_CONTEXT cert = data->pCertViewInfo->pCertContext;
2989
2990 for (i = 0; i < cert->pCertInfo->cExtension; i++)
2991 add_cert_extension_detail(hwnd, data, &cert->pCertInfo->rgExtension[i]);
2992}
2993
2995{
2996 DWORD i;
2997 PCCERT_CONTEXT cert = data->pCertViewInfo->pCertContext;
2998
2999 for (i = 0; i < cert->pCertInfo->cExtension; i++)
3000 if (cert->pCertInfo->rgExtension[i].fCritical)
3002 &cert->pCertInfo->rgExtension[i]);
3003}
3004
3005typedef WCHAR * (*prop_to_value_func)(void *pb, DWORD cb);
3006
3008{
3010 int id;
3013};
3014
3016{
3018
3019 ext.pszObjId = (LPSTR)X509_ENHANCED_KEY_USAGE;
3020 ext.fCritical = FALSE;
3021 ext.Value.pbData = pb;
3022 ext.Value.cbData = cb;
3023 return crypt_format_extension(&ext, 0);
3024}
3025
3026/* Logically the access state should also be checked, and IDC_EDITPROPERTIES
3027 * disabled for read-only certificates, but native doesn't appear to do that.
3028 */
3029static const struct prop_id_to_string_id prop_id_map[] = {
3035};
3036
3038{
3039 DWORD i;
3040 PCCERT_CONTEXT cert = data->pCertViewInfo->pCertContext;
3041
3042 for (i = 0; i < ARRAY_SIZE(prop_id_map); i++)
3043 {
3044 DWORD cb;
3045
3047 &cb))
3048 {
3049 BYTE *pb;
3050 WCHAR *val = NULL;
3051
3052 /* FIXME: MS adds a separate value for the signature hash
3053 * algorithm.
3054 */
3055 pb = HeapAlloc(GetProcessHeap(), 0, cb);
3056 if (pb)
3057 {
3059 prop_id_map[i].prop, pb, &cb))
3060 {
3062 {
3063 val = (LPWSTR)pb;
3064 /* Don't double-free pb */
3065 pb = NULL;
3066 }
3067 else
3068 val = prop_id_map[i].prop_to_value(pb, cb);
3069 }
3070 HeapFree(GetProcessHeap(), 0, pb);
3071 }
3073 NULL, NULL);
3074 }
3075 }
3076}
3077
3079{
3083}
3084
3086{
3087 int id;
3089};
3090
3091static const struct selection_list_item listItems[] = {
3097};
3098
3100{
3103 int i;
3104
3105 for (i = 0; i < ARRAY_SIZE(listItems); i++)
3106 {
3107 int index;
3108
3112 }
3114}
3115
3117{
3119 RECT rc;
3122
3124 GetWindowRect(lv, &rc);
3126 column.mask = LVCF_WIDTH | LVCF_TEXT;
3127 column.cx = (rc.right - rc.left) / 2 - 2;
3128 column.pszText = buf;
3132}
3133
3134static void set_fields_selection(HWND hwnd, struct detail_data *data, int sel)
3135{
3137
3138 if (sel >= 0 && sel < ARRAY_SIZE(listItems))
3139 {
3141 listItems[sel].add(list, data);
3142 }
3143}
3144
3146{
3150}
3151
3152static void add_purpose(HWND hwnd, LPCSTR oid)
3153{
3156 sizeof(CRYPT_OID_INFO));
3157
3158 if (info)
3159 {
3160 char *oidCopy = HeapAlloc(GetProcessHeap(), 0, strlen(oid) + 1);
3161
3162 if (oidCopy)
3163 {
3164 LVITEMA item;
3165
3166 strcpy(oidCopy, oid);
3167 info->cbSize = sizeof(CRYPT_OID_INFO);
3168 info->pszOID = oidCopy;
3171 item.stateMask = LVIS_STATEIMAGEMASK;
3172 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
3173 item.iSubItem = 0;
3174 item.lParam = (LPARAM)info;
3175 item.pszText = oidCopy;
3177 }
3178 else
3180 }
3181}
3182
3184{
3185 BOOL ret;
3186
3187 if (oid[0] != '0' && oid[0] != '1' && oid[0] != '2')
3188 ret = FALSE;
3189 else if (oid[1] != '.')
3190 ret = FALSE;
3191 else if (!oid[2])
3192 ret = FALSE;
3193 else
3194 {
3195 const char *ptr;
3196 BOOL expectNum = TRUE;
3197
3198 for (ptr = oid + 2, ret = TRUE; ret && *ptr; ptr++)
3199 {
3200 if (expectNum)
3201 {
3202 if (!isdigit(*ptr))
3203 ret = FALSE;
3204 else if (*(ptr + 1) == '.')
3205 expectNum = FALSE;
3206 }
3207 else
3208 {
3209 if (*ptr != '.')
3210 ret = FALSE;
3211 else if (!(*(ptr + 1)))
3212 ret = FALSE;
3213 else
3214 expectNum = TRUE;
3215 }
3216 }
3217 }
3218 return ret;
3219}
3220
3222{
3224 != -1;
3225}
3226
3227#define MAX_PURPOSE 255
3228
3230 WPARAM wp, LPARAM lp)
3231{
3232 LRESULT ret = 0;
3233 char buf[MAX_PURPOSE + 1];
3234
3235 switch (msg)
3236 {
3237 case WM_INITDIALOG:
3239 MAX_PURPOSE, 0);
3242 break;
3243 case WM_COMMAND:
3244 switch (HIWORD(wp))
3245 {
3246 case EN_CHANGE:
3247 if (LOWORD(wp) == IDC_NEW_PURPOSE)
3248 {
3249 /* Show/hide scroll bar on description depending on how much
3250 * text it has.
3251 */
3254
3256 }
3257 break;
3258 case BN_CLICKED:
3259 switch (LOWORD(wp))
3260 {
3261 case IDOK:
3263 (LPARAM)buf);
3264 if (!buf[0])
3265 {
3266 /* An empty purpose is the same as cancelling */
3268 ret = TRUE;
3269 }
3270 else if (!is_valid_oid(buf))
3271 {
3273
3277 }
3278 else if (is_oid_in_list(
3280 {
3282
3284 ARRAY_SIZE(error));
3287 }
3288 else
3289 {
3291
3293 EndDialog(hwnd, wp);
3294 ret = TRUE;
3295 }
3296 break;
3297 case IDCANCEL:
3298 EndDialog(hwnd, wp);
3299 ret = TRUE;
3300 break;
3301 }
3302 break;
3303 }
3304 break;
3305 }
3306 return ret;
3307}
3308
3310{
3311 WCHAR *name = NULL;
3312 DWORD cb;
3313
3315 {
3317 if (name)
3318 {
3320 {
3322 name = NULL;
3323 }
3324 }
3325 }
3326 return name;
3327}
3328
3330{
3331 int items = SendMessageW(list, LVM_GETITEMCOUNT, 0, 0), i;
3332
3333 for (i = 0; i < items; i++)
3334 {
3335 BOOL change = FALSE;
3336 int state;
3337
3339 /* This reverses the INDEXTOSTATEIMAGEMASK shift. There doesn't appear
3340 * to be a handy macro for it.
3341 */
3342 state >>= 12;
3343 if (enabled)
3344 {
3346 {
3348 change = TRUE;
3349 }
3351 {
3353 change = TRUE;
3354 }
3355 }
3356 else
3357 {
3359 {
3361 change = TRUE;
3362 }
3364 {
3366 change = TRUE;
3367 }
3368 }
3369 if (change)
3370 {
3371 LVITEMW item;
3372
3374 item.stateMask = LVIS_STATEIMAGEMASK;
3376 }
3377 }
3378}
3379
3380typedef enum {
3385
3387{
3389
3390 switch (selection)
3391 {
3392 case PurposeEnableAll:
3393 case PurposeDisableAll:
3394 EnableWindow(lv, FALSE);
3395 redraw_states(lv, FALSE);
3397 break;
3399 EnableWindow(lv, TRUE);
3400 redraw_states(lv, TRUE);
3402 }
3403}
3404
3406{
3410};
3411
3413{
3414 PCCERT_CONTEXT cert = data->cert;
3417 DWORD size;
3418 RECT rc;
3420 PurposeSelection purposeSelection = PurposeEnableAll;
3421
3422 GetWindowRect(lv, &rc);
3423 column.mask = LVCF_WIDTH;
3424 column.cx = rc.right - rc.left;
3427
3428 /* Get enhanced key usage. Have to check for a property and an extension
3429 * separately, because CertGetEnhancedKeyUsage will succeed and return an
3430 * empty usage if neither is set. Unfortunately an empty usage implies
3431 * no usage is allowed, so we have to distinguish between the two cases.
3432 */
3434 NULL, &size))
3435 {
3439 {
3441 usage = NULL;
3442 }
3443 else if (usage->cUsageIdentifier)
3444 purposeSelection = PurposeEnableSelected;
3445 else
3446 purposeSelection = PurposeDisableAll;
3447 }
3449 NULL, &size))
3450 {
3454 {
3456 usage = NULL;
3457 }
3458 else if (usage->cUsageIdentifier)
3459 purposeSelection = PurposeEnableAll;
3460 else
3461 purposeSelection = PurposeDisableAll;
3462 }
3463 else
3464 {
3465 purposeSelection = PurposeEnableAll;
3466 usage = NULL;
3467 }
3468 if (usage)
3469 {
3470 DWORD i;
3471
3472 for (i = 0; i < usage->cUsageIdentifier; i++)
3473 {
3475 usage->rgpszUsageIdentifier[i], CRYPT_ENHKEY_USAGE_OID_GROUP_ID);
3476
3477 if (info)
3479 else
3480 add_purpose(hwnd, usage->rgpszUsageIdentifier[i]);
3481 }
3483 }
3484 else
3486 select_purposes(hwnd, purposeSelection);
3488 BM_CLICK, 0, 0);
3489}
3490
3492{
3493 PCCERT_CONTEXT cert = data->cert;
3494 WCHAR *str;
3495
3497 {
3499 (LPARAM)str);
3501 }
3503 {
3505 (LPARAM)str);
3507 }
3509}
3510
3512 LPWSTR str)
3513{
3514 if (str && *str)
3515 {
3517
3518 blob.pbData = (BYTE *)str;
3519 blob.cbData = (lstrlenW(str) + 1) * sizeof(WCHAR);
3521 }
3522 else
3524}
3525
3526#define WM_REFRESH_VIEW WM_USER + 0
3527
3529{
3532 return TRUE;
3533}
3534
3535#define MAX_FRIENDLY_NAME 40
3536#define MAX_DESCRIPTION 255
3537
3539{
3541 struct edit_cert_data *data =
3543
3549 {
3550 /* Setting a NULL usage removes the enhanced key usage property. */
3552 }
3554 {
3555 CERT_ENHKEY_USAGE usage = { 0, NULL };
3556
3558 }
3560 {
3562 CERT_ENHKEY_USAGE usage = { 0, NULL };
3563 int purposes = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0), i;
3564 LVITEMW item;
3565
3566 item.mask = LVIF_STATE | LVIF_PARAM;
3567 item.iSubItem = 0;
3568 item.stateMask = LVIS_STATEIMAGEMASK;
3569 for (i = 0; i < purposes; i++)
3570 {
3571 item.iItem = i;
3572 if (SendMessageW(lv, LVM_GETITEMW, 0, (LPARAM)&item))
3573 {
3574 int state = item.state >> 12;
3575
3577 {
3579
3580 if (usage.cUsageIdentifier)
3581 usage.rgpszUsageIdentifier =
3583 usage.rgpszUsageIdentifier,
3584 (usage.cUsageIdentifier + 1) * sizeof(LPSTR));
3585 else
3586 usage.rgpszUsageIdentifier =
3587 HeapAlloc(GetProcessHeap(), 0, sizeof(LPSTR));
3588 if (usage.rgpszUsageIdentifier)
3589 usage.rgpszUsageIdentifier[usage.cUsageIdentifier++] =
3590 (LPSTR)info->pszOID;
3591 }
3592 }
3593 }
3595 HeapFree(GetProcessHeap(), 0, usage.rgpszUsageIdentifier);
3596 }
3598 if (data->pfPropertiesChanged)
3599 *data->pfPropertiesChanged = TRUE;
3600}
3601
3603 WPARAM wp, LPARAM lp)
3604{
3606
3607 TRACE("(%p, %08x, %08lx, %08lx)\n", hwnd, msg, wp, lp);
3608
3609 switch (msg)
3610 {
3611 case WM_INITDIALOG:
3612 {
3614 struct detail_data *detailData;
3615 struct edit_cert_data *editData;
3616
3617 page = (PROPSHEETPAGEW *)lp;
3618 detailData = (struct detail_data *)page->lParam;
3623 editData = HeapAlloc(GetProcessHeap(), 0,
3624 sizeof(struct edit_cert_data));
3625 if (editData)
3626 {
3627 editData->imageList = ImageList_Create(16, 16,
3628 ILC_COLOR4 | ILC_MASK, 4, 0);
3629 if (editData->imageList)
3630 {
3631 HBITMAP bmp;
3632 COLORREF backColor = RGB(255, 0, 255);
3633
3635 ImageList_AddMasked(editData->imageList, bmp, backColor);
3638 }
3639 editData->cert = detailData->pCertViewInfo->pCertContext;
3640 editData->pfPropertiesChanged = detailData->pfPropertiesChanged;
3643 }
3644 break;
3645 }
3646 case WM_NOTIFY:
3647 {
3648 NMHDR *hdr = (NMHDR *)lp;
3649 NMITEMACTIVATE *nm;
3650
3651 switch (hdr->code)
3652 {
3653 case NM_CLICK:
3654 nm = (NMITEMACTIVATE *)lp;
3655 toggle_usage(hwnd, nm->iItem);
3657 break;
3658 case PSN_APPLY:
3660 break;
3661 }
3662 break;
3663 }
3664 case WM_COMMAND:
3665 switch (HIWORD(wp))
3666 {
3667 case EN_CHANGE:
3669 if (LOWORD(wp) == IDC_DESCRIPTION)
3670 {
3671 /* Show/hide scroll bar on description depending on how much
3672 * text it has.
3673 */
3676
3678 }
3679 break;
3680 case BN_CLICKED:
3681 switch (LOWORD(wp))
3682 {
3683 case IDC_ADD_PURPOSE:
3688 break;
3694 break;
3695 }
3696 break;
3697 }
3698 break;
3699 }
3700 return 0;
3701}
3702
3705{
3706 HWND lv;
3707 int cItem, i;
3708 struct edit_cert_data *data;
3709
3710 switch (msg)
3711 {
3712 case PSPCB_RELEASE:
3714 cItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
3715 for (i = 0; i < cItem; i++)
3716 {
3717 LVITEMW item;
3718
3719 item.mask = LVIF_PARAM;
3720 item.iItem = i;
3721 item.iSubItem = 0;
3722 if (SendMessageW(lv, LVM_GETITEMW, 0, (LPARAM)&item) && item.lParam)
3723 {
3725
3726 if (info->cbSize == sizeof(CRYPT_OID_INFO) && !info->dwGroupId)
3727 {
3728 HeapFree(GetProcessHeap(), 0, (LPSTR)info->pszOID);
3730 }
3731 }
3732 }
3734 if (data)
3735 {
3736#ifndef __REACTOS__
3737 ImageList_Destroy(data->imageList);
3738#endif
3740 }
3741 break;
3742 }
3743 return 1;
3744}
3745
3747 struct detail_data *data)
3748{
3750 PROPSHEETPAGEW page; /* FIXME: need to add a cross-certificate page */
3751
3752 TRACE("(%p)\n", data);
3753
3754 memset(&page, 0, sizeof(PROPSHEETPAGEW));
3755 page.dwSize = sizeof(page);
3756 page.dwFlags = PSP_USECALLBACK;
3758 page.hInstance = hInstance;
3761 page.lParam = (LPARAM)data;
3762
3763 memset(&hdr, 0, sizeof(hdr));
3764 hdr.dwSize = sizeof(hdr);
3765 hdr.hwndParent = parent;
3766 hdr.dwFlags = PSH_PROPSHEETPAGE;
3767 hdr.hInstance = hInstance;
3769 hdr.u3.ppsp = &page;
3770 hdr.nPages = 1;
3772}
3773
3775{
3776 int i;
3777
3778 for (i = 0; i < data->cFields; i++)
3779 HeapFree(GetProcessHeap(), 0, data->fields[i].detailed_value);
3780 HeapFree(GetProcessHeap(), 0, data->fields);
3781 data->fields = NULL;
3782 data->cFields = 0;
3783}
3784
3786{
3788 int curSel;
3789 struct detail_data *data;
3790
3791 curSel = SendMessageW(cb, CB_GETCURSEL, 0, 0);
3792 /* Actually, any index will do, since they all store the same data value */
3793 data = (struct detail_data *)SendMessageW(cb, CB_GETITEMDATA, curSel, 0);
3795 set_fields_selection(hwnd, data, curSel);
3796}
3797
3799 LPARAM lp)
3800{
3802 struct detail_data *data;
3803
3804 TRACE("(%p, %08x, %08lx, %08lx)\n", hwnd, msg, wp, lp);
3805
3806 switch (msg)
3807 {
3808 case WM_INITDIALOG:
3809 page = (PROPSHEETPAGEW *)lp;
3810 data = (struct detail_data *)page->lParam;
3812 if (!(data->pCertViewInfo->dwFlags & CRYPTUI_ENABLE_EDITPROPERTIES))
3814 if (data->pCertViewInfo->dwFlags & CRYPTUI_DISABLE_EXPORT)
3816 break;
3817 case WM_NOTIFY:
3818 {
3819 NMITEMACTIVATE *nm;
3821
3822 nm = (NMITEMACTIVATE*)lp;
3823 if (nm->hdr.hwndFrom == list && nm->uNewState & LVN_ITEMACTIVATE
3824 && nm->hdr.code == LVN_ITEMCHANGED)
3825 {
3826 data = (struct detail_data *)nm->lParam;
3827 if (nm->iItem >= 0 && data && nm->iItem < data->cFields)
3828 {
3830 HWND valueCtl = GetDlgItem(hwnd, IDC_DETAIL_VALUE);
3831
3832 if (data->fields[nm->iItem].create)
3833 val = data->fields[nm->iItem].create(
3834 data->pCertViewInfo->pCertContext,
3835 data->fields[nm->iItem].param);
3836 else
3837 {
3838 LVITEMW item;
3839 int res;
3840
3841 item.cchTextMax = ARRAY_SIZE(buf);
3842 item.mask = LVIF_TEXT;
3843 item.pszText = buf;
3844 item.iItem = nm->iItem;
3845 item.iSubItem = 1;
3847 if (res)
3848 val = buf;
3849 }
3850 /* Select all the text in the control, the next update will
3851 * replace it
3852 */
3853 SendMessageW(valueCtl, EM_SETSEL, 0, -1);
3855 val ? lstrlenW(val) : 0);
3856 if (val != buf)
3858 }
3859 }
3860 break;
3861 }
3862 case WM_COMMAND:
3863 switch (wp)
3864 {
3865 case IDC_EXPORT:
3866 {
3869
3870 data = (struct detail_data *)SendMessageW(cb, CB_GETITEMDATA, 0, 0);
3871 info.dwSize = sizeof(info);
3872 info.pwszExportFileName = NULL;
3873 info.dwSubjectChoice = CRYPTUI_WIZ_EXPORT_CERT_CONTEXT;
3874 info.u.pCertContext = data->pCertViewInfo->pCertContext;
3875 info.cStores = 0;
3877 break;
3878 }
3879 case IDC_EDITPROPERTIES:
3880 {
3882 int curSel;
3883
3884 curSel = SendMessageW(cb, CB_GETCURSEL, 0, 0);
3885 /* Actually, any index will do, since they all store the same
3886 * data value
3887 */
3889 curSel, 0);
3891 break;
3892 }
3893 case ((CBN_SELCHANGE << 16) | IDC_DETAIL_SELECT):
3895 break;
3896 }
3897 break;
3898 case WM_REFRESH_VIEW:
3900 break;
3901 }
3902 return 0;
3903}
3904
3907{
3908 struct detail_data *data;
3909
3910 switch (msg)
3911 {
3912 case PSPCB_RELEASE:
3913 data = (struct detail_data *)page->lParam;
3916 break;
3917 }
3918 return 0;
3919}
3920
3923{
3924 BOOL ret;
3926 sizeof(struct detail_data));
3927
3928 if (data)
3929 {
3930 data->pCertViewInfo = pCertViewInfo;
3931 data->pfPropertiesChanged = pfPropertiesChanged;
3932 data->cFields = 0;
3933 data->fields = NULL;
3934 memset(page, 0, sizeof(PROPSHEETPAGEW));
3935 page->dwSize = sizeof(PROPSHEETPAGEW);
3936 page->dwFlags = PSP_USECALLBACK;
3937 page->pfnCallback = detail_callback;
3938 page->hInstance = hInstance;
3939 page->u.pszTemplate = MAKEINTRESOURCEW(IDD_DETAIL);
3940 page->pfnDlgProc = detail_dlg_proc;
3941 page->lParam = (LPARAM)data;
3942 ret = TRUE;
3943 }
3944 else
3945 ret = FALSE;
3946 return ret;
3947}
3948
3950{
3954};
3955
3957{
3959 (CRYPT_PROVIDER_DATA *)data->pCertViewInfo->u.pCryptProviderData,
3960 data->pCertViewInfo->idxSigner, data->pCertViewInfo->fCounterSigner,
3961 data->pCertViewInfo->idxCounterSigner);
3962
3963 /* Takes advantage of the fact that a pointer is 32-bit aligned, and
3964 * therefore always even.
3965 */
3966 if (index == provSigner->csCertChain - 1)
3967 return (LPARAM)data;
3968 return index << 1 | 1;
3969}
3970
3972{
3974 (CRYPT_PROVIDER_DATA *)data->pCertViewInfo->u.pCryptProviderData,
3975 data->pCertViewInfo->idxSigner, data->pCertViewInfo->fCounterSigner,
3976 data->pCertViewInfo->idxCounterSigner);
3977
3978 if (!(lp & 1))
3979 return provSigner->csCertChain - 1;
3980 return lp >> 1;
3981}
3982
3985{
3986 struct hierarchy_data *data = NULL;
3988
3989 do {
3992
3993 if (!parent)
3994 root = hItem;
3995 hItem = parent;
3996 } while (hItem);
3997 if (root)
3998 {
3999 TVITEMW item;
4000
4001 item.mask = TVIF_PARAM;
4002 item.hItem = root;
4004 data = (struct hierarchy_data *)item.lParam;
4005 }
4006 return data;
4007}
4008
4010{
4012
4013 if (!name)
4015 return name;
4016}
4017
4019{
4022 (CRYPT_PROVIDER_DATA *)data->pCertViewInfo->u.pCryptProviderData,
4023 data->pCertViewInfo->idxSigner, data->pCertViewInfo->fCounterSigner,
4024 data->pCertViewInfo->idxCounterSigner);
4025 DWORD i;
4027
4029 for (i = provSigner->csCertChain; i; i--)
4030 {
4031 LPWSTR name;
4032
4033 name = get_cert_display_name(provSigner->pasCertChain[i - 1].pCert);
4034 if (name)
4035 {
4036 TVINSERTSTRUCTW tvis;
4037
4038 tvis.hParent = parent;
4039 tvis.hInsertAfter = TVI_LAST;
4040 tvis.u.item.mask = TVIF_TEXT | TVIF_STATE | TVIF_IMAGE |
4042 tvis.u.item.pszText = name;
4043 tvis.u.item.state = TVIS_EXPANDED;
4044 tvis.u.item.stateMask = TVIS_EXPANDED;
4045 if (i == 1 && (!provSigner->pChainContext ||
4048 {
4049 /* The root of the chain has a special case: if the chain is
4050 * a partial chain, the icon is a warning icon rather than an
4051 * error icon.
4052 */
4053 tvis.u.item.iImage = 2;
4054 }
4055 else if (provSigner->pasCertChain[i - 1].pChainElement->TrustStatus.
4056 dwErrorStatus == 0)
4057 tvis.u.item.iImage = 0;
4058 else
4059 tvis.u.item.iImage = 1;
4060 tvis.u.item.iSelectedImage = tvis.u.item.iImage;
4061 tvis.u.item.lParam = index_to_lparam(data, i - 1);
4063 (LPARAM)&tvis);
4065 }
4066 }
4067}
4068
4070{
4071 /* Select all the text in the control, the next update will replace it */
4072 SendMessageW(hwnd, EM_SETSEL, 0, -1);
4073 /* Set the highest priority error messages first. */
4074 if (!(cert->dwConfidence & CERT_CONFIDENCE_SIG))
4076 else if (!(cert->dwConfidence & CERT_CONFIDENCE_TIME))
4078 else if (!(cert->dwConfidence & CERT_CONFIDENCE_TIMENEST))
4080 else if (cert->dwRevokedReason)
4082 else
4084}
4085
4088{
4096
4097 set_certificate_status(status, provCert);
4098}
4099
4101{
4102 /* Disable view certificate button until a certificate is selected */
4106}
4107
4109{
4111 TVITEMW item;
4112 struct hierarchy_data *data;
4114
4115 memset(&item, 0, sizeof(item));
4116 item.mask = TVIF_HANDLE | TVIF_PARAM;
4121 if (selection != 0)
4122 {
4123 CRYPT_PROVIDER_SGNR *provSigner;
4125 BOOL changed = FALSE;
4126
4127 provSigner = WTHelperGetProvSignerFromChain(
4128 (CRYPT_PROVIDER_DATA *)data->pCertViewInfo->u.pCryptProviderData,
4129 data->pCertViewInfo->idxSigner,
4130 data->pCertViewInfo->fCounterSigner,
4131 data->pCertViewInfo->idxCounterSigner);
4132 memset(&viewInfo, 0, sizeof(viewInfo));
4133 viewInfo.dwSize = sizeof(viewInfo);
4134 viewInfo.dwFlags = data->pCertViewInfo->dwFlags;
4135 viewInfo.szTitle = data->pCertViewInfo->szTitle;
4136 viewInfo.pCertContext = provSigner->pasCertChain[selection].pCert;
4137 viewInfo.cStores = data->pCertViewInfo->cStores;
4138 viewInfo.rghStores = data->pCertViewInfo->rghStores;
4139 viewInfo.cPropSheetPages = data->pCertViewInfo->cPropSheetPages;
4140 viewInfo.rgPropSheetPages = data->pCertViewInfo->rgPropSheetPages;
4141 viewInfo.nStartPage = data->pCertViewInfo->nStartPage;
4142 CryptUIDlgViewCertificateW(&viewInfo, &changed);
4143 if (changed)
4144 {
4145 /* Delete the contents of the tree */
4147 /* Reinitialize the tree */
4149 }
4150 }
4151}
4152
4154 LPARAM lp)
4155{
4157 struct hierarchy_data *data;
4158 LRESULT ret = 0;
4160
4161 TRACE("(%p, %08x, %08lx, %08lx)\n", hwnd, msg, wp, lp);
4162
4163 switch (msg)
4164 {
4165 case WM_INITDIALOG:
4166 page = (PROPSHEETPAGEW *)lp;
4167 data = (struct hierarchy_data *)page->lParam;
4169 break;
4170 case WM_NOTIFY:
4171 {
4172 NMHDR *hdr;
4173
4174 hdr = (NMHDR *)lp;
4175 switch (hdr->code)
4176 {
4177 case TVN_SELCHANGEDW:
4178 {
4179 NMTREEVIEWW *nm = (NMTREEVIEWW*)lp;
4181 CRYPT_PROVIDER_SGNR *provSigner;
4182
4185 provSigner = WTHelperGetProvSignerFromChain(
4186 (CRYPT_PROVIDER_DATA *)data->pCertViewInfo->u.pCryptProviderData,
4187 data->pCertViewInfo->idxSigner,
4188 data->pCertViewInfo->fCounterSigner,
4189 data->pCertViewInfo->idxCounterSigner);
4192 &provSigner->pasCertChain[selection]);
4193 break;
4194 }
4195 case NM_DBLCLK:
4198 ret = 1;
4199 break;
4200 }
4201 break;
4202 }
4203 case WM_COMMAND:
4204 switch (wp)
4205 {
4208 break;
4209 }
4210 break;
4211 case WM_REFRESH_VIEW:
4212 {
4213 TVITEMW item;
4214
4215 /* Get hierarchy data */
4216 memset(&item, 0, sizeof(item));
4217 item.mask = TVIF_HANDLE | TVIF_PARAM;
4219 0);
4221 /* Delete the contents of the tree */
4223 /* Reinitialize the tree */
4225 break;
4226 }
4227 }
4228 return ret;
4229}
4230
4233{
4234 struct hierarchy_data *data;
4235
4236 switch (msg)
4237 {
4238 case PSPCB_RELEASE:
4239 data = (struct hierarchy_data *)page->lParam;
4240#ifndef __REACTOS__
4241 ImageList_Destroy(data->imageList);
4242#endif
4244 break;
4245 }
4246 return 0;
4247}
4248
4251{
4253 sizeof(struct hierarchy_data));
4254 BOOL ret = FALSE;
4255
4256 if (data)
4257 {
4258 data->imageList = ImageList_Create(16, 16, ILC_COLOR4 | ILC_MASK, 2, 0);
4259 if (data->imageList)
4260 {
4261 HBITMAP bmp;
4262 COLORREF backColor = RGB(255, 0, 255);
4263
4264 data->pCertViewInfo = pCertViewInfo;
4265 data->selectedCert = 0xffffffff;
4266
4268 ImageList_AddMasked(data->imageList, bmp, backColor);
4270 ImageList_SetBkColor(data->imageList, CLR_NONE);
4271
4272 memset(page, 0, sizeof(PROPSHEETPAGEW));
4273 page->dwSize = sizeof(PROPSHEETPAGEW);
4274 page->dwFlags = PSP_USECALLBACK;
4275 page->hInstance = hInstance;
4276 page->u.pszTemplate = MAKEINTRESOURCEW(IDD_HIERARCHY);
4277 page->pfnDlgProc = hierarchy_dlg_proc;
4278 page->lParam = (LPARAM)data;
4279 page->pfnCallback = hierarchy_callback;
4280 ret = TRUE;
4281 }
4282 else
4284 }
4285 return ret;
4286}
4287
4289{
4290 RECT rc;
4291
4292 TRACE("(%p, %08x, %08lx)\n", hwnd, msg, lp);
4293
4294 switch (msg)
4295 {
4296 case PSCB_INITIALIZED:
4297 /* Get cancel button's position.. */
4299 MapWindowPoints( 0, hwnd, (POINT *)&rc, 2 );
4300 /* hide the cancel button.. */
4302 /* and move the OK button to the cancel button's original position. */
4303 SetWindowPos(GetDlgItem(hwnd, IDOK), 0, rc.left, rc.top, 0, 0,
4305 break;
4306 }
4307 return 0;
4308}
4309
4311 CRYPT_PROVIDER_CERT *provCert, BOOL *pfPropertiesChanged)
4312{
4313 static const WCHAR riched[] = { 'r','i','c','h','e','d','2','0',0 };
4314 DWORD nPages;
4315 PROPSHEETPAGEW *pages;
4316 BOOL ret = FALSE;
4317 HMODULE lib = LoadLibraryW(riched);
4318
4319 nPages = pCertViewInfo->cPropSheetPages + 1; /* one for the General tab */
4321 nPages++;
4323 nPages++;
4324 pages = HeapAlloc(GetProcessHeap(), 0, nPages * sizeof(PROPSHEETPAGEW));
4325 if (pages)
4326 {
4329 DWORD i;
4330
4331 memset(&hdr, 0, sizeof(hdr));
4332 hdr.dwSize = sizeof(hdr);
4334 hdr.hInstance = hInstance;
4336 hdr.pszCaption = pCertViewInfo->szTitle;
4337 else
4338 hdr.pszCaption = MAKEINTRESOURCEW(IDS_CERTIFICATE);
4339 init_general_page(pCertViewInfo, &pages[hdr.nPages++]);
4341 {
4342 if (init_detail_page(pCertViewInfo, pfPropertiesChanged,
4343 &pages[hdr.nPages]))
4344 hdr.nPages++;
4345 }
4347 {
4348 if (init_hierarchy_page(pCertViewInfo, &pages[hdr.nPages]))
4349 hdr.nPages++;
4350 }
4351 /* Copy each additional page, and create the init dialog struct for it
4352 */
4354 {
4358 if (init)
4359 {
4360 for (i = 0; i < pCertViewInfo->cPropSheetPages; i++)
4361 {
4362 memcpy(&pages[hdr.nPages + i],
4364 sizeof(PROPSHEETPAGEW));
4366 init[i].pCertContext = pCertViewInfo->pCertContext;
4367 pages[hdr.nPages + i].lParam = (LPARAM)&init[i];
4368 }
4369 if (pCertViewInfo->nStartPage & 0x8000)
4370 {
4371 /* Start page index is relative to the number of default
4372 * pages
4373 */
4374 hdr.u2.nStartPage = pCertViewInfo->nStartPage + hdr.nPages;
4375 }
4376 else
4377 hdr.u2.nStartPage = pCertViewInfo->nStartPage;
4378 hdr.nPages = nPages;
4379 ret = TRUE;
4380 }
4381 else
4383 }
4384 else
4385 {
4386 /* Ignore the relative flag if there aren't any additional pages */
4387 hdr.u2.nStartPage = pCertViewInfo->nStartPage & 0x7fff;
4388 ret = TRUE;
4389 }
4390 if (ret)
4391 {
4392 INT_PTR l;
4393
4394 hdr.u3.ppsp = pages;
4395 hdr.pfnCallback = cert_prop_sheet_proc;
4396 l = PropertySheetW(&hdr);
4397 if (l == 0)
4398 {
4400 ret = FALSE;
4401 }
4402 }
4404 HeapFree(GetProcessHeap(), 0, pages);
4405 }
4406 else
4408 FreeLibrary(lib);
4409 return ret;
4410}
4411
4412/***********************************************************************
4413 * CryptUIDlgViewCertificateW (CRYPTUI.@)
4414 */
4417{
4418 static GUID generic_cert_verify = WINTRUST_ACTION_GENERIC_CERT_VERIFY;
4420 WINTRUST_DATA wvt;
4422 BOOL ret = FALSE;
4423 CRYPT_PROVIDER_SGNR *signer;
4424 CRYPT_PROVIDER_CERT *provCert = NULL;
4425
4426 TRACE("(%p, %p)\n", pCertViewInfo, pfPropertiesChanged);
4427
4429 {
4431 return FALSE;
4432 }
4433 /* Make a local copy in case we have to call WinVerifyTrust ourselves */
4434 memcpy(&viewInfo, pCertViewInfo, sizeof(viewInfo));
4436 {
4437 memset(&wvt, 0, sizeof(wvt));
4438 wvt.cbStruct = sizeof(wvt);
4439 wvt.dwUIChoice = WTD_UI_NONE;
4440 if (viewInfo.dwFlags &
4448 memset(&cert, 0, sizeof(cert));
4449 cert.cbStruct = sizeof(cert);
4450 cert.psCertContext = (CERT_CONTEXT *)viewInfo.pCertContext;
4451 cert.chStores = viewInfo.cStores;
4452 cert.pahStores = viewInfo.rghStores;
4453 wvt.u.pCert = &cert;
4455 WinVerifyTrust(NULL, &generic_cert_verify, &wvt);
4456 viewInfo.u.pCryptProviderData =
4459 (CRYPT_PROVIDER_DATA *)viewInfo.u.pCryptProviderData, 0, FALSE, 0);
4460 provCert = WTHelperGetProvCertFromChain(signer, 0);
4461 ret = TRUE;
4462 }
4463 else
4464 {
4465 viewInfo.u.pCryptProviderData =
4469 viewInfo.idxSigner, viewInfo.fCounterSigner,
4470 viewInfo.idxCounterSigner);
4471 provCert = WTHelperGetProvCertFromChain(signer, viewInfo.idxCert);
4472 ret = TRUE;
4473 }
4474 if (ret)
4475 {
4476 ret = show_cert_dialog(&viewInfo, provCert, pfPropertiesChanged);
4478 {
4480 WinVerifyTrust(NULL, &generic_cert_verify, &wvt);
4481 }
4482 }
4483 return ret;
4484}
4485
4486/***********************************************************************
4487 * CryptUIDlgViewContext (CRYPTUI.@)
4488 */
4491{
4492 BOOL ret;
4493
4494 TRACE("(%d, %p, %p, %s, %08x, %p)\n", dwContextType, pvContext, hwnd,
4495 debugstr_w(pwszTitle), dwFlags, pvReserved);
4496
4497 switch (dwContextType)
4498 {
4500 {
4502
4503 memset(&viewInfo, 0, sizeof(viewInfo));
4504 viewInfo.dwSize = sizeof(viewInfo);
4505 viewInfo.hwndParent = hwnd;
4506 viewInfo.szTitle = pwszTitle;
4507 viewInfo.pCertContext = pvContext;
4508 ret = CryptUIDlgViewCertificateW(&viewInfo, NULL);
4509 break;
4510 }
4511 default:
4512 FIXME("unimplemented for context type %d\n", dwContextType);
4514 ret = FALSE;
4515 }
4516 return ret;
4517}
4518
4519/* Decodes a cert's basic constraints extension (either szOID_BASIC_CONSTRAINTS
4520 * or szOID_BASIC_CONSTRAINTS2, whichever is present) to determine if it
4521 * should be a CA. If neither extension is present, returns
4522 * defaultIfNotSpecified.
4523 */
4524static BOOL is_ca_cert(PCCERT_CONTEXT cert, BOOL defaultIfNotSpecified)
4525{
4526 BOOL isCA = defaultIfNotSpecified;
4528 cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension);
4529
4530 if (ext)
4531 {
4533 DWORD size = 0;
4534
4536 ext->Value.pbData, ext->Value.cbData, CRYPT_DECODE_ALLOC_FLAG,
4537 NULL, &info, &size))
4538 {
4539 if (info->SubjectType.cbData == 1)
4540 isCA = info->SubjectType.pbData[0] & CERT_CA_SUBJECT_FLAG;
4541 LocalFree(info);
4542 }
4543 }
4544 else
4545 {
4547 cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension);
4548 if (ext)
4549 {
4552
4554 szOID_BASIC_CONSTRAINTS2, ext->Value.pbData, ext->Value.cbData,
4555 0, NULL, &info, &size))
4556 isCA = info.fCA;
4557 }
4558 }
4559 return isCA;
4560}
4561
4563{
4564 LPCWSTR storeName;
4565
4566 if (is_ca_cert(cert, TRUE))
4567 storeName = ca;
4568 else
4569 storeName = addressBook;
4572}
4573
4575{
4576 HCERTSTORE store;
4577 BOOL ret;
4578
4579 if (!cert)
4580 {
4582 return FALSE;
4583 }
4584 if (hDestCertStore) store = hDestCertStore;
4585 else
4586 {
4587 if (!(store = choose_store_for_cert(cert)))
4588 {
4589 WARN("unable to open certificate store\n");
4590 return FALSE;
4591 }
4592 }
4595 if (!hDestCertStore) CertCloseStore(store, 0);
4596 return ret;
4597}
4598
4600{
4601 HCERTSTORE store;
4602 BOOL ret;
4603
4604 if (!crl)
4605 {
4607 return FALSE;
4608 }
4609 if (hDestCertStore) store = hDestCertStore;
4610 else
4611 {
4612 if (!(store = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, 0,
4614 {
4615 WARN("unable to open certificate store\n");
4616 return FALSE;
4617 }
4618 }
4621 if (!hDestCertStore) CertCloseStore(store, 0);
4622 return ret;
4623}
4624
4626{
4627 HCERTSTORE store;
4628 BOOL ret;
4629
4630 if (!ctl)
4631 {
4633 return FALSE;
4634 }
4635 if (hDestCertStore) store = hDestCertStore;
4636 else
4637 {
4638 static const WCHAR trust[] = { 'T','r','u','s','t',0 };
4639
4640 if (!(store = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, 0,
4642 {
4643 WARN("unable to open certificate store\n");
4644 return FALSE;
4645 }
4646 }
4647 ret = CertAddCTLContextToStore(store, ctl,
4649 if (!hDestCertStore) CertCloseStore(store, 0);
4650 return ret;
4651}
4652
4653/* Checks type, a type such as CERT_QUERY_CONTENT_CERT returned by
4654 * CryptQueryObject, against the allowed types. Returns TRUE if the
4655 * type is allowed, FALSE otherwise.
4656 */
4658{
4659 BOOL ret;
4660
4661 if (dwFlags &
4664 {
4665 switch (type)
4666 {
4670 break;
4674 break;
4678 break;
4679 default:
4680 /* The remaining types contain more than one type, so allow
4681 * any combination.
4682 */
4683 ret = TRUE;
4684 }
4685 }
4686 else
4687 {
4688 /* No allowed types specified, so any type is allowed */
4689 ret = TRUE;
4690 }
4691 if (!ret)
4693 return ret;
4694}
4695
4696
4698 int warningID)
4699{
4700 if (!(dwFlags & CRYPTUI_WIZ_NO_UI))
4701 {
4703 LPCWSTR pTitle;
4704
4705 if (szTitle)
4706 pTitle = szTitle;
4707 else
4708 {
4710 pTitle = title;
4711 }
4714 }
4715}
4716
4718{
4720}
4721
4723{
4724 BOOL ret;
4725
4726 if (dwFlags &
4729 {
4732 PCCTL_CONTEXT ctl;
4733
4734 ret = TRUE;
4735 if ((cert = CertEnumCertificatesInStore(store, NULL)))
4736 {
4739 ret = FALSE;
4740 }
4741 if (ret && (crl = CertEnumCRLsInStore(store, NULL)))
4742 {
4745 ret = FALSE;
4746 }
4747 if (ret && (ctl = CertEnumCTLsInStore(store, NULL)))
4748 {
4749 CertFreeCTLContext(ctl);
4751 ret = FALSE;
4752 }
4753 }
4754 else
4755 ret = TRUE;
4756 if (!ret)
4758 return ret;
4759}
4760
4763{
4764 BOOL ret;
4765
4767 {
4770 PCCTL_CONTEXT ctl = NULL;
4771
4772 do {
4774 if (cert)
4776 } while (ret && cert);
4777 do {
4779 if (crl)
4780 ret = import_crl(crl, dest);
4781 } while (ret && crl);
4782 do {
4783 ctl = CertEnumCTLsInStore(source, ctl);
4784 if (ctl)
4785 ret = import_ctl(ctl, dest);
4786 } while (ret && ctl);
4787 }
4788 else
4790 return ret;
4791}
4792
4794 DWORD *pContentType)
4795{
4796 HCERTSTORE store = NULL;
4797 DWORD contentType = 0, expectedContentTypeFlags;
4798
4799 if (dwFlags &
4802 {
4803 expectedContentTypeFlags =
4808 expectedContentTypeFlags |=
4812 expectedContentTypeFlags |=
4816 expectedContentTypeFlags |=
4819 }
4820 else
4821 expectedContentTypeFlags =
4831
4833 expectedContentTypeFlags, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL,
4834 &contentType, NULL, &store, NULL, NULL);
4835 if (pContentType)
4836 *pContentType = contentType;
4837 return store;
4838}
4839
4841 LPCWSTR fileName, HCERTSTORE dest)
4842{
4844 BOOL ret;
4845
4846 if ((source = open_store_from_file(dwFlags, fileName, NULL)))
4847 {
4850 }
4851 else
4852 ret = FALSE;
4853 return ret;
4854}
4855
4857{
4869};
4870
4872 LPARAM lp)
4873{
4874 LRESULT ret = 0;
4875
4876 switch (msg)
4877 {
4878 case WM_INITDIALOG:
4879 {
4880 struct ImportWizData *data;
4882 WCHAR fontFace[MAX_STRING_LEN];
4883 HDC hDC = GetDC(hwnd);
4884 int height;
4885
4886 data = (struct ImportWizData *)page->lParam;
4889 data->titleFont = CreateFontW(height, 0, 0, 0, FW_BOLD, 0, 0, 0,
4893 (WPARAM)data->titleFont, TRUE);
4894 ReleaseDC(hwnd, hDC);
4895 break;
4896 }
4897 case WM_NOTIFY:
4898 {
4899 NMHDR *hdr = (NMHDR *)lp;
4900
4901 switch (hdr->code)
4902 {
4903 case PSN_SETACTIVE:
4905 ret = TRUE;
4906 break;
4907 }
4908 break;
4909 }
4910 }
4911 return ret;
4912}
4913
4914static const WCHAR filter_cert[] = { '*','.','c','e','r',';','*','.',
4915 'c','r','t',0 };
4916static const WCHAR filter_pfx[] = { '*','.','p','f','x',';','*','.',
4917 'p','1','2',0 };
4918static const WCHAR filter_crl[] = { '*','.','c','r','l',0 };
4919static const WCHAR filter_ctl[] = { '*','.','s','t','l',0 };
4920static const WCHAR filter_serialized_store[] = { '*','.','s','s','t',0 };
4921static const WCHAR filter_cms[] = { '*','.','s','p','c',';','*','.',
4922 'p','7','b',0 };
4923static const WCHAR filter_all[] = { '*','.','*',0 };
4924
4925static const struct
4926{
4927 int id;
4930} import_filters[] = {
4939
4941{
4942 DWORD i;
4943 int len, totalLen = 2;
4944 LPWSTR filter = NULL, str;
4945
4946 for (i = 0; i < ARRAY_SIZE(import_filters); i++)
4947 {
4948 if (!import_filters[i].allowFlags || !dwFlags ||
4950 {
4952 totalLen += len + lstrlenW(import_filters[i].filter) + 2;
4953 }
4954 }
4955 filter = HeapAlloc(GetProcessHeap(), 0, totalLen * sizeof(WCHAR));
4956 if (filter)
4957 {
4958 LPWSTR ptr;
4959
4960 ptr = filter;
4961 for (i = 0; i < ARRAY_SIZE(import_filters); i++)
4962 {
4963 if (!import_filters[i].allowFlags || !dwFlags ||
4965 {
4967 (LPWSTR)&str, 0);
4968 memcpy(ptr, str, len * sizeof(WCHAR));
4969 ptr += len;
4970 *ptr++ = 0;
4973 }
4974 }
4975 *ptr++ = 0;
4976 }
4977 return filter;
4978}
4979
4982{
4983 HANDLE file;
4984 BOOL ret = FALSE;
4985
4987 OPEN_EXISTING, 0, NULL);
4989 {
4991 &data->contentType);
4992 int warningID = 0;
4993
4994 if (!source)
4995 warningID = IDS_IMPORT_BAD_FORMAT;
4996 else if (!check_store_context_type(data->dwFlags, source))
4997 warningID = IDS_IMPORT_TYPE_MISMATCH;
4998 else
4999 {
5000 data->importSrc.dwSubjectChoice =
5002 data->importSrc.u.hCertStore = source;
5003 data->freeSource = TRUE;
5004 ret = TRUE;
5005 }
5006 if (warningID)
5007 {
5008 import_warning(data->dwFlags, hwnd, data->pwszWizardTitle,
5009 warningID);
5010 }
5012 }
5013 else
5014 {
5016 LPCWSTR pTitle;
5017 LPWSTR msgBuf, fullError;
5018
5019 if (data->pwszWizardTitle)
5020 pTitle = data->pwszWizardTitle;
5021 else
5022 {
5024 pTitle = title;
5025 }
5029 GetLastError(), 0, (LPWSTR) &msgBuf, 0, NULL);
5030 fullError = HeapAlloc(GetProcessHeap(), 0,
5031 (lstrlenW(error) + lstrlenW(fileName) + lstrlenW(msgBuf) + 3)
5032 * sizeof(WCHAR));
5033 if (fullError)
5034 {
5035 LPWSTR ptr = fullError;
5036
5037 lstrcpyW(ptr, error);
5038 ptr += lstrlenW(error);
5040 ptr += lstrlenW(fileName);
5041 *ptr++ = ':';
5042 *ptr++ = '\n';
5043 lstrcpyW(ptr, msgBuf);
5044 MessageBoxW(hwnd, fullError, pTitle, MB_ICONERROR | MB_OK);
5045 HeapFree(GetProcessHeap(), 0, fullError);
5046 }
5047 LocalFree(msgBuf);
5048 }
5049 return ret;
5050}
5051
5053 LPARAM lp)
5054{
5055 LRESULT ret = 0;
5056 struct ImportWizData *data;
5057
5058 switch (msg)
5059 {
5060 case WM_INITDIALOG:
5061 {
5063
5064 data = (struct ImportWizData *)page->lParam;
5066 if (data->fileName)
5067 {
5068 HWND fileNameEdit = GetDlgItem(hwnd, IDC_IMPORT_FILENAME);
5069
5070 SendMessageW(fileNameEdit, WM_SETTEXT, 0, (LPARAM)data->fileName);
5071 }
5072 break;
5073 }
5074 case WM_NOTIFY:
5075 {
5076 NMHDR *hdr = (NMHDR *)lp;
5077
5078 switch (hdr->code)
5079 {
5080 case PSN_SETACTIVE:
5083 ret = TRUE;
5084 break;
5085 case PSN_WIZNEXT:
5086 {
5087 HWND fileNameEdit = GetDlgItem(hwnd, IDC_IMPORT_FILENAME);
5088 DWORD len = SendMessageW(fileNameEdit, WM_GETTEXTLENGTH, 0, 0);
5089
5091 if (!len)
5092 {
5093 import_warning(data->dwFlags, hwnd, data->pwszWizardTitle,
5096 ret = 1;
5097 }
5098 else
5099 {
5101 (len + 1) * sizeof(WCHAR));
5102
5103 if (fileName)
5104 {
5105 SendMessageW(fileNameEdit, WM_GETTEXT, len + 1,
5106 (LPARAM)fileName);
5108 {
5111 ret = 1;
5112 }
5113 else
5114 data->fileName = fileName;
5115 }
5116 }
5117 break;
5118 }
5119 }
5120 break;
5121 }
5122 case WM_COMMAND:
5123 switch (wp)
5124 {
5126 {
5128 WCHAR fileBuf[MAX_PATH];
5129
5131 memset(&ofn, 0, sizeof(ofn));
5132 ofn.lStructSize = sizeof(ofn);
5133 ofn.hwndOwner = hwnd;
5135 ofn.lpstrFile = fileBuf;
5136 ofn.nMaxFile = ARRAY_SIZE(fileBuf);
5137#ifdef __REACTOS__
5139#endif
5140 fileBuf[0] = 0;
5141 if (GetOpenFileNameW(&ofn))
5143 0, (LPARAM)ofn.lpstrFile);
5145 break;
5146 }
5147 }
5148 break;
5149 }
5150 return ret;
5151}
5152
5154 LPARAM lp)
5155{
5156 LRESULT ret = 0;
5157 struct ImportWizData *data;
5158
5159 switch (msg)
5160 {
5161 case WM_INITDIALOG:
5162 {
5164
5165 data = (struct ImportWizData *)page->lParam;
5167 if (!data->hDestCertStore)
5168 {
5170 0, 0);
5174 }
5175 else
5176 {
5177 WCHAR storeTitle[MAX_STRING_LEN];
5178
5180 0, 0);
5187 0, (LPARAM)storeTitle);
5188 }
5189 break;
5190 }
5191 case WM_NOTIFY:
5192 {
5193 NMHDR *hdr = (NMHDR *)lp;
5194
5195 switch (hdr->code)
5196 {
5197 case PSN_SETACTIVE:
5200 ret = TRUE;
5201 break;
5202 case PSN_WIZNEXT:
5203 {
5206 !data->hDestCertStore)
5207 {
5208 import_warning(data->dwFlags, hwnd, data->pwszWizardTitle,
5211 ret = 1;
5212 }
5213 break;
5214 }
5215 }
5216 break;
5217 }
5218 case WM_COMMAND:
5219 switch (wp)
5220 {
5223 data->autoDest = TRUE;
5226 break;
5229 data->autoDest = FALSE;
5232 break;
5234 {
5237 CRYPTUI_ENUM_DATA enumData = { 0, NULL, 1, &enumArgs };
5238 CRYPTUI_SELECTSTORE_INFO_W selectInfo;
5239 HCERTSTORE store;
5240
5242 selectInfo.dwSize = sizeof(selectInfo);
5243 selectInfo.parent = hwnd;
5245 selectInfo.pwszTitle = NULL;
5246 selectInfo.pwszText = NULL;
5247 selectInfo.pEnumData = &enumData;
5248 selectInfo.pfnSelectedStoreCallback = NULL;
5249 if ((store = CryptUIDlgSelectStoreW(&selectInfo)))
5250 {
5251 WCHAR storeTitle[MAX_STRING_LEN];
5252
5254 ARRAY_SIZE(storeTitle));
5256 0, (LPARAM)storeTitle);
5257 data->hDestCertStore = store;
5258 data->freeDest = TRUE;
5259 }
5260 break;
5261 }
5262 }
5263 break;
5264 }
5265 return ret;
5266}
5267
5269{
5271 LVITEMW item;
5272 int contentID;
5273
5274 item.mask = LVIF_TEXT;
5275 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
5276 item.iSubItem = 0;
5278 item.pszText = text;
5280 item.iSubItem = 1;
5281 if (data->autoDest)
5283 else
5286 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
5287 item.iSubItem = 0;
5290 switch (data->contentType)
5291 {
5294 contentID = IDS_IMPORT_CONTENT_CERT;
5295 break;
5298 contentID = IDS_IMPORT_CONTENT_CRL;
5299 break;
5302 contentID = IDS_IMPORT_CONTENT_CTL;
5303 break;
5305 contentID = IDS_IMPORT_CONTENT_CMS;
5306 break;
5308 contentID = IDS_IMPORT_CONTENT_PFX;
5309 break;
5310 default:
5311 contentID = IDS_IMPORT_CONTENT_STORE;
5312 break;
5313 }
5314 LoadStringW(hInstance, contentID, text, ARRAY_SIZE(text));
5315 item.iSubItem = 1;
5317 if (data->fileName)
5318 {
5319 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
5320 item.iSubItem = 0;
5323 item.iSubItem = 1;
5324 item.pszText = data->fileName;
5326 }
5327}
5328
5331{
5332 BOOL ret;
5333
5334 switch (pImportSrc->dwSubjectChoice)
5335 {
5338 pImportSrc->u.pwszFileName, hDestCertStore);
5339 break;
5342 ret = import_cert(pImportSrc->u.pCertContext, hDestCertStore);
5343 else
5345 break;
5348 ret = import_crl(pImportSrc->u.pCRLContext, hDestCertStore);
5349 else
5351 break;
5354 ret = import_ctl(pImportSrc->u.pCTLContext, hDestCertStore);
5355 else
5357 break;
5360 pImportSrc->u.hCertStore, hDestCertStore);
5361 break;
5362 default:
5363 WARN("unknown source type: %u\n", pImportSrc->dwSubjectChoice);
5365 ret = FALSE;
5366 }
5367 return ret;
5368}
5369
5371 LPARAM lp)
5372{
5373 LRESULT ret = 0;
5374 struct ImportWizData *data;
5375
5376 switch (msg)
5377 {
5378 case WM_INITDIALOG:
5379 {
5382 RECT rc;
5384
5385 data = (struct ImportWizData *)page->lParam;
5388 (WPARAM)data->titleFont, TRUE);
5389 GetWindowRect(lv, &rc);
5390 column.mask = LVCF_WIDTH;
5391 column.cx = (rc.right - rc.left) / 2 - 2;
5395 break;
5396 }
5397 case WM_NOTIFY:
5398 {
5399 NMHDR *hdr = (NMHDR *)lp;
5400
5401 switch (hdr->code)
5402 {
5403 case PSN_SETACTIVE:
5404 {
5406
5412 ret = TRUE;
5413 break;
5414 }
5415 case PSN_WIZFINISH:
5416 {
5418 if ((data->success = do_import(data->dwFlags, hwnd,
5419 data->pwszWizardTitle, &data->importSrc, data->hDestCertStore)))
5420 {
5422 LPCWSTR pTitle;
5423
5424 if (data->pwszWizardTitle)
5425 pTitle = data->pwszWizardTitle;
5426 else
5427 {
5429 pTitle = title;
5430 }
5432 MessageBoxW(hwnd, message, pTitle, MB_OK);
5433 }
5434 else
5435 import_warning(data->dwFlags, hwnd, data->pwszWizardTitle,
5437 break;
5438 }
5439 }
5440 break;
5441 }
5442 }
5443 return ret;
5444}
5445
5449{
5451 PROPSHEETPAGEW pages[4];
5452 struct ImportWizData data;
5453 int nPages = 0;
5454
5456 data.pwszWizardTitle = pwszWizardTitle;
5457 if (pImportSrc)
5458 {
5459 memcpy(&data.importSrc, pImportSrc, sizeof(data.importSrc));
5460 data.fileName = (LPWSTR)pImportSrc->u.pwszFileName;
5461 }
5462 else
5463 {
5464 memset(&data.importSrc, 0, sizeof(data.importSrc));
5465 data.fileName = NULL;
5466 }
5467 data.freeSource = FALSE;
5468 data.hDestCertStore = hDestCertStore;
5469 data.freeDest = FALSE;
5470 data.autoDest = TRUE;
5471 data.success = TRUE;
5472
5473 memset(pages, 0, sizeof(pages));
5474
5475 pages[nPages].dwSize = sizeof(pages[0]);
5476 pages[nPages].hInstance = hInstance;
5478 pages[nPages].pfnDlgProc = import_welcome_dlg_proc;
5479 pages[nPages].dwFlags = PSP_HIDEHEADER;
5480 pages[nPages].lParam = (LPARAM)&data;
5481 nPages++;
5482
5483 if (!pImportSrc ||
5484 pImportSrc->dwSubjectChoice == CRYPTUI_WIZ_IMPORT_SUBJECT_FILE)
5485 {
5486 pages[nPages].dwSize = sizeof(pages[0]);
5487 pages[nPages].hInstance = hInstance;
5488 pages[nPages].u.pszTemplate = MAKEINTRESOURCEW(IDD_IMPORT_FILE);
5489 pages[nPages].pfnDlgProc = import_file_dlg_proc;
5490 pages[nPages].dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
5491 pages[nPages].pszHeaderTitle = MAKEINTRESOURCEW(IDS_IMPORT_FILE_TITLE);
5492 pages[nPages].pszHeaderSubTitle =
5494 pages[nPages].lParam = (LPARAM)&data;
5495 nPages++;
5496 }
5497 else
5498 {
5499 switch (pImportSrc->dwSubjectChoice)
5500 {
5502 data.contentType = CERT_QUERY_CONTENT_CERT;
5503 break;
5505 data.contentType = CERT_QUERY_CONTENT_CRL;
5506 break;
5508 data.contentType = CERT_QUERY_CONTENT_CTL;
5509 break;
5512 break;
5513 }
5514 }
5515
5516 pages[nPages].dwSize = sizeof(pages[0]);
5517 pages[nPages].hInstance = hInstance;
5519 pages[nPages].pfnDlgProc = import_store_dlg_proc;
5520 pages[nPages].dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
5521 pages[nPages].pszHeaderTitle = MAKEINTRESOURCEW(IDS_IMPORT_STORE_TITLE);
5522 pages[nPages].pszHeaderSubTitle =
5524 pages[nPages].lParam = (LPARAM)&data;
5525 nPages++;
5526
5527 pages[nPages].dwSize = sizeof(pages[0]);
5528 pages[nPages].hInstance = hInstance;
5530 pages[nPages].pfnDlgProc = import_finish_dlg_proc;
5531 pages[nPages].dwFlags = PSP_HIDEHEADER;
5532 pages[nPages].lParam = (LPARAM)&data;
5533 nPages++;
5534
5535 memset(&hdr, 0, sizeof(hdr));
5536 hdr.dwSize = sizeof(hdr);
5537 hdr.hwndParent = hwndParent;
5538 hdr.dwFlags = PSH_PROPSHEETPAGE | PSH_WIZARD97_NEW | PSH_HEADER |
5539 PSH_WATERMARK;
5540 hdr.hInstance = hInstance;
5541 if (pwszWizardTitle)
5542 hdr.pszCaption = pwszWizardTitle;
5543 else
5545 hdr.u3.ppsp = pages;
5546 hdr.nPages = nPages;
5547 hdr.u4.pszbmWatermark = MAKEINTRESOURCEW(IDB_CERT_WATERMARK);
5548 hdr.u5.pszbmHeader = MAKEINTRESOURCEW(IDB_CERT_HEADER);
5550 if (data.fileName != data.importSrc.u.pwszFileName)
5551 HeapFree(GetProcessHeap(), 0, data.fileName);
5552 if (data.freeSource &&
5553 data.importSrc.dwSubjectChoice == CRYPTUI_WIZ_IMPORT_SUBJECT_CERT_STORE)
5554 CertCloseStore(data.importSrc.u.hCertStore, 0);
5555 DeleteObject(data.titleFont);
5556 return data.success;
5557}
5558
5561{
5562 BOOL ret;
5563
5564 TRACE("(0x%08x, %p, %s, %p, %p)\n", dwFlags, hwndParent, debugstr_w(pwszWizardTitle),
5566
5567 if (pImportSrc &&
5568 pImportSrc->dwSize != sizeof(CRYPTUI_WIZ_IMPORT_SRC_INFO))
5569 {
5571 return FALSE;
5572 }
5573
5574 if (!(dwFlags & CRYPTUI_WIZ_NO_UI))
5577 else if (pImportSrc)
5580 else
5581 {
5582 /* Can't have no UI without specifying source */
5584 ret = FALSE;
5585 }
5586
5587 return ret;
5588}
5589
5591{
5603};
5604
5606 LPARAM lp)
5607{
5608 LRESULT ret = 0;
5609
5610 switch (msg)
5611 {
5612 case WM_INITDIALOG:
5613 {
5614 struct ExportWizData *data;
5616 WCHAR fontFace[MAX_STRING_LEN];
5617 HDC hDC = GetDC(hwnd);
5618 int height;
5619
5620 data = (struct ExportWizData *)page->lParam;
5623 data->titleFont = CreateFontW(height, 0, 0, 0, FW_BOLD, 0, 0, 0,
5627 (WPARAM)data->titleFont, TRUE);
5628 ReleaseDC(hwnd, hDC);
5629 break;
5630 }
5631 case WM_NOTIFY:
5632 {
5633 NMHDR *hdr = (NMHDR *)lp;
5634
5635 switch (hdr->code)
5636 {
5637 case PSN_SETACTIVE:
5639 ret = TRUE;
5640 break;
5641 }
5642 break;
5643 }
5644 }
5645 return ret;
5646}
5647
5649{
5651 DWORD size;
5652
5654 NULL, &size))
5655 {
5657 if (info)
5658 {
5661 {
5663 info = NULL;
5664 }
5665 }
5666 }
5667 return info;
5668}
5669
5671 HCRYPTPROV *phProv)
5672{
5673 BOOL ret;
5674
5675 ret = CryptAcquireContextW(phProv, info->pwszContainerName,
5676 info->pwszProvName, info->dwProvType, 0);
5677 if (ret)
5678 {
5679 DWORD i;
5680
5681 for (i = 0; i < info->cProvParam; i++)
5682 CryptSetProvParam(*phProv, info->rgProvParam[i].dwParam,
5683 info->rgProvParam[i].pbData, info->rgProvParam[i].dwFlags);
5684 }
5685 return ret;
5686}
5687
5689{
5690 BOOL ret;
5691 HCRYPTKEY key;
5692
5693 if ((ret = CryptGetUserKey(hProv, keySpec, &key)))
5694 {
5695 DWORD permissions, size = sizeof(permissions);
5696
5697 if ((ret = CryptGetKeyParam(key, KP_PERMISSIONS, (BYTE *)&permissions,
5698 &size, 0)) && !(permissions & CRYPT_EXPORT))
5699 ret = FALSE;
5701 }
5702 return ret;
5703}
5704
5706 WPARAM wp, LPARAM lp)
5707{
5708 LRESULT ret = 0;
5709 struct ExportWizData *data;
5710
5711 switch (msg)
5712 {
5713 case WM_INITDIALOG:
5714 {
5717 HCRYPTPROV hProv = 0;
5718 int errorID = 0;
5719
5720 data = (struct ExportWizData *)page->lParam;
5722 /* Get enough information about a key to see whether it's exportable.
5723 */
5725 data->exportInfo.u.pCertContext)))
5729 else if (!export_is_key_exportable(hProv, info->dwKeySpec))
5731
5732 if (errorID)
5733 {
5735
5738 WM_SETTEXT, 0, (LPARAM)error);
5740 }
5741 else
5742 data->keyProvInfo = info;
5743 if (hProv)
5746 0, 0);
5747 break;
5748 }
5749 case WM_NOTIFY:
5750 {
5751 NMHDR *hdr = (NMHDR *)lp;
5752
5753 switch (hdr->code)
5754 {
5755 case PSN_SETACTIVE:
5758 ret = TRUE;
5759 break;
5760 case PSN_WIZNEXT:
5763 {
5764 data->contextInfo.dwExportFormat =
5766 data->contextInfo.fExportPrivateKeys = FALSE;
5767 }
5768 else
5769 {
5770 data->contextInfo.dwExportFormat =
5772 data->contextInfo.fExportPrivateKeys = TRUE;
5773 }
5774 break;
5775 }
5776 break;
5777 }
5778 }
5779 return ret;
5780}
5781
5783{
5784 BOOL ret = FALSE;
5785
5787 {
5788 DWORD size;
5789
5790 /* If there's a CRYPT_KEY_PROV_INFO set for this cert, assume the
5791 * cert has a private key.
5792 */
5795 ret = TRUE;
5796 }
5797 return ret;
5798}
5799
5801{
5802 int defaultFormatID;
5803
5804 switch (data->contextInfo.dwExportFormat)
5805 {
5807 defaultFormatID = IDC_EXPORT_FORMAT_BASE64;
5808 break;
5810 defaultFormatID = IDC_EXPORT_FORMAT_CMS;
5811 break;
5813 defaultFormatID = IDC_EXPORT_FORMAT_PFX;
5814 break;
5815 default:
5816 defaultFormatID = IDC_EXPORT_FORMAT_DER;
5817 }
5818 SendMessageW(GetDlgItem(hwnd, defaultFormatID), BM_CLICK, 0, 0);
5819 if (defaultFormatID == IDC_EXPORT_FORMAT_PFX)
5820 {
5825 }
5826 else
5827 {
5832 }
5833}
5834
5836 LPARAM lp)
5837{
5838 LRESULT ret = 0;
5839 struct ExportWizData *data;
5840
5841 switch (msg)
5842 {
5843 case WM_INITDIALOG:
5844 {
5846
5847 data = (struct ExportWizData *)page->lParam;
5850 break;
5851 }
5852 case WM_NOTIFY:
5853 {
5854 NMHDR *hdr = (NMHDR *)lp;
5855
5856 switch (hdr->code)
5857 {
5858 case PSN_SETACTIVE:
5863 ret = TRUE;
5864 break;
5865 case PSN_WIZNEXT:
5866 {
5867 BOOL skipPasswordPage = TRUE;
5868
5871 data->contextInfo.dwExportFormat =
5874 data->contextInfo.dwExportFormat =
5877 {
5878 data->contextInfo.dwExportFormat =
5881 data->contextInfo.fExportChain =
5883 }
5884 else
5885 {
5886 data->contextInfo.dwExportFormat =
5889 data->contextInfo.fExportChain = TRUE;
5891 data->contextInfo.fStrongEncryption = TRUE;
5893 data->deleteKeys = TRUE;
5894 skipPasswordPage = FALSE;
5895 }
5897 skipPasswordPage ? IDD_EXPORT_FILE : 0);
5898 ret = 1;
5899 break;
5900 }
5901 }
5902 break;
5903 }
5904 case WM_COMMAND:
5905 switch (HIWORD(wp))
5906 {
5907 case BN_CLICKED:
5908 switch (LOWORD(wp))
5909 {
5913 FALSE);
5915 FALSE);
5917 FALSE);
5920 break;
5923 TRUE);
5924 break;
5927 TRUE);
5929 TRUE);
5932 break;
5933 }
5934 break;
5935 }
5936 break;
5937 }
5938 return ret;
5939}
5940
5942{
5944 LPCWSTR pTitle;
5945
5946 if (data->pwszWizardTitle)
5947 pTitle = data->pwszWizardTitle;
5948 else
5949 {
5951 pTitle = title;
5952 }
5956}
5957
5959 WPARAM wp, LPARAM lp)
5960{
5961 LRESULT ret = 0;
5962 struct ExportWizData *data;
5963
5964 switch (msg)
5965 {
5966 case WM_INITDIALOG:
5967 {
5969
5970 data = (struct ExportWizData *)page->lParam;
5972 break;
5973 }
5974 case WM_NOTIFY:
5975 {
5976 NMHDR *hdr = (NMHDR *)lp;
5977
5978 switch (hdr->code)
5979 {
5980 case PSN_SETACTIVE:
5983 ret = TRUE;
5984 break;
5985 case PSN_WIZNEXT:
5986 {
5987 HWND passwordEdit = GetDlgItem(hwnd, IDC_EXPORT_PASSWORD);
5988 HWND passwordConfirmEdit = GetDlgItem(hwnd,
5990 DWORD passwordLen = SendMessageW(passwordEdit, WM_GETTEXTLENGTH,
5991 0, 0);
5992 DWORD passwordConfirmLen = SendMessageW(passwordConfirmEdit,
5993 WM_GETTEXTLENGTH, 0, 0);
5994
5996 if (!passwordLen && !passwordConfirmLen)
5997 data->contextInfo.pwszPassword = NULL;
5998 else if (passwordLen != passwordConfirmLen)
5999 {
6002 ret = 1;
6003 }
6004 else
6005 {
6007 (passwordLen + 1) * sizeof(WCHAR));
6008 LPWSTR passwordConfirm = HeapAlloc(GetProcessHeap(), 0,
6009 (passwordConfirmLen + 1) * sizeof(WCHAR));
6011
6012 if (password && passwordConfirm)
6013 {
6014 SendMessageW(passwordEdit, WM_GETTEXT, passwordLen + 1,
6015 (LPARAM)password);
6016 SendMessageW(passwordConfirmEdit, WM_GETTEXT,
6017 passwordConfirmLen + 1, (LPARAM)passwordConfirm);
6018 if (lstrcmpW(password, passwordConfirm))
6019 {
6022 ret = 1;
6023 }
6024 else
6025 {
6026 data->contextInfo.pwszPassword = password;
6028 data->freePassword = TRUE;
6029 }
6030 }
6031 if (freePassword)
6033 HeapFree(GetProcessHeap(), 0, passwordConfirm);
6034 }
6035 break;
6036 }
6037 }
6038 break;
6039 }
6040 }
6041 return ret;
6042}
6043
6046{
6047 static const WCHAR cer[] = { '.','c','e','r',0 };
6048 static const WCHAR crl[] = { '.','c','r','l',0 };
6049 static const WCHAR ctl[] = { '.','c','t','l',0 };
6050 static const WCHAR p7b[] = { '.','p','7','b',0 };
6051 static const WCHAR pfx[] = { '.','p','f','x',0 };
6052 static const WCHAR sst[] = { '.','s','s','t',0 };
6053 LPCWSTR extension;
6054 LPWSTR dot;
6055 BOOL appendExtension;
6056
6057 switch (data->contextInfo.dwExportFormat)
6058 {
6060 extension = p7b;
6061 break;
6063 extension = pfx;
6064 break;
6065 default:
6066 switch (data->exportInfo.dwSubjectChoice)
6067 {
6069 extension = crl;
6070 break;
6072 extension = ctl;
6073 break;
6075 extension = sst;
6076 break;
6077 default:
6078 extension = cer;
6079 }
6080 }
6081 dot = wcsrchr(fileName, '.');
6082 if (dot)
6083 appendExtension = wcsicmp(dot, extension) != 0;
6084 else
6085 appendExtension = TRUE;
6086 if (appendExtension)
6087 {
6089 (lstrlenW(fileName) + lstrlenW(extension) + 1) * sizeof(WCHAR));
6090 if (fileName)
6091 lstrcatW(fileName, extension);
6092 }
6093 return fileName;
6094}
6095
6098{
6099 HANDLE file;
6100 BOOL tryCreate = TRUE, forceCreate = FALSE, ret = FALSE;
6101
6105 {
6107 LPCWSTR pTitle;
6108
6109 if (data->pwszWizardTitle)
6110 pTitle = data->pwszWizardTitle;
6111 else
6112 {
6114 pTitle = title;
6115 }
6117 if (MessageBoxW(hwnd, warning, pTitle, MB_YESNO) == IDYES)
6118 forceCreate = TRUE;
6119 else
6120 tryCreate = FALSE;
6122 }
6123 if (tryCreate)
6124 {
6127 forceCreate ? CREATE_ALWAYS : CREATE_NEW,
6128 0, NULL);
6130 {
6131 data->file = file;
6132 ret = TRUE;
6133 }
6134 else
6135 {
6137 LPCWSTR pTitle;
6138 LPWSTR msgBuf, fullError;
6139
6140 if (data->pwszWizardTitle)
6141 pTitle = data->pwszWizardTitle;
6142 else
6143 {
6145 pTitle = title;
6146 }
6150 GetLastError(), 0, (LPWSTR) &msgBuf, 0, NULL);
6151 fullError = HeapAlloc(GetProcessHeap(), 0,
6152 (lstrlenW(error) + lstrlenW(fileName) + lstrlenW(msgBuf) + 3)
6153 * sizeof(WCHAR));
6154 if (fullError)
6155 {
6156 LPWSTR ptr = fullError;
6157
6158 lstrcpyW(ptr, error);
6159 ptr += lstrlenW(error);
6161 ptr += lstrlenW(fileName);
6162 *ptr++ = ':';
6163 *ptr++ = '\n';
6164 lstrcpyW(ptr, msgBuf);
6165 MessageBoxW(hwnd, fullError, pTitle, MB_ICONERROR | MB_OK);
6166 HeapFree(GetProcessHeap(), 0, fullError);
6167 }
6168 LocalFree(msgBuf);
6169 }
6170 }
6171 return ret;
6172}
6173
6174static const WCHAR export_filter_cert[] = { '*','.','c','e','r',0 };
6175static const WCHAR export_filter_crl[] = { '*','.','c','r','l',0 };
6176static const WCHAR export_filter_ctl[] = { '*','.','s','t','l',0 };
6177static const WCHAR export_filter_cms[] = { '*','.','p','7','b',0 };
6178static const WCHAR export_filter_pfx[] = { '*','.','p','f','x',0 };
6179static const WCHAR export_filter_sst[] = { '*','.','s','s','t',0 };
6180
6181static WCHAR *make_export_file_filter(DWORD exportFormat, DWORD subjectChoice)
6182{
6183 int baseLen, allLen, totalLen = 2, baseID;
6184 LPWSTR filter = NULL, baseFilter, all;
6185 LPCWSTR filterStr;
6186
6187 switch (exportFormat)
6188 {
6191 filterStr = export_filter_cert;
6192 break;
6194 baseID = IDS_EXPORT_FILTER_PFX;
6195 filterStr = export_filter_pfx;
6196 break;
6198 baseID = IDS_EXPORT_FILTER_CMS;
6199 filterStr = export_filter_cms;
6200 break;
6201 default:
6202 switch (subjectChoice)
6203 {
6205 baseID = IDS_EXPORT_FILTER_CRL;
6206 filterStr = export_filter_crl;
6207 break;
6209 baseID = IDS_EXPORT_FILTER_CTL;
6210 filterStr = export_filter_ctl;
6211 break;
6214 filterStr = export_filter_sst;
6215 break;
6216 default:
6217 baseID = IDS_EXPORT_FILTER_CERT;
6218 filterStr = export_filter_cert;
6219 break;
6220 }
6221 }
6222 baseLen = LoadStringW(hInstance, baseID, (LPWSTR)&baseFilter, 0);
6223 totalLen += baseLen + lstrlenW(filterStr) + 2;
6225 totalLen += allLen + lstrlenW(filter_all) + 2;
6226 filter = HeapAlloc(GetProcessHeap(), 0, totalLen * sizeof(WCHAR));
6227 if (filter)
6228 {
6229 LPWSTR ptr;
6230
6231 ptr = filter;
6232 memcpy(ptr, baseFilter, baseLen * sizeof(WCHAR));
6233 ptr += baseLen;
6234 *ptr++ = 0;
6235 lstrcpyW(ptr, filterStr);
6236 ptr += lstrlenW(filterStr) + 1;
6237 memcpy(ptr, all, allLen * sizeof(WCHAR));
6238 ptr += allLen;
6239 *ptr++ = 0;
6241 ptr += lstrlenW(filter_all) + 1;
6242 *ptr++ = 0;
6243 }
6244 return filter;
6245}
6246
6248 LPARAM lp)
6249{
6250 LRESULT ret = 0;
6251 struct ExportWizData *data;
6252
6253 switch (msg)
6254 {
6255 case WM_INITDIALOG:
6256 {
6258
6259 data = (struct ExportWizData *)page->lParam;
6261 if (data->exportInfo.pwszExportFileName)
6263 (LPARAM)data->exportInfo.pwszExportFileName);
6264 break;
6265 }
6266 case WM_NOTIFY:
6267 {
6268 NMHDR *hdr = (NMHDR *)lp;
6269
6270 switch (hdr->code)
6271 {
6272 case PSN_WIZBACK:
6274 if (data->contextInfo.dwExportFormat !=
6276 {
6278 ret = 1;
6279 }
6280 break;
6281 case PSN_WIZNEXT:
6282 {
6283 HWND fileNameEdit = GetDlgItem(hwnd, IDC_EXPORT_FILENAME);
6284 DWORD len = SendMessageW(fileNameEdit, WM_GETTEXTLENGTH, 0, 0);
6285
6287 if (!len)
6288 {
6290 LPCWSTR pTitle;
6291
6292 if (data->pwszWizardTitle)
6293 pTitle = data->pwszWizardTitle;
6294 else
6295 {
6297 pTitle = title;
6298 }
6302 ret = 1;
6303 }
6304 else
6305 {
6307 (len + 1) * sizeof(WCHAR));
6308
6309 if (fileName)
6310 {
6311 SendMessageW(fileNameEdit, WM_GETTEXT, len + 1,
6312 (LPARAM)fileName);
6315 {
6318 ret = 1;
6319 }
6320 else
6321 data->fileName = fileName;
6322 }
6323 }
6324 break;
6325 }
6326 case PSN_SETACTIVE:
6329 ret = TRUE;
6330 break;
6331 }
6332 break;
6333 }
6334 case WM_COMMAND:
6335 switch (wp)
6336 {
6338 {
6340 WCHAR fileBuf[MAX_PATH];
6341
6343 memset(&ofn, 0, sizeof(ofn));
6344 ofn.lStructSize = sizeof(ofn);
6345 ofn.hwndOwner = hwnd;
6347 data->contextInfo.dwExportFormat,
6348 data->exportInfo.dwSubjectChoice);
6349 ofn.lpstrFile = fileBuf;
6350 ofn.nMaxFile = ARRAY_SIZE(fileBuf);
6351 fileBuf[0] = 0;
6352 if (GetSaveFileNameW(&ofn))
6354 0, (LPARAM)ofn.lpstrFile);
6356 break;
6357 }
6358 }
6359 break;
6360 }
6361 return ret;
6362}
6363
6364static void show_export_details(HWND lv, const struct ExportWizData *data)
6365{
6367 LVITEMW item;
6368 int contentID;
6369
6370 item.mask = LVIF_TEXT;
6371 if (data->fileName)
6372 {
6373 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
6374 item.iSubItem = 0;
6376 item.pszText = text;
6378 item.iSubItem = 1;
6379 item.pszText = data->fileName;
6381 }
6382
6383 item.pszText = text;
6384 switch (data->exportInfo.dwSubjectChoice)
6385 {
6390 /* do nothing */
6391 break;
6392 default:
6393 {
6394 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
6395 item.iSubItem = 0;
6398 item.iSubItem = 1;
6399 LoadStringW(hInstance, data->contextInfo.fExportChain ? IDS_YES : IDS_NO, text,
6400 ARRAY_SIZE(text));
6402
6403 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
6404 item.iSubItem = 0;
6407 item.iSubItem = 1;
6408 LoadStringW(hInstance, data->contextInfo.fExportPrivateKeys ? IDS_YES : IDS_NO, text,
6409 ARRAY_SIZE(text));
6411 }
6412 }
6413
6414 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
6415 item.iSubItem = 0;
6418
6419 item.iSubItem = 1;
6420 switch (data->exportInfo.dwSubjectChoice)
6421 {
6423 contentID = IDS_EXPORT_FILTER_CRL;
6424 break;
6426 contentID = IDS_EXPORT_FILTER_CTL;
6427 break;
6430 break;
6431 default:
6432 switch (data->contextInfo.dwExportFormat)
6433 {
6436 break;
6438 contentID = IDS_EXPORT_FILTER_CMS;
6439 break;
6441 contentID = IDS_EXPORT_FILTER_PFX;
6442 break;
6443 default:
6444 contentID = IDS_EXPORT_FILTER_CERT;
6445 }
6446 }
6447 LoadStringW(hInstance, contentID, text, ARRAY_SIZE(text));
6449}
6450
6451static inline BOOL save_der(HANDLE file, const BYTE *pb, DWORD cb)
6452{
6454
6455 return WriteFile(file, pb, cb, &bytesWritten, NULL);
6456}
6457
6459{
6460 BOOL ret;
6461 DWORD size = 0;
6462
6464 {
6466
6467 if (buf)
6468 {
6470 &size)))
6471 ret = WriteFile(file, buf, size, &size, NULL);
6473 }
6474 else
6475 {
6477 ret = FALSE;
6478 }
6479 }
6480 return ret;
6481}
6482
6484{
6487}
6488
6490 BOOL includeChain)
6491{
6492 BOOL ret;
6495
6496 if (store)
6497 {
6498 if (includeChain)
6499 {
6502
6503 if (addlStore)
6504 {
6505 DWORD i;
6506
6507 ret = TRUE;
6508 for (i = 0; ret && i < pExportInfo->cStores; i++)
6509 ret = CertAddStoreToCollection(addlStore,
6510 pExportInfo->rghStores, 0, 0);
6511 if (ret)
6512 {
6514
6516 pExportInfo->u.pCertContext, NULL, addlStore, NULL, 0,
6517 NULL, &chain);
6518 if (ret)
6519 {
6520 DWORD j;
6521
6522 for (i = 0; ret && i < chain->cChain; i++)
6523 for (j = 0; ret && j < chain->rgpChain[i]->cElement;
6524 j++)
6526 chain->rgpChain[i]->rgpElement[j]->pCertContext,
6529 }
6530 else
6531 {
6532 /* No chain could be created, just add the individual
6533 * cert to the message.
6534 */
6536 pExportInfo->u.pCertContext, CERT_STORE_ADD_ALWAYS,
6537 NULL);
6538 }
6539 }
6540 CertCloseStore(addlStore, 0);
6541 }
6542 else
6543 ret = FALSE;
6544 }
6545 else
6547 pExportInfo->u.pCertContext, CERT_STORE_ADD_ALWAYS, NULL);
6548 if (ret)
6549 ret = save_store_as_cms(file, store);
6550 CertCloseStore(store, 0);
6551 }
6552 else
6553 ret = FALSE;
6554 return ret;
6555}
6556
6558{
6561}
6562
6566{
6569 BOOL ret = FALSE;
6570
6571 if (store)
6572 {
6573 CRYPT_DATA_BLOB pfxBlob = { 0, NULL };
6575 BOOL freeKeyProvInfo = FALSE;
6576
6577 if (pContextInfo->fExportChain)
6578 {
6579 HCERTCHAINENGINE engine = NULL;
6580
6581 if (pExportInfo->cStores)
6582 {
6584
6585 memset(&config, 0, sizeof(config));
6586 config.cbSize = sizeof(config);
6587 config.cAdditionalStore = pExportInfo->cStores;
6588 config.rghAdditionalStore = pExportInfo->rghStores;
6590 }
6591 else
6592 ret = TRUE;
6593 if (ret)
6594 {
6595 CERT_CHAIN_PARA chainPara;
6597
6598 memset(&chainPara, 0, sizeof(chainPara));
6599 chainPara.cbSize = sizeof(chainPara);
6601 pExportInfo->u.pCertContext, NULL, NULL, &chainPara, 0, NULL,
6602 &chain);
6603 if (ret)
6604 {
6605 DWORD i, j;
6606
6607 for (i = 0; ret && i < chain->cChain; i++)
6608 for (j = 0; ret && j < chain->rgpChain[i]->cElement;
6609 j++)
6610 {
6611 if (i == 0 && j == 0)
6613 chain->rgpChain[i]->rgpElement[j]->pCertContext,
6615 else
6617 chain->rgpChain[i]->rgpElement[j]->pCertContext,
6619 }
6621 }
6622 }
6623 if (engine)
6625 }
6626 else
6628 pExportInfo->u.pCertContext, CERT_STORE_ADD_ALWAYS, &cert);
6629 /* Copy private key info to newly created cert, so it'll get exported
6630 * along with the cert.
6631 */
6632 if (ret && pContextInfo->fExportPrivateKeys)
6633 {
6634 if (keyProvInfo)
6637 else
6638 {
6640 ret = FALSE;
6641 else
6642 {
6645 freeKeyProvInfo = TRUE;
6646 }
6647 }
6648 }
6649 if (ret)
6650 {
6651 DWORD exportFlags =
6653
6654 ret = PFXExportCertStore(store, &pfxBlob,
6655 pContextInfo->pwszPassword, exportFlags);
6656 if (ret)
6657 {
6658 pfxBlob.pbData = HeapAlloc(GetProcessHeap(), 0, pfxBlob.cbData);
6659 if (pfxBlob.pbData)
6660 {
6661 ret = PFXExportCertStore(store, &pfxBlob,
6662 pContextInfo->pwszPassword, exportFlags);
6663 if (ret)
6664 {
6666
6667 ret = WriteFile(file, pfxBlob.pbData, pfxBlob.cbData,
6668 &bytesWritten, NULL);
6669 }
6670 }
6671 else
6672 {
6674 ret = FALSE;
6675 }
6676 }
6677 }
6678 if (ret && deleteKeys)
6679 {
6680 HCRYPTPROV prov;
6681
6685 }
6686 if (freeKeyProvInfo)
6689 CertCloseStore(store, 0);
6690 }
6691 return ret;
6692}
6693
6697{
6698 BOOL ret;
6699
6700 if (pContextInfo->dwSize != sizeof(CRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO))
6701 {
6703 return FALSE;
6704 }
6705 switch (pExportInfo->dwSubjectChoice)
6706 {
6708 ret = save_der(file,
6709 pExportInfo->u.pCRLContext->pbCrlEncoded,
6710 pExportInfo->u.pCRLContext->cbCrlEncoded);
6711 break;
6713 ret = save_der(file,
6714 pExportInfo->u.pCTLContext->pbCtlEncoded,
6715 pExportInfo->u.pCTLContext->cbCtlEncoded);
6716 break;
6718 ret = save_serialized_store(file, pExportInfo->u.hCertStore);
6719 break;
6721 ret = save_store_as_cms(file, pExportInfo->u.hCertStore);
6722 break;
6723 default:
6724 switch (pContextInfo->dwExportFormat)
6725 {
6727 ret = save_der(file, pExportInfo->u.pCertContext->pbCertEncoded,
6728 pExportInfo->u.pCertContext->cbCertEncoded);
6729 break;
6732 pExportInfo->u.pCertContext->pbCertEncoded,
6733 pExportInfo->u.pCertContext->cbCertEncoded);
6734 break;
6736 ret = save_cert_as_cms(file, pExportInfo,
6737 pContextInfo->fExportChain);
6738 break;
6740 ret = save_pfx(file, pExportInfo, pContextInfo, keyProvInfo,
6741 deleteKeys);
6742 break;
6743 default:
6745 ret = FALSE;
6746 }
6747 }
6748 return ret;
6749}
6750
6752 LPARAM lp)
6753{
6754 LRESULT ret = 0;
6755 struct ExportWizData *data;
6756
6757 switch (msg)
6758 {
6759 case WM_INITDIALOG:
6760 {
6763 RECT rc;
6765
6766 data = (struct ExportWizData *)page->lParam;
6769 (WPARAM)data->titleFont, TRUE);
6770 GetWindowRect(lv, &rc);
6771 column.mask = LVCF_WIDTH;
6772 column.cx = (rc.right - rc.left) / 2 - 2;
6776 break;
6777 }
6778 case WM_NOTIFY:
6779 {
6780 NMHDR *hdr = (NMHDR *)lp;
6781
6782 switch (hdr->code)
6783 {
6784 case PSN_SETACTIVE:
6785 {
6787
6793 ret = TRUE;
6794 break;
6795 }
6796 case PSN_WIZFINISH:
6797 {
6798 int messageID;
6800 LPCWSTR pTitle;
6801 DWORD mbFlags;
6802
6804 if ((data->success = do_export(data->file, &data->exportInfo,
6805 &data->contextInfo, data->keyProvInfo, data->deleteKeys)))
6806 {
6807 messageID = IDS_EXPORT_SUCCEEDED;
6808 mbFlags = MB_OK;
6809 }
6810 else
6811 {
6812 messageID = IDS_EXPORT_FAILED;
6813 mbFlags = MB_OK | MB_ICONERROR;
6814 }
6815 if (data->pwszWizardTitle)
6816 pTitle = data->pwszWizardTitle;
6817 else
6818 {
6820 pTitle = title;
6821 }
6823 MessageBoxW(hwnd, message, pTitle, mbFlags);
6824 break;
6825 }
6826 }
6827 break;
6828 }
6829 }
6830 return ret;
6831}
6832
6834 LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, const void *pvoid)
6835{
6837 PROPSHEETPAGEW pages[6];
6838 struct ExportWizData data;
6839 int nPages = 0;
6840 BOOL hasPrivateKey, showFormatPage = TRUE;
6841 INT_PTR l;
6842
6843 data.dwFlags = dwFlags;
6844 data.pwszWizardTitle = pwszWizardTitle;
6845 memset(&data.exportInfo, 0, sizeof(data.exportInfo));
6846 memcpy(&data.exportInfo, pExportInfo,
6847 min(sizeof(data.exportInfo), pExportInfo->dwSize));
6848 if (pExportInfo->dwSize > sizeof(data.exportInfo))
6849 data.exportInfo.dwSize = sizeof(data.exportInfo);
6850 data.contextInfo.dwSize = sizeof(data.contextInfo);
6851 data.contextInfo.dwExportFormat = CRYPTUI_WIZ_EXPORT_FORMAT_DER;
6852 data.contextInfo.fExportChain = FALSE;
6853 data.contextInfo.fStrongEncryption = FALSE;
6854 data.contextInfo.fExportPrivateKeys = FALSE;
6855 data.contextInfo.pwszPassword = NULL;
6856 data.freePassword = FALSE;
6858 pvoid)
6859 memcpy(&data.contextInfo, pvoid,
6861 sizeof(data.contextInfo)));
6862 data.keyProvInfo = NULL;
6863 data.deleteKeys = FALSE;
6864 data.fileName = NULL;
6866 data.success = FALSE;
6867
6868 memset(pages, 0, sizeof(pages));
6869
6870 pages[nPages].dwSize = sizeof(pages[0]);
6871 pages[nPages].hInstance = hInstance;
6873 pages[nPages].pfnDlgProc = export_welcome_dlg_proc;
6874 pages[nPages].dwFlags = PSP_HIDEHEADER;
6875 pages[nPages].lParam = (LPARAM)&data;
6876 nPages++;
6877
6878 hasPrivateKey = export_info_has_private_key(pExportInfo);
6879 switch (pExportInfo->dwSubjectChoice)
6880 {
6883 showFormatPage = FALSE;
6884 data.contextInfo.dwExportFormat = CRYPTUI_WIZ_EXPORT_FORMAT_DER;
6885 break;
6887 showFormatPage = FALSE;
6888 data.contextInfo.dwExportFormat =
6890 break;
6892 showFormatPage = FALSE;
6893 data.contextInfo.dwExportFormat = CRYPTUI_WIZ_EXPORT_FORMAT_PKCS7;
6894 break;
6895 }
6896
6897 if (hasPrivateKey && showFormatPage)
6898 {
6899 pages[nPages].dwSize = sizeof(pages[0]);
6900 pages[nPages].hInstance = hInstance;
6903 pages[nPages].dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
6904 pages[nPages].pszHeaderTitle =
6906 pages[nPages].pszHeaderSubTitle =
6908 pages[nPages].lParam = (LPARAM)&data;
6909 nPages++;
6910 }
6911 if (showFormatPage)
6912 {
6913 pages[nPages].dwSize = sizeof(pages[0]);
6914 pages[nPages].hInstance = hInstance;
6916 pages[nPages].pfnDlgProc = export_format_dlg_proc;
6917 pages[nPages].dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
6918 pages[nPages].pszHeaderTitle =
6920 pages[nPages].pszHeaderSubTitle =
6922 pages[nPages].lParam = (LPARAM)&data;
6923 nPages++;
6924 }
6925 if (hasPrivateKey && showFormatPage)
6926 {
6927 pages[nPages].dwSize = sizeof(pages[0]);
6928 pages[nPages].hInstance = hInstance;
6930 pages[nPages].pfnDlgProc = export_password_dlg_proc;
6931 pages[nPages].dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
6932 pages[nPages].pszHeaderTitle =
6934 pages[nPages].pszHeaderSubTitle =
6936 pages[nPages].lParam = (LPARAM)&data;
6937 nPages++;
6938 }
6939
6940 pages[nPages].dwSize = sizeof(pages[0]);
6941 pages[nPages].hInstance = hInstance;
6942 pages[nPages].u.pszTemplate = MAKEINTRESOURCEW(IDD_EXPORT_FILE);
6943 pages[nPages].pfnDlgProc = export_file_dlg_proc;
6944 pages[nPages].dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
6945 pages[nPages].pszHeaderTitle = MAKEINTRESOURCEW(IDS_EXPORT_FILE_TITLE);
6946 pages[nPages].pszHeaderSubTitle =
6948 pages[nPages].lParam = (LPARAM)&data;
6949 nPages++;
6950
6951 pages[nPages].dwSize = sizeof(pages[0]);
6952 pages[nPages].hInstance = hInstance;
6954 pages[nPages].pfnDlgProc = export_finish_dlg_proc;
6955 pages[nPages].dwFlags = PSP_HIDEHEADER;
6956 pages[nPages].lParam = (LPARAM)&data;
6957 nPages++;
6958
6959 memset(&hdr, 0, sizeof(hdr));
6960 hdr.dwSize = sizeof(hdr);
6961 hdr.hwndParent = hwndParent;
6962 hdr.dwFlags = PSH_PROPSHEETPAGE | PSH_WIZARD97_NEW | PSH_HEADER |
6963 PSH_WATERMARK;
6964 hdr.hInstance = hInstance;
6965 if (pwszWizardTitle)
6966 hdr.pszCaption = pwszWizardTitle;
6967 else
6969 hdr.u3.ppsp = pages;
6970 hdr.nPages = nPages;
6971 hdr.u4.pszbmWatermark = MAKEINTRESOURCEW(IDB_CERT_WATERMARK);
6972 hdr.u5.pszbmHeader = MAKEINTRESOURCEW(IDB_CERT_HEADER);
6973 l = PropertySheetW(&hdr);
6974 DeleteObject(data.titleFont);
6975 if (data.freePassword)
6977 (LPWSTR)data.contextInfo.pwszPassword);
6978 HeapFree(GetProcessHeap(), 0, data.keyProvInfo);
6979 CloseHandle(data.file);
6980 HeapFree(GetProcessHeap(), 0, data.fileName);
6981 if (l == 0)
6982 {
6984 return FALSE;
6985 }
6986 else
6987 return data.success;
6988}
6989
6991 LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, void *pvoid)
6992{
6993 BOOL ret;
6994
6995 TRACE("(%08x, %p, %s, %p, %p)\n", dwFlags, hwndParent,
6996 debugstr_w(pwszWizardTitle), pExportInfo, pvoid);
6997
6998 if (!(dwFlags & CRYPTUI_WIZ_NO_UI))
7000 pvoid);
7001 else
7002 {
7005 CREATE_ALWAYS, 0, NULL);
7006
7008 {
7009 ret = do_export(file, pExportInfo, pvoid, NULL, FALSE);
7011 }
7012 else
7013 ret = FALSE;
7014 }
7015 return ret;
7016}
7017
7019{
7020 FIXME("%p: stub\n", pcvsi);
7021 return FALSE;
7022}
7023
7025{
7028 DWORD i = 0;
7029
7031 column.mask = LVCF_WIDTH | LVCF_TEXT;
7032 column.cx = 90;
7033 column.pszText = buf;
7035 {
7038 }
7040 {
7043 }
7045 {
7048 }
7050 {
7053 }
7055 {
7058 }
7060 {
7063 }
7064}
7065
7066static void add_cert_to_list(HWND lv, PCCERT_CONTEXT cert, DWORD flags, DWORD *allocatedLen,
7067 LPWSTR *str)
7068{
7069 DWORD len;
7070 LVITEMW item;
7071 WCHAR dateFmt[80]; /* sufficient for LOCALE_SSHORTDATE */
7072 WCHAR buf[80];
7073 SYSTEMTIME sysTime;
7074 LPWSTR none, usages;
7075
7077 item.iItem = SendMessageW(lv, LVM_GETITEMCOUNT, 0, 0);
7078 item.iSubItem = 0;
7079 item.iImage = 0;
7081 if (!item.iItem)
7082 {
7083 item.mask |= LVIF_STATE;
7084 item.state = LVIS_SELECTED;
7085 item.stateMask = -1;
7086 }
7088 {
7090 if (len > *allocatedLen)
7091 {
7092 HeapFree(GetProcessHeap(), 0, *str);
7093 *str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
7094 if (*str)
7095 *allocatedLen = len;
7096 }
7097 if (*str)
7098 {
7100 item.pszText = *str;
7102 }
7103 item.mask = LVIF_TEXT;
7104 ++item.iSubItem;
7105 }
7107 {
7109 NULL, 0);
7110 if (len > *allocatedLen)
7111 {
7112 HeapFree(GetProcessHeap(), 0, *str);
7113 *str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
7114 if (*str)
7115 *allocatedLen = len;
7116 }
7117 if (*str)
7118 {
7120 *str, len);
7121 item.pszText = *str;
7122 if (!item.iSubItem)
7124 else
7126 }
7127 item.mask = LVIF_TEXT;
7128 ++item.iSubItem;
7129 }
7131 {
7133 if (usages)
7134 {
7135 item.pszText = usages;
7136 if (!item.iSubItem)
7138 else
7141 }
7142 item.mask = LVIF_TEXT;
7143 ++item.iSubItem;
7144 }
7146 {
7149 if (len > *allocatedLen)
7150 {
7151 HeapFree(GetProcessHeap(), 0, *str);
7152 *str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
7153 if (*str)
7154 *allocatedLen = len;
7155 }
7156 if (*str)
7157 {
7159 item.pszText = none;
7160 else
7161 item.pszText = *str;
7162 if (!item.iSubItem)
7164 else
7166 }
7167 item.mask = LVIF_TEXT;
7168 ++item.iSubItem;
7169 }
7171 {
7173 FileTimeToSystemTime(&cert->pCertInfo->NotAfter, &sysTime);
7174 GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, dateFmt, buf, ARRAY_SIZE(buf));
7175 item.pszText = buf;
7176 if (!item.iSubItem)
7178 else
7180 item.mask = LVIF_TEXT;
7181 ++item.iSubItem;
7182 }
7184 {
7185 static int show_fixme;
7186 if (!show_fixme++)
7187 FIXME("showing location is not implemented\n");
7189 if (!item.iSubItem)
7191 else
7193 }
7194}
7195
7197 void *callback_data)
7198{
7200 BOOL select = FALSE;
7201 DWORD allocatedLen = 0;
7202 LPWSTR str = NULL;
7203
7204 do {
7206 if (cert && (!filter || filter(cert, &select, callback_data)))
7207 add_cert_to_list(lv, cert, flags, &allocatedLen, &str);
7208 } while (cert);
7210}
7211
7213{
7216 LVITEMW item;
7217
7218 if (selection < 0)
7220 if (selection < 0)
7221 return NULL;
7222 item.mask = LVIF_PARAM;
7223 item.iItem = selection;
7224 item.iSubItem = 0;
7225 if (SendMessageW(lv, LVM_GETITEMW, 0, (LPARAM)&item))
7226 cert = (PCCERT_CONTEXT)item.lParam;
7227 return cert;
7228}
7229
7231{
7233 int numSelected = SendMessageW(lv, LVM_GETSELECTEDCOUNT, 0, 0);
7234
7235 EnableWindow(GetDlgItem(hwnd, IDC_SELECT_VIEW_CERT), numSelected == 1);
7236}
7237
7239{
7250};
7251
7253{
7255
7256 if (data->displayProc && data->displayProc(cert, hwnd, data->callbackData))
7257 return;
7258 memset(&viewInfo, 0, sizeof(viewInfo));
7259 viewInfo.dwSize = sizeof(viewInfo);
7260 viewInfo.hwndParent = hwnd;
7261 viewInfo.pCertContext = cert;
7262 viewInfo.cStores = data->cStores;
7263 viewInfo.rghStores = data->rghStores;
7264 viewInfo.cPropSheetPages = data->cPropSheetPages;
7265 viewInfo.rgPropSheetPages = data->rgPropSheetPages;
7266 /* FIXME: this should be modal */
7267 CryptUIDlgViewCertificateW(&viewInfo, NULL);
7268}
7269
7271{
7274};
7275
7277{
7278 struct SortData *data = (struct SortData *)lp;
7279 return cert_mgr_sort_by_text(data->hwnd, data->column, lp1, lp2);
7280}
7281
7283{
7286};
7287
7289{
7290 struct SelectCertData *data;
7291
7292 switch (msg)
7293 {
7294 case WM_INITDIALOG:
7295 {
7296 struct SelectCertParam *param = (struct SelectCertParam *)lp;
7299 DWORD i = 0;
7300
7301 data = HeapAlloc(GetProcessHeap(), 0, sizeof(*data));
7302 if (!data)
7303 return 0;
7304 data->cert = &param->cert;
7305 data->dateColumn = 4 -
7310 data->imageList = ImageList_Create(16, 16, ILC_COLOR4 | ILC_MASK, 2, 0);
7311 if (data->imageList)
7312 {
7313 HBITMAP bmp;
7314 COLORREF backColor = RGB(255, 0, 255);
7315
7317 ImageList_AddMasked(data->imageList, bmp, backColor);
7319 ImageList_SetBkColor(data->imageList, CLR_NONE);
7321 (LPARAM)data->imageList);
7322 }
7323 data->title = pcsc->szTitle;
7324 data->cStores = pcsc->cStores;
7325 data->rghStores = pcsc->rghStores;
7326 data->cPropSheetPages = pcsc->cPropSheetPages;
7327 data->rgPropSheetPages = pcsc->rgPropSheetPages;
7328 data->displayProc = pcsc->pDisplayCallback;
7329 data->callbackData = pcsc->pvCallbackData;
7331
7332 if (pcsc->szTitle)
7334 if (pcsc->szDisplayString)
7338 while (i < pcsc->cDisplayStores)
7342 break;
7343 }
7344#ifdef __REACTOS__
7345 case WM_DESTROY:
7349 break;
7350#endif
7351 case WM_NOTIFY:
7352 {
7353 NMHDR *hdr = (NMHDR *)lp;
7354
7355 switch (hdr->code)
7356 {
7357 case NM_DBLCLK:
7358 {
7360
7362 if (cert)
7364 break;
7365 }
7366 case LVN_COLUMNCLICK:
7367 {
7368 NMLISTVIEW *nmlv = (NMLISTVIEW *)lp;
7370
7371 /* FIXME: doesn't support swapping sort order between ascending and descending. */
7373 if (nmlv->iSubItem == data->dateColumn)
7375 else
7376 {
7377 struct SortData sortData;
7378
7379 sortData.hwnd = lv;
7380 sortData.column = nmlv->iSubItem;
7381 SendMessageW(lv, LVM_SORTITEMSEX, (WPARAM)&sortData,
7383 }
7384 break;
7385 }
7386 }
7387 break;
7388 }
7389 case WM_COMMAND:
7390 switch (wp)
7391 {
7392 case IDOK:
7393 {
7395
7397 if (!cert)
7398 {
7399 WCHAR buf[40], title[40];
7400
7402 if (!data->title)
7404 MessageBoxW(hwnd, buf, data->title ? data->title : title, MB_OK | MB_ICONWARNING);
7405 break;
7406 }
7408#ifndef __REACTOS__
7410 ImageList_Destroy(data->imageList);
7412#endif
7414 break;
7415 }
7416 case IDCANCEL:
7417#ifndef __REACTOS__
7420 ImageList_Destroy(data->imageList);
7422#endif
7424 break;
7426 {
7428
7430 if (cert)
7432 break;
7433 }
7434 }
7435 break;
7436 }
7437 return 0;
7438}
7439
7441{
7442 struct SelectCertParam param;
7443
7444 TRACE("%p\n", pcsc);
7445
7446 if (pcsc->dwSize != sizeof(*pcsc) && pcsc->dwSize != sizeof(*pcsc) - sizeof(HCERTSTORE))
7447 {
7448 WARN("unexpected size %d\n", pcsc->dwSize);
7450 return NULL;
7451 }
7453 FIXME("ignoring CRYPTUI_SELECTCERT_MULTISELECT\n");
7454 param.pcsc = pcsc;
7455 param.cert = NULL;
7458 return param.cert;
7459}
7460
7462{
7463 DWORD i;
7464
7465 for (i = 0; i < num; i++)
7466 {
7467 if (!(pages[i].dwFlags & PSP_DLGINDIRECT) && !IS_INTRESOURCE(pages[i].u.pszTemplate))
7468 HeapFree(GetProcessHeap(), 0, (void *)pages[i].u.pszTemplate);
7469 if ((pages[i].dwFlags & PSP_USEICONID) && !IS_INTRESOURCE(pages[i].u2.pszIcon))
7470 HeapFree(GetProcessHeap(), 0, (void *)pages[i].u2.pszIcon);
7471 if ((pages[i].dwFlags & PSP_USETITLE) && !IS_INTRESOURCE(pages[i].pszTitle))
7472 HeapFree(GetProcessHeap(), 0, (void *)pages[i].pszTitle);
7473 if ((pages[i].dwFlags & PSP_USEHEADERTITLE) && !IS_INTRESOURCE(pages[i].pszHeaderTitle))
7474 HeapFree(GetProcessHeap(), 0, (void *)pages[i].pszHeaderTitle);
7475 if ((pages[i].dwFlags & PSP_USEHEADERSUBTITLE) &&
7476 !IS_INTRESOURCE(pages[i].pszHeaderSubTitle))
7477 HeapFree(GetProcessHeap(), 0, (void *)pages[i].pszHeaderSubTitle);
7478 }
7479 HeapFree(GetProcessHeap(), 0, pages);
7480}
7481
7483{
7484 PROPSHEETPAGEW *psp;
7485 DWORD i, size = sizeof(*psp) * num;
7486
7487 psp = HeapAlloc(GetProcessHeap(), 0, size);
7488 if (!psp)
7489 return NULL;
7490 memcpy(psp, pages, size);
7491 for (i = 0; i < num; i++)
7492 {
7493 if (!(pages[i].dwFlags & PSP_DLGINDIRECT) && !IS_INTRESOURCE(pages[i].u.pszTemplate))
7494 psp[i].u.pszTemplate = NULL;
7495 if ((pages[i].dwFlags & PSP_USEICONID) && !IS_INTRESOURCE(pages[i].u2.pszIcon))
7496 psp[i].u2.pszIcon = NULL;
7497 if ((pages[i].dwFlags & PSP_USETITLE) && !IS_INTRESOURCE(pages[i].pszTitle))
7498 psp[i].pszTitle = NULL;
7499 if (pages[i].dwFlags & PSP_USECALLBACK)
7500 psp[i].pfnCallback = NULL;
7501 if ((pages[i].dwFlags & PSP_USEHEADERTITLE) && !IS_INTRESOURCE(pages[i].pszHeaderTitle))
7502 psp[i].pszHeaderTitle = NULL;
7503 if ((pages[i].dwFlags & PSP_USEHEADERSUBTITLE) &&
7504 !IS_INTRESOURCE(pages[i].pszHeaderSubTitle))
7505 psp[i].pszHeaderSubTitle = NULL;
7506 }
7507 for (i = 0; i < num; i++)
7508 {
7509 if (!(pages[i].dwFlags & PSP_DLGINDIRECT) && !IS_INTRESOURCE(pages[i].u.pszTemplate))
7510 {
7511 if (!(psp[i].u.pszTemplate = strdupAtoW( pages[i].u.pszTemplate ))) goto error;
7512 }
7513 if ((pages[i].dwFlags & PSP_USEICONID) && !IS_INTRESOURCE(pages[i].u2.pszIcon))
7514 {
7515 if (!(psp[i].u2.pszIcon = strdupAtoW( pages[i].u2.pszIcon ))) goto error;
7516 }
7517 if ((pages[i].dwFlags & PSP_USETITLE) && !IS_INTRESOURCE(pages[i].pszTitle))
7518 {
7519 if (!(psp[i].pszTitle = strdupAtoW( pages[i].pszTitle ))) goto error;
7520 }
7521 if (pages[i].dwFlags & PSP_USECALLBACK)
7522 FIXME("ignoring pfnCallback\n");
7523 if ((pages[i].dwFlags & PSP_USEHEADERTITLE) && !IS_INTRESOURCE(pages[i].pszHeaderTitle))
7524 {
7525 if (!(psp[i].pszHeaderTitle = strdupAtoW( pages[i].pszHeaderTitle ))) goto error;
7526 }
7527 if ((pages[i].dwFlags & PSP_USEHEADERSUBTITLE) &&
7528 !IS_INTRESOURCE(pages[i].pszHeaderSubTitle))
7529 {
7530 if (!(psp[i].pszHeaderSubTitle = strdupAtoW( pages[i].pszHeaderSubTitle ))) goto error;
7531 }
7532 }
7533 return psp;
7534error:
7536 return NULL;
7537}
7538
7540{
7543 LPWSTR title = NULL, display_str = NULL;
7544 PROPSHEETPAGEW *pages = NULL;
7545
7546 TRACE("%p\n", pcsc);
7547
7548 if (pcsc->dwSize != sizeof(*pcsc) && pcsc->dwSize != sizeof(*pcsc) - sizeof(HCERTSTORE))
7549 {
7550 WARN("unexpected size %d\n", pcsc->dwSize);
7552 return NULL;
7553 }
7554 memcpy(&selCertInfo, pcsc, pcsc->dwSize);
7555 if (pcsc->szTitle)
7556 {
7557 if (!(title = strdupAtoW( pcsc->szTitle ))) goto error;
7558 selCertInfo.szTitle = title;
7559 }
7560 if (pcsc->szDisplayString)
7561 {
7562 if (!(display_str = strdupAtoW( pcsc->szDisplayString ))) goto error;
7563 selCertInfo.szDisplayString = display_str;
7564 }
7565 if (pcsc->cPropSheetPages)
7566 {
7568 if (!pages)
7569 goto error;
7570 selCertInfo.rgPropSheetPages = pages;
7571 }
7572 cert = CryptUIDlgSelectCertificateW(&selCertInfo);
7573error:
7575 HeapFree(GetProcessHeap(), 0, display_str);
7576 if (pcsc->cPropSheetPages)
7578 return cert;
7579}
7580
7582 LPCWSTR pwszDisplayString, DWORD dwDontUseColumn,
7583 DWORD dwFlags, void *pvReserved)
7584{
7586
7587 TRACE("%p %p %s %s %x %x %p\n", hCertStore, hwnd, debugstr_w(pwszTitle), debugstr_w(pwszDisplayString), dwDontUseColumn, dwFlags, pvReserved);
7588
7589 memset(&sc, 0, sizeof(sc));
7590
7591 sc.dwSize = sizeof(sc);
7592 sc.hwndParent = hwnd;
7593 sc.dwFlags = dwFlags;
7594 sc.szTitle = pwszTitle;
7595 sc.szDisplayString = pwszDisplayString;
7596 sc.dwDontUseColumn = dwDontUseColumn;
7597 sc.cDisplayStores = 1;
7598 sc.rghDisplayStores = &hCertStore;
7599 return CryptUIDlgSelectCertificateW(&sc);
7600}
7601
7604{
7605 FIXME("%d %p %s %p %p: stub\n", flags, parent, debugstr_w(title), info, context);
7606 return FALSE;
7607}
static HDC hDC
Definition: 3dtext.c:33
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
#define isdigit(c)
Definition: acclib.h:68
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * strchr(const char *String, int ch)
Definition: utclib.c:501
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
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:300
static HWND LPCWSTR pwszWizardTitle
Definition: cryptui.c:301
static HWND LPCWSTR PCCRYPTUI_WIZ_IMPORT_SRC_INFO HCERTSTORE hDestCertStore
Definition: cryptui.c:302
static HWND LPCWSTR PCCRYPTUI_WIZ_IMPORT_SRC_INFO pImportSrc
Definition: cryptui.c:301
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
struct config_s config
#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
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
Definition: main.c:26
#define IDS_VALUE
Definition: resource.h:26
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:2179
BOOL WINAPI CryptDestroyKey(HCRYPTKEY hKey)
Definition: crypt.c:930
BOOL WINAPI CryptReleaseContext(HCRYPTPROV hProv, DWORD dwFlags)
Definition: crypt.c:648
BOOL WINAPI CryptGetUserKey(HCRYPTPROV hProv, DWORD dwKeySpec, HCRYPTKEY *phUserKey)
Definition: crypt.c:1718
BOOL WINAPI CryptGetKeyParam(HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
Definition: crypt.c:1649
BOOL WINAPI CryptAcquireContextW(HCRYPTPROV *phProv, LPCWSTR pszContainer, LPCWSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
Definition: crypt.c:358
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:1228
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:2212
BOOL WINAPI CryptUIDlgViewCertificateW(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo, BOOL *pfPropertiesChanged)
Definition: main.c:4415
#define MAX_FRIENDLY_NAME
Definition: main.c:3535
static void add_purpose(HWND hwnd, LPCSTR oid)
Definition: main.c:3152
static void add_string_resource_with_paraformat_to_control(HWND hwnd, int id, const PARAFORMAT2 *fmt)
Definition: main.c:1768
static void init_general_page(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo, PROPSHEETPAGEW *page)
Definition: main.c:2584
static void export_format_enable_controls(HWND hwnd, const struct ExportWizData *data)
Definition: main.c:5800
static void show_dialog_for_selected_cert(HWND hwnd)
Definition: main.c:4108
static HCERTSTORE selected_item_to_store(HWND tree, HTREEITEM hItem)
Definition: main.c:1503
static int CALLBACK cert_prop_sheet_proc(HWND hwnd, UINT msg, LPARAM lp)
Definition: main.c:4288
static LRESULT CALLBACK import_file_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:5052
static const WCHAR export_filter_pfx[]
Definition: main.c:6178
static const WCHAR ca[]
Definition: main.c:457
static WCHAR * get_cert_display_name(PCCERT_CONTEXT cert)
Definition: main.c:4009
static WCHAR * field_format_detailed_issuer(PCCERT_CONTEXT cert, void *param)
Definition: main.c:2653
BOOL WINAPI CryptUIDlgViewCertificateA(PCCRYPTUI_VIEWCERTIFICATE_STRUCTA pCertViewInfo, BOOL *pfPropertiesChanged)
Definition: main.c:1675
static const WCHAR my[]
Definition: main.c:454
static LRESULT CALLBACK add_purpose_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:3229
static WCHAR * get_user_notice_from_qualifier(const CRYPT_OBJID_BLOB *qualifier)
Definition: main.c:2252
static void select_purposes(HWND hwnd, PurposeSelection selection)
Definition: main.c:3386
static const struct @376 import_filters[]
static void import_warn_type_mismatch(DWORD dwFlags, HWND hwnd, LPCWSTR szTitle)
Definition: main.c:4717
static void set_general_info(HWND hwnd, PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo)
Definition: main.c:2452
static void add_field_value_data(struct detail_data *data, create_detailed_value_func create, void *param)
Definition: main.c:2767
static BOOL export_validate_filename(HWND hwnd, struct ExportWizData *data, LPCWSTR fileName)
Definition: main.c:6096
static void add_local_oid_text_to_control(HWND text, LPCSTR oid)
Definition: main.c:1993
static void select_cert_update_view_button(HWND hwnd)
Definition: main.c:7230
static void create_show_list(HWND hwnd, struct detail_data *data)
Definition: main.c:3099
void(* add_fields_func)(HWND hwnd, struct detail_data *data)
Definition: main.c:2756
static WCHAR * make_export_file_filter(DWORD exportFormat, DWORD subjectChoice)
Definition: main.c:6181
static void set_certificate_status_for_end_cert(HWND hwnd, PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo)
Definition: main.c:4086
static void show_import_details(HWND lv, struct ImportWizData *data)
Definition: main.c:5268
BOOL WINAPI WTHelperGetKnownUsages(DWORD action, PCCRYPT_OID_INFO **usages)
static WCHAR * field_format_subject(PCCERT_CONTEXT cert)
Definition: main.c:2658
WCHAR *(* prop_to_value_func)(void *pb, DWORD cb)
Definition: main.c:3005
static LRESULT CALLBACK general_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:2512
static BOOL export_info_has_private_key(PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo)
Definition: main.c:5782
static void cert_mgr_clear_cert_selection(HWND hwnd)
Definition: main.c:811
static PCCERT_CONTEXT cert_mgr_index_to_cert(HWND hwnd, int index)
Definition: main.c:821
static BOOL display_cert_usages(HWND text, PCCERT_CONTEXT cert, BOOL *anyUsageAdded)
Definition: main.c:2116
static const WCHAR filter_crl[]
Definition: main.c:4918
static void redraw_states(HWND list, BOOL enabled)
Definition: main.c:3329
static LRESULT CALLBACK export_private_key_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:5705
static void add_cert_string_to_control(HWND hwnd, PCCERT_CONTEXT pCertContext, DWORD dwType, DWORD dwFlags)
Definition: main.c:1794
static PCCERT_CONTEXT select_cert_get_selected(HWND hwnd, int selection)
Definition: main.c:7212
static const WCHAR filter_cms[]
Definition: main.c:4921
WCHAR *(* create_detailed_value_func)(PCCERT_CONTEXT cert, void *param)
Definition: main.c:2758
static LPWSTR export_append_extension(const struct ExportWizData *data, LPWSTR fileName)
Definition: main.c:6044
static void add_critical_extensions(HWND hwnd, struct detail_data *data)
Definition: main.c:2994
static void init_columns(HWND lv, DWORD flags)
Definition: main.c:7024
#define MAX_DESCRIPTION
Definition: main.c:3536
static BOOL export_is_key_exportable(HCRYPTPROV hProv, DWORD keySpec)
Definition: main.c:5688
BOOL WINAPI CryptUIWizImport(DWORD dwFlags, HWND hwndParent, LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_IMPORT_SRC_INFO pImportSrc, HCERTSTORE hDestCertStore)
Definition: main.c:5559
static int cert_mgr_sort_by_text(HWND lv, int col, int index1, int index2)
Definition: main.c:1079
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:5329
static const struct CertMgrStoreInfo defaultStoreList[]
Definition: main.c:470
static WCHAR * field_format_extension_hex_with_ascii(const CERT_EXTENSION *ext)
Definition: main.c:2875
BOOL WINAPI CryptUIWizExport(DWORD dwFlags, HWND hwndParent, LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, void *pvoid)
Definition: main.c:6990
static HCERTSTORE open_store_from_file(DWORD dwFlags, LPCWSTR fileName, DWORD *pContentType)
Definition: main.c:4793
static BOOL is_oid_in_list(HWND hwnd, LPCSTR oid)
Definition: main.c:3221
static PCRYPT_KEY_PROV_INFO export_get_private_key_info(PCCERT_CONTEXT cert)
Definition: main.c:5648
static void toggle_usage(HWND hwnd, int iItem)
Definition: main.c:617
static void create_cert_details_list(HWND hwnd, struct detail_data *data)
Definition: main.c:3145
static void free_detail_fields(struct detail_data *data)
Definition: main.c:3774
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:6489
static WCHAR * field_format_public_key(PCCERT_CONTEXT cert)
Definition: main.c:2699
static void initialize_purpose_selection(HWND hwnd)
Definition: main.c:222
static int CALLBACK cert_mgr_sort_by_issuer(LPARAM lp1, LPARAM lp2, LPARAM lp)
Definition: main.c:1102
static LRESULT CALLBACK import_welcome_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:4871
static BOOL is_valid_oid(LPCSTR oid)
Definition: main.c:3183
static WCHAR * field_format_to_date(PCCERT_CONTEXT cert)
Definition: main.c:2694
DWORD allowFlags
Definition: main.c:4928
static void set_issuer_statement(HWND hwnd, PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo)
Definition: main.c:2278
static UINT CALLBACK hierarchy_callback(HWND hwnd, UINT msg, PROPSHEETPAGEW *page)
Definition: main.c:4231
static UINT CALLBACK detail_callback(HWND hwnd, UINT msg, PROPSHEETPAGEW *page)
Definition: main.c:3905
#define WM_REFRESH_VIEW
Definition: main.c:3526
static const WCHAR filter_serialized_store[]
Definition: main.c:4920
static void add_all_fields(HWND hwnd, struct detail_data *data)
Definition: main.c:3078
static struct OIDToString oidMap[]
Definition: main.c:1917
static LRESULT CALLBACK cert_mgr_advanced_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:724
HCERTSTORE WINAPI CryptUIDlgSelectStoreW(PCRYPTUI_SELECTSTORE_INFO_W info)
Definition: main.c:1618
struct _CRYPTUI_ENUM_DATA * PCRYPTUI_ENUM_DATA
static const struct v1_field v1_fields[]
Definition: main.c:2835
PCCERT_CONTEXT WINAPI CryptUIDlgSelectCertificateA(PCCRYPTUI_SELECTCERTIFICATE_STRUCTA pcsc)
Definition: main.c:7539
static BOOL init_detail_page(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo, BOOL *pfPropertiesChanged, PROPSHEETPAGEW *page)
Definition: main.c:3921
static BOOL show_import_ui(DWORD dwFlags, HWND hwndParent, LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_IMPORT_SRC_INFO pImportSrc, HCERTSTORE hDestCertStore)
Definition: main.c:5446
static LRESULT CALLBACK user_notice_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:2463
static void set_fields_selection(HWND hwnd, struct detail_data *data, int sel)
Definition: main.c:3134
PurposeFilter
Definition: main.c:216
@ PurposeFilterShowAdvanced
Definition: main.c:218
@ PurposeFilterShowAll
Definition: main.c:217
@ PurposeFilterShowOID
Definition: main.c:219
static void show_export_details(HWND lv, const struct ExportWizData *data)
Definition: main.c:6364
struct _CRYPTUI_SELECTSTORE_INFO_A * PCRYPTUI_SELECTSTORE_INFO_A
static BOOL import_crl(PCCRL_CONTEXT crl, HCERTSTORE hDestCertStore)
Definition: main.c:4599
static void add_cert_to_view(HWND lv, PCCERT_CONTEXT cert, DWORD *allocatedLen, LPWSTR *str)
Definition: main.c:101
static void set_cert_validity_period(HWND hwnd, PCCERT_CONTEXT cert)
Definition: main.c:2423
static void set_cert_string_property(PCCERT_CONTEXT cert, DWORD prop, LPWSTR str)
Definition: main.c:3511
static LPSTR get_cert_mgr_usages(void)
Definition: main.c:181
static LRESULT CALLBACK export_format_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:5835
static const WCHAR disallowed[]
Definition: main.c:461
static int CALLBACK cert_mgr_sort_by_friendly_name(LPARAM lp1, LPARAM lp2, LPARAM lp)
Definition: main.c:1115
static void set_cert_name_string(HWND hwnd, PCCERT_CONTEXT cert, DWORD nameFlags, int heading)
Definition: main.c:2384
static BOOL import_cert(PCCERT_CONTEXT cert, HCERTSTORE hDestCertStore)
Definition: main.c:4574
static void set_cert_info(HWND hwnd, PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo)
Definition: main.c:2323
static void display_app_usages(HWND text, PCCERT_CONTEXT cert, BOOL *anyUsageAdded)
Definition: main.c:2064
static const WCHAR addressBook[]
Definition: main.c:455
static void add_known_usages_to_list(HWND lv, CheckBitmapIndex state)
Definition: main.c:603
static BOOL show_export_ui(DWORD dwFlags, HWND hwndParent, LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, const void *pvoid)
Definition: main.c:6833
static const struct CertMgrStoreInfo publisherStoreList[]
Definition: main.c:481
static WCHAR * format_hex_string(void *pb, DWORD cb)
Definition: main.c:2609
static HCERTSTORE choose_store_for_cert(PCCERT_CONTEXT cert)
Definition: main.c:4562
static BOOL save_serialized_store(HANDLE file, HCERTSTORE store)
Definition: main.c:6557
BOOL WINAPI CryptUIWizDigitalSign(DWORD flags, HWND parent, LPCWSTR title, PCCRYPTUI_WIZ_DIGITAL_SIGN_INFO info, PCCRYPTUI_WIZ_DIGITAL_SIGN_CONTEXT *context)
Definition: main.c:7602
PCCERT_CONTEXT WINAPI CryptUIDlgSelectCertificateW(PCCRYPTUI_SELECTCERTIFICATE_STRUCTW pcsc)
Definition: main.c:7440
static const WCHAR trustedPublisher[]
Definition: main.c:459
static WCHAR * field_format_from_date(PCCERT_CONTEXT cert)
Definition: main.c:2689
static const WCHAR export_filter_ctl[]
Definition: main.c:6176
static void set_certificate_status(HWND hwnd, const CRYPT_PROVIDER_CERT *cert)
Definition: main.c:4069
static LRESULT CALLBACK select_cert_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:7288
int id
Definition: main.c:4927
static const WCHAR export_filter_cert[]
Definition: main.c:6174
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:2806
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:6563
static void show_store_certs(HWND hwnd, HCERTSTORE store)
Definition: main.c:355
static void show_cert_chain(HWND hwnd, struct hierarchy_data *data)
Definition: main.c:4018
static BOOL import_validate_filename(HWND hwnd, struct ImportWizData *data, LPCWSTR fileName)
Definition: main.c:4980
HCERTSTORE WINAPI CryptUIDlgSelectStoreA(PCRYPTUI_SELECTSTORE_INFO_A info)
Definition: main.c:1638
static LRESULT CALLBACK detail_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:3798
static BOOL import_ctl(PCCTL_CONTEXT ctl, HCERTSTORE hDestCertStore)
Definition: main.c:4625
static void close_stores(HWND tab)
Definition: main.c:564
static const struct selection_list_item listItems[]
Definition: main.c:3091
static void show_cert_hierarchy(HWND hwnd, struct hierarchy_data *data)
Definition: main.c:4100
static void add_icon_to_control(HWND hwnd, int id)
Definition: main.c:1809
static HCERTSTORE cert_mgr_current_store(HWND hwnd)
Definition: main.c:557
static void cert_mgr_do_export(HWND hwnd)
Definition: main.c:1018
static void add_date_string_to_control(HWND hwnd, const FILETIME *fileTime)
Definition: main.c:2411
static void add_cert_extension_detail(HWND hwnd, struct detail_data *data, PCERT_EXTENSION ext)
Definition: main.c:2956
static LRESULT CALLBACK export_password_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:5958
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:2785
static LRESULT CALLBACK import_finish_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:5370
static void cert_mgr_do_remove(HWND hwnd)
Definition: main.c:972
static void show_selected_cert(HWND hwnd, int index)
Definition: main.c:835
static void add_string_resource_to_control(HWND hwnd, int id)
Definition: main.c:1752
static const WCHAR export_filter_sst[]
Definition: main.c:6179
static WCHAR * format_enhanced_key_usage_value(void *pb, DWORD cb)
Definition: main.c:3015
static const WCHAR filter_cert[]
Definition: main.c:4914
static LRESULT CALLBACK export_file_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:6247
static CERT_ENHKEY_USAGE * add_oid_to_usage(CERT_ENHKEY_USAGE *usage, LPSTR oid)
Definition: main.c:262
static void add_v1_fields(HWND hwnd, struct detail_data *data)
Definition: main.c:2846
static void add_store_certs(HWND lv, HCERTSTORE store, DWORD flags, PFNCFILTERPROC filter, void *callback_data)
Definition: main.c:7196
static BOOL check_context_type(DWORD dwFlags, DWORD type)
Definition: main.c:4657
static BOOL save_der(HANDLE file, const BYTE *pb, DWORD cb)
Definition: main.c:6451
static void set_policy_text(HWND text, PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo)
Definition: main.c:2172
static const WCHAR filter_pfx[]
Definition: main.c:4916
static void add_text_with_paraformat_to_control(HWND hwnd, LPCWSTR text, LONG len, const PARAFORMAT2 *fmt)
Definition: main.c:1761
static int CALLBACK select_cert_sort_by_text(LPARAM lp1, LPARAM lp2, LPARAM lp)
Definition: main.c:7276
struct _CRYPTUI_ENUM_SYSTEM_STORE_ARGS CRYPTUI_ENUM_SYSTEM_STORE_ARGS
PurposeSelection
Definition: main.c:3380
@ PurposeEnableAll
Definition: main.c:3381
@ PurposeEnableSelected
Definition: main.c:3383
@ PurposeDisableAll
Definition: main.c:3382
static UINT CALLBACK general_callback_proc(HWND hwnd, UINT msg, PROPSHEETPAGEW *page)
Definition: main.c:2563
static void import_warning(DWORD dwFlags, HWND hwnd, LPCWSTR szTitle, int warningID)
Definition: main.c:4697
static const WCHAR empty[]
Definition: main.c:47
static void add_known_usage(HWND lv, PCCRYPT_OID_INFO info, CheckBitmapIndex state)
Definition: main.c:588
static BOOL is_ca_cert(PCCERT_CONTEXT cert, BOOL defaultIfNotSpecified)
Definition: main.c:4524
static BOOL WINAPI enum_store_callback(const void *pvSystemStore, DWORD dwFlags, PCERT_SYSTEM_STORE_INFO pStoreInfo, void *pvReserved, void *pvArg)
Definition: main.c:1385
static void export_password_mismatch(HWND hwnd, const struct ExportWizData *data)
Definition: main.c:5941
#define MAX_PURPOSE
Definition: main.c:3227
static void cert_mgr_show_cert_usages(HWND hwnd, int index)
Definition: main.c:958
static BOOL CALLBACK refresh_propsheet_pages(HWND hwnd, LPARAM lParam)
Definition: main.c:3528
static int CALLBACK cert_mgr_sort_by_date(LPARAM lp1, LPARAM lp2, LPARAM lp)
Definition: main.c:1107
static BOOL show_cert_dialog(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo, CRYPT_PROVIDER_CERT *provCert, BOOL *pfPropertiesChanged)
Definition: main.c:4310
static LRESULT CALLBACK import_store_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:5153
static WCHAR * field_format_serial_number(PCCERT_CONTEXT cert)
Definition: main.c:2625
static void show_cert_stores(HWND hwnd, DWORD dwFlags, struct CertMgrData *data)
Definition: main.c:496
BOOL WINAPI CryptUIDlgViewContext(DWORD dwContextType, LPVOID pvContext, HWND hwnd, LPCWSTR pwszTitle, DWORD dwFlags, LPVOID pvReserved)
Definition: main.c:4489
PCCERT_CONTEXT WINAPI CryptUIDlgSelectCertificateFromStore(HCERTSTORE hCertStore, HWND hwnd, LPCWSTR pwszTitle, LPCWSTR pwszDisplayString, DWORD dwDontUseColumn, DWORD dwFlags, void *pvReserved)
Definition: main.c:7581
static LRESULT CALLBACK hierarchy_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:4153
static void select_cert_view(HWND hwnd, PCCERT_CONTEXT cert, struct SelectCertData *data)
Definition: main.c:7252
static void show_user_notice(HWND hwnd, struct IssuerStatement *issuerStatement)
Definition: main.c:2506
WCHAR *(* field_format_func)(PCCERT_CONTEXT cert)
Definition: main.c:2597
static WCHAR * make_import_file_filter(DWORD dwFlags)
Definition: main.c:4940
static void free_prop_sheet_pages(PROPSHEETPAGEW *pages, DWORD num)
Definition: main.c:7461
static LPARAM index_to_lparam(struct hierarchy_data *data, DWORD index)
Definition: main.c:3956
static void add_oid_text_to_control(HWND hwnd, char *oid)
Definition: main.c:1893
static DWORD lparam_to_index(struct hierarchy_data *data, LPARAM lp)
Definition: main.c:3971
struct _CRYPTUI_SELECTSTORE_INFO_A CRYPTUI_SELECTSTORE_INFO_A
static WCHAR * field_format_detailed_public_key(PCCERT_CONTEXT cert, void *param)
Definition: main.c:2740
#define CRYPTUI_ENABLE_SHOW_PHYSICAL_STORE
Definition: main.c:1347
static void add_properties(HWND hwnd, struct detail_data *data)
Definition: main.c:3037
static const struct prop_id_to_string_id prop_id_map[]
Definition: main.c:3029
static UINT CALLBACK cert_properties_general_callback(HWND hwnd, UINT msg, PROPSHEETPAGEW *page)
Definition: main.c:3703
static void save_cert_mgr_usages(HWND hwnd)
Definition: main.c:664
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:6694
static void enumerate_stores(HWND hwnd, CRYPTUI_ENUM_DATA *pEnumData)
Definition: main.c:1431
static void add_cert_to_list(HWND lv, PCCERT_CONTEXT cert, DWORD flags, DWORD *allocatedLen, LPWSTR *str)
Definition: main.c:7066
static void set_general_cert_properties(HWND hwnd, struct edit_cert_data *data)
Definition: main.c:3491
static void show_cert_usages(HWND hwnd, struct edit_cert_data *data)
Definition: main.c:3412
static WCHAR * field_format_detailed_extension(PCCERT_CONTEXT cert, void *param)
Definition: main.c:2945
BOOL WINAPI CryptUIDlgCertMgr(PCCRYPTUI_CERT_MGR_STRUCT pCryptUICertMgr)
Definition: main.c:1313
static WCHAR * get_cps_str_from_qualifier(const CRYPT_OBJID_BLOB *qualifier)
Definition: main.c:2231
static void refresh_store_certs(HWND hwnd)
Definition: main.c:572
static void add_all_extensions(HWND hwnd, struct detail_data *data)
Definition: main.c:2985
static void show_edit_cert_properties_dialog(HWND parent, struct detail_data *data)
Definition: main.c:3746
struct _CRYPTUI_SELECTSTORE_INFO_W CRYPTUI_SELECTSTORE_INFO_W
static LRESULT CALLBACK export_welcome_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:5605
static LPWSTR get_cert_name_string(PCCERT_CONTEXT pCertContext, DWORD dwType, DWORD dwFlags)
Definition: main.c:1778
static WCHAR * strdupAtoW(const char *str)
Definition: main.c:67
static const WCHAR filter_ctl[]
Definition: main.c:4919
static WCHAR * get_cert_property_as_string(PCCERT_CONTEXT cert, DWORD prop)
Definition: main.c:3309
static void create_listview_columns(HWND hwnd)
Definition: main.c:3116
static CERT_ENHKEY_USAGE * convert_usages_str_to_usage(LPSTR usageStr)
Definition: main.c:281
static PROPSHEETPAGEW * prop_sheet_pages_AtoW(LPCPROPSHEETPAGEA pages, DWORD num)
Definition: main.c:7482
static WCHAR * field_format_detailed_subject(PCCERT_CONTEXT cert, void *param)
Definition: main.c:2663
static LRESULT CALLBACK cert_properties_general_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:3602
static void free_store_info(HWND tree)
Definition: main.c:1477
static void apply_general_changes(HWND hwnd)
Definition: main.c:3538
static const WCHAR filter_all[]
Definition: main.c:4923
#define MY_INDENT
Definition: main.c:1891
static WCHAR * field_format_issuer(PCCERT_CONTEXT cert)
Definition: main.c:2631
static LRESULT CALLBACK cert_mgr_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:1121
static void add_unformatted_text_to_control(HWND hwnd, LPCWSTR text, LONG len)
Definition: main.c:1735
struct _CRYPTUI_ENUM_DATA CRYPTUI_ENUM_DATA
CheckBitmapIndex
Definition: main.c:581
@ CheckBitmapIndexChecked
Definition: main.c:583
@ CheckBitmapIndexUnchecked
Definition: main.c:582
@ CheckBitmapIndexDisabledUnchecked
Definition: main.c:584
@ CheckBitmapIndexDisabledChecked
Definition: main.c:585
static BOOL save_base64(HANDLE file, const BYTE *pb, DWORD cb)
Definition: main.c:6458
static DWORD CALLBACK read_text_callback(DWORD_PTR dwCookie, LPBYTE buf, LONG cb, LONG *pcb)
Definition: main.c:1721
static void add_cert_columns(HWND hwnd)
Definition: main.c:77
static BOOL export_acquire_private_key(const CRYPT_KEY_PROV_INFO *info, HCRYPTPROV *phProv)
Definition: main.c:5670
static BOOL import_store(DWORD dwFlags, HWND hwnd, LPCWSTR szTitle, HCERTSTORE source, HCERTSTORE dest)
Definition: main.c:4761
BOOL WINAPI CryptUIDlgViewSignerInfoA(CRYPTUI_VIEWSIGNERINFO_STRUCTA *pcvsi)
Definition: main.c:7018
static struct hierarchy_data * get_hierarchy_data_from_tree_item(HWND tree, HTREEITEM hItem)
Definition: main.c:3983
static WCHAR * crypt_format_extension(const CERT_EXTENSION *ext, DWORD formatStrType)
Definition: main.c:2860
static void add_v1_field(HWND hwnd, struct detail_data *data, const struct v1_field *field)
Definition: main.c:2822
static struct OIDToString * findSupportedOID(LPCSTR oid)
Definition: main.c:1976
static int CALLBACK cert_mgr_sort_by_subject(LPARAM lp1, LPARAM lp2, LPARAM lp)
Definition: main.c:1097
static WCHAR * field_format_version(PCCERT_CONTEXT cert)
Definition: main.c:2599
static void get_cert_usages(PCCERT_CONTEXT cert, LPWSTR *str)
Definition: main.c:852
static const WCHAR export_filter_cms[]
Definition: main.c:6177
static const WCHAR export_filter_crl[]
Definition: main.c:6175
static LRESULT CALLBACK export_finish_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:6751
static WCHAR * format_long_date(const FILETIME *fileTime)
Definition: main.c:2668
static LRESULT CALLBACK select_store_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: main.c:1538
static WCHAR * field_format_detailed_cert_name(PCERT_NAME_BLOB name)
Definition: main.c:2637
static void free_certs(HWND lv)
Definition: main.c:533
static CERT_ENHKEY_USAGE * create_advanced_filter(void)
Definition: main.c:302
static HCERTSTORE cert_mgr_index_to_store(HWND tab, int index)
Definition: main.c:548
static BOOL init_hierarchy_page(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo, PROPSHEETPAGEW *page)
Definition: main.c:4249
static BOOL save_store_as_cms(HANDLE file, HCERTSTORE store)
Definition: main.c:6483
LPCWSTR filter
Definition: main.c:4929
BOOL(WINAPI * PFN_SELECTED_STORE_CB)(HCERTSTORE store, HWND hwnd, void *pvArg)
Definition: main.c:1343
static void refresh_details_view(HWND hwnd)
Definition: main.c:3785
static BOOL import_file(DWORD dwFlags, HWND hwnd, LPCWSTR szTitle, LPCWSTR fileName, HCERTSTORE dest)
Definition: main.c:4840
static LONG_PTR find_oid_in_list(HWND lv, LPCSTR oid)
Definition: main.c:639
static BOOL check_store_context_type(DWORD dwFlags, HCERTSTORE store)
Definition: main.c:4722
#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
HANDLE HWND
Definition: compat.h:19
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define HeapReAlloc
Definition: compat.h:734
#define FreeLibrary(x)
Definition: compat.h:748
#define GENERIC_READ
Definition: compat.h:135
#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 HEAP_ZERO_MEMORY
Definition: compat.h:134
#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 LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:188
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:4243
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: locale.c:1666
const WCHAR * action
Definition: action.c:7509
const WCHAR * text
Definition: package.c:1794
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:71
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
GLdouble GLdouble u2
Definition: glext.h:8308
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 * u
Definition: glfuncs.h:240
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 iswspace(_c)
Definition: ctype.h:669
#define iswprint(_c)
Definition: ctype.h:672
_CONST_RETURN wchar_t *__cdecl wmemchr(_In_reads_(_N) const wchar_t *_S, _In_ wchar_t _C, _In_ size_t _N)
Definition: wchar.h:2606
#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:989
if(dx< 0)
Definition: linetemp.h:194
static IN DWORD IN LPVOID lpvReserved
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
__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:844
static const BYTE crl[]
Definition: message.c:864
static const BYTE cert1[]
Definition: message.c:828
static BYTE cert[]
Definition: msg.c:1437
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
static LPCSTR DWORD void * pvReserved
Definition: str.c:196
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
static const struct access_res create[16]
Definition: package.c:7505
#define cmp(status, error)
Definition: error.c:114
static char * dest
Definition: rtl.c:135
static APTTYPEQUALIFIER * qualifier
Definition: compobj.c:79
static HCRYPTPROV hProv
Definition: rsaenh.c:32
static ATOM item
Definition: dde.c:856
static WCHAR password[]
Definition: url.c:33
static PCCRYPT_OID_INFO ** usages
Definition: softpub.c:81
#define min(a, b)
Definition: monoChain.cc:55
REFCLSID clsid
Definition: msctf.c:82
__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
#define BOOL
Definition: nt_native.h:43
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
#define KEY_READ
Definition: nt_native.h:1023
#define GENERIC_WRITE
Definition: nt_native.h:90
#define LOCALE_SYSTEM_DEFAULT
HRESULT WINAPI CreateBindCtx(DWORD reserved, LPBC *ppbc)
Definition: bindctx.c:556
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
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
const WCHAR * str
#define warning(s)
Definition: debug.h:83
strcpy
Definition: string.h:131
#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
HRESULT hr
Definition: shlfolder.c:183
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:492
LPCWSTR title
Definition: main.c:491
HIMAGELIST imageList
Definition: main.c:490
const struct CertMgrStoreInfo * stores
Definition: main.c:493
int removePluralWarning
Definition: main.c:467
int removeWarning
Definition: main.c:466
LPCWSTR name
Definition: main.c:465
DWORD dwFlags
Definition: main.c:5593
LPWSTR fileName
Definition: main.c:5600
BOOL deleteKeys
Definition: main.c:5599
HANDLE file
Definition: main.c:5601
CRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO contextInfo
Definition: main.c:5596
LPCWSTR pwszWizardTitle
Definition: main.c:5594
HFONT titleFont
Definition: main.c:5592
PCRYPT_KEY_PROV_INFO keyProvInfo
Definition: main.c:5598
CRYPTUI_WIZ_EXPORT_INFO exportInfo
Definition: main.c:5595
BOOL success
Definition: main.c:5602
BOOL freePassword
Definition: main.c:5597
BOOL freeDest
Definition: main.c:4866
LPWSTR fileName
Definition: main.c:4862
HFONT titleFont
Definition: main.c:4858
DWORD dwFlags
Definition: main.c:4859
HCERTSTORE hDestCertStore
Definition: main.c:4865
BOOL autoDest
Definition: main.c:4867
BOOL success
Definition: main.c:4868
BOOL freeSource
Definition: main.c:4864
DWORD contentType
Definition: main.c:4863
LPCWSTR pwszWizardTitle
Definition: main.c:4860
CRYPTUI_WIZ_IMPORT_SRC_INFO importSrc
Definition: main.c:4861
LPWSTR cps
Definition: main.c:2274
LPWSTR userNotice
Definition: main.c:2275
int id
Definition: main.c:1913
LPCSTR oid
Definition: main.c:1912
LPCWSTR buf
Definition: main.c:1716
DWORD dateColumn
Definition: main.c:7241
DWORD cStores
Definition: main.c:7244
HIMAGELIST imageList
Definition: main.c:7242
PFNCCERTDISPLAYPROC displayProc
Definition: main.c:7248
HCERTSTORE * rghStores
Definition: main.c:7245
void * callbackData
Definition: main.c:7249
DWORD cPropSheetPages
Definition: main.c:7246
PCCERT_CONTEXT * cert
Definition: main.c:7240
LPCPROPSHEETPAGEW rgPropSheetPages
Definition: main.c:7247
LPCWSTR title
Definition: main.c:7243
PCCERT_CONTEXT cert
Definition: main.c:7285
PCCRYPTUI_SELECTCERTIFICATE_STRUCTW pcsc
Definition: main.c:7284
PCRYPTUI_SELECTSTORE_INFO_W info
Definition: main.c:1534
HCERTSTORE store
Definition: main.c:1535
int column
Definition: main.c:7273
HWND hwnd
Definition: main.c:7272
enum StoreInfo::@377 type
@ StoreHandle
Definition: main.c:1376
@ SystemStore
Definition: main.c:1377
HCERTSTORE store
Definition: main.c:1380
union StoreInfo::@378 DUMMYUNIONNAME
LPWSTR name
Definition: main.c:1381
CERT_TRUST_STATUS TrustStatus
Definition: wincrypt.h:939
CERT_TRUST_STATUS TrustStatus
Definition: wincrypt.h:917
PCERT_INFO pCertInfo
Definition: wincrypt.h:482
BYTE * pbCertEncoded
Definition: wincrypt.h:480
DWORD cbCertEncoded
Definition: wincrypt.h:481
LPSTR pszObjId
Definition: wincrypt.h:230
CRYPT_OBJID_BLOB Value
Definition: wincrypt.h:232
PCERT_EXTENSION rgExtension
Definition: wincrypt.h:252
DWORD cExtension
Definition: wincrypt.h:251
DWORD dwValueType
Definition: wincrypt.h:272
CERT_RDN_VALUE_BLOB Value
Definition: wincrypt.h:273
CERT_POLICY_INFO * rgPolicyInfo
Definition: wincrypt.h:400
CERT_POLICY_QUALIFIER_INFO * rgPolicyQualifier
Definition: wincrypt.h:395
DWORD cPolicyQualifier
Definition: wincrypt.h:394
DWORD cbCrlEncoded
Definition: wincrypt.h:621
BYTE * pbCrlEncoded
Definition: wincrypt.h:620
BYTE * pbData
Definition: wincrypt.h:103
PCRYPTUI_ENUM_SYSTEM_STORE_ARGS rgEnumArgs
Definition: main.c:1340
DWORD cEnumArgs
Definition: main.c:1339
HCERTSTORE * rghStore
Definition: main.c:1338
LPCPROPSHEETPAGEW rgPropSheetPages
Definition: cryptuiapi.h:385
PFNCCERTDISPLAYPROC pDisplayCallback
Definition: cryptuiapi.h:378
CRYPTUI_ENUM_DATA * pEnumData
Definition: main.c:1356
PFN_SELECTED_STORE_CB pfnSelectedStoreCallback
Definition: main.c:1357
CRYPTUI_ENUM_DATA * pEnumData
Definition: main.c:1368
PFN_SELECTED_STORE_CB pfnSelectedStoreCallback
Definition: main.c:1369
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:209
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:746
BYTE * pbCtlEncoded
Definition: wincrypt.h:745
DWORD cUsageIdentifier
Definition: wincrypt.h:719
LPSTR * rgpszUsageIdentifier
Definition: wincrypt.h:720
LPCSTR pszIcon
Definition: prsht.h:186
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:2752
BOOL * pfPropertiesChanged
Definition: main.c:2751
struct field_value_data * fields
Definition: main.c:2753
PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo
Definition: main.c:2750
HIMAGELIST imageList
Definition: main.c:3409
BOOL * pfPropertiesChanged
Definition: main.c:3408
PCCERT_CONTEXT cert
Definition: main.c:3407
void * param
Definition: main.c:2764
LPWSTR detailed_value
Definition: main.c:2763
create_detailed_value_func create
Definition: main.c:2762
Definition: parser.c:44
Definition: fci.c:127
Definition: dsound.c:943
DWORD selectedCert
Definition: main.c:3953
PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo
Definition: main.c:3951
HIMAGELIST imageList
Definition: main.c:3952
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:3012
add_fields_func add
Definition: main.c:3088
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:3170
HWND hwndFrom
Definition: winuser.h:3168
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:308
LONG left
Definition: windef.h:306
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:2819
int id
Definition: main.c:2817
field_format_func format
Definition: main.c:2818
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
int32_t INT_PTR
Definition: typedefs.h:64
uint32_t DWORD_PTR
Definition: typedefs.h:65
unsigned char * LPBYTE
Definition: typedefs.h:53
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:11
Definition: pdh_main.c:96
int ret
static struct wctab tab[]
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define FORMAT_MESSAGE_FROM_STRING
Definition: winbase.h:447
#define FORMAT_MESSAGE_FROM_SYSTEM
Definition: winbase.h:449
#define FORMAT_MESSAGE_ALLOCATE_BUFFER
Definition: winbase.h:445
#define FORMAT_MESSAGE_ARGUMENT_ARRAY
Definition: winbase.h:450
#define szOID_PKIX_KP_IPSEC_END_SYSTEM
Definition: wincrypt.h:3298
#define szOID_NT5_CRYPTO
Definition: wincrypt.h:3221
#define szOID_KP_DOCUMENT_SIGNING
Definition: wincrypt.h:3227
#define CERT_ENHKEY_USAGE_PROP_ID
Definition: wincrypt.h:2694
#define szOID_EFS_RECOVERY
Definition: wincrypt.h:3219
#define CRYPT_FORMAT_STR_MULTI_LINE
Definition: wincrypt.h:3510
#define CERT_QUERY_CONTENT_SERIALIZED_CERT
Definition: wincrypt.h:3533
#define szOID_KP_KEY_RECOVERY_AGENT
Definition: wincrypt.h:3271
#define CERT_QUERY_CONTENT_FLAG_CTL
Definition: wincrypt.h:3544
#define CERT_STORE_SAVE_AS_STORE
Definition: wincrypt.h:2646
#define CERT_NAME_SIMPLE_DISPLAY_TYPE
Definition: wincrypt.h:3500
#define CERT_STORE_PROV_COLLECTION
Definition: wincrypt.h:2261
#define szOID_PKIX_POLICY_QUALIFIER_CPS
Definition: wincrypt.h:3291
struct _CRYPT_OID_INFO CRYPT_OID_INFO
#define CERT_STORE_LOCALIZED_NAME_PROP_ID
Definition: wincrypt.h:2830
#define szOID_LICENSES
Definition: wincrypt.h:3238
#define CERT_QUERY_OBJECT_FILE
Definition: wincrypt.h:3526
#define CERT_X500_NAME_STR
Definition: wincrypt.h:3486
#define szOID_DRM
Definition: wincrypt.h:3232
ULONG_PTR HCRYPTPROV
Definition: wincrypt.h:46
#define szOID_BASIC_CONSTRAINTS2
Definition: wincrypt.h:3189
#define CERT_QUERY_CONTENT_FLAG_CRL
Definition: wincrypt.h:3545
#define CERT_STORE_SAVE_AS_PKCS7
Definition: wincrypt.h:2647
#define CERT_QUERY_CONTENT_FLAG_CERT
Definition: wincrypt.h:3543
#define CERT_KEY_PROV_INFO_PROP_ID
Definition: wincrypt.h:2686
#define CERT_QUERY_CONTENT_CRL
Definition: wincrypt.h:3531
#define szOID_ENROLLMENT_AGENT
Definition: wincrypt.h:3256
#define CERT_DESCRIPTION_PROP_ID
Definition: wincrypt.h:2699
#define CERT_STORE_CREATE_NEW_FLAG
Definition: wincrypt.h:2464
#define CERT_QUERY_CONTENT_SERIALIZED_STORE
Definition: wincrypt.h:3532
#define szOID_KP_LIFETIME_SIGNING
Definition: wincrypt.h:3228
#define CRYPT_STRING_BASE64
Definition: wincrypt.h:2985
struct _CRYPT_OID_INFO * PCRYPT_OID_INFO
#define szOID_PKIX_KP_CLIENT_AUTH
Definition: wincrypt.h:3295
#define CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG
Definition: wincrypt.h:2916
#define CRYPT_ENHKEY_USAGE_OID_GROUP_ID
Definition: wincrypt.h:1690
#define CERT_QUERY_CONTENT_CTL
Definition: wincrypt.h:3530
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
#define szOID_PKIX_KP_CODE_SIGNING
Definition: wincrypt.h:3296
#define CERT_QUERY_CONTENT_SERIALIZED_CTL
Definition: wincrypt.h:3534
#define CRYPT_DELETEKEYSET
Definition: wincrypt.h:2071
#define CRYPT_EXPORT
Definition: wincrypt.h:2197
#define X509_NAME_VALUE
Definition: wincrypt.h:3370
#define szOID_PKIX_KP_IPSEC_USER
Definition: wincrypt.h:3300
#define szOID_PKIX_KP_TIMESTAMP_SIGNING
Definition: wincrypt.h:3301
#define szOID_PKIX_KP_IPSEC_TUNNEL
Definition: wincrypt.h:3299
#define szOID_OEM_WHQL_CRYPTO
Definition: wincrypt.h:3222
#define X509_ASN_ENCODING
Definition: wincrypt.h:2297
#define szOID_ANY_CERT_POLICY
Definition: wincrypt.h:3198
#define szOID_BASIC_CONSTRAINTS
Definition: wincrypt.h:3183
#define CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG
Definition: wincrypt.h:2918
#define CRYPT_DECODE_ALLOC_FLAG
Definition: wincrypt.h:3454
#define CERT_STORE_PROV_MEMORY
Definition: wincrypt.h:2251
#define CERT_NAME_STR_CRLF_FLAG
Definition: wincrypt.h:3490
#define szOID_KP_CTL_USAGE_SIGNING
Definition: wincrypt.h:3210
#define CERT_FRIENDLY_NAME_PROP_ID
Definition: wincrypt.h:2697
#define CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT
Definition: wincrypt.h:3548
#define X509_CERT_POLICIES
Definition: wincrypt.h:3381
#define CERT_STORE_CERTIFICATE_CONTEXT
Definition: wincrypt.h:2974
#define CERT_CA_SUBJECT_FLAG
Definition: wincrypt.h:378
#define szOID_KP_QUALIFIED_SUBORDINATION
Definition: wincrypt.h:3225
#define szOID_KP_KEY_RECOVERY
Definition: wincrypt.h:3226
#define szOID_CERT_POLICIES
Definition: wincrypt.h:3197
#define szOID_KP_EFS
Definition: wincrypt.h:3218
#define CERT_QUERY_CONTENT_SERIALIZED_CRL
Definition: wincrypt.h:3535
const CERT_CONTEXT * PCCERT_CONTEXT
Definition: wincrypt.h:485
#define szOID_PKIX_KP_SERVER_AUTH
Definition: wincrypt.h:3294
#define EXPORT_PRIVATE_KEYS
Definition: wincrypt.h:4137
_In_ PCCERT_CONTEXT pCertContext
Definition: wincrypt.h:4836
#define CERT_QUERY_CONTENT_PKCS7_SIGNED
Definition: wincrypt.h:3536
#define CERT_HASH_PROP_ID
Definition: wincrypt.h:2688
#define szOID_PKIX_KP_EMAIL_PROTECTION
Definition: wincrypt.h:3297
#define szOID_KP_SMARTCARD_LOGON
Definition: wincrypt.h:3258
#define CERT_NAME_ISSUER_FLAG
Definition: wincrypt.h:3506
#define szOID_WHQL_CRYPTO
Definition: wincrypt.h:3220
#define CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED
Definition: wincrypt.h:3554
#define CERT_STORE_ADD_ALWAYS
Definition: wincrypt.h:2485
#define CERT_QUERY_FORMAT_FLAG_ALL
Definition: wincrypt.h:3589
#define CERT_STORE_PROV_SYSTEM_W
Definition: wincrypt.h:2259
const CRYPT_OID_INFO * PCCRYPT_OID_INFO
Definition: wincrypt.h:1418
#define szOID_PKIX_POLICY_QUALIFIER_USERNOTICE
Definition: wincrypt.h:3292
#define szOID_EMBEDDED_NT_CRYPTO
Definition: wincrypt.h:3223
#define REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY
Definition: wincrypt.h:4136
#define CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE
Definition: wincrypt.h:3546
#define CERT_TRUST_IS_PARTIAL_CHAIN
Definition: wincrypt.h:891
#define CRYPT_OID_INFO_OID_KEY
Definition: wincrypt.h:1702
#define CERT_SYSTEM_STORE_CURRENT_USER
Definition: wincrypt.h:2324
#define PKCS_7_ASN_ENCODING
Definition: wincrypt.h:2299
#define szOID_KP_CA_EXCHANGE
Definition: wincrypt.h:3270
#define KP_PERMISSIONS
Definition: wincrypt.h:2133
#define CERT_STORE_SAVE_TO_FILE
Definition: wincrypt.h:2649
#define CRYPT_FORMAT_STR_NO_HEX
Definition: wincrypt.h:3511
#define szOID_ANY_APPLICATION_POLICY
Definition: wincrypt.h:3247
#define CERT_QUERY_CONTENT_FLAG_PFX
Definition: wincrypt.h:3561
#define szOID_APPLICATION_CERT_POLICIES
Definition: wincrypt.h:3275
#define szOID_DS_EMAIL_REPLICATION
Definition: wincrypt.h:3283
#define CERT_QUERY_CONTENT_CERT
Definition: wincrypt.h:3529
struct _CERT_BASIC_CONSTRAINTS2_INFO CERT_BASIC_CONSTRAINTS2_INFO
ULONG_PTR HCRYPTKEY
Definition: wincrypt.h:49
#define X509_ENHANCED_KEY_USAGE
Definition: wincrypt.h:3403
#define X509_PKIX_POLICY_QUALIFIER_USERNOTICE
Definition: wincrypt.h:3414
#define CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL
Definition: wincrypt.h:3552
#define CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL
Definition: wincrypt.h:3550
#define CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES
Definition: wincrypt.h:2486
#define szOID_ROOT_LIST_SIGNER
Definition: wincrypt.h:3224
#define szOID_LICENSE_SERVER
Definition: wincrypt.h:3241
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
#define __ms_va_list
Definition: windef.h:456
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
DWORD COLORREF
Definition: windef.h:300
#define WINAPI
Definition: msvc.h:6
const char * description
Definition: directx.c:2497
#define ERROR_CANCELLED
Definition: winerror.h:726
#define TRUST_E_CERT_SIGNATURE
Definition: winerror.h:3107
#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:63
#define LOCALE_SSHORTDATE
Definition: winnls.h:62
#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:1977
#define WM_GETTEXTLENGTH
Definition: winuser.h:1630
#define SWP_NOACTIVATE
Definition: winuser.h:1253
#define CB_GETLBTEXTLEN
Definition: winuser.h:1964
#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:4840
#define LR_LOADTRANSPARENT
Definition: winuser.h:1104
#define CB_GETLBTEXT
Definition: winuser.h:1963
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)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
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:4410
#define SB_VERT
Definition: winuser.h:553
#define WM_COMMAND
Definition: winuser.h:1751
#define IS_INTRESOURCE(i)
Definition: winuser.h:580
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:2540
#define CB_SETCURSEL
Definition: winuser.h:1972
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define SWP_NOSIZE
Definition: winuser.h:1256
#define WM_GETTEXT
Definition: winuser.h:1629
#define CB_RESETCONTENT
Definition: winuser.h:1970
#define CB_FINDSTRINGEXACT
Definition: winuser.h:1951
#define WM_INITDIALOG
Definition: winuser.h:1750
#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:1990
#define MB_ICONERROR
Definition: winuser.h:798
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
#define WM_SETTEXT
Definition: winuser.h:1628
HWND WINAPI SetFocus(_In_opt_ HWND)
#define EM_SETLIMITTEXT
Definition: winuser.h:2022
#define WM_SETFONT
Definition: winuser.h:1661
#define BM_CLICK
Definition: winuser.h:1928
#define CB_GETITEMDATA
Definition: winuser.h:1961
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
HDC WINAPI GetDC(_In_opt_ HWND)
#define EM_SETSEL
Definition: winuser.h:2029
#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:1936
#define VK_DELETE
Definition: winuser.h:2244
#define WM_DESTROY
Definition: winuser.h:1620
#define LR_DEFAULTSIZE
Definition: winuser.h:1105
BOOL WINAPI ShowScrollBar(_In_ HWND, _In_ int, _In_ BOOL)
#define EM_GETLINECOUNT
Definition: winuser.h:2003
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define CB_INSERTSTRING
Definition: winuser.h:1968
HBITMAP WINAPI LoadBitmapW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2500
#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:1954
#define SetWindowLongPtrW
Definition: winuser.h:5366
#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:2033
const char * LPCSTR
Definition: xmlstorage.h:183
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
unsigned char BYTE
Definition: xxhash.c:193