fix more MSVC warnings
diff --git a/arch/AArch64/AArch64InstPrinter.c b/arch/AArch64/AArch64InstPrinter.c
index b94c44c..e7881e9 100644
--- a/arch/AArch64/AArch64InstPrinter.c
+++ b/arch/AArch64/AArch64InstPrinter.c
@@ -1576,7 +1576,7 @@
 	arm64_vess vess = 0;
 
 	if (NumLanes) {
-		snprintf(Suffix, sizeof(Suffix), ".%u%c", NumLanes, LaneKind);
+		cs_snprintf(Suffix, sizeof(Suffix), ".%u%c", NumLanes, LaneKind);
 		switch(LaneKind) {
 			default: break;
 			case 'b':
@@ -1633,7 +1633,7 @@
 				break;
 		}
 	} else {
-		snprintf(Suffix, sizeof(Suffix), ".%c", LaneKind);
+		cs_snprintf(Suffix, sizeof(Suffix), ".%c", LaneKind);
 		switch(LaneKind) {
 			default: break;
 			case 'b':
diff --git a/arch/AArch64/AArch64Mapping.c b/arch/AArch64/AArch64Mapping.c
index 87ae02f..cbd6c3a 100644
--- a/arch/AArch64/AArch64Mapping.c
+++ b/arch/AArch64/AArch64Mapping.c
@@ -14959,7 +14959,7 @@
 {
 	if (MI->csh->detail) {
 		MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
-		MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = imm;
+		MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = (int)imm;
 		MI->flat_insn->detail->arm64.op_count++;
 	}
 }
diff --git a/arch/Mips/MipsDisassembler.c b/arch/Mips/MipsDisassembler.c
index 6359bcd..55c8234 100644
--- a/arch/Mips/MipsDisassembler.c
+++ b/arch/Mips/MipsDisassembler.c
@@ -496,7 +496,7 @@
 
 	uint32_t Rs = fieldFromInstruction(insn, 21, 5);
 	uint32_t Rt = fieldFromInstruction(insn, 16, 5);
-	uint32_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) << 2;
+	uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) << 2;
 	bool HasRs = false;
 
 	if (Rs >= Rt) {
@@ -532,7 +532,7 @@
 
 	uint32_t Rs = fieldFromInstruction(insn, 21, 5);
 	uint32_t Rt = fieldFromInstruction(insn, 16, 5);
-	uint32_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) << 2;
+	uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) << 2;
 	bool HasRs = false;
 
 	if (Rs >= Rt) {
@@ -569,7 +569,7 @@
 
 	uint32_t Rs = fieldFromInstruction(insn, 21, 5);
 	uint32_t Rt = fieldFromInstruction(insn, 16, 5);
-	uint32_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) << 2;
+	uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) << 2;
 	bool HasRs = false;
 
 	if (Rt == 0)
@@ -611,7 +611,7 @@
 
 	uint32_t Rs = fieldFromInstruction(insn, 21, 5);
 	uint32_t Rt = fieldFromInstruction(insn, 16, 5);
-	uint32_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) << 2;
+	uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) << 2;
 
 	if (Rt == 0)
 		return MCDisassembler_Fail;
@@ -649,7 +649,7 @@
 
 	uint32_t Rs = fieldFromInstruction(insn, 21, 5);
 	uint32_t Rt = fieldFromInstruction(insn, 16, 5);
-	uint32_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) << 2;
+	uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) << 2;
 	bool HasRs = false;
 	bool HasRt = false;
 
@@ -695,7 +695,7 @@
 
 	uint32_t Rs = fieldFromInstruction(insn, 21, 5);
 	uint32_t Rt = fieldFromInstruction(insn, 16, 5);
-	uint32_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) << 2;
+	uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) << 2;
 	bool HasRs = false;
 
 	if (Rt == 0)
diff --git a/arch/Sparc/SparcInstPrinter.c b/arch/Sparc/SparcInstPrinter.c
index d395700..ebd3091 100644
--- a/arch/Sparc/SparcInstPrinter.c
+++ b/arch/Sparc/SparcInstPrinter.c
@@ -16,6 +16,10 @@
 
 #ifdef CAPSTONE_HAS_SPARC
 
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
diff --git a/cs.c b/cs.c
index 2095280..9cc98a3 100644
--- a/cs.c
+++ b/cs.c
@@ -517,7 +517,7 @@
 
 			if (handle->skipdata_setup.callback) {
 				skipdata_bytes = handle->skipdata_setup.callback(buffer_org, size_org,
-						offset - offset_org, handle->skipdata_setup.user_data);
+						(size_t)(offset - offset_org), handle->skipdata_setup.user_data);
 				if (skipdata_bytes > size)
 					// remaining data is not enough
 					break;
diff --git a/utils.c b/utils.c
index f322d05..79c5a0f 100644
--- a/utils.c
+++ b/utils.c
@@ -69,3 +69,16 @@
 
 	return (char *)memmove(new, str, len);
 }
+
+// we need this since Windows doesnt have snprintf()
+int cs_snprintf(char *buffer, size_t size, const char *fmt, ...)
+{
+	int ret;
+
+	va_list ap;
+	va_start(ap, fmt);
+	ret = cs_vsnprintf(buffer, size, fmt, ap);
+	va_end(ap);
+
+	return ret;
+}
diff --git a/utils.h b/utils.h
index 9ac117b..60ed822 100644
--- a/utils.h
+++ b/utils.h
@@ -48,5 +48,8 @@
 
 #define MIN(x, y) ((x) < (y) ? (x) : (y))
 
+// we need this since Windows doesnt have snprintf()
+int cs_snprintf(char *buffer, size_t size, const char *fmt, ...);
+
 #endif