Make vboot_reference build in MSVC command line environment.

This is a mostly NOOP change which modifies the source code
to compile cleanly in the MSVC command line build
environment.

A new makefile is introduced (msc/nmakefile) along with a
README.txt in the same directory explaining how to build
the code in the DOS window. As of this submission the build
is running in a 32 bit environment, the intention is to use
the same makefile for 64 bit builds in the future.

Enabling high compilation warnings level allowed to
identify a couple of bugs in the code which are being fixed.

Not all sources are being compiled in the MSVC environment,
only those in firmware/ and most of those in test/
subdirectories. The benchmark calculations require porting
of the timer facilities and are being postponed.

TEST

Built in DOS and linux environments. Ran unit tests in
linux environment.

Review URL: http://codereview.chromium.org/2809037
diff --git a/Makefile b/Makefile
index 3086ab3..29d2e09 100644
--- a/Makefile
+++ b/Makefile
@@ -4,8 +4,7 @@
 
 export CC ?= gcc
 export CXX ?= g++
-export CFLAGS = -Wall -DNDEBUG -O3 -Werror -DCHROMEOS_ENVIRONMENT \
-	-DVBOOT_DEBUG
+export CFLAGS = -Wall -DNDEBUG -O3 -Werror -DCHROMEOS_ENVIRONMENT -DVBOOT_DEBUG
 export TOP = $(shell pwd)
 export FWDIR=$(TOP)/firmware
 export HOSTDIR=$(TOP)/host
diff --git a/firmware/include/sysincludes.h b/firmware/include/sysincludes.h
index be7e701..ff24e4c 100644
--- a/firmware/include/sysincludes.h
+++ b/firmware/include/sysincludes.h
@@ -26,12 +26,20 @@
 #include <memory.h>
 #endif
 
+#else
+#include "biosincludes.h"
+#endif
+
+#ifndef _MSC_VER
+#define __pragma(...)
+#endif
+
+#if defined (CHROMEOS_ENVIRONMENT) || defined (TARGET_TEST_MODE)
+
 /* 64-bit operations, for platforms where they need to be function calls */
 #define UINT64_RSHIFT(v, shiftby) (((uint64_t)(v)) >> (shiftby))
 #define UINT64_MULT32(v, multby)  (((uint64_t)(v)) * ((uint32_t)(multby)))
 
-#else
-#include "biosincludes.h"
 #endif
 
 #endif  /* VBOOT_REFERENCE_SYSINCLUDES_H_ */
diff --git a/firmware/include/utility.h b/firmware/include/utility.h
index c170938..0e05ee3 100644
--- a/firmware/include/utility.h
+++ b/firmware/include/utility.h
@@ -52,10 +52,10 @@
 int Memcmp(const void* src1, const void* src2, size_t n);
 
 /* Copy [n] bytes from [src] to [dest]. */
-void* Memcpy(void* dest, const void* src, size_t n);
+void* Memcpy(void* dest, const void* src, uint64_t n);
 
 /* Set [n] bytes starting at [s] to [c]. */
-void* Memset(void *dest, const uint8_t c, size_t n);
+void* Memset(void *dest, const uint8_t c, uint64_t n);
 
 /* Compare [n] bytes starting at [s1] with [s2] and return 0 if they match,
  * 1 if they don't. Time taken to perform the comparison is only dependent on
diff --git a/firmware/lib/cgptlib/cgptlib_internal.c b/firmware/lib/cgptlib/cgptlib_internal.c
index 4e0a06a..c3fd1f3 100644
--- a/firmware/lib/cgptlib/cgptlib_internal.c
+++ b/firmware/lib/cgptlib/cgptlib_internal.c
@@ -115,7 +115,7 @@
 }
 
 
-int CheckEntries(GptEntry* entries, GptHeader* h, uint64_t drive_sectors) {
+int CheckEntries(GptEntry* entries, GptHeader* h) {
 
   GptEntry* entry;
   uint32_t crc32;
@@ -227,17 +227,17 @@
    * Note that we use the same header in both checks.  This way we'll
    * catch the case where (header1,entries1) and (header2,entries2)
    * are both valid, but (entries1 != entries2). */
-  if (0 == CheckEntries(entries1, goodhdr, gpt->drive_sectors))
+  if (0 == CheckEntries(entries1, goodhdr))
     gpt->valid_entries |= MASK_PRIMARY;
