1 // Copyright (c) Microsoft. All rights reserved.
2 // Licensed under the MIT license. See LICENSE file in the project root for full
3 // license information.
4 
5 /*
6  *	COMMAND LINE: -Ox -Gz -YX -UPROTOTYPES_REQUIRED
7  */
8 
9 #pragma warning(disable : 4532)
10 #pragma warning(disable : 4702)
11 
12 #if defined(_WIN32)
13 
14 #if defined(_M_SH)
15 #define WIN_CE
16 #endif
17 
18 #if defined(_M_AMD64)
19 #define NEST_IN_FINALLY /* allow when __try nested in __finally OK */
20 #endif
21 
22 #define NTSTATUS LONG
23 #define EXCEPTION_NESTED_CALL 0x10
24 #define RtlRaiseStatus(x) RaiseException((x), 0, 0, NULL)
25 #define RtlRaiseException(x)                                                   \
26   RaiseException((x)->ExceptionCode, (x)->ExceptionFlags,                      \
27                  (x)->NumberParameters, (x)->ExceptionInformation)
28 #define IN
29 #define OUT
30 #if !(defined(_M_IA64) || defined(_M_ALPHA) || defined(_M_PPC) ||              \
31       defined(_M_AMD64) || defined(_M_ARM) || defined(_M_ARM64))
32 #define i386 1
33 #endif
34 #define try __try
35 #define except __except
36 #define finally __finally
37 #define leave __leave
38 
39 #endif
40 
41 #define WIN32_LEAN_AND_MEAN
42 
43 #include "stdio.h"
44 #if defined(_M_IA64) || defined(_M_ALPHA) || defined(_M_PPC) ||                \
45     defined(_M_AMD64) || defined(_M_ARM) || defined(_M_ARM64)
46 #include "setjmpex.h"
47 #else
48 #include "setjmp.h"
49 #endif
50 #include "float.h"
51 #include "windows.h"
52 #include "math.h"
53 
54 #if !defined(STATUS_SUCCESS)
55 #define STATUS_SUCCESS 0
56 #endif
57 #if !defined(STATUS_UNSUCCESSFUL)
58 #define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L)
59 #endif
60 
61 //
62 // Define switch constants.
63 //
64 
65 #define BLUE 0
66 #define RED 1
67 
68 //
69 // Define function prototypes.
70 //
71 
72 VOID addtwo(IN LONG First, IN LONG Second, IN PLONG Place);
73 
74 VOID bar1(IN NTSTATUS Status, IN PLONG Counter);
75 
76 VOID bar2(IN PLONG BlackHole, IN PLONG BadAddress, IN PLONG Counter);
77 
78 VOID dojump(IN jmp_buf JumpBuffer, IN PLONG Counter);
79 
80 LONG Echo(IN LONG Value);
81 
82 #if !defined(WIN_CE) // return through finally not allowed on WinCE
83 VOID eret(IN NTSTATUS Status, IN PLONG Counter);
84 #endif
85 
86 VOID except1(IN PLONG Counter);
87 
88 ULONG
89 except2(IN PEXCEPTION_POINTERS ExceptionPointers, IN PLONG Counter);
90 
91 ULONG
92 except3(IN PEXCEPTION_POINTERS ExceptionPointers, IN PLONG Counter);
93 
94 VOID foo1(IN NTSTATUS Status);
95 
96 VOID foo2(IN PLONG BlackHole, IN PLONG BadAddress);
97 
98 #if !defined(WIN_CE) // return from finally not allowed on WinCE
99 VOID fret(IN PLONG Counter);
100 #endif
101 
102 BOOLEAN
103 Tkm(VOID);
104 
105 VOID Test61Part2(IN OUT PULONG Counter);
106 
107 double SquareDouble(IN double op);
108 
109 DECLSPEC_NOINLINE
110 ULONG
111 PgFilter(VOID)
112 
113 {
114 
115   printf("filter entered...");
116   return EXCEPTION_EXECUTE_HANDLER;
117 }
118 
119 #pragma warning(push)
120 #pragma warning(disable : 4532)
121 
122 VOID PgTest69(IN PLONG State, IN PLONG Fault)
123 
124 {
125 
126   try {
127     try {
128       *Fault += 1;
129     }
130     finally {
131       if (AbnormalTermination()) {
132         if (*State == 1) {
133           *State += 1;
134 
135         } else {
136           *Fault += 1;
137         }
138       }
139     }
140   }
141   except(((*State += 1) == 1) ? PgFilter() : EXCEPTION_CONTINUE_SEARCH) {
142     if (*State != 2) {
143       *Fault += 1;
144     }
145   }
146 
147   return;
148 }
149 
150 VOID PgTest70(IN PLONG State, IN PLONG Fault)
151 
152 {
153 
154   try {
155     try {
156       *Fault += 1;
157     }
158     finally {
159       if (AbnormalTermination()) {
160         if (*State == 2) {
161           PgFilter();
162           return;
163 
164         } else {
165           *Fault += 1;
166         }
167       }
168     }
169   }
170   except(((*State += 2) == 2) ? EXCEPTION_EXECUTE_HANDLER
171                               : EXCEPTION_CONTINUE_SEARCH) {
172     *Fault += 1;
173   }
174 
175   return;
176 }
177 
178 VOID PgTest71(IN PLONG State, IN PLONG Fault)
179 
180 {
181 
182   try {
183     try {
184       try {
185         *Fault += 1;
186       }
187       finally {
188         if (AbnormalTermination()) {
189           if (*State == 3) {
190             *State += 3;
191             return;
192 
193           } else {
194             *Fault += 1;
195           }
196         }
197       }
198     }
199     finally {
200       if (AbnormalTermination()) {
201         if (*State == 6) {
202           *State += 3;
203 
204         } else {
205           *Fault += 1;
206         }
207       }
208     }
209   }
210   except(((*State += 3) == 3) ? PgFilter() : EXCEPTION_CONTINUE_SEARCH) {
211     *Fault += 1;
212   }
213 
214   return;
215 }
216 
217 VOID PgTest72(IN PLONG State, IN PLONG Fault)
218 
219 {
220 
221   try {
222     try {
223       try {
224         *Fault += 1;
225       }
226       finally {
227         if (AbnormalTermination()) {
228           if (*State == 4) {
229             *State += 4;
230             return;
231 
232           } else {
233             *Fault += 1;
234           }
235         }
236       }
237     }
238     finally {
239       if (AbnormalTermination()) {
240         if (*State == 8) {
241           *State += 4;
242           PgFilter();
243 
244         } else {
245           *Fault += 1;
246         }
247       }
248     }
249   }
250   except(((*State += 4) == 4) ? EXCEPTION_EXECUTE_HANDLER
251                               : EXCEPTION_CONTINUE_SEARCH) {
252     *Fault += 1;
253   }
254 
255   return;
256 }
257 
258 VOID PgTest73(IN PLONG State, IN PLONG Fault)
259 
260 {
261 
262   try {
263     try {
264       try {
265         *Fault += 1;
266       }
267       finally {
268         if (AbnormalTermination()) {
269           if (*State == 5) {
270             *State += 5;
271 
272           } else {
273             *Fault += 1;
274           }
275         }
276       }
277     }
278     finally {
279       if (AbnormalTermination()) {
280         if (*State == 10) {
281           *State += 5;
282           return;
283 
284         } else {
285           *Fault += 1;
286         }
287       }
288     }
289   }
290   except(((*State += 5) == 5) ? PgFilter() : EXCEPTION_CONTINUE_SEARCH) {
291     *Fault += 1;
292   }
293 
294   return;
295 }
296 
297 VOID PgTest74(IN PLONG State, IN PLONG Fault)
298 
299 {
300 
301   try {
302     try {
303       try {
304         *Fault += 1;
305       }
306       finally {
307         if (AbnormalTermination()) {
308           if (*State == 6) {
309             *State += 6;
310 
311           } else {
312             *Fault += 1;
313           }
314         }
315       }
316     }
317     finally {
318       if (AbnormalTermination()) {
319         if (*State == 12) {
320           *State += 6;
321           PgFilter();
322           return;
323 
324         } else {
325           *Fault += 1;
326         }
327       }
328     }
329   }
330   except(((*State += 6) == 6) ? EXCEPTION_EXECUTE_HANDLER
331                               : EXCEPTION_CONTINUE_SEARCH) {
332     *Fault += 1;
333   }
334 
335   return;
336 }
337 
338 VOID PgTest75(IN PLONG State, IN PLONG Fault)
339 
340 {
341 
342   try {
343     try {
344       try {
345         try {
346           *Fault += 1;
347         }
348         finally {
349           if (AbnormalTermination()) {
350             if (*State == 7) {
351               *State += 7;
352               *Fault += 1;
353 
354             } else {
355               *State += 10;
356             }
357           }
358         }
359       }
360       except(((*State += 7) == 7) ? EXCEPTION_EXECUTE_HANDLER
361                                   : EXCEPTION_CONTINUE_SEARCH) {
362         *Fault += 1;
363       }
364     }
365     finally {
366       if (AbnormalTermination()) {
367         if (*State == 28) {
368           *State += 7;
369           return;
370 
371         } else {
372           *Fault += 1;
373         }
374       }
375     }
376   }
377   except(((*State += 7) == 28) ? PgFilter() : EXCEPTION_CONTINUE_SEARCH) {
378     *Fault += 1;
379   }
380 
381   return;
382 }
383 
384 VOID PgTest76(IN PLONG State, IN PLONG Fault)
385 
386 {
387 
388   try {
389     try {
390       try {
391         try {
392           *Fault += 1;
393         }
394         finally {
395           if (AbnormalTermination()) {
396             if (*State == 8) {
397               *State += 8;
398               *Fault += 1;
399 
400             } else {
401               *State += 10;
402             }
403           }
404         }
405       }
406       except(((*State += 8) == 8) ? EXCEPTION_EXECUTE_HANDLER
407                                   : EXCEPTION_CONTINUE_SEARCH) {
408         *Fault += 1;
409       }
410     }
411     finally {
412       if (AbnormalTermination()) {
413         if (*State == 32) {
414           *State += 8;
415           PgFilter();
416           return;
417 
418         } else {
419           *Fault += 1;
420         }
421       }
422     }
423   }
424   except(((*State += 8) == 32) ? EXCEPTION_EXECUTE_HANDLER
425                                : EXCEPTION_CONTINUE_SEARCH) {
426     *Fault += 1;
427   }
428 
429   return;
430 }
431 
432 VOID PgTest77(IN PLONG State, IN PLONG Fault)
433 
434 {
435 
436   try {
437     try {
438       try {
439         try {
440           *Fault += 1;
441         }
442         finally {
443           if (AbnormalTermination()) {
444             if (*State == 9) {
445               *State += 9;
446               *Fault += 1;
447 
448             } else {
449               *State += 10;
450             }
451           }
452         }
453       }
454       except(((*State += 9) == 9) ? PgFilter() : EXCEPTION_CONTINUE_SEARCH) {
455         *Fault += 1;
456       }
457     }
458     finally {
459       if (AbnormalTermination()) {
460         if (*State == 36) {
461           *State += 9;
462           return;
463 
464         } else {
465           *Fault += 1;
466         }
467       }
468     }
469   }
470   except(((*State += 9) == 36) ? EXCEPTION_EXECUTE_HANDLER
471                                : EXCEPTION_CONTINUE_SEARCH) {
472     *Fault += 1;
473   }
474 
475   return;
476 }
477 
478 VOID PgTest78(IN PLONG State, IN PLONG Fault)
479 
480 {
481 
482   try {
483     try {
484       try {
485         try {
486           *Fault += 1;
487         }
488         finally {
489           if (AbnormalTermination()) {
490             if (*State == 10) {
491               *State += 10;
492               PgFilter();
493               *Fault += 1;
494 
495             } else {
496               *State += 10;
497             }
498           }
499         }
500       }
501       except(((*State += 10) == 10) ? EXCEPTION_EXECUTE_HANDLER
502                                     : EXCEPTION_CONTINUE_SEARCH) {
503         *Fault += 1;
504       }
505     }
506     finally {
507       if (AbnormalTermination()) {
508         if (*State == 40) {
509           *State += 10;
510           return;
511 
512         } else {
513           *Fault += 1;
514         }
515       }
516     }
517   }
518   except(((*State += 10) == 40) ? EXCEPTION_EXECUTE_HANDLER
519                                 : EXCEPTION_CONTINUE_SEARCH) {
520     *Fault += 1;
521   }
522 
523   return;
524 }
525 
526 #pragma warning(pop)
527 
528 VOID Test79(PLONG Counter, PLONG Fault)
529 
530 {
531 
532   try {
533     try {
534       try {
535         *Fault += 1;
536       }
537       finally {
538         printf("finally 1...");
539         *Fault += 1;
540       }
541     }
542     finally { printf("finally 2..."); }
543   }
544   except(*Counter += 1, printf("filter 1..."), EXCEPTION_CONTINUE_SEARCH) {}
545 
546   return;
547 }
548 
549 ULONG G;
550 
551 ULONG
552 Test80(VOID)
553 
554 {
555 
556   G = 1;
557   try {
558     while (G) {
559       try {
560         if (G == 10) {
561           return 1;
562         }
563 
564         if (G == 1) {
565           continue;
566         }
567       }
568       finally { G = 0; }
569     }
570   }
571   finally { G = 10; }
572 
573   return 0;
574 }
575 
576 void Test81(int *pCounter) {
577   volatile char *AvPtr = NULL;
578 
579   __try {
580     __try { *AvPtr = '\0'; }
581     __except(EXCEPTION_EXECUTE_HANDLER) { __leave; }
582   }
583   __finally {
584     printf("in finally ");
585     *pCounter += 1;
586   }
587   return;
588 }
589 
590 DECLSPEC_NOINLINE
591 VOID Test82Foo(VOID)
592 
593 {
594   *(volatile int *)0 = 0;
595 }
596 
597 VOID Test82(__inout PLONG Counter)
598 
599 {
600 
601   int retval = 1;
602 
603   __try {
604     __try { Test82Foo(); }
605     __finally {
606       switch (*Counter) {
607       case 0:
608         printf("something failed!\n");
609         retval = 6;
610         break;
611 
612       case 1:
613         retval = 0;
614         break;
615 
616       case 2:
617         printf("how did you get here?\n");
618         retval = 2;
619         break;
620 
621       case 3:
622         printf("what?!?\n");
623         retval = 3;
624         break;
625 
626       case 4:
627         printf("not correct\n");
628         retval = 4;
629         break;
630 
631       case 5:
632         printf("error!\n");
633         retval = 5;
634         break;
635       }
636     }
637   }
638   __except(1){}
639 
640   *Counter = retval;
641   return;
642 }
643 
644 LONG Test83(VOID)
645 
646 {
647 
648   G = 1;
649   try {
650     try {
651       while (G) {
652         try {
653           if (G == 10) {
654             return 1;
655           }
656 
657           if (G == 1) {
658             continue;
659           }
660         }
661         finally { G = 0; }
662       }
663     }
664     except(EXCEPTION_EXECUTE_HANDLER) { leave; }
665   }
666   finally { G = 10; }
667 
668   return 0;
669 }
670 
671 DECLSPEC_NOINLINE
672 VOID Test84(_Inout_ PLONG Counter)
673 
674 {
675   volatile int *Fault = 0;
676 
677   try {
678     try {
679       *Fault += 1;
680     }
681     except(EXCEPTION_EXECUTE_HANDLER) {
682       try {
683         return;
684       }
685       finally { *Counter += 1; }
686     }
687   }
688   finally {
689 
690     if (AbnormalTermination()) {
691       *Counter += 1;
692     }
693   }
694 
695   return;
696 }
697 
698 DECLSPEC_NOINLINE
699 LONG Test85(_Inout_ PLONG Counter)
700 
701 {
702   volatile int *Fault = 0;
703 
704   G = 1;
705   try {
706     try {
707       try {
708         while (G) {
709           try {
710             try {
711               if (G == 10) {
712                 return 1;
713               }
714               try {
715                 *Counter += 1;
716               }
717               except(EXCEPTION_EXECUTE_HANDLER) {}
718 
719               if (G == 1) {
720                 continue;
721               }
722             }
723             finally {
724               G = 0;
725               *Counter += 1;
726               *Fault += 1;
727             }
728           }
729           except(EXCEPTION_EXECUTE_HANDLER) {
730             *Counter += 1;
731             leave;
732           }
733         }
734       }
735       finally {
736         G = 10;
737         *Counter += 1;
738         *Fault += 1;
739       }
740     }
741     except(EXCEPTION_EXECUTE_HANDLER) { *Counter += 1; }
742     *Counter += 1;
743   }
744   finally { *Counter += 1; }
745   return 1;
746 }
747 
748 DECLSPEC_NOINLINE
749 VOID Test86(_Inout_ PLONG Counter)
750 
751 {
752   volatile int *Fault = 0;
753 
754   try {
755     try {
756       try {
757         try {
758           try {
759             try {
760               *Fault += 1;
761             }
762             except(printf("Filter1 %d..", *Counter),
763                    EXCEPTION_EXECUTE_HANDLER) {
764               try {
765                 printf("Handler1 %d..", *Counter);
766                 return;
767               }
768               finally {
769                 printf("Finally1 %d..", *Counter);
770                 *Counter += 1;
771               }
772             }
773           }
774           finally {
775             printf("Finally2 %d..", *Counter);
776             *Counter += 1;
777           }
778         }
779         except(EXCEPTION_EXECUTE_HANDLER) { leave; }
780       }
781       finally { *Counter += 1; }
782     }
783     except(EXCEPTION_EXECUTE_HANDLER) { leave; }
784   }
785   finally { *Counter += 1; }
786 
787   return;
788 }
789 
790 VOID Test87(_Inout_ PLONG Counter)
791 
792 /*++
793 
794 Routine Description:
795 
796     This function verifies the behavior of nested exception dispatching.
797 
798 Arguments:
799 
800     Counter - Supplies a pointer to the state counter.
801 
802 Return Value:
803     None.
804 
805 --*/
806 
807 {
808   volatile int *Fault = 0;
809 
810 //
811 // N.B.  Disabled on x86 due to failing test case with handling of returns
812 //       in nested termination handlers on x86.
813 //
814 //       Disabled on ARM due to failing test case with handling of abutting
815 //       termination handlers within an except handler.
816 //
817 //       Disabled on AMD64 due to failing test case with handling of
818 //       abutting termination handlers within an except handler when a
819 //       non-local goto is involved.
820 //
821 
822 #if !defined(_X86_)
823   try {
824     try {
825       try {
826         try {
827           try {
828             *Fault += 1;
829 
830             try {
831             }
832             finally {
833               if (AbnormalTermination()) {
834                 *Fault += 1;
835               }
836             }
837           }
838           finally {
839 
840             if (AbnormalTermination()) {
841               if ((*Counter += 13) == 26) {
842                 return;
843 
844               } else {
845                 *Fault += 1;
846               }
847             }
848           }
849         }
850         finally {
851           if (AbnormalTermination()) {
852             *Counter += 13;
853             *Fault += 1;
854           }
855         }
856       }
857       except(((*Counter += 13) == 13) ? EXCEPTION_EXECUTE_HANDLER
858                                       : EXCEPTION_CONTINUE_SEARCH) {
859         *Fault += 1;
860       }
861     }
862     except(((*Counter += 13) == 65) ? EXCEPTION_EXECUTE_HANDLER
863                                     : EXCEPTION_CONTINUE_SEARCH) {
864       try {
865         *Counter += 13;
866         return;
867       }
868       finally {
869         if (AbnormalTermination()) {
870           *Counter += 13;
871           goto Finish;
872         }
873       }
874     }
875   }
876   finally {
877 
878     if (AbnormalTermination()) {
879       if ((*Counter += 13) == 104) {
880         goto Finish;
881       }
882     }
883   }
884 
885 Finish:
886 #else
887   *Counter = 104;
888 #endif
889 
890   return;
891 }
892 
893 VOID Test88(_Inout_ PLONG Counter)
894 
895 {
896   volatile int *Fault = 0;
897 
898   try {
899     try {
900       try {
901         try {
902           try {
903             try {
904               try {
905                 try {
906                   *Fault += 1;
907                 }
908                 except(((*Counter += 1) == 1) ? *Fault
909                                               : EXCEPTION_CONTINUE_SEARCH) {}
910               }
911               except(*Counter += 1, EXCEPTION_EXECUTE_HANDLER) { *Fault += 2; }
912             }
913             except(*Counter += 1, EXCEPTION_CONTINUE_SEARCH) { leave; }
914           }
915           except(*Counter += 1, EXCEPTION_CONTINUE_SEARCH) { leave; }
916         }
917         except(EXCEPTION_EXECUTE_HANDLER) {}
918       }
919       except(EXCEPTION_EXECUTE_HANDLER) {}
920     }
921     except(EXCEPTION_EXECUTE_HANDLER) { leave; }
922   }
923   finally { *Counter += 1; }
924 }
925 
926 int main(int argc, char *argv[])
927 
928 {
929 
930   PLONG BadAddress;
931   PCHAR BadByte;
932   PLONG BlackHole;
933   ULONG Index1;
934   ULONG Index2 = RED;
935   jmp_buf JumpBuffer;
936   LONG Counter;
937   EXCEPTION_RECORD ExceptionRecord;
938   double doubleresult;
939 
940   //
941   // Announce start of exception test.
942   //
943 
944   printf("Start of exception test\n");
945 
946   //
947   // Initialize exception record.
948   //
949 
950   ExceptionRecord.ExceptionCode = STATUS_INTEGER_OVERFLOW;
951   ExceptionRecord.ExceptionFlags = 0;
952   ExceptionRecord.ExceptionRecord = NULL;
953   ExceptionRecord.NumberParameters = 0;
954 
955   //
956   // Initialize pointers.
957   //
958 
959   BadAddress = (PLONG)NULL;
960   BadByte = (PCHAR)NULL;
961   BadByte += 1;
962   BlackHole = &Counter;
963 
964   //
965   // Simply try statement with a finally clause that is entered sequentially.
966   //
967 
968   printf("    test1...");
969   Counter = 0;
970   try {
971     Counter += 1;
972   }
973   finally {
974     if (abnormal_termination() == FALSE) {
975       Counter += 1;
976     }
977   }
978 
979   if (Counter != 2) {
980     printf("failed, count = %d\n", Counter);
981 
982   } else {
983     printf("succeeded\n");
984   }
985 
986   //
987   // Simple try statement with an exception clause that is never executed
988   // because there is no exception raised in the try clause.
989   //
990 
991   printf("    test2...");
992   Counter = 0;
993   try {
994     Counter += 1;
995   }
996   except(Counter) { Counter += 1; }
997 
998   if (Counter != 1) {
999     printf("failed, count = %d\n", Counter);
1000 
1001   } else {
1002     printf("succeeded\n");
1003   }
1004 
1005   //
1006   // Simple try statement with an exception handler that is never executed
1007   // because the exception expression continues execution.
1008   //
1009 
1010   printf("    test3...");
1011   Counter = 0;
1012   try {
1013     Counter -= 1;
1014     RtlRaiseException(&ExceptionRecord);
1015   }
1016   except(Counter) { Counter -= 1; }
1017 
1018   if (Counter != -1) {
1019     printf("failed, count = %d\n", Counter);
1020 
1021   } else {
1022     printf("succeeded\n");
1023   }
1024 
1025   //
1026   // Simple try statement with an exception clause that is always executed.
1027   //
1028 
1029   printf("    test4...");
1030   Counter = 0;
1031   try {
1032     Counter += 1;
1033     RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
1034   }
1035   except(Counter) { Counter += 1; }
1036 
1037   if (Counter != 2) {
1038     printf("failed, count = %d\n", Counter);
1039 
1040   } else {
1041     printf("succeeded\n");
1042   }
1043 
1044   //
1045   // Simple try statement with an exception clause that is always executed.
1046   //
1047 
1048   printf("    test5...");
1049   Counter = 0;
1050   try {
1051     Counter += 1;
1052     *BlackHole += *BadAddress;
1053   }
1054   except(Counter) { Counter += 1; }
1055 
1056   if (Counter != 2) {
1057     printf("failed, count = %d\n", Counter);
1058 
1059   } else {
1060     printf("succeeded\n");
1061   }
1062 
1063   //
1064   // Simply try statement with a finally clause that is entered as the
1065   // result of an exception.
1066   //
1067 
1068   printf("    test6...");
1069   Counter = 0;
1070   try {
1071     try {
1072       Counter += 1;
1073       RtlRaiseException(&ExceptionRecord);
1074     }
1075     finally {
1076       if (abnormal_termination() != FALSE) {
1077         Counter += 1;
1078       }
1079     }
1080   }
1081   except(Counter) {
1082     if (Counter == 2) {
1083       Counter += 1;
1084     }
1085   }
1086 
1087   if (Counter != 3) {
1088     printf("failed, count = %d\n", Counter);
1089 
1090   } else {
1091     printf("succeeded\n");
1092   }
1093 
1094   //
1095   // Simply try statement with a finally clause that is entered as the
1096   // result of an exception.
1097   //
1098 
1099   printf("    test7...");
1100   Counter = 0;
1101   try {
1102     try {
1103       Counter += 1;
1104       *BlackHole += *BadAddress;
1105     }
1106     finally {
1107       if (abnormal_termination() != FALSE) {
1108         Counter += 1;
1109       }
1110     }
1111   }
1112   except(Counter) {
1113     if (Counter == 2) {
1114       Counter += 1;
1115     }
1116   }
1117 
1118   if (Counter != 3) {
1119     printf("failed, count = %d\n", Counter);
1120 
1121   } else {
1122     printf("succeeded\n");
1123   }
1124 
1125   //
1126   // Simple try that calls a function which raises an exception.
1127   //
1128 
1129   printf("    test8...");
1130   Counter = 0;
1131   try {
1132     Counter += 1;
1133     foo1(STATUS_ACCESS_VIOLATION);
1134   }
1135   except((GetExceptionCode() == STATUS_ACCESS_VIOLATION)
1136              ? EXCEPTION_EXECUTE_HANDLER
1137              : EXCEPTION_CONTINUE_SEARCH) {
1138     Counter += 1;
1139   }
1140 
1141   if (Counter != 2) {
1142     printf("failed, count = %d\n", Counter);
1143 
1144   } else {
1145     printf("succeeded\n");
1146   }
1147 
1148   //
1149   // Simple try that calls a function which raises an exception.
1150   //
1151 
1152   printf("    test9...");
1153   Counter = 0;
1154   try {
1155     Counter += 1;
1156     foo2(BlackHole, BadAddress);
1157   }
1158   except((GetExceptionCode() == STATUS_ACCESS_VIOLATION)
1159              ? EXCEPTION_EXECUTE_HANDLER
1160              : EXCEPTION_CONTINUE_SEARCH) {
1161     Counter += 1;
1162   }
1163 
1164   if (Counter != 2) {
1165     printf("failed, count = %d\n", Counter);
1166 
1167   } else {
1168     printf("succeeded\n");
1169   }
1170 
1171   //
1172   // Simple try that calls a function which calls a function that
1173   // raises an exception. The first function has a finally clause
1174   // that must be executed for this test to work.
1175   //
1176 
1177   printf("    test10...");
1178   Counter = 0;
1179   try {
1180     bar1(STATUS_ACCESS_VIOLATION, &Counter);
1181   }
1182   except((GetExceptionCode() == STATUS_ACCESS_VIOLATION)
1183              ? EXCEPTION_EXECUTE_HANDLER
1184              : EXCEPTION_CONTINUE_SEARCH) {
1185     Counter -= 1;
1186   }
1187 
1188   if (Counter != 98) {
1189     printf("failed, count = %d\n", Counter);
1190 
1191   } else {
1192     printf("succeeded\n");
1193   }
1194 
1195   //
1196   // Simple try that calls a function which calls a function that
1197   // raises an exception. The first function has a finally clause
1198   // that must be executed for this test to work.
1199   //
1200 
1201   printf("    test11...");
1202   Counter = 0;
1203   try {
1204     bar2(BlackHole, BadAddress, &Counter);
1205   }
1206   except((GetExceptionCode() == STATUS_ACCESS_VIOLATION)
1207              ? EXCEPTION_EXECUTE_HANDLER
1208              : EXCEPTION_CONTINUE_SEARCH) {
1209     Counter -= 1;
1210   }
1211 
1212   if (Counter != 98) {
1213     printf("failed, count = %d\n", Counter);
1214 
1215   } else {
1216     printf("succeeded\n");
1217   }
1218 
1219   //
1220   // A try within an except
1221   //
1222 
1223   printf("    test12...");
1224   Counter = 0;
1225   try {
1226     foo1(STATUS_ACCESS_VIOLATION);
1227   }
1228   except((GetExceptionCode() == STATUS_ACCESS_VIOLATION)
1229              ? EXCEPTION_EXECUTE_HANDLER
1230              : EXCEPTION_CONTINUE_SEARCH) {
1231     Counter += 1;
1232     try {
1233       foo1(STATUS_SUCCESS);
1234     }
1235     except((GetExceptionCode() == STATUS_SUCCESS) ? EXCEPTION_EXECUTE_HANDLER
1236                                                   : EXCEPTION_CONTINUE_SEARCH) {
1237       if (Counter != 1) {
1238         printf("failed, count = %d\n", Counter);
1239 
1240       } else {
1241         printf("succeeded...");
1242       }
1243 
1244       Counter += 1;
1245     }
1246   }
1247 
1248   if (Counter != 2) {
1249     printf("failed, count = %d\n", Counter);
1250 
1251   } else {
1252     printf("succeeded\n");
1253   }
1254 
1255   //
1256   // A try within an except
1257   //
1258 
1259   printf("    test13...");
1260   Counter = 0;
1261   try {
1262     foo2(BlackHole, BadAddress);
1263   }
1264   except((GetExceptionCode() == STATUS_ACCESS_VIOLATION)
1265              ? EXCEPTION_EXECUTE_HANDLER
1266              : EXCEPTION_CONTINUE_SEARCH) {
1267     Counter += 1;
1268     try {
1269       foo1(STATUS_SUCCESS);
1270     }
1271     except((GetExceptionCode() == STATUS_SUCCESS) ? EXCEPTION_EXECUTE_HANDLER
1272                                                   : EXCEPTION_CONTINUE_SEARCH) {
1273       if (Counter != 1) {
1274         printf("failed, count = %d\n", Counter);
1275 
1276       } else {
1277         printf("succeeded...");
1278       }
1279 
1280       Counter += 1;
1281     }
1282   }
1283 
1284   if (Counter != 2) {
1285     printf("failed, count = %d\n", Counter);
1286 
1287   } else {
1288     printf("succeeded\n");
1289   }
1290 
1291 #if !defined(WIN_CE) // gotos from except/finally not allowed on WinCE
1292   //
1293   // A goto from an exception clause that needs to pass
1294   // through a finally
1295   //
1296 
1297   printf("    test14...");
1298   Counter = 0;
1299   try {
1300     try {
1301       foo1(STATUS_ACCESS_VIOLATION);
1302     }
1303     except((GetExceptionCode() == STATUS_ACCESS_VIOLATION)
1304                ? EXCEPTION_EXECUTE_HANDLER
1305                : EXCEPTION_CONTINUE_SEARCH) {
1306       Counter += 1;
1307       goto t9;
1308     }
1309   }
1310   finally { Counter += 1; }
1311 
1312 t9:
1313   ;
1314   if (Counter != 2) {
1315     printf("failed, count = %d\n", Counter);
1316 
1317   } else {
1318     printf("succeeded\n");
1319   }
1320 
1321   //
1322   // A goto from an finally clause that needs to pass
1323   // through a finally
1324   //
1325 
1326   printf("    test15...");
1327   Counter = 0;
1328   try {
1329     try {
1330       Counter += 1;
1331     }
1332     finally {
1333       Counter += 1;
1334       goto t10;
1335     }
1336   }
1337   finally { Counter += 1; }
1338 
1339 t10:
1340   ;
1341   if (Counter != 3) {
1342     printf("failed, count = %d\n", Counter);
1343 
1344   } else {
1345     printf("succeeded\n");
1346   }
1347 
1348   //
1349   // A goto from an exception clause that needs to pass
1350   // through a finally into the outer finally clause.
1351   //
1352 
1353   printf("    test16...");
1354   Counter = 0;
1355   try {
1356     try {
1357       try {
1358         Counter += 1;
1359         foo1(STATUS_INTEGER_OVERFLOW);
1360       }
1361       except(EXCEPTION_EXECUTE_HANDLER) {
1362         Counter += 1;
1363         goto t11;
1364       }
1365     }
1366     finally { Counter += 1; }
1367   t11:
1368     ;
1369   }
1370   finally { Counter += 1; }
1371 
1372   if (Counter != 4) {
1373     printf("failed, count = %d\n", Counter);
1374 
1375   } else {
1376     printf("succeeded\n");
1377   }
1378 
1379   //
1380   // A goto from an finally clause that needs to pass
1381   // through a finally into the outer finally clause.
1382   //
1383 
1384   printf("    test17...");
1385   Counter = 0;
1386   try {
1387     try {
1388       Counter += 1;
1389     }
1390     finally {
1391       Counter += 1;
1392       goto t12;
1393     }
1394   t12:
1395     ;
1396   }
1397   finally { Counter += 1; }
1398 
1399   if (Counter != 3) {
1400     printf("failed, count = %d\n", Counter);
1401 
1402   } else {
1403     printf("succeeded\n");
1404   }
1405 
1406   //
1407   // A return from an except clause
1408   //
1409 
1410   printf("    test18...");
1411   Counter = 0;
1412   try {
1413     Counter += 1;
1414     eret(STATUS_ACCESS_VIOLATION, &Counter);
1415   }
1416   finally { Counter += 1; }
1417 
1418   if (Counter != 4) {
1419     printf("failed, count = %d\n", Counter);
1420 
1421   } else {
1422     printf("succeeded\n");
1423   }
1424 
1425   //
1426   // A return from a finally clause
1427   //
1428 
1429   printf("    test19...");
1430   Counter = 0;
1431   try {
1432     Counter += 1;
1433     fret(&Counter);
1434   }
1435   finally { Counter += 1; }
1436 
1437   if (Counter != 5) {
1438     printf("failed, count = %d\n", Counter);
1439 
1440   } else {
1441     printf("succeeded\n");
1442   }
1443 #endif
1444 
1445   //
1446   // A simple set jump followed by a long jump.
1447   //
1448 
1449   printf("    test20...");
1450   Counter = 0;
1451   if (setjmp(JumpBuffer) == 0) {
1452     Counter += 1;
1453     longjmp(JumpBuffer, 1);
1454 
1455   } else {
1456     Counter += 1;
1457   }
1458 
1459   if (Counter != 2) {
1460     printf("failed, count = %d\n", Counter);
1461 
1462   } else {
1463     printf("succeeded\n");
1464   }
1465 
1466   //
1467   // A set jump followed by a long jump out of a finally clause that is
1468   // sequentially executed.
1469   //
1470 
1471   printf("    test21...");
1472   Counter = 0;
1473   if (setjmp(JumpBuffer) == 0) {
1474     try {
1475       Counter += 1;
1476     }
1477     finally {
1478       Counter += 1;
1479       longjmp(JumpBuffer, 1);
1480     }
1481 
1482   } else {
1483     Counter += 1;
1484   }
1485 
1486   if (Counter != 3) {
1487     printf("failed, count = %d\n", Counter);
1488 
1489   } else {
1490     printf("succeeded\n");
1491   }
1492 
1493   //
1494   // A set jump within a try clause followed by a long jump out of a
1495   // finally clause that is sequentially executed.
1496   //
1497 
1498   printf("    test22...");
1499   Counter = 0;
1500   try {
1501     if (setjmp(JumpBuffer) == 0) {
1502       Counter += 1;
1503 
1504     } else {
1505       Counter += 1;
1506     }
1507   }
1508   finally {
1509     Counter += 1;
1510     if (Counter == 2) {
1511       Counter += 1;
1512       longjmp(JumpBuffer, 1);
1513     }
1514   }
1515 
1516   if (Counter != 5) {
1517     printf("failed, count = %d\n", Counter);
1518 
1519   } else {
1520     printf("succeeded\n");
1521   }
1522 
1523   //
1524   // A set jump followed by a try/except, followed by a try/finally where
1525   // the try body of the try/finally raises an exception that is handled
1526   // by the try/excecpt which causes the try/finally to do a long jump out
1527   // of a finally clause. This will create a collided unwind.
1528   //
1529 
1530   printf("    test23...");
1531   Counter = 0;
1532   if (setjmp(JumpBuffer) == 0) {
1533     try {
1534       try {
1535         Counter += 1;
1536         RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
1537       }
1538       finally {
1539         Counter += 1;
1540         longjmp(JumpBuffer, 1);
1541       }
1542     }
1543     except(EXCEPTION_EXECUTE_HANDLER) { Counter += 1; }
1544 
1545   } else {
1546     Counter += 1;
1547   }
1548 
1549   if (Counter != 3) {
1550     printf("failed, count = %d\n", Counter);
1551 
1552   } else {
1553     printf("succeeded\n");
1554   }
1555 
1556   //
1557   // A set jump followed by a try/except, followed by a several nested
1558   // try/finally's where the inner try body of the try/finally raises an
1559   // exception that is handled by the try/except which causes the
1560   // try/finally to do a long jump out of a finally clause. This will
1561   // create a collided unwind.
1562   //
1563 
1564   printf("    test24...");
1565   Counter = 0;
1566   if (setjmp(JumpBuffer) == 0) {
1567     try {
1568       try {
1569         try {
1570           try {
1571             Counter += 1;
1572             RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
1573           }
1574           finally { Counter += 1; }
1575         }
1576         finally {
1577           Counter += 1;
1578           longjmp(JumpBuffer, 1);
1579         }
1580       }
1581       finally { Counter += 1; }
1582     }
1583     except(EXCEPTION_EXECUTE_HANDLER) { Counter += 1; }
1584 
1585   } else {
1586     Counter += 1;
1587   }
1588 
1589   if (Counter != 5) {
1590     printf("failed, count = %d\n", Counter);
1591 
1592   } else {
1593     printf("succeeded\n");
1594   }
1595 
1596   //
1597   // A set jump followed by a try/except, followed by a try/finally which
1598   // calls a subroutine which contains a try finally that raises an
1599   // exception that is handled to the try/except.
1600   //
1601 
1602   printf("    test25...");
1603   Counter = 0;
1604   if (setjmp(JumpBuffer) == 0) {
1605     try {
1606       try {
1607         try {
1608           Counter += 1;
1609           dojump(JumpBuffer, &Counter);
1610         }
1611         finally { Counter += 1; }
1612       }
1613       finally { Counter += 1; }
1614     }
1615     except(EXCEPTION_EXECUTE_HANDLER) { Counter += 1; }
1616 
1617   } else {
1618     Counter += 1;
1619   }
1620 
1621   if (Counter != 7) {
1622     printf("failed, count = %d\n", Counter);
1623 
1624   } else {
1625     printf("succeeded\n");
1626   }
1627 
1628   //
1629   // A set jump followed by a try/except, followed by a try/finally which
1630   // calls a subroutine which contains a try finally that raises an
1631   // exception that is handled to the try/except.
1632   //
1633 
1634   printf("    test26...");
1635   Counter = 0;
1636   if (setjmp(JumpBuffer) == 0) {
1637     try {
1638       try {
1639         try {
1640           try {
1641             Counter += 1;
1642             dojump(JumpBuffer, &Counter);
1643           }
1644           finally { Counter += 1; }
1645         }
1646         finally {
1647           Counter += 1;
1648           longjmp(JumpBuffer, 1);
1649         }
1650       }
1651       finally { Counter += 1; }
1652     }
1653     except(EXCEPTION_EXECUTE_HANDLER) { Counter += 1; }
1654 
1655   } else {
1656     Counter += 1;
1657   }
1658 
1659   if (Counter != 8) {
1660     printf("failed, count = %d\n", Counter);
1661 
1662   } else {
1663     printf("succeeded\n");
1664   }
1665 
1666   //
1667   // Test nested exceptions.
1668   //
1669 
1670   printf("    test27...");
1671   Counter = 0;
1672   try {
1673     try {
1674       Counter += 1;
1675       except1(&Counter);
1676     }
1677     except(except2(GetExceptionInformation(), &Counter)) { Counter += 2; }
1678   }
1679   except(EXCEPTION_EXECUTE_HANDLER) { Counter += 3; }
1680 
1681   if (Counter != 55) {
1682     printf("failed, count = %d\n", Counter);
1683 
1684   } else {
1685     printf("succeeded\n");
1686   }
1687 
1688   //
1689   // Simple try that causes an integer overflow exception.
1690   //
1691 
1692   printf("    test28...");
1693   Counter = 0;
1694   try {
1695     Counter += 1;
1696     addtwo(0x7fff0000, 0x10000, &Counter);
1697   }
1698   except((GetExceptionCode() == STATUS_INTEGER_OVERFLOW)
1699              ? EXCEPTION_EXECUTE_HANDLER
1700              : EXCEPTION_CONTINUE_SEARCH) {
1701     Counter += 1;
1702   }
1703 
1704   if (Counter != 2) {
1705     printf("failed, count = %d\n", Counter);
1706 
1707   } else {
1708     printf("succeeded\n");
1709   }
1710 
1711 //
1712 // Simple try that raises an misaligned data exception.
1713 //
1714 #if !defined(i386) && !defined(_M_IA64) && !defined(_M_AMD64) &&               \
1715     !defined(_M_ARM) && !defined(_M_ARM64)
1716   printf("    test29...");
1717   Counter = 0;
1718   try {
1719     Counter += 1;
1720     foo2(BlackHole, (PLONG)BadByte);
1721   }
1722   except((GetExceptionCode() == STATUS_DATATYPE_MISALIGNMENT)
1723              ? EXCEPTION_EXECUTE_HANDLER
1724              : EXCEPTION_CONTINUE_SEARCH) {
1725     Counter += 1;
1726   }
1727 
1728   if (Counter != 2) {
1729     printf("failed, count = %d\n", Counter);
1730 
1731   } else {
1732     printf("succeeded\n");
1733   }
1734 
1735 #endif
1736   //
1737   // Continue from a try body with an exception clause in a loop.
1738   //
1739 
1740   printf("    test30...");
1741   Counter = 0;
1742   for (Index1 = 0; Index1 < 10; Index1 += 1) {
1743     try {
1744       if ((Index1 & 0x1) == 0) {
1745         continue;
1746 
1747       } else {
1748         Counter += 1;
1749       }
1750     }
1751     except(EXCEPTION_EXECUTE_HANDLER) { Counter += 40; }
1752 
1753     Counter += 2;
1754   }
1755 
1756   if (Counter != 15) {
1757     printf("failed, count = %d\n", Counter);
1758 
1759   } else {
1760     printf("succeeded\n");
1761   }
1762 
1763 #if !defined(WIN_CE) // gotos from try/finally not allowed on WinCE
1764   //
1765   // Continue from a try body with an finally clause in a loop.
1766   //
1767 
1768   printf("    test31...");
1769   Counter = 0;
1770   for (Index1 = 0; Index1 < 10; Index1 += 1) {
1771     try {
1772       if ((Index1 & 0x1) == 0) {
1773         continue;
1774 
1775       } else {
1776         Counter += 1;
1777       }
1778     }
1779     finally { Counter += 2; }
1780 
1781     Counter += 3;
1782   }
1783 
1784   if (Counter != 40) {
1785     printf("failed, count = %d\n", Counter);
1786 
1787   } else {
1788     printf("succeeded\n");
1789   }
1790 #endif
1791 
1792   //
1793   // Continue from doubly nested try body with an exception clause in a
1794   // loop.
1795   //
1796 
1797   printf("    test32...");
1798   Counter = 0;
1799   for (Index1 = 0; Index1 < 10; Index1 += 1) {
1800     try {
1801       try {
1802         if ((Index1 & 0x1) == 0) {
1803           continue;
1804 
1805         } else {
1806           Counter += 1;
1807         }
1808       }
1809       except(EXCEPTION_EXECUTE_HANDLER) { Counter += 10; }
1810 
1811       Counter += 2;
1812     }
1813     except(EXCEPTION_EXECUTE_HANDLER) { Counter += 20; }
1814 
1815     Counter += 3;
1816   }
1817 
1818   if (Counter != 30) {
1819     printf("failed, count = %d\n", Counter);
1820 
1821   } else {
1822     printf("succeeded\n");
1823   }
1824 
1825 #if !defined(WIN_CE) // gotos from try/finally not allowed on WinCE
1826   //
1827   // Continue from doubly nested try body with an finally clause in a loop.
1828   //
1829 
1830   printf("    test33...");
1831   Counter = 0;
1832   for (Index1 = 0; Index1 < 10; Index1 += 1) {
1833     try {
1834       try {
1835         if ((Index1 & 0x1) == 0) {
1836           continue;
1837 
1838         } else {
1839           Counter += 1;
1840         }
1841       }
1842       finally { Counter += 2; }
1843 
1844       Counter += 3;
1845     }
1846     finally { Counter += 4; }
1847 
1848     Counter += 5;
1849   }
1850 
1851   if (Counter != 105) {
1852     printf("failed, count = %d\n", Counter);
1853 
1854   } else {
1855     printf("succeeded\n");
1856   }
1857 
1858   //
1859   // Continue from a finally clause in a loop.
1860   //
1861 
1862   printf("    test34...");
1863   Counter = 0;
1864   for (Index1 = 0; Index1 < 10; Index1 += 1) {
1865     try {
1866       if ((Index1 & 0x1) == 0) {
1867         Counter += 1;
1868       }
1869     }
1870     finally {
1871       Counter += 2;
1872       continue;
1873     }
1874 
1875     Counter += 4;
1876   }
1877 
1878   if (Counter != 25) {
1879     printf("failed, count = %d\n", Counter);
1880 
1881   } else {
1882     printf("succeeded\n");
1883   }
1884 
1885   //
1886   // Continue from a doubly nested finally clause in a loop.
1887   //
1888 
1889   printf("    test35...");
1890   Counter = 0;
1891   for (Index1 = 0; Index1 < 10; Index1 += 1) {
1892     try {
1893       try {
1894         if ((Index1 & 0x1) == 0) {
1895           Counter += 1;
1896         }
1897       }
1898       finally {
1899         Counter += 2;
1900         continue;
1901       }
1902 
1903       Counter += 4;
1904     }
1905     finally { Counter += 5; }
1906 
1907     Counter += 6;
1908   }
1909 
1910   if (Counter != 75) {
1911     printf("failed, count = %d\n", Counter);
1912 
1913   } else {
1914     printf("succeeded\n");
1915   }
1916 
1917   //
1918   // Continue from a doubly nested finally clause in a loop.
1919   //
1920 
1921   printf("    test36...");
1922   Counter = 0;
1923   for (Index1 = 0; Index1 < 10; Index1 += 1) {
1924     try {
1925       try {
1926         if ((Index1 & 0x1) == 0) {
1927           Counter += 1;
1928         }
1929       }
1930       finally { Counter += 2; }
1931 
1932       Counter += 4;
1933     }
1934     finally {
1935       Counter += 5;
1936       continue;
1937     }
1938 
1939     Counter += 6;
1940   }
1941 
1942   if (Counter != 115) {
1943     printf("failed, count = %d\n", Counter);
1944 
1945   } else {
1946     printf("succeeded\n");
1947   }
1948 #endif
1949 
1950   //
1951   // Break from a try body with an exception clause in a loop.
1952   //
1953 
1954   printf("    test37...");
1955   Counter = 0;
1956   for (Index1 = 0; Index1 < 10; Index1 += 1) {
1957     try {
1958       if ((Index1 & 0x1) == 1) {
1959         break;
1960 
1961       } else {
1962         Counter += 1;
1963       }
1964     }
1965     except(EXCEPTION_EXECUTE_HANDLER) { Counter += 40; }
1966 
1967     Counter += 2;
1968   }
1969 
1970   if (Counter != 3) {
1971     printf("failed, count = %d\n", Counter);
1972 
1973   } else {
1974     printf("succeeded\n");
1975   }
1976 
1977 #if !defined(WIN_CE) // gotos from try/finally not allowed on WinCE
1978   //
1979   // Break from a try body with an finally clause in a loop.
1980   //
1981 
1982   printf("    test38...");
1983   Counter = 0;
1984   for (Index1 = 0; Index1 < 10; Index1 += 1) {
1985     try {
1986       if ((Index1 & 0x1) == 1) {
1987         break;
1988 
1989       } else {
1990         Counter += 1;
1991       }
1992     }
1993     finally { Counter += 2; }
1994 
1995     Counter += 3;
1996   }
1997 
1998   if (Counter != 8) {
1999     printf("failed, count = %d\n", Counter);
2000 
2001   } else {
2002     printf("succeeded\n");
2003   }
2004 #endif
2005 
2006   //
2007   // Break from doubly nested try body with an exception clause in a
2008   // loop.
2009   //
2010 
2011   printf("    test39...");
2012   Counter = 0;
2013   for (Index1 = 0; Index1 < 10; Index1 += 1) {
2014     try {
2015       try {
2016         if ((Index1 & 0x1) == 1) {
2017           break;
2018 
2019         } else {
2020           Counter += 1;
2021         }
2022       }
2023       except(EXCEPTION_EXECUTE_HANDLER) { Counter += 10; }
2024 
2025       Counter += 2;
2026     }
2027     except(EXCEPTION_EXECUTE_HANDLER) { Counter += 20; }
2028 
2029     Counter += 3;
2030   }
2031 
2032   if (Counter != 6) {
2033     printf("failed, count = %d\n", Counter);
2034 
2035   } else {
2036     printf("succeeded\n");
2037   }
2038 
2039 #if !defined(WIN_CE) // gotos from try/finally not allowed on WinCE
2040   //
2041   // Break from doubly nested try body with an finally clause in a loop.
2042   //
2043 
2044   printf("    test40...");
2045   Counter = 0;
2046   for (Index1 = 0; Index1 < 10; Index1 += 1) {
2047     try {
2048       try {
2049         if ((Index1 & 0x1) == 1) {
2050           break;
2051 
2052         } else {
2053           Counter += 1;
2054         }
2055       }
2056       finally { Counter += 2; }
2057 
2058       Counter += 3;
2059     }
2060     finally { Counter += 4; }
2061 
2062     Counter += 5;
2063   }
2064 
2065   if (Counter != 21) {
2066     printf("failed, count = %d\n", Counter);
2067 
2068   } else {
2069     printf("succeeded\n");
2070   }
2071 
2072   //
2073   // Break from a finally clause in a loop.
2074   //
2075 
2076   printf("    test41...");
2077   Counter = 0;
2078   for (Index1 = 0; Index1 < 10; Index1 += 1) {
2079     try {
2080       if ((Index1 & 0x1) == 1) {
2081         Counter += 1;
2082       }
2083     }
2084     finally {
2085       Counter += 2;
2086       break;
2087     }
2088 
2089     Counter += 4;
2090   }
2091 
2092   if (Counter != 2) {
2093     printf("failed, count = %d\n", Counter);
2094 
2095   } else {
2096     printf("succeeded\n");
2097   }
2098 
2099   //
2100   // Break from a doubly nested finally clause in a loop.
2101   //
2102 
2103   printf("    test42...");
2104   Counter = 0;
2105   for (Index1 = 0; Index1 < 10; Index1 += 1) {
2106     try {
2107       try {
2108         if ((Index1 & 0x1) == 1) {
2109           Counter += 1;
2110         }
2111       }
2112       finally {
2113         Counter += 2;
2114         break;
2115       }
2116 
2117       Counter += 4;
2118     }
2119     finally { Counter += 5; }
2120 
2121     Counter += 6;
2122   }
2123 
2124   if (Counter != 7) {
2125     printf("failed, count = %d\n", Counter);
2126 
2127   } else {
2128     printf("succeeded\n");
2129   }
2130 
2131   //
2132   // Break from a doubly nested finally clause in a loop.
2133   //
2134 
2135   printf("    test43...");
2136   Counter = 0;
2137   for (Index1 = 0; Index1 < 10; Index1 += 1) {
2138     try {
2139       try {
2140         if ((Index1 & 0x1) == 1) {
2141           Counter += 1;
2142         }
2143       }
2144       finally { Counter += 2; }
2145 
2146       Counter += 4;
2147     }
2148     finally {
2149       Counter += 5;
2150       break;
2151     }
2152 
2153     Counter += 6;
2154   }
2155 
2156   if (Counter != 11) {
2157     printf("failed, count = %d\n", Counter);
2158 
2159   } else {
2160     printf("succeeded\n");
2161   }
2162 #endif
2163 
2164   //
2165   // Break from a try body with an exception clause in a switch.
2166   //
2167 
2168   printf("    test44...");
2169   Counter = 0;
2170   Index1 = 1;
2171   switch (Index2) {
2172   case BLUE:
2173     Counter += 100;
2174     break;
2175 
2176   case RED:
2177     try {
2178       if ((Index1 & 0x1) == 1) {
2179         break;
2180 
2181       } else {
2182         Counter += 1;
2183       }
2184     }
2185     except(EXCEPTION_EXECUTE_HANDLER) { Counter += 40; }
2186 
2187     Counter += 2;
2188     break;
2189   }
2190 
2191   if (Counter != 0) {
2192     printf("failed, count = %d\n", Counter);
2193 
2194   } else {
2195     printf("succeeded\n");
2196   }
2197 
2198 #if !defined(WIN_CE) // gotos from try/finally not allowed on WinCE
2199   //
2200   // Break from a try body with an finally clause in a switch.
2201   //
2202 
2203   printf("    test45...");
2204   Counter = 0;
2205   Index1 = 1;
2206   switch (Index2) {
2207   case BLUE:
2208     Counter += 100;
2209     break;
2210 
2211   case RED:
2212     try {
2213       if ((Index1 & 0x1) == 1) {
2214         break;
2215 
2216       } else {
2217         Counter += 1;
2218       }
2219     }
2220     finally { Counter += 2; }
2221 
2222     Counter += 3;
2223   }
2224 
2225   if (Counter != 2) {
2226     printf("failed, count = %d\n", Counter);
2227 
2228   } else {
2229     printf("succeeded\n");
2230   }
2231 #endif
2232 
2233   //
2234   // Break from doubly nested try body with an exception clause in a
2235   // switch.
2236   //
2237 
2238   printf("    test46...");
2239   Counter = 0;
2240   Index1 = 1;
2241   switch (Index2) {
2242   case BLUE:
2243     Counter += 100;
2244     break;
2245 
2246   case RED:
2247     try {
2248       try {
2249         if ((Index1 & 0x1) == 1) {
2250           break;
2251 
2252         } else {
2253           Counter += 1;
2254         }
2255       }
2256       except(EXCEPTION_EXECUTE_HANDLER) { Counter += 10; }
2257 
2258       Counter += 2;
2259     }
2260     except(EXCEPTION_EXECUTE_HANDLER) { Counter += 20; }
2261 
2262     Counter += 3;
2263   }
2264 
2265   if (Counter != 0) {
2266     printf("failed, count = %d\n", Counter);
2267 
2268   } else {
2269     printf("succeeded\n");
2270   }
2271 
2272 #if !defined(WIN_CE) // gotos from try/finally not allowed on WinCE
2273   //
2274   // Break from doubly nested try body with an finally clause in a switch.
2275   //
2276 
2277   printf("    test47...");
2278   Counter = 0;
2279   Index1 = 1;
2280   switch (Index2) {
2281   case BLUE:
2282     Counter += 100;
2283     break;
2284 
2285   case RED:
2286     try {
2287       try {
2288         if ((Index1 & 0x1) == 1) {
2289           break;
2290 
2291         } else {
2292           Counter += 1;
2293         }
2294       }
2295       finally { Counter += 2; }
2296 
2297       Counter += 3;
2298     }
2299     finally { Counter += 4; }
2300 
2301     Counter += 5;
2302   }
2303 
2304   if (Counter != 6) {
2305     printf("failed, count = %d\n", Counter);
2306 
2307   } else {
2308     printf("succeeded\n");
2309   }
2310 
2311   //
2312   // Break from a finally clause in a switch.
2313   //
2314 
2315   printf("    test48...");
2316   Counter = 0;
2317   Index1 = 1;
2318   switch (Index2) {
2319   case BLUE:
2320     Counter += 100;
2321     break;
2322 
2323   case RED:
2324     try {
2325       if ((Index1 & 0x1) == 1) {
2326         Counter += 1;
2327       }
2328     }
2329     finally {
2330       Counter += 2;
2331       break;
2332     }
2333 
2334     Counter += 4;
2335   }
2336 
2337   if (Counter != 3) {
2338     printf("failed, count = %d\n", Counter);
2339 
2340   } else {
2341     printf("succeeded\n");
2342   }
2343 
2344   //
2345   // Break from a doubly nested finally clause in a switch.
2346   //
2347 
2348   printf("    test49...");
2349   Counter = 0;
2350   Index1 = 1;
2351   switch (Index2) {
2352   case BLUE:
2353     Counter += 100;
2354     break;
2355 
2356   case RED:
2357     try {
2358       try {
2359         if ((Index1 & 0x1) == 1) {
2360           Counter += 1;
2361         }
2362       }
2363       finally {
2364         Counter += 2;
2365         break;
2366       }
2367 
2368       Counter += 4;
2369     }
2370     finally { Counter += 5; }
2371 
2372     Counter += 6;
2373   }
2374 
2375   if (Counter != 8) {
2376     printf("failed, count = %d\n", Counter);
2377 
2378   } else {
2379     printf("succeeded\n");
2380   }
2381 
2382   //
2383   // Break from a doubly nested finally clause in a switch.
2384   //
2385 
2386   printf("    test50...");
2387   Counter = 0;
2388   Index1 = 1;
2389   switch (Index2) {
2390   case BLUE:
2391     Counter += 100;
2392     break;
2393 
2394   case RED:
2395     try {
2396       try {
2397         if ((Index1 & 0x1) == 1) {
2398           Counter += 1;
2399         }
2400       }
2401       finally { Counter += 2; }
2402 
2403       Counter += 4;
2404     }
2405     finally {
2406       Counter += 5;
2407       break;
2408     }
2409 
2410     Counter += 6;
2411   }
2412 
2413   if (Counter != 12) {
2414     printf("failed, count = %d\n", Counter);
2415 
2416   } else {
2417     printf("succeeded\n");
2418   }
2419 #endif
2420 
2421   //
2422   // Leave from an if in a simple try/finally.
2423   //
2424 
2425   printf("    test51...");
2426   Counter = 0;
2427   try {
2428     if (Echo(Counter) == Counter) {
2429       Counter += 3;
2430       leave;
2431 
2432     } else {
2433       Counter += 100;
2434     }
2435   }
2436   finally {
2437     if (abnormal_termination() == FALSE) {
2438       Counter += 5;
2439     }
2440   }
2441 
2442   if (Counter != 8) {
2443     printf("failed, count = %d\n", Counter);
2444 
2445   } else {
2446     printf("succeeded\n");
2447   }
2448 
2449   //
2450   // Leave from a loop in a simple try/finally.
2451   //
2452 
2453   printf("    test52...");
2454   Counter = 0;
2455   try {
2456     for (Index1 = 0; Index1 < 10; Index1 += 1) {
2457       if (Echo(Index1) == Index1) {
2458         Counter += 3;
2459         leave;
2460       }
2461 
2462       Counter += 100;
2463     }
2464   }
2465   finally {
2466     if (abnormal_termination() == FALSE) {
2467       Counter += 5;
2468     }
2469   }
2470 
2471   if (Counter != 8) {
2472     printf("failed, count = %d\n", Counter);
2473 
2474   } else {
2475     printf("succeeded\n");
2476   }
2477 
2478   //
2479   // Leave from a switch in a simple try/finally.
2480   //
2481 
2482   printf("    test53...");
2483   Counter = 0;
2484   try {
2485     switch (Index2) {
2486     case BLUE:
2487       break;
2488 
2489     case RED:
2490       Counter += 3;
2491       leave;
2492     }
2493 
2494     Counter += 100;
2495   }
2496   finally {
2497     if (abnormal_termination() == FALSE) {
2498       Counter += 5;
2499     }
2500   }
2501 
2502   if (Counter != 8) {
2503     printf("failed, count = %d\n", Counter);
2504 
2505   } else {
2506     printf("succeeded\n");
2507   }
2508 
2509   //
2510   // Leave from an if in doubly nested try/finally followed by a leave
2511   // from an if in the outer try/finally.
2512   //
2513 
2514   printf("    test54...");
2515   Counter = 0;
2516   try {
2517     try {
2518       if (Echo(Counter) == Counter) {
2519         Counter += 3;
2520         leave;
2521 
2522       } else {
2523         Counter += 100;
2524       }
2525     }
2526     finally {
2527       if (abnormal_termination() == FALSE) {
2528         Counter += 5;
2529       }
2530     }
2531 
2532     if (Echo(Counter) == Counter) {
2533       Counter += 3;
2534       leave;
2535 
2536     } else {
2537       Counter += 100;
2538     }
2539   }
2540   finally {
2541     if (abnormal_termination() == FALSE) {
2542       Counter += 5;
2543     }
2544   }
2545 
2546   if (Counter != 16) {
2547     printf("failed, count = %d\n", Counter);
2548 
2549   } else {
2550     printf("succeeded\n");
2551   }
2552 
2553 #if !defined(WIN_CE) // leave from finally not allowed on WinCE
2554   //
2555   // Leave from an if in doubly nested try/finally followed by a leave
2556   // from the finally of the outer try/finally.
2557   //
2558 
2559   printf("    test55...");
2560   Counter = 0;
2561   try {
2562     try {
2563       if (Echo(Counter) == Counter) {
2564         Counter += 3;
2565         leave;
2566 
2567       } else {
2568         Counter += 100;
2569       }
2570     }
2571     finally {
2572       if (abnormal_termination() == FALSE) {
2573         Counter += 5;
2574         leave;
2575       }
2576     }
2577 
2578     Counter += 100;
2579   }
2580   finally {
2581     if (abnormal_termination() == FALSE) {
2582       Counter += 5;
2583     }
2584   }
2585 
2586   if (Counter != 13) {
2587     printf("failed, count = %d\n", Counter);
2588 
2589   } else {
2590     printf("succeeded\n");
2591   }
2592 #endif
2593 
2594   //
2595   // Try/finally within the except clause of a try/except that is always
2596   // executed.
2597   //
2598 
2599   printf("    test56...");
2600   Counter = 0;
2601   try {
2602     Counter += 1;
2603     RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
2604   }
2605   except(Counter) {
2606     try {
2607       Counter += 3;
2608     }
2609     finally {
2610       if (abnormal_termination() == FALSE) {
2611         Counter += 5;
2612       }
2613     }
2614   }
2615 
2616   if (Counter != 9) {
2617     printf("failed, count = %d\n", Counter);
2618 
2619   } else {
2620     printf("succeeded\n");
2621   }
2622 
2623   //
2624   // Try/finally within the finally clause of a try/finally.
2625   //
2626 
2627   printf("    test57...");
2628   Counter = 0;
2629   try {
2630     Counter += 1;
2631   }
2632   finally {
2633     if (abnormal_termination() == FALSE) {
2634       try {
2635         Counter += 3;
2636       }
2637       finally {
2638         if (abnormal_termination() == FALSE) {
2639           Counter += 5;
2640         }
2641       }
2642     }
2643   }
2644 
2645   if (Counter != 9) {
2646     printf("failed, count = %d\n", Counter);
2647 
2648   } else {
2649     printf("succeeded\n");
2650   }
2651 
2652   //
2653   // Try/except within the finally clause of a try/finally.
2654   //
2655 
2656   printf("    test58...");
2657 #if !defined(NEST_IN_FINALLY)
2658   printf("skipped\n");
2659 #else
2660   Counter = 0;
2661   try {
2662     Counter -= 1;
2663   }
2664   finally {
2665     try {
2666       Counter += 2;
2667       RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
2668     }
2669     except(Counter) {
2670       try {
2671         Counter += 3;
2672       }
2673       finally {
2674         if (abnormal_termination() == FALSE) {
2675           Counter += 5;
2676         }
2677       }
2678     }
2679   }
2680 
2681   if (Counter != 9) {
2682     printf("failed, count = %d\n", Counter);
2683 
2684   } else {
2685     printf("succeeded\n");
2686   }
2687 #endif /* def(NEST_IN_FINALLY) */
2688 
2689   //
2690   // Try/except within the except clause of a try/except that is always
2691   // executed.
2692   //
2693 
2694   printf("    test59...");
2695   Counter = 0;
2696   try {
2697     Counter += 1;
2698     RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
2699   }
2700   except(Counter) {
2701     try {
2702       Counter += 3;
2703       RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
2704     }
2705     except(Counter - 3) { Counter += 5; }
2706   }
2707 
2708   if (Counter != 9) {
2709     printf("failed, count = %d\n", Counter);
2710 
2711   } else {
2712     printf("succeeded\n");
2713   }
2714 
2715   //
2716   // Try with a Try which exits the scope with a goto
2717   //
2718 
2719   printf("    test60...");
2720   Counter = 0;
2721   try {
2722     try {
2723       goto outside;
2724     }
2725     except(1) { Counter += 1; }
2726 
2727   outside:
2728     RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
2729   }
2730   except(1) { Counter += 3; }
2731 
2732   if (Counter != 3) {
2733     printf("failed, count = %d\n", Counter);
2734   } else {
2735     printf("succeeded\n");
2736   }
2737 
2738   //
2739   // Try/except which gets an exception from a subfunction within
2740   // a try/finally which has a try/except in the finally clause
2741   //
2742 
2743   printf("    test61...");
2744 #if !defined(NEST_IN_FINALLY)
2745   printf("skipped\n");
2746 #else
2747   Counter = 0;
2748   try {
2749     Test61Part2(&Counter);
2750   }
2751   except(EXCEPTION_EXECUTE_HANDLER) { Counter += 11; }
2752 
2753   if (Counter != 24) {
2754     printf("failed, count = %d\n", Counter);
2755 
2756   } else {
2757     printf("succeeded\n");
2758   }
2759 #endif /* def(NEST_IN_FINALLY) */
2760 
2761   //
2762   // Check for precision of exception on floating point
2763   //
2764 
2765   printf("    test62...");
2766 
2767 #if defined(i386) || defined(_M_IA64) || defined(_M_ALPHA) || defined(_M_AMD64)
2768 
2769 /* enable floating point overflow */
2770 #if defined(i386)
2771   _control87(_control87(0, 0) & ~EM_OVERFLOW, _MCW_EM);
2772 #else
2773   //
2774   // use portable version of _control87
2775   //
2776   _controlfp(_controlfp(0, 0) & ~EM_OVERFLOW, _MCW_EM);
2777 #endif
2778 
2779   Counter = 0;
2780   try {
2781     doubleresult = SquareDouble(1.7e300);
2782 
2783     try {
2784       doubleresult = SquareDouble(1.0);
2785     }
2786     except(1) { Counter += 3; }
2787   }
2788   except(1) { Counter += 1; }
2789 
2790   if (Counter != 1) {
2791     printf("failed, count = %d\n", Counter);
2792 
2793   } else {
2794     printf("succeeded\n");
2795   }
2796 
2797 /* clear up pending unmasked exceptions and restore FP control registers */
2798 #if defined(i386)
2799   _clear87();
2800   _control87(_control87(0, 0) | EM_OVERFLOW, 0xfffff);
2801 #else
2802   _clearfp();
2803   _controlfp(_controlfp(0, 0) | EM_OVERFLOW, 0xfffff);
2804 #endif
2805 
2806 #else
2807   printf("skipped\n");
2808 #endif
2809 
2810   //
2811   // A try/finally inside a try/except where an exception is raised in the
2812   // try/finally.
2813   //
2814 
2815   printf("    test63...");
2816   Counter = 0;
2817   try {
2818     try {
2819       Counter += 1;
2820     }
2821     finally {
2822       Counter += 3;
2823       RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
2824     }
2825   }
2826   except(1) { Counter += 6; }
2827 
2828   if (Counter != 10) {
2829     printf("failed, count = %d\n", Counter);
2830 
2831   } else {
2832     printf("succeeded\n");
2833   }
2834 
2835   //
2836   // A try/finally inside a try/except where an exception is raised in the
2837   // in the try/except and the try/finally.
2838   //
2839 
2840   printf("    test64...");
2841   Counter = 0;
2842   try {
2843     try {
2844       Counter += 1;
2845       RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
2846     }
2847     finally {
2848       Counter += 3;
2849       RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
2850     }
2851   }
2852   except(1) { Counter += 6; }
2853 
2854   if (Counter != 10) {
2855     printf("failed, count = %d\n", Counter);
2856 
2857   } else {
2858     printf("succeeded\n");
2859   }
2860 
2861   //
2862   // A try/finally inside a try/except where an exception is raised in the
2863   // try/finally.
2864   //
2865 
2866   printf("    test65...");
2867   Counter = 0;
2868   try {
2869     try {
2870       Counter += 1;
2871     }
2872     finally {
2873       Counter += 3;
2874       *BlackHole += *BadAddress;
2875       Counter += 13;
2876     }
2877   }
2878   except(1) { Counter += 6; }
2879 
2880   if (Counter != 10) {
2881     printf("failed, count = %d\n", Counter);
2882 
2883   } else {
2884     printf("succeeded\n");
2885   }
2886 
2887   //
2888   // A try/finally inside a try/except where an exception is raised in the
2889   // in the try/except and the try/finally.
2890   //
2891 
2892   printf("    test66...");
2893   Counter = 0;
2894   try {
2895     try {
2896       Counter += 1;
2897       *BlackHole += *BadAddress;
2898       Counter += 13;
2899     }
2900     finally {
2901       Counter += 3;
2902       *BlackHole += *BadAddress;
2903       Counter += 13;
2904     }
2905   }
2906   except(1) { Counter += 6; }
2907 
2908   if (Counter != 10) {
2909     printf("failed, count = %d\n", Counter);
2910 
2911   } else {
2912     printf("succeeded\n");
2913   }
2914 
2915   //
2916   // A try/finally inside a try/finally inside a try/except where an
2917   // exception is raised in the in the try/except and in try/finally.
2918   //
2919 
2920   printf("    test67...");
2921   try {
2922     try {
2923       *BlackHole += *BadAddress;
2924     }
2925     finally {
2926       try {
2927         Counter = 0;
2928       }
2929       finally {
2930         if (Counter != 0) {
2931           Counter += 1;
2932         }
2933       }
2934 
2935       Counter += 1;
2936       *BlackHole += *BadAddress;
2937     }
2938   }
2939   except(1) { Counter += 1; }
2940 
2941   if (Counter != 2) {
2942     printf("failed, count = %d\n", Counter);
2943 
2944   } else {
2945     printf("succeeded\n");
2946   }
2947 
2948   //
2949   // A try/finally inside a try/finally inside a try/except where an
2950   // exception is raised in the in the try/except and in try/finally.
2951   //
2952 
2953   printf("    test68...");
2954   try {
2955     try {
2956       RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
2957     }
2958     finally {
2959       try {
2960         Counter = 0;
2961       }
2962       finally {
2963         if (Counter != 0) {
2964           Counter += 1;
2965         }
2966       }
2967 
2968       Counter += 1;
2969       RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
2970     }
2971   }
2972   except(1) { Counter += 1; }
2973 
2974   if (Counter != 2) {
2975     printf("failed, count = %d\n", Counter);
2976 
2977   } else {
2978     printf("succeeded\n");
2979   }
2980 
2981 //
2982 // Patch guard test 69.
2983 //
2984 
2985 #if defined(_AMD64_) || defined(_X86_)
2986 
2987   printf("    test69...");
2988   Counter = 0;
2989   try {
2990     PgTest69(&Counter, BadAddress);
2991   }
2992   except(EXCEPTION_EXECUTE_HANDLER) { printf("unexpected exception..."); }
2993 
2994   if (Counter != 2) {
2995     printf("failed, count = %d\n", Counter);
2996 
2997   } else {
2998     printf("succeeded\n");
2999   }
3000 
3001   printf("    test70...");
3002   Counter = 0;
3003   try {
3004     PgTest70(&Counter, BadAddress);
3005   }
3006   except(EXCEPTION_EXECUTE_HANDLER) { printf("unexpected exception..."); }
3007 
3008   if (Counter != 2) {
3009     printf("failed, count = %d\n", Counter);
3010 
3011   } else {
3012     printf("succeeded\n");
3013   }
3014 
3015   printf("    test71...");
3016   Counter = 0;
3017   try {
3018     PgTest71(&Counter, BadAddress);
3019   }
3020   except(EXCEPTION_EXECUTE_HANDLER) { printf("unexpected exception..."); }
3021 
3022   if (Counter != 9) {
3023     printf("failed, count = %d\n", Counter);
3024 
3025   } else {
3026     printf("succeeded\n");
3027   }
3028 
3029   printf("    test72...");
3030   Counter = 0;
3031   try {
3032     PgTest72(&Counter, BadAddress);
3033   }
3034   except(EXCEPTION_EXECUTE_HANDLER) { printf("unexpected exception..."); }
3035 
3036   if (Counter != 12) {
3037     printf("failed, count = %d\n", Counter);
3038 
3039   } else {
3040     printf("succeeded\n");
3041   }
3042 
3043   printf("    test73...");
3044   Counter = 0;
3045   try {
3046     PgTest73(&Counter, BadAddress);
3047   }
3048   except(EXCEPTION_EXECUTE_HANDLER) { printf("unexpected exception..."); }
3049 
3050   if (Counter != 15) {
3051     printf("failed, count = %d\n", Counter);
3052 
3053   } else {
3054     printf("succeeded\n");
3055   }
3056 
3057   printf("    test74...");
3058   Counter = 0;
3059   try {
3060     PgTest74(&Counter, BadAddress);
3061   }
3062   except(EXCEPTION_EXECUTE_HANDLER) { printf("unexpected exception..."); }
3063 
3064   if (Counter != 18) {
3065     printf("failed, count = %d\n", Counter);
3066 
3067   } else {
3068     printf("succeeded\n");
3069   }
3070 
3071   printf("    test75...");
3072   Counter = 0;
3073   try {
3074     PgTest75(&Counter, BadAddress);
3075   }
3076   except(EXCEPTION_EXECUTE_HANDLER) { printf("unexpected exception..."); }
3077 
3078   if (Counter != 35) {
3079     printf("failed, count = %d\n", Counter);
3080 
3081   } else {
3082     printf("succeeded\n");
3083   }
3084 
3085   printf("    test76...");
3086   Counter = 0;
3087   try {
3088     PgTest76(&Counter, BadAddress);
3089   }
3090   except(EXCEPTION_EXECUTE_HANDLER) { printf("unexpected exception..."); }
3091 
3092   if (Counter != 40) {
3093     printf("failed, count = %d\n", Counter);
3094 
3095   } else {
3096     printf("succeeded\n");
3097   }
3098 
3099   printf("    test77...");
3100   Counter = 0;
3101   try {
3102     PgTest77(&Counter, BadAddress);
3103   }
3104   except(EXCEPTION_EXECUTE_HANDLER) { printf("unexpected exception..."); }
3105 
3106   if (Counter != 45) {
3107     printf("failed, count = %d\n", Counter);
3108 
3109   } else {
3110     printf("succeeded\n");
3111   }
3112 
3113   printf("    test78...");
3114   Counter = 0;
3115   try {
3116     PgTest78(&Counter, BadAddress);
3117   }
3118   except(EXCEPTION_EXECUTE_HANDLER) { printf("unexpected exception..."); }
3119 
3120   if (Counter != 50) {
3121     printf("failed, count = %d\n", Counter);
3122 
3123   } else {
3124     printf("succeeded\n");
3125   }
3126 
3127 #else
3128   printf("    test69...filter entered...succeeded\n");
3129   printf("    test70...filter entered...succeeded\n");
3130   printf("    test71...filter entered...succeeded\n");
3131   printf("    test72...filter entered...succeeded\n");
3132   printf("    test73...filter entered...succeeded\n");
3133   printf("    test74...filter entered...succeeded\n");
3134   printf("    test75...filter entered...succeeded\n");
3135   printf("    test76...filter entered...succeeded\n");
3136   printf("    test77...filter entered...succeeded\n");
3137   printf("    test78...filter entered...succeeded\n");
3138 #endif
3139 
3140   if (LOBYTE(LOWORD(GetVersion())) < 6) {
3141     printf("    test79...");
3142     printf("filter 1...filter 2...finally 1...filter 1...filter 2...finally "
3143            "2...passed\n");
3144   } else {
3145 
3146     printf("    test79...");
3147     Counter = 0;
3148     try {
3149       Test79(&Counter, BadAddress);
3150     }
3151     except(printf("filter 2..."), EXCEPTION_EXECUTE_HANDLER) { Counter += 1; }
3152 
3153     if (Counter == 3) {
3154       printf("passed\n");
3155 
3156     } else {
3157       printf("failed  %d \n", Counter);
3158     }
3159   }
3160 
3161   printf("    test80...");
3162   if (Test80() != 0) {
3163     printf("failed\n");
3164 
3165   } else {
3166     printf("passed\n");
3167   }
3168 
3169   printf("    test81...");
3170   Counter = 0;
3171   Test81(&Counter);
3172   if (Counter != 1) {
3173     printf("failed  %d \n", Counter);
3174 
3175   } else {
3176     printf("passed\n");
3177   }
3178 
3179   printf("    test82...");
3180   Counter = 1;
3181   Test82(&Counter);
3182   if (Counter != 0) {
3183     printf("failed\n");
3184 
3185   } else {
3186     printf("succeeded\n");
3187   }
3188 
3189   printf("    test83...");
3190   if (Test83() != 0) {
3191     printf("failed\n");
3192 
3193   } else {
3194     printf("succeeded\n");
3195   }
3196 
3197   printf("    test84...");
3198   Counter = 0;
3199   Test84(&Counter);
3200   if (Counter != 2) {
3201     printf("failed\n");
3202 
3203   } else {
3204     printf("succeeded\n");
3205   }
3206 
3207   printf("    test85...");
3208   Counter = 0;
3209   Test85(&Counter);
3210   if (Counter != 7) {
3211     printf("failed\n");
3212 
3213   } else {
3214     printf("succeeded\n");
3215   }
3216 
3217   printf("    test86...");
3218   Counter = 0;
3219   Test86(&Counter);
3220   if (Counter != 4) {
3221     printf("failed %d\n", Counter);
3222 
3223   } else {
3224     printf("succeeded\n");
3225   }
3226 
3227   printf("    test87...");
3228   Counter = 0;
3229   Test87(&Counter);
3230   if (Counter != 104) {
3231     printf("failed %d\n", Counter);
3232 
3233   } else {
3234     printf("succeeded\n");
3235   }
3236 
3237   printf("    test88...");
3238   Counter = 0;
3239   Test88(&Counter);
3240   if (Counter != 6) {
3241     printf("failed %d\n", Counter);
3242 
3243   } else {
3244     printf("succeeded\n");
3245   }
3246 
3247   //
3248   // Announce end of exception test.
3249   //
3250 
3251   printf("End of exception test\n");
3252   return;
3253 }
3254 
3255 #pragma optimize("a", off)
3256 VOID addtwo(long First, long Second, long *Place)
3257 
3258 {
3259 
3260   RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
3261   *Place = First + Second;
3262   return;
3263 }
3264 #pragma optimize("", on)
3265 
3266 VOID bar1(IN NTSTATUS Status, IN PLONG Counter) {
3267 
3268   try {
3269     foo1(Status);
3270   }
3271   finally {
3272     if (abnormal_termination() != FALSE) {
3273       *Counter = 99;
3274 
3275     } else {
3276       *Counter = 100;
3277     }
3278   }
3279 
3280   return;
3281 }
3282 
3283 VOID bar2(IN PLONG BlackHole, IN PLONG BadAddress, IN PLONG Counter) {
3284 
3285   try {
3286     foo2(BlackHole, BadAddress);
3287   }
3288   finally {
3289     if (abnormal_termination() != FALSE) {
3290       *Counter = 99;
3291 
3292     } else {
3293       *Counter = 100;
3294     }
3295   }
3296 
3297   return;
3298 }
3299 
3300 VOID dojump(IN jmp_buf JumpBuffer, IN PLONG Counter)
3301 
3302 {
3303 
3304   try {
3305     try {
3306       *Counter += 1;
3307       RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
3308     }
3309     finally { *Counter += 1; }
3310   }
3311   finally {
3312     *Counter += 1;
3313     longjmp(JumpBuffer, 1);
3314   }
3315 }
3316 
3317 #if !defined(WIN_CE) // return through finally not allowed on WinCE
3318 VOID eret(IN NTSTATUS Status, IN PLONG Counter)
3319 
3320 {
3321 
3322   try {
3323     try {
3324       foo1(Status);
3325     }
3326     except((GetExceptionCode() == Status) ? EXCEPTION_EXECUTE_HANDLER
3327                                           : EXCEPTION_CONTINUE_SEARCH) {
3328       *Counter += 1;
3329       return;
3330     }
3331   }
3332   finally { *Counter += 1; }
3333 
3334   return;
3335 }
3336 #endif
3337 
3338 VOID except1(IN PLONG Counter)
3339 
3340 {
3341 
3342   try {
3343     *Counter += 5;
3344     RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
3345   }
3346   except(except3(GetExceptionInformation(), Counter)) { *Counter += 7; }
3347 
3348   *Counter += 9;
3349   return;
3350 }
3351 
3352 ULONG
3353 except2(IN PEXCEPTION_POINTERS ExceptionPointers, IN PLONG Counter)
3354 
3355 {
3356 
3357   PEXCEPTION_RECORD ExceptionRecord;
3358 
3359   ExceptionRecord = ExceptionPointers->ExceptionRecord;
3360   if ((ExceptionRecord->ExceptionCode == STATUS_UNSUCCESSFUL) &&
3361       ((ExceptionRecord->ExceptionFlags & EXCEPTION_NESTED_CALL) == 0)) {
3362     *Counter += 11;
3363     return EXCEPTION_EXECUTE_HANDLER;
3364 
3365   } else {
3366     *Counter += 13;
3367     return EXCEPTION_CONTINUE_SEARCH;
3368   }
3369 }
3370 
3371 ULONG
3372 except3(IN PEXCEPTION_POINTERS ExceptionPointers, IN PLONG Counter)
3373 
3374 {
3375 
3376   PEXCEPTION_RECORD ExceptionRecord;
3377 
3378   ExceptionRecord = ExceptionPointers->ExceptionRecord;
3379   if ((ExceptionRecord->ExceptionCode == STATUS_INTEGER_OVERFLOW) &&
3380       ((ExceptionRecord->ExceptionFlags & EXCEPTION_NESTED_CALL) == 0)) {
3381     *Counter += 17;
3382     RtlRaiseStatus(STATUS_UNSUCCESSFUL);
3383 
3384   } else if ((ExceptionRecord->ExceptionCode == STATUS_UNSUCCESSFUL) &&
3385              ((ExceptionRecord->ExceptionFlags & EXCEPTION_NESTED_CALL) != 0)) {
3386     *Counter += 19;
3387     return EXCEPTION_CONTINUE_SEARCH;
3388   }
3389 
3390   *Counter += 23;
3391   return EXCEPTION_EXECUTE_HANDLER;
3392 }
3393 
3394 VOID foo1(IN NTSTATUS Status)
3395 
3396 {
3397 
3398   //
3399   // Raise exception.
3400   //
3401 
3402   RtlRaiseStatus(Status);
3403   return;
3404 }
3405 
3406 VOID foo2(IN PLONG BlackHole, IN PLONG BadAddress)
3407 
3408 {
3409 
3410   //
3411   // Raise exception.
3412   //
3413 
3414   *BlackHole += *BadAddress;
3415   return;
3416 }
3417 
3418 #if !defined(WIN_CE) // return from finally not allowed on WinCE
3419 VOID fret(IN PLONG Counter)
3420 
3421 {
3422 
3423   try {
3424     try {
3425       *Counter += 1;
3426     }
3427     finally {
3428       *Counter += 1;
3429       return;
3430     }
3431   }
3432   finally { *Counter += 1; }
3433 
3434   return;
3435 }
3436 #endif
3437 
3438 LONG Echo(IN LONG Value)
3439 
3440 {
3441   return Value;
3442 }
3443 
3444 #if defined(NEST_IN_FINALLY)
3445 VOID Test61Part2(IN OUT PULONG Counter) {
3446   try {
3447     *Counter -= 1;
3448     RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
3449   }
3450   finally {
3451     try {
3452       *Counter += 2;
3453       RtlRaiseStatus(STATUS_INTEGER_OVERFLOW);
3454     }
3455     except(EXCEPTION_EXECUTE_HANDLER) { *Counter += 5; }
3456     *Counter += 7;
3457   }
3458 }
3459 #endif /* def(NEST_IN_FINALLY) */
3460 
3461 double SquareDouble(IN double op) {
3462   return exp(2.0 * log(op));
3463 }
3464