Module: wine Branch: master Commit: 5d4d5b16fd2ca99648e6755d09fe17298e952620 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5d4d5b16fd2ca99648e6755d09...
Author: Juan Lang juan.lang@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),