-  if (0 == CheckEntries(entries2, goodhdr, gpt->drive_sectors))
+  if (0 == CheckEntries(entries2, goodhdr))
     gpt->valid_entries |= MASK_SECONDARY;
 
   /* If both headers are good but neither entries were good, check the
    * entries with the secondary header. */
   if (MASK_BOTH == gpt->valid_headers && !gpt->valid_entries) {
-    if (0 == CheckEntries(entries1, header2, gpt->drive_sectors))
+    if (0 == CheckEntries(entries1, header2))
       gpt->valid_entries |= MASK_PRIMARY;
-    if (0 == CheckEntries(entries2, header2, gpt->drive_sectors))
+    if (0 == CheckEntries(entries2, header2))
       gpt->valid_entries |= MASK_SECONDARY;
     if (gpt->valid_entries) {
       /* Sure enough, header2 had a good CRC for one of the entries.  Mark
diff --git a/firmware/lib/cgptlib/include/cgptlib_internal.h b/firmware/lib/cgptlib/include/cgptlib_internal.h
index 5252b6a..95e5b4e 100644
--- a/firmware/lib/cgptlib/include/cgptlib_internal.h
+++ b/firmware/lib/cgptlib/include/cgptlib_internal.h
@@ -83,7 +83,7 @@
 /* Check entries.
  *
  * Returns 0 if entries are valid, 1 if invalid. */
-int CheckEntries(GptEntry* entries, GptHeader* h, uint64_t drive_sectors);
+int CheckEntries(GptEntry* entries, GptHeader* h);
 
 /* Check GptData, headers, entries.
  *
diff --git a/firmware/lib/cgptlib/include/gpt.h b/firmware/lib/cgptlib/include/gpt.h
index 1d5cb58..b55f921 100644
--- a/firmware/lib/cgptlib/include/gpt.h
+++ b/firmware/lib/cgptlib/include/gpt.h
@@ -12,9 +12,7 @@
 
 #include "sysincludes.h"
 
-#ifdef _MSC_VER
-#pragma pack(push,1) /* Support packing for MSVC. */
-#endif
+__pragma(pack(push,1)) /* Support packing for MSVC. */
 
 #define GPT_HEADER_SIGNATURE "EFI PART"
 #define GPT_HEADER_SIGNATURE_SIZE sizeof(GPT_HEADER_SIGNATURE)
@@ -117,8 +115,6 @@
 
 #define GPTENTRY_EXPECTED_SIZE 128
 
-#ifdef _MSC_VER
-#pragma pack(pop) /* Support packing for MSVC. */
-#endif
+__pragma(pack(pop)) /* Support packing for MSVC. */
 
 #endif  /* VBOOT_REFERENCE_CGPTLIB_GPT_H_ */
diff --git a/firmware/lib/include/vboot_struct.h b/firmware/lib/include/vboot_struct.h
index e6240c7..975d6f6 100644
--- a/firmware/lib/include/vboot_struct.h
+++ b/firmware/lib/include/vboot_struct.h
@@ -11,9 +11,7 @@
 
 #include "sysincludes.h"
 
-#ifdef _MSC_VER
-#pragma pack(push, 1) /* Support packing for MSVC. */
-#endif
+__pragma(pack(push, 1)) /* Support packing for MSVC. */
 
 /* Public key data */
 typedef struct VbPublicKey {
@@ -133,8 +131,6 @@
 
 #define EXPECTED_VBKERNELPREAMBLEHEADER_SIZE 96
 
-#ifdef _MSC_VER
-#pragma pack(pop) /* Support packing for MSVC. */
-#endif
+__pragma(pack(pop)) /* Support packing for MSVC. */
 
 #endif  /* VBOOT_REFERENCE_VBOOT_STRUCT_H_ */
diff --git a/firmware/lib/rollback_index.c b/firmware/lib/rollback_index.c
index ebc721d..4fb7ec9 100644
--- a/firmware/lib/rollback_index.c
+++ b/firmware/lib/rollback_index.c
@@ -17,6 +17,9 @@
 uint16_t g_kernel_key_version = 0;
 uint16_t g_kernel_version = 0;
 
+/* disable MSVC warning on const logical expression (as in } while(0);) */
+__pragma(warning (disable: 4127))
+
 #define RETURN_ON_FAILURE(tpm_command) do {             \
     uint32_t result;                                    \
     if ((result = (tpm_command)) != TPM_SUCCESS) {      \
@@ -369,7 +372,8 @@
   return TlclLockPhysicalPresence();
 }
 
-
+/* disable MSVC warnings on unused arguments */
+__pragma(warning (disable: 4100))
 
 /* NEW APIS!  HELP ME LUIGI, YOU'RE MY ONLY HOPE! */
 
diff --git a/firmware/lib/vboot_kernel.c b/firmware/lib/vboot_kernel.c
index e6658d7..17cd925 100644
--- a/firmware/lib/vboot_kernel.c
+++ b/firmware/lib/vboot_kernel.c
@@ -108,6 +108,8 @@
   return 0;
 }
 
+/* disable MSVC warning on const logical expression (as in } while(0);) */
+__pragma(warning(disable: 4127))
 
 int LoadKernel(LoadKernelParams* params) {
 
diff --git a/firmware/stub/boot_device_stub.c b/firmware/stub/boot_device_stub.c
index c7bb86f..1316e01 100644
--- a/firmware/stub/boot_device_stub.c
+++ b/firmware/stub/boot_device_stub.c
@@ -7,6 +7,9 @@
 
 #include "boot_device.h"
 
+/* disable MSVC warnings on unused arguments */
+__pragma(warning (disable: 4100))
+
 int BootDeviceReadLBA(uint64_t lba_start, uint64_t lba_count, void *buffer) {
   return 1;
 }
diff --git a/firmware/stub/include/biosincludes.h b/firmware/stub/include/biosincludes.h
index 9ed4eab..ac0159d 100644
--- a/firmware/stub/include/biosincludes.h
+++ b/firmware/stub/include/biosincludes.h
@@ -11,4 +11,24 @@
  * CHROMEOS_ENVIRONMENT is not defined at compilation time.
  */
 
+#ifdef TARGET_TEST_MODE
+
+typedef unsigned long long uint64_t;
+typedef long long int64_t;
+typedef unsigned int uint32_t;
+typedef unsigned short uint16_t;
+typedef unsigned char uint8_t;
+typedef unsigned size_t;
+
+#ifndef NULL
+#define NULL ((void*) 0)
+#endif
+
+#define UINT64_C(x) ((uint64_t)x)
+#define __attribute__(x)
+#define PRIu64 "%ll"
+extern void debug(const char *format, ...);
+
+#endif
+
 #endif /*CHROMEOS_SRC_PLATFORM_VBOOT_REFERENCE_FIRMWARE_STUB_BIOSINCLUDES_H_*/
diff --git a/firmware/stub/load_firmware_stub.c b/firmware/stub/load_firmware_stub.c
index 9453856..9d99b4a 100644
--- a/firmware/stub/load_firmware_stub.c
+++ b/firmware/stub/load_firmware_stub.c
@@ -35,9 +35,13 @@
     case 0:
       size = ci->firmwareA_size;
       fw = ci->firmwareA;
+      break;
+
     case 1:
       size = ci->firmwareB_size;
       fw = ci->firmwareB;
+      break;
+
     default:
       /* Anything else is invalid */
       return 1;
@@ -68,6 +72,7 @@
   int rv;
 
   CallerInternal ci;
+  LoadFirmwareParams p;
 
   /* Copy the firmware volume pointers to our global variables. */
   ci.firmwareA = firmwareA;
@@ -78,7 +83,6 @@
   ci.firmwareB_size = 0;
 
   /* Set up the params for LoadFirmware() */
-  LoadFirmwareParams p;
   p.caller_internal = &ci;
   p.firmware_root_key_blob = root_key_blob;
   p.verification_block_0 = verification_headerA;
diff --git a/firmware/stub/tlcl.c b/firmware/stub/tlcl.c
index 23f0f09..cad286a 100644
--- a/firmware/stub/tlcl.c
+++ b/firmware/stub/tlcl.c
@@ -7,6 +7,9 @@
 
 #include "tss_constants.h"
 
+/* disable MSVC warnings on unused arguments */
+__pragma(warning (disable: 4100))
+
 void TlclLibInit(void) { return; }
 uint32_t TlclStartup(void) { return TPM_SUCCESS; }
 uint32_t TlclSelftestfull(void) { return TPM_SUCCESS; }
diff --git a/firmware/stub/utility_stub.c b/firmware/stub/utility_stub.c
index a41e3a3..1445008 100644
--- a/firmware/stub/utility_stub.c
+++ b/firmware/stub/utility_stub.c
@@ -48,13 +48,14 @@
   return memcmp(src1, src2, n);
 }
 
-void* Memcpy(void* dest, const void* src, size_t n) {
-  return memcpy(dest, src, n);
+void* Memcpy(void* dest, const void* src, uint64_t n) {
+  return memcpy(dest, src, (size_t)n);
 }
 
-void* Memset(void* dest, const uint8_t c, size_t n) {
+void* Memset(void* d, const uint8_t c, uint64_t n) {
+  uint8_t *dest = d; /* the only way to keep both cl and gcc happy */
   while (n--) {
-    *((uint8_t*)dest++) = c;
+    *dest++ = c;
   }
   return dest;
 }
diff --git a/firmware/version.c b/firmware/version.c
index faadaba..5fb57f5 100644
--- a/firmware/version.c
+++ b/firmware/version.c
@@ -1 +1 @@
-char* VbootVersion = "VBOOv=c6976ffa";
+char* VbootVersion = "VBOOv=0c991073";
diff --git a/host/include/host_common.h b/host/include/host_common.h
index 056fbc4..d8a2b09 100644
--- a/host/include/host_common.h
+++ b/host/include/host_common.h
@@ -8,8 +8,6 @@
 #ifndef VBOOT_REFERENCE_HOST_COMMON_H_
 #define VBOOT_REFERENCE_HOST_COMMON_H_
 
-#include <stdint.h>
-
 #include "cryptolib.h"
 #include "host_key.h"
 #include "host_keyblock.h"
diff --git a/host/include/host_key.h b/host/include/host_key.h
index efdf79d..9ce1fa5 100644
--- a/host/include/host_key.h
+++ b/host/include/host_key.h
@@ -8,8 +8,6 @@
 #ifndef VBOOT_REFERENCE_HOST_KEY_H_
 #define VBOOT_REFERENCE_HOST_KEY_H_
 
-#include <stdint.h>
-
 #include "cryptolib.h"
 #include "utility.h"
 #include "vboot_struct.h"
diff --git a/host/include/host_keyblock.h b/host/include/host_keyblock.h
index 0228143..1da251e 100644
--- a/host/include/host_keyblock.h
+++ b/host/include/host_keyblock.h
@@ -8,8 +8,6 @@
 #ifndef VBOOT_REFERENCE_HOST_KEYBLOCK_H_
 #define VBOOT_REFERENCE_HOST_KEYBLOCK_H_
 
-#include <stdint.h>
-
 #include "host_key.h"
 #include "vboot_struct.h"
 
diff --git a/host/include/host_misc.h b/host/include/host_misc.h
index 49afa29..abbfc0f 100644
--- a/host/include/host_misc.h
+++ b/host/include/host_misc.h
@@ -8,9 +8,6 @@
 #ifndef VBOOT_REFERENCE_HOST_MISC_H_
 #define VBOOT_REFERENCE_HOST_MISC_H_
 
-#include <stdint.h>
-
-#include "host_misc.h"
 #include "utility.h"
 #include "vboot_struct.h"
 
diff --git a/host/include/host_signature.h b/host/include/host_signature.h
index 9e7b0c0..4bbee7c 100644
--- a/host/include/host_signature.h
+++ b/host/include/host_signature.h
@@ -8,8 +8,6 @@
 #ifndef VBOOT_REFERENCE_HOST_SIGNATURE_H_
 #define VBOOT_REFERENCE_HOST_SIGNATURE_H_
 
-#include <stdint.h>
-
 #include "cryptolib.h"
 #include "host_key.h"
 #include "utility.h"
diff --git a/msc/README.txt b/msc/README.txt
new file mode 100644
index 0000000..f22bac0
--- /dev/null
+++ b/msc/README.txt
@@ -0,0 +1,25 @@
+This directory contains the Microsoft Visual C makefile for building vboot
+reference code (and testing, eventually) in a 32 bit DOS window.
+
+Microsoft Visual C 2008 (or later) is the prerequisite for this to work.
+
+To build vboot_reference tree in the DOS window do the following:
+
+- untar or git clone the vboot_reference source tree
+
+- open a DOS window
+
+- run the MSVC provided script vcvars32.bat to create the command line build
+  environment. Script location is MSVC installation specific. For instance:
+
+  c:\> \bios\devtls\MSVC9\Vc\bin\vcvars32.bat
+
+- define a directory where the nmake output should go into
+
+  c:\> set MOD=z:\shared\tmp
+
+- start the make job as follows:
+
+ c:\> nmake /f %path_to_vboot_reference_tree%\msc\nmakefile
+
+- observe the output generated in %MOD%
diff --git a/msc/nmakefile b/msc/nmakefile
new file mode 100644
index 0000000..0fa98d0
--- /dev/null
+++ b/msc/nmakefile
@@ -0,0 +1,55 @@
+
+!IF "$(MOD)" == ""
+!ERROR MOD (Make output dir) is not defined
+!ENDIF
+
+O = $(MOD)
+R = z:\shared\vboot_reference
+
+ALL_OBJS = $O\main.obj $O\stateful_util.obj $O\cgptlib_internal.obj	       \
+  $O\cgptlib.obj $O\crc32.obj $O\vboot_common.obj $O\vboot_kernel.obj	       \
+  $O\vboot_firmware.obj $O\rollback_index.obj $O\sha_utility.obj $O\rsa.obj    \
+  $O\rsa_utility.obj $O\padding.obj $O\sha2.obj $O\sha1.obj		       \
+  $O\load_firmware_stub.obj $O\tlcl.obj $O\utility_stub.obj		       \
+  $O\boot_device_stub.obj $O\crc32_test.obj $O\rollback_index_mock.obj	       \
+  $O\test_common.obj $O\cgptlib_test.obj $O\rsa_padding_test.obj	       \
+  $O\sha_tests.obj $O\vboot_common_tests.obj $O\vboot_common2_tests.obj	       \
+  $O\vboot_common3_tests.obj
+
+CFLAGS = $(CFLAGS) /I $R\firmware\lib\include
+CFLAGS = $(CFLAGS) /I $R\firmware\lib\cgptlib\include
+CFLAGS = $(CFLAGS) /I $R\firmware\include
+CFLAGS = $(CFLAGS) /I $R\firmware\stub\include
+CFLAGS = $(CFLAGS) /I $R\firmware\lib\cryptolib\include
+CFLAGS = $(CFLAGS) /I $R\host\include
+
+CFLAGS = $(CFLAGS) /W4 /WX /D TARGET_TEST_MODE
+
+COMPILE = $(CC) $(CFLAGS) /Fo$@ -c $<
+
+all: $(ALL_OBJS)
+
+{$R\firmware\linktest}.c{$O}.obj:
+	$(COMPILE)
+
+{$R\firmware\lib}.c{$O}.obj:
+	$(COMPILE)
+
+{$R\firmware\lib\cgptlib}.c{$O}.obj:
+	$(COMPILE)
+
+{$R\firmware\lib\cryptolib}.c{$O}.obj:
+	$(COMPILE)
+
+{$R\firmware\stub}.c{$O}.obj:
+	$(COMPILE)
+
+{$R\tests}.c{$O}.obj:
+	$(COMPILE)
+
+#{$R\cgpt}.c{$O}.obj:
+#$R/firmware/lib/cgptlibc.$O.obj:
+#$R/firmware/lib/cryptolibc.$O.obj:
+#$R/firmware/stubc.$O.obj:
+#$R/utilityc.$O.obj:
+#	$(CC) $(CFLAGS) -Fd$O\ -c $<
diff --git a/tests/cgptlib_test.c b/tests/cgptlib_test.c
index 29f91d8..5b0b9b4 100644
--- a/tests/cgptlib_test.c
+++ b/tests/cgptlib_test.c
@@ -11,6 +11,7 @@
 #include "crc32.h"
 #include "crc32_test.h"
 #include "gpt.h"
+#include "test_common.h"
 #include "utility.h"
 
 /* Testing partition layout (sector_bytes=512)
@@ -560,12 +561,12 @@
 
   /* Modify the first byte of primary entries, and expect the CRC is wrong. */
   BuildTestGptData(gpt);
-  EXPECT(0 == CheckEntries(e1, h1, gpt->drive_sectors));
-  EXPECT(0 == CheckEntries(e2, h1, gpt->drive_sectors));
+  EXPECT(0 == CheckEntries(e1, h1));
+  EXPECT(0 == CheckEntries(e2, h1));
   gpt->primary_entries[0] ^= 0xa5;  /* just XOR a non-zero value */
   gpt->secondary_entries[TOTAL_ENTRIES_SIZE-1] ^= 0x5a;
-  EXPECT(1 == CheckEntries(e1, h1, gpt->drive_sectors));
-  EXPECT(1 == CheckEntries(e2, h1, gpt->drive_sectors));
+  EXPECT(1 == CheckEntries(e1, h1));
+  EXPECT(1 == CheckEntries(e2, h1));
 
   return TEST_OK;
 }
@@ -586,26 +587,26 @@
   BuildTestGptData(gpt);
   e1[0].starting_lba = h1->first_usable_lba - 1;
   RefreshCrc32(gpt);
-  EXPECT(1 == CheckEntries(e1, h1, gpt->drive_sectors));
+  EXPECT(1 == CheckEntries(e1, h1));
 
   /* error case: entry.EndingLBA > header.LastUsableLBA */
   BuildTestGptData(gpt);
   e1[2].ending_lba = h1->last_usable_lba + 1;
   RefreshCrc32(gpt);
-  EXPECT(1 == CheckEntries(e1, h1, gpt->drive_sectors));
+  EXPECT(1 == CheckEntries(e1, h1));
 
   /* error case: entry.StartingLBA > entry.EndingLBA */
   BuildTestGptData(gpt);
   e1[3].starting_lba = e1[3].ending_lba + 1;
   RefreshCrc32(gpt);
-  EXPECT(1 == CheckEntries(e1, h1, gpt->drive_sectors));
+  EXPECT(1 == CheckEntries(e1, h1));
 
   /* case: non active entry should be ignored. */
   BuildTestGptData(gpt);
   Memset(&e1[1].type, 0, sizeof(e1[1].type));
   e1[1].starting_lba = e1[1].ending_lba + 1;
   RefreshCrc32(gpt);
-  EXPECT(0 == CheckEntries(e1, h1, gpt->drive_sectors));
+  EXPECT(0 == CheckEntries(e1, h1));
 
   return TEST_OK;
 }
@@ -667,7 +668,7 @@
     }
     RefreshCrc32(gpt);
 
-    EXPECT(cases[i].overlapped == CheckEntries(e, h, gpt->drive_sectors));
+    EXPECT(cases[i].overlapped == CheckEntries(e, h));
   }
   return TEST_OK;
 }
