aboutsummaryrefslogtreecommitdiffhomepage
path: root/samples/slept/slept.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'samples/slept/slept.cpp')
-rw-r--r--samples/slept/slept.cpp130
1 files changed, 130 insertions, 0 deletions
diff --git a/samples/slept/slept.cpp b/samples/slept/slept.cpp
new file mode 100644
index 0000000..5903295
--- /dev/null
+++ b/samples/slept/slept.cpp
@@ -0,0 +1,130 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// Detour Test Program (slept.cpp of slept.dll)
+//
+// Microsoft Research Detours Package
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+#include <stdio.h>
+#include <windows.h>
+#include "detours.h"
+#include "slept.h"
+
+#include "verify.cpp"
+
+static BOOL fBroke = FALSE;
+static LONG dwSlept = 0;
+static DWORD (WINAPI * TrueSleepEx)(DWORD dwMilliseconds, BOOL bAlertable) = SleepEx;
+
+DWORD WINAPI UntimedSleepEx(DWORD dwMilliseconds, BOOL bAlertable)
+{
+ return TrueSleepEx(dwMilliseconds, bAlertable);
+}
+
+DWORD WINAPI TimedSleepEx(DWORD dwMilliseconds, BOOL bAlertable)
+{
+ DWORD dwBeg = GetTickCount();
+ DWORD ret = TrueSleepEx(dwMilliseconds, bAlertable);
+ DWORD dwEnd = GetTickCount();
+
+ if (!fBroke) {
+ fBroke = TRUE;
+ // DebugBreak();
+ }
+
+ InterlockedExchangeAdd(&dwSlept, dwEnd - dwBeg);
+ return ret;
+}
+
+DWORD WINAPI GetSleptTicks(VOID)
+{
+ return dwSlept;
+}
+
+DWORD WINAPI TestTicks(VOID)
+{
+ return TestTicksEx(0);
+}
+
+DWORD WINAPI TestTicksEx(DWORD Add)
+{
+ PDWORD pdw = new DWORD [Add + 1];
+
+ if (pdw != NULL) {
+ pdw[0] = dwSlept;
+ for (DWORD n = 1; n < Add + 1; n++) {
+ pdw[n] = pdw[n-1] + 1;
+ }
+
+ for (DWORD n = 1; n < Add + 1; n++) {
+ pdw[n-1] = pdw[n-1] - 1;
+ }
+
+ for (DWORD n = 1; n < Add + 1; n++) {
+ pdw[n] = pdw[n-1] + 1;
+ }
+
+ Add = pdw[Add] - Add;
+
+ delete [] pdw;
+ }
+ else {
+ Add = dwSlept + Add;
+ }
+
+ return Add;
+}
+
+BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
+{
+ LONG error;
+ (void)hinst;
+ (void)reserved;
+
+ if (DetourIsHelperProcess()) {
+ return TRUE;
+ }
+
+ if (dwReason == DLL_PROCESS_ATTACH) {
+ DetourRestoreAfterWith();
+
+ printf("slept" DETOURS_STRINGIFY(DETOURS_BITS) ".dll: "
+ " Starting.\n");
+ PVOID pbExeEntry = DetourGetEntryPoint(NULL);
+ PVOID pbDllEntry = DetourGetEntryPoint(hinst);
+ printf("slept" DETOURS_STRINGIFY(DETOURS_BITS) ".dll: "
+ " ExeEntry=%p, DllEntry=%p\n", pbExeEntry, pbDllEntry);
+
+ Verify("SleepEx", (PVOID)SleepEx);
+ printf("\n");
+ fflush(stdout);
+
+ DetourTransactionBegin();
+ DetourUpdateThread(GetCurrentThread());
+ DetourAttach(&(PVOID&)TrueSleepEx, TimedSleepEx);
+ error = DetourTransactionCommit();
+
+ if (error == NO_ERROR) {
+ printf("slept" DETOURS_STRINGIFY(DETOURS_BITS) ".dll: "
+ " Detoured SleepEx() @ %p.\n", TrueSleepEx);
+ }
+ else {
+ printf("slept" DETOURS_STRINGIFY(DETOURS_BITS) ".dll: "
+ " Error detouring SleepEx(): %ld\n", error);
+ }
+ }
+ else if (dwReason == DLL_PROCESS_DETACH) {
+ DetourTransactionBegin();
+ DetourUpdateThread(GetCurrentThread());
+ DetourDetach(&(PVOID&)TrueSleepEx, TimedSleepEx);
+ error = DetourTransactionCommit();
+ printf("slept" DETOURS_STRINGIFY(DETOURS_BITS) ".dll: "
+ " Removed SleepEx() detour (%ld), slept %ld ticks.\n", error, dwSlept);
+ fflush(stdout);
+ }
+ return TRUE;
+}
+
+//
+///////////////////////////////////////////////////////////////// End of File.