diff -urpN 179-a/src/NT2_fmt_plug.c john-1.7.9-a/src/NT2_fmt_plug.c
--- 179-a/src/NT2_fmt_plug.c	2011-11-29 14:45:54.709125000 +0000
+++ john-1.7.9-a/src/NT2_fmt_plug.c	2011-11-29 16:16:45.646625000 +0000
@@ -74,8 +74,8 @@
 #define saved_key NTSSE2_saved_key
 #define crypt_key NTSSE2_crypt_key
 #if defined (_MSC_VER)
-__declspec(align(MMX_COEF*4)) unsigned char saved_key[64*MAX_KEYS_PER_CRYPT];
-__declspec(align(MMX_COEF*4)) unsigned char crypt_key[BINARY_SIZE*MAX_KEYS_PER_CRYPT];
+__declspec(align(16)) unsigned char saved_key[64*MAX_KEYS_PER_CRYPT];
+__declspec(align(16)) unsigned char crypt_key[BINARY_SIZE*MAX_KEYS_PER_CRYPT];
 #else
 unsigned char saved_key[64*MAX_KEYS_PER_CRYPT] __attribute__ ((aligned(MMX_COEF*4)));
 unsigned char crypt_key[BINARY_SIZE*MAX_KEYS_PER_CRYPT+1] __attribute__ ((aligned(MMX_COEF*4)));
diff -urpN 179-a/src/md4-mmx.S john-1.7.9-a/src/md4-mmx.S
--- 179-a/src/md4-mmx.S	2011-11-29 14:45:46.974750000 +0000
+++ john-1.7.9-a/src/md4-mmx.S	2011-11-29 16:08:52.162250000 +0000
@@ -6,8 +6,15 @@
 #ifdef UNDERSCORES
 #define mdfourmmx	_mdfourmmx
 #endif
+// For proper VC 'param marshalling' function stubs.
+#ifdef __MINGW32__
+#define mdfourmmx_VC @mdfourmmx_VC@12
+#endif
 
 .globl mdfourmmx
+#ifdef __MINGW32__
+.globl mdfourmmx_VC
+#endif
 
 .data
 #if defined (MD4_SSE_PARA) && !defined (MMX_COEF)
@@ -104,11 +111,27 @@ buffer:
  * %edx ptr -> in
  * %ecx n
  */
+ 
+ #ifdef __MINGW32__
+// These are 'magic' param marshalling calls to convert VC __fastcall, to 
+// GCC/GAS register param ordering.  Same as was done in MD5/SHA1. Requires
+// MinGW32 to build the .o, and then VC can use that .o file properly.
+mdfivemmx_VC:
+    lea mdfourmmx_VC_exit, %eax
+    push %eax
+    pusha
+    mov %ecx, %eax
+    mov 40(%esp), %ecx
+    jmp mdfourmmx_no_push
+mdfourmmx_VC_exit:
+    ret $4
+#endif
 
 mdfourmmx:
 	 //MD4 Init
 	pusha
 	
+mdfourmmx_no_push:
 	shl $3, %ecx
 	mov %ecx, %ebx
 	and $0xffff, %ecx
@@ -202,8 +225,15 @@ mdfourmmx:
 #ifdef UNDERSCORES
 #define mdfoursse2	_mdfoursse2
 #endif
+// For proper VC 'param marshalling' function stubs.
+#ifdef __MINGW32__
+#define mdfoursse2_VC @mdfoursse2_VC@12
+#endif
 
 .globl mdfoursse2
+#ifdef __MINGW32__
+.globl mdfoursse2_VC
+#endif
 
 .data
 #if defined (MD4_SSE_PARA) && !defined (MMX_COEF)
@@ -313,10 +343,25 @@ buffer:
  * %ecx n
  */
 
+ #ifdef __MINGW32__
+// These are 'magic' param marshalling calls to convert VC __fastcall, to 
+// GCC/GAS register param ordering.  Same as was done in MD5/SHA1. Requires
+// MinGW32 to build the .o, and then VC can use that .o file properly.
+mdfoursse2_VC:
+    lea mdfoursse2_VC_exit, %eax
+    push %eax
+    pusha
+    mov %ecx, %eax
+    mov 40(%esp), %ecx
+    jmp mdfoursse2_no_push
+mdfoursse2_VC_exit:
+    ret $4
+#endif
+
 mdfoursse2:
 	pusha