@@ -823,39 +824,39 @@
   GptData* gpt = GetEmptyGptData();
   GptEntry* e = (GptEntry*)(gpt->primary_entries);
 
-  e->attrs.whole = 0x0000000000000000LLU;
+  e->attrs.whole = 0x0000000000000000ULL;
   SetEntrySuccessful(e, 1);
-  EXPECT(0x0100000000000000LLU == e->attrs.whole);
+  EXPECT(0x0100000000000000ULL == e->attrs.whole);
   EXPECT(1 == GetEntrySuccessful(e));
-  e->attrs.whole = 0xFFFFFFFFFFFFFFFFLLU;
+  e->attrs.whole = 0xFFFFFFFFFFFFFFFFULL;
   SetEntrySuccessful(e, 0);
-  EXPECT(0xFEFFFFFFFFFFFFFFLLU == e->attrs.whole);
+  EXPECT(0xFEFFFFFFFFFFFFFFULL == e->attrs.whole);
   EXPECT(0 == GetEntrySuccessful(e));
 
-  e->attrs.whole = 0x0000000000000000LLU;
+  e->attrs.whole = 0x0000000000000000ULL;
   SetEntryTries(e, 15);
   EXPECT(15 == GetEntryTries(e));
-  EXPECT(0x00F0000000000000LLU == e->attrs.whole);
-  e->attrs.whole = 0xFFFFFFFFFFFFFFFFLLU;
+  EXPECT(0x00F0000000000000ULL == e->attrs.whole);
+  e->attrs.whole = 0xFFFFFFFFFFFFFFFFULL;
   SetEntryTries(e, 0);
