2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for ZwContinue
11 #include <wine/test.h>
14 #define ZWC_SEGMENT_BITS (0xFFFF)
15 #define ZWC_EFLAGS_BITS (0x3C0CD5)
18 void continuePoint(void);
19 LONG NTAPI
ZwContinue(IN CONTEXT
*, IN BOOLEAN
);
21 static jmp_buf jmpbuf
;
22 static CONTEXT continueContext
;
23 static unsigned int nRandBytes
;
25 static int initrand(void)
27 unsigned int nRandMax
;
28 unsigned int nRandMaxBits
;
32 for(nRandMaxBits
= 0; nRandMax
!= 0; nRandMax
>>= 1, ++ nRandMaxBits
);
33 nRandBytes
= nRandMaxBits
/ CHAR_BIT
;
34 //assert(nRandBytes != 0);
35 srand((unsigned)(time(&tLoc
) & UINT_MAX
));
39 static void randbytes(void * p
, size_t n
)
45 b
= (unsigned char *)p
;
46 for(i
= 0; i
< n
; ++ i
)
48 if(i
% nRandBytes
== 0)
50 b
[i
] = (unsigned char)(r
& UCHAR_MAX
);
55 static ULONG
randULONG(void)
58 randbytes(&n
, sizeof(n
));
62 void check(CONTEXT
* pContext
)
65 ok(pContext
->ContextFlags
== CONTEXT_FULL
,
66 "ContextFlags=0x%lx\n", pContext
->ContextFlags
);
68 /* Random data segments */
69 ok((pContext
->SegGs
& ZWC_SEGMENT_BITS
) ==
70 (continueContext
.SegGs
& ZWC_SEGMENT_BITS
),
71 "SegGs=0x%lx / 0x%lx\n", pContext
->SegGs
, continueContext
.SegGs
);
73 ok((pContext
->SegFs
& ZWC_SEGMENT_BITS
) ==
74 (continueContext
.SegFs
& ZWC_SEGMENT_BITS
),
75 "SegFs=0x%lx / 0x%lx\n", pContext
->SegFs
, continueContext
.SegFs
);
77 ok((pContext
->SegEs
& ZWC_SEGMENT_BITS
) ==
78 (continueContext
.SegEs
& ZWC_SEGMENT_BITS
),
79 "SegEs=0x%lx / 0x%lx\n", pContext
->SegEs
, continueContext
.SegEs
);
81 ok((pContext
->SegDs
& ZWC_SEGMENT_BITS
) ==
82 (continueContext
.SegDs
& ZWC_SEGMENT_BITS
),
83 "SegDs=0x%lx / 0x%lx\n", pContext
->SegDs
, continueContext
.SegDs
);
85 /* Integer registers */
86 ok(pContext
->Edi
== continueContext
.Edi
,
87 "Edi: 0x%lx != 0x%lx\n", pContext
->Edi
, continueContext
.Edi
);
88 ok(pContext
->Esi
== continueContext
.Esi
,
89 "Esi: 0x%lx != 0x%lx\n", pContext
->Esi
, continueContext
.Esi
);
90 ok(pContext
->Ebx
== continueContext
.Ebx
,
91 "Ebx: 0x%lx != 0x%lx\n", pContext
->Ebx
, continueContext
.Ebx
);
92 ok(pContext
->Edx
== continueContext
.Edx
,
93 "Edx: 0x%lx != 0x%lx\n", pContext
->Edx
, continueContext
.Edx
);
94 ok(pContext
->Ecx
== continueContext
.Ecx
,
95 "Ecx: 0x%lx != 0x%lx\n", pContext
->Ecx
, continueContext
.Ecx
);
96 ok(pContext
->Eax
== continueContext
.Eax
,
97 "Eax: 0x%lx != 0x%lx\n", pContext
->Eax
, continueContext
.Eax
);
99 /* Control registers and segments */
100 ok(pContext
->Ebp
== continueContext
.Ebp
,
101 "Ebp: 0x%lx != 0x%lx\n", pContext
->Ebp
, continueContext
.Ebp
);
102 ok(pContext
->Eip
== continueContext
.Eip
,
103 "Eip: 0x%lx != 0x%lx\n", pContext
->Eip
, continueContext
.Eip
);
104 ok(pContext
->Esp
== continueContext
.Esp
,
105 "Esp: 0x%lx != 0x%lx\n", pContext
->Esp
, continueContext
.Esp
);
107 ok((pContext
->SegCs
& ZWC_SEGMENT_BITS
) ==
108 (continueContext
.SegCs
& ZWC_SEGMENT_BITS
),
109 "SegCs: 0x%lx != 0x%lx\n", pContext
->SegCs
, continueContext
.SegCs
);
111 ok((pContext
->EFlags
& ZWC_EFLAGS_BITS
) ==
112 (continueContext
.EFlags
& ZWC_EFLAGS_BITS
),
113 "EFlags: 0x%lx != 0x%lx\n", pContext
->EFlags
, continueContext
.EFlags
);
115 ok((pContext
->SegSs
& ZWC_SEGMENT_BITS
) ==
116 (continueContext
.SegSs
& ZWC_SEGMENT_BITS
),
117 "SegSs: 0x%lx != 0x%lx\n", pContext
->SegSs
, continueContext
.SegSs
);
120 /* Return where we came from */
124 void Test_ZwContinue()
129 if(setjmp(jmpbuf
) == 0)
133 continueContext
.ContextFlags
= CONTEXT_FULL
;
134 GetThreadContext(GetCurrentThread(), &continueContext
);
137 continueContext
.ContextFlags
= CONTEXT_FULL
;
139 /* Fill the integer registers with random values */
140 continueContext
.Edi
= randULONG();
141 continueContext
.Esi
= randULONG();
142 continueContext
.Ebx
= randULONG();
143 continueContext
.Edx
= randULONG();
144 continueContext
.Ecx
= randULONG();
145 continueContext
.Eax
= randULONG();
146 continueContext
.Ebp
= randULONG();
148 /* Randomize all the allowed flags (determined experimentally with WinDbg) */
149 continueContext
.EFlags
= randULONG() & 0x3C0CD5;
151 /* Randomize the stack pointer as much as possible */
152 continueContext
.Esp
= (ULONG
)(((ULONG_PTR
)&bogus
) & 0xFFFFFFFF) +
153 sizeof(bogus
) - (randULONG() & 0xF) * 4;
155 /* continuePoint() is implemented in assembler */
156 continueContext
.Eip
= (ULONG
)((ULONG_PTR
)continuePoint
& 0xFFFFFFF);
158 /* Can't do a lot about segments */
161 ZwContinue(&continueContext
, FALSE
);
162 ok(0, "should never get here\n");
169 START_TEST(ZwContinue
)