[Wine-patches] [eterhack] crypt32: Implement CryptRegisterOIDInfo (eterbug #5528).

Alexander Morozov amorozov на etersoft.ru
Пн Апр 26 19:58:15 MSD 2010


----------- следующая часть -----------
From 8d5981f77bee753d27de70171f5587779a32ce30 Mon Sep 17 00:00:00 2001
From: Alexander Morozov <amorozov на etersoft.ru>
Date: Mon, 26 Apr 2010 19:37:05 +0400
Subject: [eterhack] crypt32: Implement CryptRegisterOIDInfo (eterbug #5528).

---
 dlls/crypt32/oid.c |   95 +++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 83 insertions(+), 12 deletions(-)

diff --git a/dlls/crypt32/oid.c b/dlls/crypt32/oid.c
index a95a791..440d556 100644
--- a/dlls/crypt32/oid.c
+++ b/dlls/crypt32/oid.c
@@ -29,14 +29,24 @@
 #include "wincrypt.h"
 #include "winreg.h"
 #include "winuser.h"
+#include "winnls.h"
 #include "wine/debug.h"
 #include "wine/list.h"
 #include "crypt32_private.h"
 #include "cryptres.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(crypt);
 
 static const WCHAR DllW[] = { 'D','l','l',0 };
+static const WCHAR wszCryptDllFindOIDInfoKey[] =
+ { 'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
+ 'C','r','y','p','t','o','g','r','a','p','h','y','\\',
+ 'O','I','D','\\','E','n','c','o','d','i','n','g','T','y','p','e',' ','0','\\',
+ 'C','r','y','p','t','D','l','l','F','i','n','d','O','I','D','I','n','f','o',0 };
+static const WCHAR wszAlgid[] = { 'A','l','g','i','d',0 };
+static const WCHAR wszExtraInfo[] = { 'E','x','t','r','a','I','n','f','o',0 };
+static const WCHAR wszName[] = { 'N','a','m','e',0 };
 
 static void init_oid_info(void);
 static void free_function_sets(void);
@@ -673,9 +683,79 @@ error_close_key:
  */
 BOOL WINAPI CryptRegisterOIDInfo(PCCRYPT_OID_INFO pInfo, DWORD dwFlags)
 {
-    FIXME("(%p, %x): stub\n", pInfo, dwFlags );
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return FALSE;
+    WCHAR bufW[MAX_PATH];
+    char buf[MAX_PATH];
+    HKEY hKey, hSubKey;
+    BOOL ret = FALSE;
+    LONG r;
+
+    TRACE("(%p, %x)\n", pInfo, dwFlags);
+
+    if (dwFlags)
+        FIXME("flags not supported\n");
+
+    if (!pInfo || pInfo->cbSize < sizeof(CRYPT_OID_INFO) || !pInfo->pszOID)
+    {
+        SetLastError(E_INVALIDARG);
+        return FALSE;
+    }
+
+    r = RegCreateKeyW(HKEY_LOCAL_MACHINE, wszCryptDllFindOIDInfoKey, &hKey);
+    if (r != ERROR_SUCCESS)
+    {
+        SetLastError(r);
+        return FALSE;
+    }
+
+    snprintf(buf, sizeof(buf), "%s!%u", pInfo->pszOID, pInfo->dwGroupId);
+    if (!MultiByteToWideChar(CP_ACP, 0, buf, -1, bufW, sizeof(bufW)))
+    {
+        RegCloseKey(hKey);
+        return FALSE;
+    }
+
+    r = RegCreateKeyW(hKey, bufW, &hSubKey);
+    if (r == ERROR_SUCCESS)
+    {
+        if (pInfo->pwszName)
+        {
+            r = RegSetValueExW(hSubKey, wszName, 0, REG_SZ,
+             (LPBYTE)pInfo->pwszName,
+             (strlenW(pInfo->pwszName) + 1) * sizeof(WCHAR));
+            if (r != ERROR_SUCCESS)
+            {
+                SetLastError(r);
+                goto close_key;
+            }
+        }
+        if (pInfo->u.Algid)
+        {
+            r = RegSetValueExW(hSubKey, wszAlgid, 0, REG_DWORD,
+             (LPBYTE)&pInfo->u.Algid, sizeof(pInfo->u.Algid));
+            if (r != ERROR_SUCCESS)
+            {
+                SetLastError(r);
+                goto close_key;
+            }
+        }
+        if (pInfo->ExtraInfo.cbData)
+        {
+            r = RegSetValueExW(hSubKey, wszExtraInfo, 0, REG_BINARY,
+             pInfo->ExtraInfo.pbData, pInfo->ExtraInfo.cbData);
+            if (r != ERROR_SUCCESS)
+            {
+                SetLastError(r);
+                goto close_key;
+            }
+        }
+        ret = TRUE;
+close_key:
+        RegCloseKey(hSubKey);
+    }
+    else SetLastError(r);
+
+    RegCloseKey(hKey);
+    return ret;
 }
 
 /***********************************************************************
@@ -1483,15 +1563,6 @@ static void free_oid_info(void)
 
 static void update_oid_info(void)
 {
-    static const WCHAR wszCryptDllFindOIDInfoKey[] = {'S','o','f','t','w','a','r','e','\\',
-     'M','i','c','r','o','s','o','f','t','\\',
-     'C','r','y','p','t','o','g','r','a','p','h','y','\\',
-     'O','I','D','\\','E','n','c','o','d','i','n','g','T','y','p','e',' ','0','\\',
-     'C','r','y','p','t','D','l','l','F','i','n','d','O','I','D','I','n','f','o',0};
-    static const WCHAR wszAlgid[] = {'A','l','g','i','d',0};
-    static const WCHAR wszExtraInfo[] = {'E','x','t','r','a','I','n','f','o',0};
-    static const WCHAR wszName[] = {'N','a','m','e',0};
-
     struct OIDInfo *info;
     HKEY hKey, hSubKey;
     char buf[MAX_PATH], *ptr, *endptr;
-- 
1.6.5.8



Подробная информация о списке рассылки Wine-patches