1 #define UNICODE
2 #define WIN32_NO_STATUS
3 #include <windows.h>
4 #include <stdio.h>
5 #define NTOS_MODE_USER
6 #include <ndk/ntndk.h>
7
8 #define NDEBUG
9 #include <debug.h>
10
11 static volatile DWORD z;
12 static volatile DWORD x=0;
13
14 static NTSTATUS WINAPI
thread_1(PVOID Param)15 thread_1(PVOID Param)
16 {
17 DWORD y=0;
18
19 for(;;)
20 {
21 z++;
22 if(x>50)
23 {
24 printf("I should have been suspended for years :-)\n");
25 Sleep(100);
26 x=0;y++;
27 if(y==3) ExitProcess(0);
28 }
29 }
30 }
31
32 int
main(int argc,char * argv[])33 main(int argc, char *argv[])
34 {
35 HANDLE thread;
36 DWORD thread_id;
37 CONTEXT context;
38
39 context.ContextFlags=CONTEXT_CONTROL;
40
41 z=0;
42 thread=CreateThread(NULL,
43 0x1000,
44 (LPTHREAD_START_ROUTINE)thread_1,
45 NULL,
46 0,
47 &thread_id);
48
49 if(!thread)
50 {
51 printf("Error: could not create thread ...\n");
52 ExitProcess(0);
53 }
54
55 Sleep(1000);
56
57 SuspendThread(thread);
58
59 for(;;)
60 {
61 printf("%lx ", z);
62 Sleep(100);x++;
63 if(x>100 && GetThreadContext(thread, &context))
64 {
65 #if defined(_M_IX86)
66 printf("EIP: %lx\n", context.Eip);
67 #elif defined(_M_AMD64)
68 printf("RIP: %p\n", context.Rip);
69 #endif
70 printf("Calling resumethread ... \n");
71 ResumeThread(thread);
72 }
73 }
74
75 ExitProcess(0);
76 return(0);
77 }
78