diff -urN driverloader-2.50-cpp/modules/GPL/netndis.c driverloader-2.50-multicast/modules/GPL/netndis.c
--- driverloader-2.50-cpp/modules/GPL/netndis.c	2009-10-21 20:03:12.000000000 -0400
+++ driverloader-2.50-multicast/modules/GPL/netndis.c	2010-09-02 14:53:22.490960344 -0400
@@ -1675,12 +1675,13 @@
 
 	//printk("%s: dev=%p\n", __FUNCTION__, dev);
 
-	if((dev->flags & IFF_ALLMULTI) || (dev->mc_count > priv->max_multicast)) {
+	mc_count = netdev_mc_count(dev);
+
+	if((dev->flags & IFF_ALLMULTI) || (mc_count > priv->max_multicast)) {
 		priv->allmulti = 1;
 		mc_count = 0;
 	} else {
 		priv->allmulti = 0;
-		mc_count = dev->mc_count;
 	}
 
 	if (dev->flags & IFF_PROMISC) {
@@ -1690,7 +1691,7 @@
 	}
 
 	if (mc_count) {
-		struct dev_mc_list *p = dev->mc_list;
+		struct dev_mc_list *p;
 		unsigned char *mclist;
 		int i;
 
@@ -1700,19 +1701,24 @@
 			err = -ENOMEM;
 			mc_count = 0;
 		} else {
-			for (i = 0; i < mc_count; i++) {
+			i = 0;
+			netdev_for_each_mc_addr(p, dev) {
 				/* Paranoia: */
-				if (!p)
-					BUG(); /* Multicast list shorter than mc_count */
-				if (p->dmi_addrlen != ETH_ALEN)
+				if (i == mc_count)
+					break;
+				if (netndis_mc_list_get_addrlen(p) != ETH_ALEN)
 					BUG(); /* Bad address size in multicast list */
 
-				memcpy(mclist + (i*ETH_ALEN), p->dmi_addr, ETH_ALEN);
-				p = p->next;
+				memcpy(mclist + (i*ETH_ALEN), netndis_mc_list_get_addr(p), ETH_ALEN);
+				i++;
 			}
 
-			if (p)
-				printk(KERN_WARNING "Multicast list is longer than mc_count\n");
+ 			if (i != mc_count) {
+				if (i > mc_count)
+					printk(KERN_WARNING "Multicast list is longer than mc_count\n");
+				if (i < mc_count)
+					BUG(); /* Multicast list shorter than mc_count */
+			}
 
 			err = NdisWrapStatusToErrno(
 					NdisWrapSetMulticastList(priv->miniportAdapter, mclist, mc_count * ETH_ALEN));
diff -urN driverloader-2.50-cpp/modules/GPL/oscompat.h driverloader-2.50-multicast/modules/GPL/oscompat.h
--- driverloader-2.50-cpp/modules/GPL/oscompat.h	2009-04-23 10:50:30.000000000 -0400
+++ driverloader-2.50-multicast/modules/GPL/oscompat.h	2010-09-02 15:10:04.602952819 -0400
@@ -679,4 +679,29 @@
 #define FOUND_REGPARM
 #endif
 
+/* -------------------- Multicast newer API -------------------- */
+#ifndef netdev_mc_count
+#define netdev_mc_count(dev) ((dev)->mc_count)
+#endif
+
+#ifndef netdev_mc_empty
+#define netdev_mc_empty(dev) (netdev_mc_count(dev) == 0)
+#endif
+
+#ifndef netdev_for_each_mc_addr
+#define netdev_for_each_mc_addr(mclist, dev) \
+       for (mclist = dev->mc_list; mclist; mclist = mclist->next)
+#endif
+
+#ifdef netdev_hw_addr_list_count
+# define dev_mc_list netdev_hw_addr
+# define netndis_mc_list_get_addr(mclist)     (mclist)->addr
+/* XXX: We don't have addrlen with the new API? */
+# define netndis_mc_list_get_addrlen(mclist)  (ETH_ALEN)
+#else
+# define netndis_mc_list_get_addr(mclist)     (mclist)->dmi_addr
+# define netndis_mc_list_get_addrlen(mclist)  (mclist)->dmi_addrlen
+#endif /* dev_mc_list */
+/* ------------------------------------------------------------- */
+
 #endif /* __OSCOMPAT_H */