-  EXPECT(0xFF0FFFFFFFFFFFFFLLU == e->attrs.whole);
+  EXPECT(0xFF0FFFFFFFFFFFFFULL == e->attrs.whole);
   EXPECT(0 == GetEntryTries(e));
 
-  e->attrs.whole = 0x0000000000000000LLU;
+  e->attrs.whole = 0x0000000000000000ULL;
   SetEntryPriority(e, 15);
-  EXPECT(0x000F000000000000LLU == e->attrs.whole);
+  EXPECT(0x000F000000000000ULL == e->attrs.whole);
   EXPECT(15 == GetEntryPriority(e));
-  e->attrs.whole = 0xFFFFFFFFFFFFFFFFLLU;
+  e->attrs.whole = 0xFFFFFFFFFFFFFFFFULL;
   SetEntryPriority(e, 0);
-  EXPECT(0xFFF0FFFFFFFFFFFFLLU == e->attrs.whole);
+  EXPECT(0xFFF0FFFFFFFFFFFFULL == e->attrs.whole);
   EXPECT(0 == GetEntryPriority(e));
 
-  e->attrs.whole = 0xFFFFFFFFFFFFFFFFLLU;
+  e->attrs.whole = 0xFFFFFFFFFFFFFFFFULL;
   EXPECT(1 == GetEntrySuccessful(e));
   EXPECT(15 == GetEntryPriority(e));
   EXPECT(15 == GetEntryTries(e));
 
