Module: wine
Branch: master
Commit: f99efa38351dddb52b2f1d99be33fb75ac8d42c8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f99efa38351dddb52b2f1d99b…
Author: Paul Vriens <Paul.Vriens(a)xs4all.nl>
Date: Wed Oct 4 12:15:35 2006 +0200
crypt32: More tests for CryptSIPLoad.
---
dlls/crypt32/tests/sip.c | 97 ++++++++++++++++++++++++++++++++++++++--------
1 files changed, 80 insertions(+), 17 deletions(-)
diff --git a/dlls/crypt32/tests/sip.c b/dlls/crypt32/tests/sip.c
index 866951f..faff684 100644
--- a/dlls/crypt32/tests/sip.c
+++ b/dlls/crypt32/tests/sip.c
@@ -261,7 +261,10 @@ static void test_SIPLoad(void)
BOOL ret;
GUID subject;
static GUID dummySubject = { 0xdeadbeef, 0xdead, 0xbeef, { 0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef }};
- static GUID unknown = { 0xC689AABA, 0x8E78, 0x11D0, { 0x8C,0x47,0x00,0xC0,0x4F,0xC2,0x95,0xEE }};
+ static GUID unknown = { 0xC689AABA, 0x8E78, 0x11D0, { 0x8C,0x47,0x00,0xC0,0x4F,0xC2,0x95,0xEE }}; /* WINTRUST.DLL */
+ static GUID unknown2 = { 0xDE351A43, 0x8E59, 0x11D0, { 0x8C,0x47,0x00,0xC0,0x4F,0xC2,0x95,0xEE }}; /* WINTRUST.DLL */
+ /* The next SIP is available on Windows (not on a clean Wine install) */
+ static GUID unknown3 = { 0x000C10F1, 0x0000, 0x0000, { 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 }}; /* MSISIP.DLL */
SIP_DISPATCH_INFO sdi;
HMODULE hCrypt;
@@ -293,6 +296,18 @@ static void test_SIPLoad(void)
"Expected TRUST_E_SUBJECT_FORM_UNKNOWN, got 0x%08x\n", GetLastError());
ok( sdi.pfGet == (pCryptSIPGetSignedDataMsg)0xdeadbeef, "Expected no change to the function pointer\n");
+ hCrypt = LoadLibraryA("crypt32.dll");
+ if (hCrypt)
+ {
+ funcCryptSIPGetSignedDataMsg = (void*)GetProcAddress(hCrypt, "CryptSIPGetSignedDataMsg");
+ funcCryptSIPPutSignedDataMsg = (void*)GetProcAddress(hCrypt, "CryptSIPPutSignedDataMsg");
+ funcCryptSIPCreateIndirectData = (void*)GetProcAddress(hCrypt, "CryptSIPCreateIndirectData");
+ funcCryptSIPVerifyIndirectData = (void*)GetProcAddress(hCrypt, "CryptSIPVerifyIndirectData");
+ funcCryptSIPRemoveSignedDataMsg = (void*)GetProcAddress(hCrypt, "CryptSIPRemoveSignedDataMsg");
+ }
+ /* We're not going to use the functions, so we can free already here */
+ FreeLibrary(hCrypt);
+
/* All OK */
SetLastError(0xdeadbeef);
memset(&sdi, 0, sizeof(SIP_DISPATCH_INFO));
@@ -304,7 +319,8 @@ static void test_SIPLoad(void)
ok ( ret, "Expected CryptSIPLoad to succeed\n");
/* This error will always be there as native searches for the function DllCanUnloadNow
* in WINTRUST.DLL (in this case). This function is not available in WINTRUST.DLL.
- * For now there's no need to implement this is Wine.
+ * For now there's no need to implement this is Wine as I doubt any program will rely on
+ * this last error when the call succeeded.
*/
ok ( GetLastError() == ERROR_PROC_NOT_FOUND,
"Expected ERROR_PROC_NOT_FOUND, got 0x%08x\n", GetLastError());
@@ -316,27 +332,70 @@ static void test_SIPLoad(void)
* calling crypt32 functions which in it's turn call the equivalent in the SIP
* as dictated by the given GUID.
*/
- hCrypt = LoadLibrary("crypt32.dll");
- if (hCrypt)
+ if (funcCryptSIPGetSignedDataMsg && funcCryptSIPPutSignedDataMsg && funcCryptSIPCreateIndirectData &&
+ funcCryptSIPVerifyIndirectData && funcCryptSIPRemoveSignedDataMsg)
+ todo_wine
+ ok (sdi.pfGet == funcCryptSIPGetSignedDataMsg &&
+ sdi.pfPut == funcCryptSIPPutSignedDataMsg &&
+ sdi.pfCreate == funcCryptSIPCreateIndirectData &&
+ sdi.pfVerify == funcCryptSIPVerifyIndirectData &&
+ sdi.pfRemove == funcCryptSIPRemoveSignedDataMsg,
+ "Expected function addresses to be from crypt32\n");
+ else
+ trace("Couldn't load function pointers\n");
+
+ /* All OK, but different GUID (same SIP though) */
+ SetLastError(0xdeadbeef);
+ memset(&sdi, 0, sizeof(SIP_DISPATCH_INFO));
+ sdi.cbSize = sizeof(SIP_DISPATCH_INFO);
+ sdi.pfGet = (pCryptSIPGetSignedDataMsg)0xdeadbeef;
+ ret = CryptSIPLoad(&unknown2, 0, &sdi);
+ todo_wine
{
- funcCryptSIPGetSignedDataMsg = (void*)GetProcAddress(hCrypt, "CryptSIPGetSignedDataMsg");
- funcCryptSIPPutSignedDataMsg = (void*)GetProcAddress(hCrypt, "CryptSIPPutSignedDataMsg");
- funcCryptSIPCreateIndirectData = (void*)GetProcAddress(hCrypt, "CryptSIPCreateIndirectData");
- funcCryptSIPVerifyIndirectData = (void*)GetProcAddress(hCrypt, "CryptSIPVerifyIndirectData");
- funcCryptSIPRemoveSignedDataMsg = (void*)GetProcAddress(hCrypt, "CryptSIPRemoveSignedDataMsg");
- if (funcCryptSIPGetSignedDataMsg && funcCryptSIPPutSignedDataMsg && funcCryptSIPCreateIndirectData &&
- funcCryptSIPVerifyIndirectData && funcCryptSIPRemoveSignedDataMsg)
- todo_wine
+ ok ( ret, "Expected CryptSIPLoad to succeed\n");
+ /* This call on it's own would have resulted in a ERROR_PROC_NOT_FOUND, but the previous
+ * call to CryptSIPLoad already loaded wintrust.dll. As this information is cached,
+ * CryptSIPLoad will not try to search for the already mentioned DllCanUnloadNow.
+ */
+ }
+ ok ( GetLastError() == 0xdeadbeef,
+ "Expected 0xdeadbeef, got 0x%08x\n", GetLastError());
+ todo_wine
+ ok( sdi.pfGet != (pCryptSIPGetSignedDataMsg)0xdeadbeef, "Expected a function pointer to be loaded.\n");
+
+ /* All OK, but other SIP */
+ SetLastError(0xdeadbeef);
+ memset(&sdi, 0, sizeof(SIP_DISPATCH_INFO));
+ sdi.cbSize = sizeof(SIP_DISPATCH_INFO);
+ sdi.pfGet = (pCryptSIPGetSignedDataMsg)0xdeadbeef;
+ ret = CryptSIPLoad(&unknown3, 0, &sdi);
+ if (ret)
+ {
+ /* The SIP is known so we can safely assume that the next tests can be done */
+
+ /* As msisip.dll is not checked yet by any of the previous calls, the
+ * function DllCanUnloadNow will be checked again in msisip.dll (it's not present)
+ */
+ todo_wine
+ {
+ ok ( GetLastError() == ERROR_PROC_NOT_FOUND,
+ "Expected ERROR_PROC_NOT_FOUND, got 0x%08x\n", GetLastError());
+ ok( sdi.pfGet != (pCryptSIPGetSignedDataMsg)0xdeadbeef, "Expected a function pointer to be loaded.\n");
+
+ /* This is another SIP but this test proves the function addresses are the same as
+ * in the previous test.
+ */
+ if (funcCryptSIPGetSignedDataMsg && funcCryptSIPPutSignedDataMsg && funcCryptSIPCreateIndirectData &&
+ funcCryptSIPVerifyIndirectData && funcCryptSIPRemoveSignedDataMsg)
ok (sdi.pfGet == funcCryptSIPGetSignedDataMsg &&
sdi.pfPut == funcCryptSIPPutSignedDataMsg &&
sdi.pfCreate == funcCryptSIPCreateIndirectData &&
sdi.pfVerify == funcCryptSIPVerifyIndirectData &&
sdi.pfRemove == funcCryptSIPRemoveSignedDataMsg,
"Expected function addresses to be from crypt32\n");
- else
- trace("Couldn't load function pointers\n");
-
- FreeLibrary(hCrypt);
+ else
+ trace("Couldn't load function pointers\n");
+ }
}
/* Reserved parameter not 0 */
@@ -355,6 +414,10 @@ static void test_SIPLoad(void)
START_TEST(sip)
{
test_AddRemoveProvider();
- test_SIPRetrieveSubjectGUID();
+ /* It seems that the caching for loaded dlls is shared between CryptSIPRetrieveSubjectGUID
+ * and CryptSIPLoad. The tests have to be in this order to succeed. This is because in the last
+ * test for CryptSIPRetrieveSubjectGUID, several SIPs will be loaded (on Windows).
+ */
test_SIPLoad();
+ test_SIPRetrieveSubjectGUID();
}