Jump to content

DosQueryThreadContext: Difference between revisions

From EDM2
Ak120 (talk | contribs)
mNo edit summary
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
==Description==
Query context of a suspended thread.
Query context of a suspended thread.


==Syntax==
==Syntax==
<PRE>
DosQueryThreadContext(tid, level, pcxt)
#define INCL_DOSEXCEPTIONS
#include <os2.h>
 
TID              tid;    /*  Thread identity. */
ULONG            level;  /*  Level of information desired. */
PCONTEXTRECORD    pcxt;  /*  Thread context record. */
APIRET            ulrc;  /*  Return Code. */


ulrc = DosQueryThreadContext(tid, level, pcxt);
</PRE>
==Parameters==
==Parameters==
; tid (TID) - input : Thread identity.  
;tid (TID) - input: Thread identity.
;level (ULONG) - input: Level of information desired:
::CONTEXT_CONTROL (0x00000001) Control registers: SS:ESP, CS:EIP, EFLAGS and EBP
::CONTEXT_INTEGER (0x00000002) EAX, EBX, ECX, EDX, ESI and EDI
::CONTEXT_SEGMENTS (0x00000004) Segment registers: DS, ES, FS, and GS
::CONTEXT_FLOATING_POINT (0x00000008) Numeric coprocessor state
::CONTEXT_FULL All of the above
;pcxt (PCONTEXTRECORD) - in/out: Thread context record.


; level (ULONG) - input : Level of information desired:
    CONTEXT_CONTROL (0x00000001)
        Control registers: SS:ESP, CS:EIP, EFLAGS and EBP
    CONTEXT_INTEGER (0x00000002)
        EAX, EBX, ECX, EDX, ESI and EDI
    CONTEXT_SEGMENTS (0x00000004)
        Segment registers: DS, ES, FS, and GS
    CONTEXT_FLOATING_POINT (0x00000008)
        Numeric coprocessor state
    CONTEXT_FULL
        All of the above
; pcxt (PCONTEXTRECORD) - in/out  :  Thread context record.
==Return Code==
==Return Code==
ulrc (APIRET) - returns
;ulrc (APIRET) - returns:DosQueryThreadContext returns one of the following values:
 
* 0 NO_ERROR
DosQueryThreadContext returns one of the following values:
* 87 ERROR_INVALID_PARAMETER
 
* 90 ERROR_NOT_FROZEN
* 0         NO_ERROR  
*115 ERROR_PROTECTION_VIOLATION
* 87       ERROR_INVALID_PARAMETER  
*309 ERROR_INVALID_THREADID
* 90       ERROR_NOT_FROZEN  
* 115       ERROR_PROTECTION_VIOLATION  
* 309       ERROR_INVALID_THREADID


==Remarks==
==Remarks==
DosQueryThreadContext returns the context record of a suspended thread. A thread may be suspended by using DosSuspendThread or DosEnterCritSec. If DosSuspendThread is used, the caller must allow some time for OS/2 to suspend the thread before querying its context.
DosQueryThreadContext returns the context record of a suspended thread. A thread may be suspended by using DosSuspendThread or DosEnterCritSec. If DosSuspendThread is used, the caller must allow some time for OS/2 to suspend the thread before querying its context.


Note: Values from the thread context should be used only when the state of the target thread is known.  
Note: Values from the thread context should be used only when the state of the target thread is known.


==Example Code==
==Example Code==
Line 69: Line 44:
     PFNTHREAD  pfnCntThread = &CntThreadProc; /* Address of Thread program */
     PFNTHREAD  pfnCntThread = &CntThreadProc; /* Address of Thread program */
     ULONG      ulLoopMax    = 500000;    /* Parameter to thread routine  */
     ULONG      ulLoopMax    = 500000;    /* Parameter to thread routine  */
     APIRET    rc          = NO_ERROR; /* Return code                 */
     APIRET    rc          = NO_ERROR;   /* Return code                   */


                       /* Thread Context Record */
                       /* Thread Context Record */
