diff --git a/src/jthread/win32/jsemaphore.cpp b/src/jthread/win32/jsemaphore.cpp
index 34167f391..40623b13d 100755
--- a/src/jthread/win32/jsemaphore.cpp
+++ b/src/jthread/win32/jsemaphore.cpp
@@ -66,14 +66,41 @@ bool JSemaphore::Wait(unsigned int time_ms) {
 	}
 }
 
+typedef LONG (NTAPI *_NtQuerySemaphore)(
+    HANDLE SemaphoreHandle,
+    DWORD SemaphoreInformationClass,
+    PVOID SemaphoreInformation,
+    ULONG SemaphoreInformationLength,
+    PULONG ReturnLength OPTIONAL
+);
+
+typedef struct _SEMAPHORE_BASIC_INFORMATION {
+    ULONG CurrentCount;
+    ULONG MaximumCount;
+} SEMAPHORE_BASIC_INFORMATION;
+
+/* Note: this will only work as long as jthread is directly linked to application */
+/* it's gonna fail if someone tries to build jthread as dll */
+static _NtQuerySemaphore NtQuerySemaphore = 
+		(_NtQuerySemaphore)
+		GetProcAddress 
+		(GetModuleHandle ("ntdll.dll"), "NtQuerySemaphore");
+
 int JSemaphore::GetValue() {
+	SEMAPHORE_BASIC_INFORMATION BasicInfo;
+	LONG retval;
 
-	long int retval = 0;
-	ReleaseSemaphore(
-			m_hSemaphore,
-			0,
-			&retval);
+	assert(NtQuerySemaphore);
+	
+	retval = NtQuerySemaphore (m_hSemaphore, 0,
+		&BasicInfo, sizeof (SEMAPHORE_BASIC_INFORMATION), NULL);
 
-	return retval;
+	if (retval == ERROR_SUCCESS)
+	{
+		return BasicInfo.CurrentCount;
+	}
+	else {
+		assert("unable to read semaphore count" == 0);
+	}
 }