Detlef Riekenberg : advapi32: Implement CredIsMarshaledCredentialA/W.
Alexandre Julliard
julliard at winehq.org
Thu Jul 12 18:00:34 CDT 2012
Module: wine
Branch: master
Commit: d96de83089cc4af8077e6f185024134b06bab78e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d96de83089cc4af8077e6f185024134b06bab78e
Author: Detlef Riekenberg <wine.dev at web.de>
Date: Sat Jul 7 00:36:27 2012 +0200
advapi32: Implement CredIsMarshaledCredentialA/W.
---
dlls/advapi32/advapi32.spec | 4 +-
dlls/advapi32/cred.c | 66 +++++++++++++++++++++++++++++++++++++++++++
include/wincred.h | 3 ++
3 files changed, 71 insertions(+), 2 deletions(-)
diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec
index 638cba1..732bf04 100644
--- a/dlls/advapi32/advapi32.spec
+++ b/dlls/advapi32/advapi32.spec
@@ -144,8 +144,8 @@
@ stdcall CredGetSessionTypes(long ptr)
# @ stub CredGetTargetInfoA
# @ stub CredGetTargetInfoW
-# @ stub CredIsMarshaledCredentialA
-# @ stub CredIsMarshaledCredentialW
+@ stdcall CredIsMarshaledCredentialA(str)
+@ stdcall CredIsMarshaledCredentialW(wstr)
# @ stub CredIsProtectedA
# @ stub CredIsProtectedW
@ stdcall CredMarshalCredentialA(long ptr ptr)
diff --git a/dlls/advapi32/cred.c b/dlls/advapi32/cred.c
index 432eb5c..d15feb7 100644
--- a/dlls/advapi32/cred.c
+++ b/dlls/advapi32/cred.c
@@ -2161,3 +2161,69 @@ BOOL WINAPI CredUnmarshalCredentialW( LPCWSTR cred, PCRED_MARSHAL_TYPE type, PVO
}
return TRUE;
}
+
+/******************************************************************************
+ * CredIsMarshaledCredentialW [ADVAPI32.@]
+ *
+ * Check, if the name parameter is a marshaled credential, hash or binary blob
+ *
+ * PARAMS
+ * name the name to check
+ *
+ * RETURNS
+ * TRUE: the name parameter is a marshaled credential, hash or binary blob
+ * FALSE: the name is a plain username
+ */
+BOOL WINAPI CredIsMarshaledCredentialW(LPCWSTR name)
+{
+ TRACE("(%s)\n", debugstr_w(name));
+
+ if (name && name[0] == '@' && name[1] == '@' && name[2] > 'A' && name[3])
+ {
+ char hash[CERT_HASH_LENGTH + 2];
+ int len = strlenW(name + 3 );
+ DWORD size;
+
+ if ((name[2] - 'A') == CertCredential && (len == 27) && cred_decode(name + 3, len, hash))
+ return TRUE;
+
+ if (((name[2] - 'A') == UsernameTargetCredential) &&
+ (len >= 9) && cred_decode(name + 3, 6, (char *)&size) && size)
+ return TRUE;
+
+ if ((name[2] - 'A') == BinaryBlobCredential)
+ FIXME("BinaryBlobCredential not checked\n");
+
+ if ((name[2] - 'A') > BinaryBlobCredential)
+ TRACE("unknown type: %d\n", (name[2] - 'A'));
+ }
+
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+}
+
+/******************************************************************************
+ * CredIsMarshaledCredentialA [ADVAPI32.@]
+ *
+ * See CredIsMarshaledCredentialW
+ *
+ */
+BOOL WINAPI CredIsMarshaledCredentialA(LPCSTR name)
+{
+ LPWSTR nameW = NULL;
+ BOOL res;
+ int len;
+
+ TRACE("(%s)\n", debugstr_a(name));
+
+ if (name)
+ {
+ len = MultiByteToWideChar(CP_ACP, 0, name, -1, NULL, 0);
+ nameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, name, -1, nameW, len);
+ }
+
+ res = CredIsMarshaledCredentialW(nameW);
+ HeapFree(GetProcessHeap(), 0, nameW);
+ return res;
+}
diff --git a/include/wincred.h b/include/wincred.h
index fb18a01..d0a75a7 100644
--- a/include/wincred.h
+++ b/include/wincred.h
@@ -248,6 +248,9 @@ WINADVAPI BOOL WINAPI CredEnumerateW(LPCWSTR,DWORD,DWORD *,PCREDENTIALW **);
#define CredEnumerate WINELIB_NAME_AW(CredEnumerate)
WINADVAPI VOID WINAPI CredFree(PVOID);
WINADVAPI BOOL WINAPI CredGetSessionTypes(DWORD,LPDWORD);
+WINADVAPI BOOL WINAPI CredIsMarshaledCredentialA(LPCSTR);
+WINADVAPI BOOL WINAPI CredIsMarshaledCredentialW(LPCWSTR);
+#define CredIsMarshaledCredential WINELIB_NAME_AW(CredIsMarshaledCredential)
WINADVAPI BOOL WINAPI CredMarshalCredentialA(CRED_MARSHAL_TYPE,PVOID,LPSTR *);
WINADVAPI BOOL WINAPI CredMarshalCredentialW(CRED_MARSHAL_TYPE,PVOID,LPWSTR *);
#define CredMarshalCredential WINELIB_NAME_AW(CredMarshalCredential)
More information about the wine-cvs
mailing list