-	 //MD4 Init
-	
+	 
+mdfoursse2_no_push:	 
 	//mov %edx, %eax
 	//ret
 
diff -urpN 179-a/src/md4.h john-1.7.9-a/src/md4.h
--- 179-a/src/md4.h	2011-11-29 14:45:47.006000000 +0000
+++ john-1.7.9-a/src/md4.h	2011-11-29 16:06:49.318500000 +0000
@@ -29,12 +29,22 @@ extern void MD4_Final(unsigned char *res
 
 /* Bartavelle's SSE/MMX asm functions */
 #if (MMX_COEF == 2)
+#ifdef _MSC_VER
+int __fastcall mdfourmmx_VC(unsigned char *out, unsigned char *in, int n);
+#define mdfourmmx mdfourmmx_VC
+#else
 extern int mdfourmmx(unsigned char *out, unsigned char *in, int n) __attribute__((regparm(3)));
 #endif
+#endif
 
 #if (MMX_COEF == 4)
+#ifdef _MSC_VER
+int __fastcall mdfoursse2_VC(unsigned char *out, unsigned char *in, int n);
+#define mdfourmmx mdfoursse2_VC
+#else
 #define mdfourmmx mdfoursse2
 extern int mdfoursse2(unsigned char *out, unsigned char *in, int n) __attribute__((regparm(3)));
 #endif
+#endif
 
 #endif
diff -urpN 179-a/src/rawMD4_fmt_plug.c john-1.7.9-a/src/rawMD4_fmt_plug.c
--- 179-a/src/rawMD4_fmt_plug.c	2011-11-29 14:45:51.490375000 +0000
+++ john-1.7.9-a/src/rawMD4_fmt_plug.c	2011-11-29 16:02:21.834125000 +0000
@@ -80,8 +80,8 @@ static struct fmt_tests tests[] = {
 #define saved_key rawmd4_saved_key
 #define crypt_key rawmd4_crypt_key
 #if defined (_MSC_VER)
-__declspec(align(MMX_COEF*4)) unsigned char saved_key[64*MAX_KEYS_PER_CRYPT];
-__declspec(align(MMX_COEF*4)) unsigned char crypt_key[BINARY_SIZE*MAX_KEYS_PER_CRYPT];
+__declspec(align(16)) unsigned char saved_key[64*MAX_KEYS_PER_CRYPT];
+__declspec(align(16)) unsigned char crypt_key[BINARY_SIZE*MAX_KEYS_PER_CRYPT];
 #else
 unsigned char saved_key[64*MAX_KEYS_PER_CRYPT] __attribute__ ((aligned(MMX_COEF*4)));
 unsigned char crypt_key[BINARY_SIZE*MAX_KEYS_PER_CRYPT+1] __attribute__ ((aligned(MMX_COEF*4)));
diff -urpN 179-a/src/rawMD5_fmt_plug.c john-1.7.9-a/src/rawMD5_fmt_plug.c
--- 179-a/src/rawMD5_fmt_plug.c	2011-11-29 14:46:00.865375000 +0000
+++ john-1.7.9-a/src/rawMD5_fmt_plug.c	2011-11-29 16:02:39.490375000 +0000
@@ -73,8 +73,8 @@ static struct fmt_tests tests[] = {
 #define saved_key rawmd5_saved_key
 #define crypt_key rawmd5_crypt_key
 #if defined (_MSC_VER)
-__declspec(align(MMX_COEF*4)) unsigned char saved_key[64*MAX_KEYS_PER_CRYPT];
-__declspec(align(MMX_COEF*4)) unsigned char crypt_key[BINARY_SIZE*MAX_KEYS_PER_CRYPT];
+__declspec(align(16)) unsigned char saved_key[64*MAX_KEYS_PER_CRYPT];
+__declspec(align(16)) unsigned char crypt_key[BINARY_SIZE*MAX_KEYS_PER_CRYPT];
 #else
 unsigned char saved_key[64*MAX_KEYS_PER_CRYPT] __attribute__ ((aligned(MMX_COEF*4)));
 unsigned char crypt_key[BINARY_SIZE*MAX_KEYS_PER_CRYPT+1] __attribute__ ((aligned(MMX_COEF*4)));