Line 77: Line 52:
                                 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
                                 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};


     rc = DosCreateThread(&tidCntThread, /* Thread ID (return by function) */
     rc = DosCreateThread(&tidCntThread, /* Thread ID (return by function) */
                         pfnCntThread,  /* Address of thread program      */
                         pfnCntThread,  /* Address of thread program      */
                         ulLoopMax,      /* Parameter passed to ThreadProc */
                         ulLoopMax,      /* Parameter passed to ThreadProc */
                         CREATE_READY | /* Thread is ready when created */
                         CREATE_READY | /* Thread is ready when created   */
                         STACK_SPARSE, /* Do not pre_commit stack pages */
                         STACK_SPARSE,   /* Do not pre_commit stack pages */
                         8192L);        /* Stack size, rounded to page bdy*/
                         8192L);        /* Stack size, rounded to page bdy*/
     if (rc != NO_ERROR) {
     if (rc != NO_ERROR) {
Line 197: Line 172:
</PRE>
</PRE>
==Related Functions==
==Related Functions==
* [[OS2 API:CPI:DosCreateThread|DosCreateThread]]
*[[DosCreateThread]]
* [[OS2 API:CPI:DosEnterCritSec|DosEnterCritSec]]
*[[DosEnterCritSec]]
* [[OS2 API:CPI:DosResumeThread|DosResumeThread]]
*[[DosResumeThread]]
* [[OS2 API:CPI:DosSuspendThread|DosSuspendThread]]
*[[DosSuspendThread]]
 


[[Category:The OS/2 API Project]]
[[Category:Dos]]

Latest revision as of 08:57, 1 December 2019

Query context of a suspended thread.

Syntax

DosQueryThreadContext(tid, level, pcxt)

Parameters

tid (TID) - input
Thread identity.
level (ULONG) - input
Level of information desired:
CONTEXT_CONTROL (0x00000001) Control registers: SS:ESP, CS:EIP, EFLAGS and EBP
CONTEXT_INTEGER (0x00000002) EAX, EBX, ECX, EDX, ESI and EDI
CONTEXT_SEGMENTS (0x00000004) Segment registers: DS, ES, FS, and GS
CONTEXT_FLOATING_POINT (0x00000008) Numeric coprocessor state
CONTEXT_FULL All of the above
pcxt (PCONTEXTRECORD) - in/out
Thread context record.

Return Code

ulrc (APIRET) - returns
DosQueryThreadContext returns one of the following values:
  • 0 NO_ERROR
  • 87 ERROR_INVALID_PARAMETER
  • 90 ERROR_NOT_FROZEN
  • 115 ERROR_PROTECTION_VIOLATION
  • 309 ERROR_INVALID_THREADID

Remarks

DosQueryThreadContext returns the context record of a suspended thread. A thread may be suspended by using DosSuspendThread or DosEnterCritSec. If DosSuspendThread is used, the caller must allow some time for OS/2 to suspend the thread before querying its context.

Note: Values from the thread context should be used only when the state of the target thread is known.

Example Code

This example uses DosQueryThreadContext to query the context of a suspended thread.

#define INCL_DOSEXCEPTIONS
#define INCL_DOSPROCESS
#define INCL_DOSERRORS
#include <os2.h>
#include <stdio.h>

VOID _System CntThreadProc( ULONG LoopMax );             /* Count Thread */
VOID PrintContextRecord( CONTEXTRECORD *pThread );

int main(VOID)
{
    TID        tidCntThread = 0;   /* ID returned for newly created thread */
    PFNTHREAD  pfnCntThread = &CntThreadProc; /* Address of Thread program */
    ULONG      ulLoopMax    = 500000;     /* Parameter to thread routine   */
    APIRET     rc           = NO_ERROR;   /* Return code                   */

                      /* Thread Context Record */
    CONTEXTRECORD  Thread_cxt= {0,{0,0,0,0,0,0,0},
                               {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
                                {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
                                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

    rc = DosCreateThread(&tidCntThread,  /* Thread ID (return by function) */
                         pfnCntThread,   /* Address of thread program      */
                         ulLoopMax,      /* Parameter passed to ThreadProc */
                         CREATE_READY |  /* Thread is ready when created   */
                         STACK_SPARSE,   /* Do not pre_commit stack pages  */
                         8192L);         /* Stack size, rounded to page bdy*/
    if (rc != NO_ERROR) {
        printf("DosCreateThread error: return code = %u\n",rc);
        return 1;
    }

    rc = DosSuspendThread (tidCntThread);
    if (rc != NO_ERROR)
        printf("DosSuspendThread error: return code = %u\n",rc);
    else
    {           /* Wait for thread to suspend */

        printf("Waiting 5 seconds for thread to suspend...\n");
        rc = DosSleep(5000);

        rc = DosQueryThreadContext (tidCntThread,
                                    CONTEXT_FULL,
                                    &Thread_cxt);
        if (rc != NO_ERROR)
           printf("DosQueryThreadContext error: return code = %u\n",rc);
        else
           PrintContextRecord( &Thread_cxt );


        rc = DosResumeThread (tidCntThread);
        if (rc != NO_ERROR) {
            printf("DosResumeThread error: return code = %u\n",rc);
            return 1;
        }
    }

    printf("Waiting for thread to complete...\n");

    rc = DosWaitThread ( &tidCntThread, DCWW_WAIT );
    if (rc != NO_ERROR) {
        printf("DosWaitThread error: return code = %u\n",rc);
        return 1;
    }

    printf("Thread has completed!\n");
    return NO_ERROR;
}

VOID _System CntThreadProc( ULONG LoopMax ) /* Count Thread */
{
    ULONG  ulCount = 0,
           i       = 0,
           j       = 1,
           k       = 1,
           l       = 0;
    double w       = 0.0,
           y       = 0.0,
           z       = 0.0;

    for (l=0; l < 20; l++)
    {
      for (i=0; i < LoopMax; i++)
      {
        w = 1.00 / 2.00;
        y = 2.00 * 2.00;
        z = 3.00 / 6.00;
        j = j + i;
        k = k * i;
      }
    }

  return;
}

VOID PrintContextRecord( CONTEXTRECORD *pThread )
{
       int i = 0;

       printf("\nRegisters for CONTEXT_CONTROL level:\n");
       printf("  EBP= 0x%08x\t",pThread->ctx_RegEbp);
       printf("EIP= 0x%08x\t",pThread->ctx_RegEip);
       printf("CS= 0x%08x\n",pThread->ctx_SegCs);
       printf("  EFLAGS = 0x%08x\t",pThread->ctx_EFlags);
       printf("ESP= 0x%08x\t",pThread->ctx_RegEsp);
       printf("SS= 0x%08x\n",pThread->ctx_SegSs);

       printf("\nRegisters for CONTEXT_INTEGER level:\n");
       printf("  EAX= 0x%08x\t",pThread->ctx_RegEax);
       printf("EBX= 0x%08x\t",pThread->ctx_RegEbx);
       printf("ECX= 0x%08x\n",pThread->ctx_RegEcx);
       printf("  EDX= 0x%08x\t",pThread->ctx_RegEdx);
       printf("ESI= 0x%08x\t",pThread->ctx_RegEsi);
       printf("EDI= 0x%08x\n",pThread->ctx_RegEdi);

       printf("\nRegisters for CONTEXT_SEGMENTS level:\n");
       printf("  DS= 0x%08x\t",pThread->ctx_SegDs);
       printf("ES= 0x%08x\t",pThread->ctx_SegEs);
       printf("FS= 0x%08x\t",pThread->ctx_SegFs);
       printf("GS= 0x%08x\n",pThread->ctx_SegGs);

       printf("\nRegisters for CONTEXT_FLOATING_POINT level:\n");
       printf("  - Coprocessor stack register (exponent,hisig:losig):\n");
       for (i=0;i<8;i++)
       {
          printf("    ctx_stack[%d]=0x%08x ,0x%08x :0x%08x \n",i,
                  pThread->ctx_stack[i].signexp,
                  pThread->ctx_stack[i].hisig,
                  pThread->ctx_stack[i].losig);
       }
       printf("  - Other element\n");
       for (i=0;i<7;i++)
       {
          printf("    ctx_env[%d]=0x%08x \n",i ,pThread->ctx_env[i]);
       }

       return;
}

Related Functions