diff --git a/src/winsock.c b/src/winsock.c
index 395300c..bd23c51 100644
--- a/src/winsock.c
+++ b/src/winsock.c
@@ -128,40 +128,43 @@ INT APIENTRY EnumProtocolsW(LPINT protocols, LPVOID buf, LPDWORD bsptr) {
 }
 
 int PASCAL WSARecvEx(SOCKET fd, char *buf, int len, int *flags) {
-	ipx_socket *ptr = get_socket(fd);
+	ipx_socket *sockptr = get_socket(fd);
 	
-	if(ptr) {
-		if(!(ptr->flags & IPX_BOUND)) {
-			RETURN_WSA(WSAEINVAL, -1);
+	if(sockptr) {
+		if(!(sockptr->flags & IPX_BOUND)) {
+			unlock_mutex();
+			
+			WSASetLastError(WSAEINVAL);
+			return -1;
 		}
 		
+		unlock_mutex();
+		
 		struct ipx_packet *packet = malloc(PACKET_BUF_SIZE);
 		if(!packet) {
-			RETURN_WSA(ERROR_OUTOFMEMORY, -1);
+			WSASetLastError(ERROR_OUTOFMEMORY);
+			return -1;
 		}
 		
 		int rval = r_WSARecvEx(fd, (char*)packet, PACKET_BUF_SIZE, flags);
 		if(rval == -1) {
-			RETURN(-1);
+			return -1;
 		}
 		
 		if(packet->size <= len) {
 			memcpy(buf, packet->data, packet->size);
-			len = packet->size;
-			free(packet);
-			
 			*flags = 0;
-			RETURN(len);
 		}else{
 			memcpy(buf, packet->data, len);
-			len = packet->size;
-			free(packet);
-			
 			*flags = MSG_PARTIAL;
-			RETURN(len);
 		}
+		
+		len = packet->size;
+		free(packet);
+		
+		return len;
 	}else{
-		RETURN(r_WSARecvEx(fd, buf, len, flags));
+		return r_WSARecvEx(fd, buf, len, flags);
 	}
 }