e2b254beda171f0de84a44f169b9ae5a31778e6d
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for NtContinue
14 #define NTC_SEGMENT_BITS (0xFFFF)
15 #define NTC_EFLAGS_BITS (0x3C0CD5)
18 void continuePoint(void);
20 static jmp_buf jmpbuf
;
21 static CONTEXT continueContext
;
22 static unsigned int nRandBytes
;
24 static int initrand(void)
26 unsigned int nRandMax
;
27 unsigned int nRandMaxBits
;
31 for(nRandMaxBits
= 0; nRandMax
!= 0; nRandMax
>>= 1, ++ nRandMaxBits
);
32 nRandBytes
= nRandMaxBits
/ CHAR_BIT
;
33 //assert(nRandBytes != 0);
34 srand((unsigned)(time(&tLoc
) & UINT_MAX
));
38 static void randbytes(void * p
, size_t n
)
44 b
= (unsigned char *)p
;
45 for(i
= 0; i
< n
; ++ i
)
47 if(i
% nRandBytes
== 0)
49 b
[i
] = (unsigned char)(r
& UCHAR_MAX
);
54 static ULONG
randULONG(void)
57 randbytes(&n
, sizeof(n
));
61 void check(CONTEXT
* pContext
)
64 ok(pContext
->ContextFlags
== CONTEXT_FULL
,
65 "ContextFlags=0x%lx\n", pContext
->ContextFlags
);
67 /* Random data segments */
68 ok((pContext
->SegGs
& NTC_SEGMENT_BITS
) ==
69 (continueContext
.SegGs
& NTC_SEGMENT_BITS
),
70 "SegGs=0x%lx / 0x%lx\n", pContext
->SegGs
, continueContext
.SegGs
);
72 ok((pContext
->SegFs
& NTC_SEGMENT_BITS
) ==
73 (continueContext
.SegFs
& NTC_SEGMENT_BITS
),
74 "SegFs=0x%lx / 0x%lx\n", pContext
->SegFs
, continueContext
.SegFs
);
76 ok((pContext
->SegEs
& NTC_SEGMENT_BITS
) ==
77 (continueContext
.SegEs
& NTC_SEGMENT_BITS
),
78 "SegEs=0x%lx / 0x%lx\n", pContext
->SegEs
, continueContext
.SegEs
);
80 ok((pContext
->SegDs
& NTC_SEGMENT_BITS
) ==
81 (continueContext
.SegDs
& NTC_SEGMENT_BITS
),
82 "SegDs=0x%lx / 0x%lx\n", pContext
->SegDs
, continueContext
.SegDs
);
84 /* Integer registers */
85 ok(pContext
->Edi
== continueContext
.Edi
,
86 "Edi: 0x%lx != 0x%lx\n", pContext
->Edi
, continueContext
.Edi
);
87 ok(pContext
->Esi
== continueContext
.Esi
,
88 "Esi: 0x%lx != 0x%lx\n", pContext
->Esi
, continueContext
.Esi
);
89 ok(pContext
->Ebx
== continueContext
.Ebx
,
90 "Ebx: 0x%lx != 0x%lx\n", pContext
->Ebx
, continueContext
.Ebx
);
91 ok(pContext
->Edx
== continueContext
.Edx
,
92 "Edx: 0x%lx != 0x%lx\n", pContext
->Edx
, continueContext
.Edx
);
93 ok(pContext
->Ecx
== continueContext
.Ecx
,
94 "Ecx: 0x%lx != 0x%lx\n", pContext
->Ecx
, continueContext
.Ecx
);
95 ok(pContext
->Eax
== continueContext
.Eax
,
96 "Eax: 0x%lx != 0x%lx\n", pContext
->Eax
, continueContext
.Eax
);
98 /* Control registers and segments */
99 ok(pContext
->Ebp
== continueContext
.Ebp
,
100 "Ebp: 0x%lx != 0x%lx\n", pContext
->Ebp
, continueContext
.Ebp
);
101 ok(pContext
->Eip
== continueContext
.Eip
,
102 "Eip: 0x%lx != 0x%lx\n", pContext
->Eip
, continueContext
.Eip
);
103 ok(pContext
->Esp
== continueContext
.Esp
,
104 "Esp: 0x%lx != 0x%lx\n", pContext
->Esp
, continueContext
.Esp
);
106 ok((pContext
->SegCs
& NTC_SEGMENT_BITS
) ==
107 (continueContext
.SegCs
& NTC_SEGMENT_BITS
),
108 "SegCs: 0x%lx != 0x%lx\n", pContext
->SegCs
, continueContext
.SegCs
);
110 ok((pContext
->EFlags
& NTC_EFLAGS_BITS
) ==
111 (continueContext
.EFlags
& NTC_EFLAGS_BITS
),
112 "EFlags: 0x%lx != 0x%lx\n", pContext
->EFlags
, continueContext
.EFlags
);
114 ok((pContext
->SegSs
& NTC_SEGMENT_BITS
) ==
115 (continueContext
.SegSs
& NTC_SEGMENT_BITS
),
116 "SegSs: 0x%lx != 0x%lx\n", pContext
->SegSs
, continueContext
.SegSs
);
119 /* Return where we came from */
123 START_TEST(NtContinue
)
125 #ifdef __RUNTIME_CHECKS__
126 skip("This test breaks MSVC runtime checks!");
128 #endif /* __RUNTIME_CHECKS__ */
132 if(setjmp(jmpbuf
) == 0)
136 continueContext
.ContextFlags
= CONTEXT_FULL
;
137 GetThreadContext(GetCurrentThread(), &continueContext
);
140 continueContext
.ContextFlags
= CONTEXT_FULL
;
142 /* Fill the integer registers with random values */
143 continueContext
.Edi
= randULONG();
144 continueContext
.Esi
= randULONG();
145 continueContext
.Ebx
= randULONG();
146 continueContext
.Edx
= randULONG();
147 continueContext
.Ecx
= randULONG();
148 continueContext
.Eax
= randULONG();
149 continueContext
.Ebp
= randULONG();
151 /* Randomize all the allowed flags (determined experimentally with WinDbg) */
152 continueContext
.EFlags
= randULONG() & 0x3C0CD5;
154 /* Randomize the stack pointer as much as possible */
155 continueContext
.Esp
= (ULONG
)(((ULONG_PTR
)&bogus
) & 0xFFFFFFFF) +
156 sizeof(bogus
) - (randULONG() & 0xF) * 4;
158 /* continuePoint() is implemented in assembler */
159 continueContext
.Eip
= (ULONG
)((ULONG_PTR
)continuePoint
& 0xFFFFFFF);
161 /* Can't do a lot about segments */
164 NtContinue(&continueContext
, FALSE
);
165 ok(0, "should never get here\n");