-  e->attrs.whole = 0x0123000000000000LLU;
+  e->attrs.whole = 0x0123000000000000ULL;
   EXPECT(1 == GetEntrySuccessful(e));
   EXPECT(2 == GetEntryTries(e));
   EXPECT(3 == GetEntryPriority(e));
@@ -1091,6 +1092,8 @@
   return TEST_OK;
 }
 
+/* disable MSVC warnings on unused arguments */
+__pragma(warning (disable: 4100))
 
 int main(int argc, char *argv[]) {
   int i;
diff --git a/tests/cgptlib_test.h b/tests/cgptlib_test.h
index 9812e77..5f8b042 100644
--- a/tests/cgptlib_test.h
+++ b/tests/cgptlib_test.h
@@ -6,6 +6,7 @@
 #define VBOOT_REFERENCE_CGPTLIB_TEST_H_
 
 #include <stdio.h>
+#include "sysincludes.h"
 
 enum {
   TEST_FAIL = -1,
@@ -13,14 +14,12 @@
 };
 
 #define TEST_CASE(func) #func, func
-typedef int (*test_func)(void);
+typedef int (*test_func)();
 
 #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
 
-/* ANSI Color coding sequences. */
-#define COL_GREEN "\e[1;32m"
-#define COL_RED "\e[0;31m"
-#define COL_STOP "\e[m"
+/* disable MSVC warning on const logical expression (as in } while(0);) */
+__pragma(warning (disable: 4127))
 
 #define EXPECT(expr) \
   do { \
diff --git a/tests/crc32_test.c b/tests/crc32_test.c
index bb7e460..01eb5ac 100644
--- a/tests/crc32_test.c
+++ b/tests/crc32_test.c
@@ -6,6 +6,7 @@
 #include "crc32_test.h"
 #include "cgptlib_test.h"
 #include "crc32.h"
+#include "test_common.h"
 #include "utility.h"
 
 #define MAX_VECTOR_LEN 256
diff --git a/tests/rollback_index_mock.c b/tests/rollback_index_mock.c
index 6c62993..f12402b 100644
--- a/tests/rollback_index_mock.c
+++ b/tests/rollback_index_mock.c
@@ -8,7 +8,6 @@
 #include "rollback_index.h"
 #include "tss_constants.h"
 
-#include <stdint.h>
 #include <stdio.h>
 
 uint16_t g_firmware_key_version = 0;
@@ -16,6 +15,9 @@
 uint16_t g_kernel_key_version = 0;
 uint16_t g_kernel_version = 0;
 
+/* disable MSVC warnings on unused arguments */
+__pragma(warning (disable: 4100))
+
 uint32_t SetupTPM(int mode, int developer_flag) {
 #ifndef NDEBUG
   debug("Rollback Index Library Mock: TPM initialized.\n");
diff --git a/tests/sha_tests.c b/tests/sha_tests.c
index 2b75a03..65cbb46 100644
--- a/tests/sha_tests.c
+++ b/tests/sha_tests.c
@@ -78,6 +78,9 @@
   return success;
 }
 
+/* disable MSVC warnings on unused arguments */
+__pragma(warning (disable: 4100))
+
 int main(int argc, char* argv[]) {
   int success = 1;
   /* Initialize long_msg with 'a' x 1,000,000 */
diff --git a/tests/test_common.c b/tests/test_common.c
index e53f596..e7e5493 100644
--- a/tests/test_common.c
+++ b/tests/test_common.c
@@ -13,11 +13,6 @@
 #include "file_keys.h"
 #include "utility.h"
 
-/* ANSI Color coding sequences. */
-#define COL_GREEN "\e[1;32m"
-#define COL_RED "\e[0;31m"
-#define COL_STOP "\e[m"
-
 /* Global test success flag. */
 int gTestSuccess = 1;
 
diff --git a/tests/test_common.h b/tests/test_common.h
index d62071f..ed3e603 100644
--- a/tests/test_common.h
+++ b/tests/test_common.h
@@ -7,8 +7,6 @@
 #ifndef VBOOT_REFERENCE_TEST_COMMON_H_
 #define VBOOT_REFERENCE_TEST_COMMON_H_
 
-#include <stdint.h>
-
 extern int gTestSuccess;
 
 /* Return 1 if result is equal to expected_result, else return 0.
@@ -18,4 +16,12 @@
  * Also update the global gTestSuccess flag if test fails. */
 int TEST_NEQ(int result, int not_expected_result, char* testname);
 
+/* ANSI Color coding sequences.
+ *
+ * Don't use \e as MSC does not recognize it as a valid escape sequence.
+ */
+#define COL_GREEN "\x1b[1;32m"
+#define COL_RED "\x1b[0;31m"
+#define COL_STOP "\x1b[m"
+
 #endif  /* VBOOT_REFERENCE_TEST_COMMON_H_ */
diff --git a/tests/timer_utils.h b/tests/timer_utils.h
index 95eb8c7..f0d6b29 100644
--- a/tests/timer_utils.h
+++ b/tests/timer_utils.h
@@ -6,7 +6,10 @@
 #ifndef VBOOT_REFERENCE_TIMER_UTILS_H_
 #define VBOOT_REFERENCE_TIMER_UTILS_H_
 
+#ifndef _MSC_VER
 #include <inttypes.h>
+#endif
+
 #include <time.h>
 
 typedef struct ClockTimer {
diff --git a/tests/vboot_common2_tests.c b/tests/vboot_common2_tests.c
index b4c9096..9fee525 100644
--- a/tests/vboot_common2_tests.c
+++ b/tests/vboot_common2_tests.c
@@ -34,7 +34,8 @@
   rsa = PublicKeyToRSA(orig_key);
   TEST_NEQ((size_t)rsa, 0, "PublicKeyToRSA() ok");
   if (rsa) {
-    TEST_EQ(rsa->algorithm, key->algorithm, "PublicKeyToRSA() algorithm");
+    TEST_EQ((int)rsa->algorithm, (int)key->algorithm,
+            "PublicKeyToRSA() algorithm");
     RSAPublicKeyFree(rsa);
   }
 }
@@ -77,7 +78,7 @@
 
   sig = CalculateSignature(test_data, sizeof(test_data), private_key);
   rsa = PublicKeyToRSA(public_key);
-  digest = DigestBuf(test_data, sizeof(test_data), public_key->algorithm);
+  digest = DigestBuf(test_data, sizeof(test_data), (int)public_key->algorithm);
   TEST_NEQ(sig && rsa && digest, 0, "VerifyData() prerequisites");
   if (!sig || !rsa || !digest)
     return;
@@ -109,7 +110,7 @@
   VbKernelPreambleHeader *hdr;
   VbKernelPreambleHeader *h;
   RSAPublicKey* rsa;
-  uint64_t hsize;
+  unsigned hsize;
 
   /* Create a dummy signature */
   VbSignature *body_sig = SignatureAlloc(56, 78);
@@ -120,7 +121,7 @@
   TEST_NEQ(hdr && rsa, 0, "VerifyKernelPreamble2() prerequisites");
   if (!hdr)
     return;
-  hsize = hdr->preamble_size;
+  hsize = (unsigned) hdr->preamble_size;
   h = (VbKernelPreambleHeader*)Malloc(hsize + 16384);
 
   TEST_EQ(VerifyKernelPreamble2(hdr, hsize, rsa), 0,
diff --git a/tests/vboot_common3_tests.c b/tests/vboot_common3_tests.c
index e094d63..ff75906 100644
--- a/tests/vboot_common3_tests.c
+++ b/tests/vboot_common3_tests.c
@@ -31,13 +31,13 @@
 
   VbKeyBlockHeader *hdr;
   VbKeyBlockHeader *h;
-  uint64_t hsize;
+  unsigned hsize;
 
   hdr = KeyBlockCreate(data_key, private_key, 0x1234);
   TEST_NEQ((size_t)hdr, 0, "KeyBlockVerify() prerequisites");
   if (!hdr)
     return;
-  hsize = hdr->key_block_size;
+  hsize = (unsigned) hdr->key_block_size;
   h = (VbKeyBlockHeader*)Malloc(hsize + 1024);
 
   TEST_EQ(KeyBlockVerify(hdr, hsize, NULL), 0,
@@ -149,7 +149,7 @@
   VbFirmwarePreambleHeader *hdr;
   VbFirmwarePreambleHeader *h;
   RSAPublicKey* rsa;
-  uint64_t hsize;
+  unsigned hsize;
 
   /* Create a dummy signature */
   VbSignature *body_sig = SignatureAlloc(56, 78);
@@ -159,7 +159,7 @@
   TEST_NEQ(hdr && rsa, 0, "VerifyFirmwarePreamble2() prerequisites");
   if (!hdr)
     return;
-  hsize = hdr->preamble_size;
+  hsize = (unsigned) hdr->preamble_size;
   h = (VbFirmwarePreambleHeader*)Malloc(hsize + 16384);
 
   TEST_EQ(VerifyFirmwarePreamble2(hdr, hsize, rsa), 0,
diff --git a/tests/vboot_common_tests.c b/tests/vboot_common_tests.c
index e707daf..d01b2f9 100644
--- a/tests/vboot_common_tests.c
+++ b/tests/vboot_common_tests.c
@@ -31,24 +31,24 @@
 
   {
     uint8_t p[1];
-    TEST_EQ(OffsetOf(p, p), 0, "OffsetOf() equal");
-    TEST_EQ(OffsetOf(p, p+10), 10, "OffsetOf() positive");
-    TEST_EQ(OffsetOf(p, p+0x12345678), 0x12345678, "OffsetOf() large");
+    TEST_EQ((int)OffsetOf(p, p), 0, "OffsetOf() equal");
+    TEST_EQ((int)OffsetOf(p, p+10), 10, "OffsetOf() positive");
+    TEST_EQ((int)OffsetOf(p, p+0x12345678), 0x12345678, "OffsetOf() large");
   }
 
   {
     VbPublicKey k = {sizeof(k), 2, 3, 4};
-    TEST_EQ(OffsetOf(&k, GetPublicKeyData(&k)), sizeof(k),
+    TEST_EQ((int)OffsetOf(&k, GetPublicKeyData(&k)), sizeof(k),
             "GetPublicKeyData() adjacent");
-    TEST_EQ(OffsetOf(&k, GetPublicKeyDataC(&k)), sizeof(k),
+    TEST_EQ((int)OffsetOf(&k, GetPublicKeyDataC(&k)), sizeof(k),
             "GetPublicKeyDataC() adjacent");
   }
 
   {
     VbPublicKey k = {123, 2, 3, 4};
-    TEST_EQ(OffsetOf(&k, GetPublicKeyData(&k)), 123,
+    TEST_EQ((int)OffsetOf(&k, GetPublicKeyData(&k)), 123,
             "GetPublicKeyData() spaced");
-    TEST_EQ(OffsetOf(&k, GetPublicKeyDataC(&k)), 123,
+    TEST_EQ((int)OffsetOf(&k, GetPublicKeyDataC(&k)), 123,
             "GetPublicKeyDataC() spaced");
   }
 
@@ -64,7 +64,7 @@
             "MemberInside member too big");
     TEST_EQ(VerifyMemberInside(p, 20, p, 4, 21, 0), 1,
             "MemberInside data after parent");
-    TEST_EQ(VerifyMemberInside(p, 20, p, 4, -1, 0), 1,
+    TEST_EQ(VerifyMemberInside(p, 20, p, 4, (uint64_t)-1, 0), 1,
             "MemberInside data before parent");
     TEST_EQ(VerifyMemberInside(p, 20, p, 4, 4, 17), 1,
             "MemberInside data too big");
@@ -101,6 +101,8 @@
 
 }
 
+/* disable MSVC warnings on unused arguments */
+__pragma(warning (disable: 4100))
 
 int main(int argc, char* argv[]) {
   int error_code = 0;
diff --git a/utility/load_kernel_test.c b/utility/load_kernel_test.c
index ebeeb43..83cc60c 100644
--- a/utility/load_kernel_test.c
+++ b/utility/load_kernel_test.c
@@ -20,12 +20,6 @@
 #include "utility.h"
 #include "vboot_kernel.h"
 
-/* ANSI Color coding sequences. */
-#define COL_GREEN "\e[1;32m"
-#define COL_RED "\e[0;31m"
-#define COL_STOP "\e[m"
-
-
 #define LBA_BYTES 512
 #define KERNEL_BUFFER_SIZE 0x600000