Juan Lang : crypt32: More fully implement CryptSIPRetrieveSubjectGuid.

Alexandre Julliard julliard at winehq.org
Mon Aug 4 08:53:32 CDT 2008


Module: wine
Branch: master
Commit: 5d4d5b16fd2ca99648e6755d09fe17298e952620
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5d4d5b16fd2ca99648e6755d09fe17298e952620

Author: Juan Lang <juan.lang at gmail.com>
Date:   Fri Aug  1 10:19:52 2008 -0700

crypt32: More fully implement CryptSIPRetrieveSubjectGuid.

---

 dlls/crypt32/sip.c |   89 ++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 80 insertions(+), 9 deletions(-)

diff --git a/dlls/crypt32/sip.c b/dlls/crypt32/sip.c
index 227c895..8258e79 100644
--- a/dlls/crypt32/sip.c
+++ b/dlls/crypt32/sip.c
@@ -318,6 +318,9 @@ BOOL WINAPI CryptSIPRetrieveSubjectGuid
     static const WORD dosHdr = IMAGE_DOS_SIGNATURE;
     static const BYTE cabHdr[] = { 'M','S','C','F' };
     BYTE hdr[SIP_MAX_MAGIC_NUMBER];
+    WCHAR szFullKey[ 0x100 ];
+    LONG r = ERROR_SUCCESS;
+    HKEY key;
 
     TRACE("(%s %p %p)\n", wine_dbgstr_w(FileName), hFileIn, pgSubject);
 
@@ -369,16 +372,84 @@ BOOL WINAPI CryptSIPRetrieveSubjectGuid
         goto cleanup;
     }
 
-    /* FIXME
-     * There is a lot more to be checked:
-     * - Check for the keys CryptSIPDllIsMyFileType and CryptSIPDllIsMyFileType2
-     *   under HKLM\Software\Microsoft\Cryptography\OID\EncodingType 0. Here are 
-     *   functions listed that need check if a SIP Provider can deal with the 
-     *   given file.
-     */
+    /* Check for supported functions using CryptSIPDllIsMyFileType */
+    /* max length of szFullKey depends on our code only, so we won't overrun */
+    lstrcpyW(szFullKey, szOID);
+    lstrcatW(szFullKey, szIsMyFile);
+    r = RegOpenKeyExW(HKEY_LOCAL_MACHINE, szFullKey, 0, KEY_READ, &key);
+    if (r == ERROR_SUCCESS)
+    {
+        DWORD index = 0, size;
+        WCHAR subKeyName[MAX_PATH];
+
+        do {
+            size = sizeof(subKeyName) / sizeof(subKeyName[0]);
+            r = RegEnumKeyExW(key, index++, subKeyName, &size, NULL, NULL,
+             NULL, NULL);
+            if (r == ERROR_SUCCESS)
+            {
+                HKEY subKey;
+
+                r = RegOpenKeyExW(key, subKeyName, 0, KEY_READ, &subKey);
+                if (r == ERROR_SUCCESS)
+                {
+                    HMODULE lib;
+                    pfnIsFileSupported isMy = CRYPT_LoadSIPFuncFromKey(subKey,
+                     &lib);
+
+                    if (isMy)
+                    {
+                        bRet = isMy(hFile, pgSubject);
+                        FreeLibrary(lib);
+                    }
+                    RegCloseKey(subKey);
+                }
+            }
+        } while (!bRet && r == ERROR_SUCCESS);
+        RegCloseKey(key);
+    }
 
-    /* Let's set the most common error for now */
-    SetLastError(TRUST_E_SUBJECT_FORM_UNKNOWN);
+    /* Check for supported functions using CryptSIPDllIsMyFileType2 */
+    if (!bRet)
+    {
+        lstrcpyW(szFullKey, szOID);
+        lstrcatW(szFullKey, szIsMyFile2);
+        r = RegOpenKeyExW(HKEY_LOCAL_MACHINE, szFullKey, 0, KEY_READ, &key);
+        if (r == ERROR_SUCCESS)
+        {
+            DWORD index = 0, size;
+            WCHAR subKeyName[MAX_PATH];
+
+            do {
+                size = sizeof(subKeyName) / sizeof(subKeyName[0]);
+                r = RegEnumKeyExW(key, index++, subKeyName, &size, NULL, NULL,
+                 NULL, NULL);
+                if (r == ERROR_SUCCESS)
+                {
+                    HKEY subKey;
+
+                    r = RegOpenKeyExW(key, subKeyName, 0, KEY_READ, &subKey);
+                    if (r == ERROR_SUCCESS)
+                    {
+                        HMODULE lib;
+                        pfnIsFileSupportedName isMy2 =
+                         CRYPT_LoadSIPFuncFromKey(subKey, &lib);
+
+                        if (isMy2)
+                        {
+                            bRet = isMy2((LPWSTR)FileName, pgSubject);
+                            FreeLibrary(lib);
+                        }
+                        RegCloseKey(subKey);
+                    }
+                }
+            } while (!bRet && r == ERROR_SUCCESS);
+            RegCloseKey(key);
+        }
+    }
+
+    if (!bRet)
+        SetLastError(TRUST_E_SUBJECT_FORM_UNKNOWN);
 
 cleanup:
     /* If we didn't open this one we shouldn't close it (hFile is a copy),




More information about the wine-cvs mailing list