cryptui: Add a partial implementation of CryptUIWizImport.

Hans Leidekker hans at codeweavers.com
Mon Oct 20 03:16:45 CDT 2008


This is just enough to make importing a certificate in Outlook 2007 work.

 -Hans

diff --git a/dlls/cryptui/Makefile.in b/dlls/cryptui/Makefile.in
index 996711a..abb0b27 100644
--- a/dlls/cryptui/Makefile.in
+++ b/dlls/cryptui/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../..
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = cryptui.dll
-IMPORTS   = kernel32
+IMPORTS   = crypt32 kernel32
 IMPORTLIB = cryptui
 
 C_SRCS = \
diff --git a/dlls/cryptui/cryptui.spec b/dlls/cryptui/cryptui.spec
index 088d087..201282f 100644
--- a/dlls/cryptui/cryptui.spec
+++ b/dlls/cryptui/cryptui.spec
@@ -34,7 +34,7 @@
 34 stub CryptUIWizExport
 35 stub CryptUIWizFreeCertRequestNoDS
 36 stub CryptUIWizFreeDigitalSignContext
-37 stub CryptUIWizImport
+37 stdcall CryptUIWizImport(long ptr wstr ptr ptr)
 38 stub CryptUIWizQueryCertRequestNoDS
 39 stub CryptUIWizSubmitCertRequestNoDS
 40 stub DllRegisterServer
diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c
index 00e8683..0aab87e 100644
--- a/dlls/cryptui/main.c
+++ b/dlls/cryptui/main.c
@@ -98,3 +98,76 @@ BOOL WINAPI CryptUIDlgViewCertificateW(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertVi
     if (pfPropertiesChanged) *pfPropertiesChanged = FALSE;
     return TRUE;
 }
+
+BOOL WINAPI CryptUIWizImport(DWORD dwFlags, HWND hwndParent, LPCWSTR pwszWizardTitle,
+                             PCCRYPTUI_WIZ_IMPORT_SRC_INFO pImportSrc, HCERTSTORE hDestCertStore)
+{
+    static const WCHAR Root[] = {'R','o','o','t',0};
+    BOOL ret;
+    HANDLE file;
+    HCERTSTORE store;
+    BYTE *buffer;
+    DWORD size, encoding = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
+    const CERT_CONTEXT *cert;
+
+    TRACE("(0x%08x, %p, %s, %p, %p)\n", dwFlags, hwndParent, debugstr_w(pwszWizardTitle),
+          pImportSrc, hDestCertStore);
+
+    FIXME("only certificate files are supported\n");
+
+    if (!(dwFlags & CRYPTUI_WIZ_NO_UI)) FIXME("UI not implemented\n");
+
+    if (pImportSrc->dwSubjectChoice != CRYPTUI_WIZ_IMPORT_SUBJECT_FILE)
+    {
+        FIXME("source type not implemented: %u\n", pImportSrc->dwSubjectChoice);
+        return FALSE;
+    }
+    file = CreateFileW(pImportSrc->pwszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
+                       OPEN_EXISTING, 0, NULL);
+    if (file == INVALID_HANDLE_VALUE)
+    {
+        WARN("can't open certificate file %s\n", debugstr_w(pImportSrc->pwszFileName));
+        return FALSE;
+    }
+    if ((size = GetFileSize(file, NULL)))
+    {
+        if ((buffer = HeapAlloc(GetProcessHeap(), 0, size)))
+        {
+            DWORD read;
+            if (!ReadFile(file, buffer, size, &read, NULL) || read != size)
+            {
+                WARN("can't read certificate file %s\n", debugstr_w(pImportSrc->pwszFileName));
+                HeapFree(GetProcessHeap(), 0, buffer);
+                CloseHandle(file);
+                return FALSE;
+            }
+        }
+    }
+    else
+    {
+        WARN("empty file %s\n", debugstr_w(pImportSrc->pwszFileName));
+        CloseHandle(file);
+        return FALSE;
+    }
+    CloseHandle(file);
+    if (!(cert = CertCreateCertificateContext(encoding, buffer, size)))
+    {
+        WARN("unable to create certificate context\n");
+        HeapFree(GetProcessHeap(), 0, buffer);
+        return FALSE;
+    }
+    /* FIXME: verify certificate and determine store name dynamically */
+    if (!(store = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, Root)))
+    {
+        WARN("unable to open certificate store\n");
+        CertFreeCertificateContext(cert);
+        HeapFree(GetProcessHeap(), 0, buffer);
+        return FALSE;
+    }
+    ret = CertAddCertificateContextToStore(store, cert, CERT_STORE_ADD_REPLACE_EXISTING, NULL);
+
+    CertCloseStore(store, 0);
+    CertFreeCertificateContext(cert);
+    HeapFree(GetProcessHeap(), 0, buffer);
+    return ret;
+}



More information about the wine-patches mailing list