github.com/comwrg/go/src@v0.0.0-20220319063731-c238d0440370/runtime/testdata/testwinlib/main.c (about)

     1  #include <stdio.h>
     2  #include <windows.h>
     3  #include "testwinlib.h"
     4  
     5  int exceptionCount;
     6  int continueCount;
     7  LONG WINAPI customExceptionHandlder(struct _EXCEPTION_POINTERS *ExceptionInfo)
     8  {
     9      if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT)
    10      {
    11          exceptionCount++;
    12          // prepare context to resume execution
    13          CONTEXT *c = ExceptionInfo->ContextRecord;
    14          c->Rip = *(ULONG_PTR *)c->Rsp;
    15          c->Rsp += 8;
    16          return EXCEPTION_CONTINUE_EXECUTION;
    17      }
    18      return EXCEPTION_CONTINUE_SEARCH;
    19  }
    20  LONG WINAPI customContinueHandlder(struct _EXCEPTION_POINTERS *ExceptionInfo)
    21  {
    22      if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT)
    23      {
    24          continueCount++;
    25          return EXCEPTION_CONTINUE_EXECUTION;
    26      }
    27      return EXCEPTION_CONTINUE_SEARCH;
    28  }
    29  
    30  void throwFromC()
    31  {
    32      DebugBreak();
    33  }
    34  int main()
    35  {
    36      // simulate a "lazily" attached debugger, by calling some go code before attaching the exception/continue handler
    37      Dummy();
    38      exceptionCount = 0;
    39      continueCount = 0;
    40      void *exceptionHandlerHandle = AddVectoredExceptionHandler(0, customExceptionHandlder);
    41      if (NULL == exceptionHandlerHandle)
    42      {
    43          printf("cannot add vectored exception handler\n");
    44          return 2;
    45      }
    46      void *continueHandlerHandle = AddVectoredContinueHandler(0, customContinueHandlder);
    47      if (NULL == continueHandlerHandle)
    48      {
    49          printf("cannot add vectored continue handler\n");
    50          return 2;
    51      }
    52      CallMeBack(throwFromC);
    53      RemoveVectoredContinueHandler(continueHandlerHandle);
    54      RemoveVectoredExceptionHandler(exceptionHandlerHandle);
    55      printf("exceptionCount: %d\ncontinueCount: %d\n", exceptionCount, continueCount);
    56      return 0;
    57  }