home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l430 / 1.ddi / CHAP5.ZIP / BREAK.C < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-11  |  2.2 KB  |  77 lines

  1. /*
  2.     BREAK.C -- Tests a Windows Ctrl-Brk handler
  3.  
  4.     From Chapter 5 of "Undocumented Windows" (Addison-Wesley 1992)
  5.     by Andrew Schulman, Dave Maxey and Matt Pietrek
  6.  
  7.     Build using: WINIOBC BREAK (for Borland C++ v3.00)
  8.                  WINIOMS BREAK (for Microsoft C/SDK)
  9. */
  10.  
  11. #include <windows.h>
  12. #include "winio.h"
  13.  
  14. WORD (FAR PASCAL *SetSigHandler)(FARPROC newSignalHandler,
  15.     DWORD FAR * lpOldSignalHandlerAddress, WORD FAR *lpOldSignalType,
  16.     WORD signalType, WORD mustBeOne);
  17.  
  18. void (FAR PASCAL *DoSignal)(void);
  19.  
  20. int volatile do_abort = 0;
  21.  
  22. WORD FAR PASCAL _export ctrl_break_handler(WORD a, WORD b)
  23. {
  24.     MessageBeep(0); // seems ok to call, though most APIs aren't
  25.     return do_abort++;
  26. }
  27.  
  28. main(int argc, char *argv[])
  29. {
  30.     FARPROC ctrl_break;
  31.     DWORD dwOldProc;
  32.     WORD wOldType;
  33.     int do_dosignal = (argc < 2) ;
  34.     HANDLE hKernel = GetModuleHandle("KERNEL");
  35.     
  36.     winio_about("BREAK"
  37.         "\nTests a Windows Ctrl-Brk handler"
  38.         "\n\nFrom Chapter 5 of"
  39.         "\n\"Undocumented Windows\" (Addison-Wesley, 1992)"
  40.         "\nby Andrew Schulman, David Maxey and Matt Pietrek"
  41.         );
  42.     
  43.     if (do_dosignal)
  44.         if (! (DoSignal = GetProcAddress(hKernel, "DOSIGNAL")))
  45.             fail("Can't find DoSignal");
  46.     if (! (SetSigHandler = GetProcAddress(hKernel, "SETSIGHANDLER")))
  47.         fail("Can't find SetSigHandler");
  48.     ctrl_break = MakeProcInstance((FARPROC) ctrl_break_handler, __hInst);
  49.     SetSigHandler((FARPROC) ctrl_break, 
  50.         &dwOldProc, &wOldType, 2, 1);   // install handler
  51.     for (;;)
  52.     {
  53.         if (do_dosignal)
  54.         {
  55.             puts("This is a test of DoSignal!");
  56.             DoSignal();
  57.         }
  58.         else
  59.             puts("Hit Ctrl-Break!");
  60.         
  61.         if (do_abort)   // signal handler was called
  62.         {
  63.             if (MessageBox(NULL, "Ctrl-Break Pressed", 
  64.                 "Test of SetSigHandler", 
  65.                 MB_ABORTRETRYIGNORE) == IDABORT)
  66.                 break;          // abort
  67.             else
  68.                 do_abort = 0;   // retry, ignore
  69.         }
  70.     }
  71.  
  72.     FreeProcInstance(ctrl_break);
  73.     puts("Program aborted");
  74.     return 0;
  75. }
  76.  
  77.