showseh.c

来自「Windows 95 系統程式設計大奧秘书籍源码」· C语言 代码 · 共 106 行

C
106
字号
//==================================
// SHOWSEH - Matt Pietrek 1995
// FILE: SHOWSEH.C
//==================================
#include <windows.h>
#include <stdio.h>
#pragma hdrstop
#include "tib.h"

void _except_handler3(void);

void DisplaySEHChain(void)
{
    PTIB ptib;
    PSEH_record psehrec;
    
    __asm {
            mov     ax, fs
            mov     es, ax
            mov     eax, 18h
            mov     ebx, es:[eax]
            mov     [ptib], ebx
    }
    
    psehrec = ptib->pvExcept;

    printf("next rec  handler\n"
           "========  ========\n" );

    while ( psehrec != (PSEH_record)0xFFFFFFFF )
    {
        printf("%08X  %08X\n", psehrec->pNext, psehrec->pfnHandler);
        psehrec = psehrec->pNext;
    }

    printf("\n");
}

void c(void)
{
    DWORD   _esp;
    
    __asm   mov     [_esp], esp
    __try
    {
        DisplaySEHChain();
    }
    __except( 1 )
    {
    }
    
    printf("in    c(), ESP = %08X\n", _esp);
}

void b(void)
{
    DWORD   _esp;
    
    __asm   mov     [_esp], esp

    __try
    {
        c();
    }
    __except( 1 )
    {
    }

    printf("in    b(), ESP = %08X\n", _esp);
}

void a(void)
{
    DWORD   _esp;
    
    __asm   mov     [_esp], esp

    __try
    {
        b();
    }
    __except( 1 )
    {
    }
    printf("in    a(), ESP = %08X\n", _esp);
}

int main()
{
    DWORD   _esp;
    
    printf("offset of __except_handler3: %08X\n\n", _except_handler3);

    __asm   mov     [_esp], esp
    
    __try
    {
        a();
        printf("in main(), ESP = %08X\n", _esp);
    }
    __except( 1 )
    {
    }
    
    return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?