Changeset 21626 for trunk/src


Ignore:
Timestamp:
Apr 15, 2011, 9:37:36 PM (14 years ago)
Author:
dmik
Message:

kernel32: To complete the Win32 exception chain unwind support, make sure it is unwound when the thread terminates itself with ExitThread/ExitProcess etc. before removing its exception handlers from stack.

Location:
trunk/src/kernel32
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/initkernel32.cpp

    r21583 r21626  
    7373}
    7474
     75// borrowed from ntddk.h
     76extern "C"
     77void WIN32API RtlUnwind(
     78        LPVOID,
     79        LPVOID,
     80        LPVOID,DWORD);
     81
    7582extern PFN pfnImSetMsgQueueProperty;
    7683
     
    275282    dprintf(("kernel32 exit %d\n", ulReason));
    276283
     284    TEB *teb = GetThreadTEB();
     285
     286    if (teb)
     287    {
     288        // make sure the Win32 exception stack (if there is still any) is unwound
     289        // before we destroy internal structures including the Win32 TEB
     290        RtlUnwind(NULL, 0, 0, 0);
     291    }
     292
    277293    if( IsDBCSEnv() && imHandle )
    278294        DosFreeModule( imHandle );
     
    288304    OSLibLVMExit();
    289305
    290     TEB *teb = GetThreadTEB();
    291306    if(teb) DestroyTEB(teb);
    292307    DestroySharedHeap();
  • trunk/src/kernel32/thread.cpp

    r21529 r21626  
    5252#define MQP_INSTANCE_PERMQ              0x00000001 // from os2im.h
    5353
     54// borrowed from ntddk.h
     55extern "C"
     56void WINAPI RtlUnwind(
     57        PEXCEPTION_FRAME,
     58        LPVOID,
     59        PEXCEPTION_RECORD,DWORD);
     60
    5461//******************************************************************************
    5562//******************************************************************************
     
    547554
    548555    dprintf(("ExitThread %x (%x)", GetCurrentThread(), exitcode));
     556
     557    // make sure the Win32 exception stack (if there is still any) is unwound
     558    // before we destroy internal structures including the Win32 TIB
     559    RtlUnwind(NULL, 0, 0, 0);
    549560
    550561    teb = GetThreadTEB();
     
    729740    CONTROL87(0x27F, 0xFFF);
    730741    rc = AsmCallThreadHandler(fAlignStack, threadCallback, userdata);
     742
     743    // make sure the Win32 exception stack (if there is still any) is unwound
     744    // before we destroy internal structures including the Win32 TIB
     745    RtlUnwind(NULL, 0, 0, 0);
    731746
    732747    if(fExitProcess) {
  • trunk/src/kernel32/wprocess.cpp

    r21619 r21626  
    550550    dprintf(("KERNEL32:  ExitProcess %d (time %x)", exitcode, GetCurrentTime()));
    551551    dprintf(("KERNEL32:  ExitProcess FS = %x\n", GetFS()));
     552
     553    // make sure the Win32 exception stack (if there is still any) is unwound
     554    // before we destroy internal structures including the Win32 TIB
     555    RtlUnwind(NULL, 0, 0, 0);
    552556
    553557    fExitProcess = TRUE;
Note: See TracChangeset for help on using the changeset viewer.