Mike McCormack : advapi32: Implement and test SystemFunction007.

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 10 12:57:01 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 72822c0fea07bc22cb51b882841054a4601ce005
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=72822c0fea07bc22cb51b882841054a4601ce005

Author: Mike McCormack <mike at codeweavers.com>
Date:   Wed May 10 19:39:36 2006 +0900

advapi32: Implement and test SystemFunction007.

---

 dlls/advapi32/advapi32.spec     |    2 +
 dlls/advapi32/crypt_md4.c       |   29 ++++++++++++++++++++
 dlls/advapi32/tests/crypt_md4.c |   58 ++++++++++++++++++++++++++++++++-------
 3 files changed, 77 insertions(+), 12 deletions(-)

diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec
index c729d3b..742376c 100644
--- a/dlls/advapi32/advapi32.spec
+++ b/dlls/advapi32/advapi32.spec
@@ -601,7 +601,7 @@ # @ stub StopTraceW
 @ stub SystemFunction004
 @ stub SystemFunction005
 @ stdcall SystemFunction006(ptr ptr)
-@ stub SystemFunction007
+@ stdcall SystemFunction007(ptr ptr)
 @ stdcall SystemFunction008(ptr ptr ptr)
 @ stub SystemFunction009
 @ stub SystemFunction010
diff --git a/dlls/advapi32/crypt_md4.c b/dlls/advapi32/crypt_md4.c
index a741963..2c2318f 100644
--- a/dlls/advapi32/crypt_md4.c
+++ b/dlls/advapi32/crypt_md4.c
@@ -35,7 +35,10 @@
 
 #include <stdarg.h>
 
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
 #include "windef.h"
+#include "winternl.h"
 
 typedef struct
 {
@@ -267,3 +270,29 @@ static void MD4Transform( unsigned int b
     buf[2] += c;
     buf[3] += d;
 }
+
+/******************************************************************************
+ * SystemFunction007  [ADVAPI32.@]
+ *
+ * MD4 hash a unicode string
+ *
+ * PARAMS
+ *   string  [I] the string to hash
+ *   output  [O] the md4 hash of the string (16 bytes)
+ *
+ * RETURNS
+ *  Success: STATUS_SUCCESS
+ *  Failure: STATUS_UNSUCCESSFUL
+ *
+ */
+NTSTATUS WINAPI SystemFunction007(PUNICODE_STRING string, LPBYTE hash)
+{
+    MD4_CTX ctx;
+
+    MD4Init( &ctx );
+    MD4Update( &ctx, (BYTE*) string->Buffer, string->Length );
+    MD4Final( &ctx );
+    memcpy( hash, ctx.digest, 0x10 );
+
+    return STATUS_SUCCESS;
+}
diff --git a/dlls/advapi32/tests/crypt_md4.c b/dlls/advapi32/tests/crypt_md4.c
index 3a68c88..3dfa294 100644
--- a/dlls/advapi32/tests/crypt_md4.c
+++ b/dlls/advapi32/tests/crypt_md4.c
@@ -20,10 +20,13 @@
 
 #include <stdio.h>
 
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
 #include "wine/test.h"
 #include "windef.h"
 #include "winbase.h"
 #include "winerror.h"
+#include "winternl.h"
 
 typedef struct
 {
@@ -36,10 +39,12 @@ typedef struct
 typedef VOID (WINAPI *fnMD4Init)( MD4_CTX *ctx );
 typedef VOID (WINAPI *fnMD4Update)( MD4_CTX *ctx, const unsigned char *src, const int len );
 typedef VOID (WINAPI *fnMD4Final)( MD4_CTX *ctx );
+typedef int (WINAPI *fnSystemFunction007)(PUNICODE_STRING,LPBYTE);
 
 fnMD4Init pMD4Init;
 fnMD4Update pMD4Update;
 fnMD4Final pMD4Final;
+fnSystemFunction007 pSystemFunction007;
 
 #define ctxcmp( a, b ) memcmp( (char*)a, (char*)b, FIELD_OFFSET( MD4_CTX, in ) )
 
@@ -52,7 +57,6 @@ static void test_md4_ctx(void)
         "In our bodies, there is Die";
 
     int size = sizeof(message) - 1;
-    HMODULE module;
 
     MD4_CTX ctx;
     MD4_CTX ctx_initialized = 
@@ -77,13 +81,6 @@ static void test_md4_ctx(void)
         { 0x5f, 0xd3, 0x9b, 0x29, 0x47, 0x53, 0x47, 0xaf,
           0xa5, 0xba, 0x0c, 0x05, 0xff, 0xc0, 0xc7, 0xda };
 
-    if (!(module = LoadLibrary( "advapi32.dll" ))) return;
-
-    pMD4Init = (fnMD4Init)GetProcAddress( module, "MD4Init" );
-    pMD4Update = (fnMD4Update)GetProcAddress( module, "MD4Update" );
-    pMD4Final = (fnMD4Final)GetProcAddress( module, "MD4Final" );
-
-    if (!pMD4Init || !pMD4Update || !pMD4Final) goto out;
 
     memset( &ctx, 0, sizeof(ctx) );
     pMD4Init( &ctx );
@@ -99,11 +96,50 @@ static void test_md4_ctx(void)
     ok( ctxcmp( &ctx, &ctx_initialized ), "context has changed\n" );
     ok( !memcmp( ctx.digest, expect, sizeof(expect) ), "incorrect result\n" );
 
-out:
-    FreeLibrary( module );
+}
+
+static void test_SystemFunction007(void)
+{
+    int r;
+    UNICODE_STRING str;
+    BYTE output[0x10];
+    BYTE expected[0x10] = { 0x24, 0x0a, 0xf0, 0x9d, 0x84, 0x1c, 0xda, 0xcf, 
+                            0x56, 0xeb, 0x6b, 0x96, 0x55, 0xec, 0xcf, 0x0a };
+    WCHAR szFoo[] = {'f','o','o',0 };
+
+#if 0
+    /* crashes */
+    r = pSystemFunction007(NULL, NULL);
+    ok( r == STATUS_UNSUCCESSFUL, "wrong error code\n");
+#endif
+
+    str.Buffer = szFoo;
+    str.Length = 4*sizeof(WCHAR);
+    str.MaximumLength = str.Length;
+
+    memset(output, 0, sizeof output);
+    r = pSystemFunction007(&str, output);
+    ok( r == STATUS_SUCCESS, "wrong error code\n");
+
+    ok(!memcmp(output, expected, sizeof expected), "response wrong\n");
 }
 
 START_TEST(crypt_md4)
 {
-    test_md4_ctx();
+    HMODULE module;
+
+    if (!(module = LoadLibrary( "advapi32.dll" ))) return;
+
+    pMD4Init = (fnMD4Init)GetProcAddress( module, "MD4Init" );
+    pMD4Update = (fnMD4Update)GetProcAddress( module, "MD4Update" );
+    pMD4Final = (fnMD4Final)GetProcAddress( module, "MD4Final" );
+
+    if (pMD4Init && pMD4Update && pMD4Final)
+        test_md4_ctx();
+
+    pSystemFunction007 = (fnSystemFunction007)GetProcAddress( module, "SystemFunction007" );
+    if (pSystemFunction007)
+        test_SystemFunction007();
+
+    FreeLibrary( module );
 }




More information about the wine-cvs mailing list