Click here to Skip to main content
15,887,440 members
Articles / Desktop Programming / MFC

Timers Tutorial

Rate me:
Please Sign up or sign in to vote.
4.91/5 (127 votes)
4 Oct 2012CPOL13 min read 967.1K   384   173
A tutorial on different kinds of timers

Table of Contents

Introduction

The goal of this article is to show the practical use of different kinds of timers. First, we will see how to use the "standard" Win32 timers, then switch to multimedia timers, mention waitable timers and queue timers. I will try to make some general comparison between these solutions. So called high-resolution timer based on functions QueryPerformanceFrequency and QueryPerformanceCounter will not be taken into account because it can be used only to measure time intervals, and not to fire events in regular time intervals.

According to MSDN, An application uses a timer to schedule an event for a window after a specified time has elapsed. It means that if we create a timer and specify a time interval of uElapse milliseconds, it will do "something" every uElapse milliseconds, until we destroy it. It is up to us to specify what "something" is.

Timers are a useful feature offered to programmers by the OS. However, they can be easily misused: using timers for different kinds of polling (e.g. check every 200 milliseconds if the user entered some value into the edit box), is almost never a good idea. Good candidates for using timers are applications which do not depend that much on users' actions, but rather on time flow.

It is important to understand that the accuracy of timers is limited. Windows is not a real-time operating system (except Windows CE) and it is not reasonable to expect timers to handle very small time intervals (10 ms, for instance).

Standard Win32 Timers

When the term timer is used, it is almost always referred to this kind of timer. I use the term Win32 timer in this article simply to make a distinction between them and other timers. In some texts, these timers are called user timers because they are not kernel objects, unlike waitable and queue timers.

How do Win32 timers work? First, we create a timer, specify its elapse time, and (optionally) attach it to a window. After the timer is created, it sends WM_TIMER messages to the window message queue, or if no window was specified, to the application queue. We can process this message to call the code that we want to be executed in regular time intervals. The timer will send WM_TIMER messages until it is destroyed.

To create a timer, we will use a Win32 function:

C++
UINT_PTR SetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);

or its MFC equivalent:

C++
UINT CWnd::SetTimer(UINT_PTR nIDEvent, UINT nElapse, 
	void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT_PTR, DWORD)); 

Arguments

  • hWnd - The handle of the window to which the timer is associated; may be NULL, in which case nIDEvent is ignored, and the return value serves as the timer identifier.
  • nIDEvent - A nonzero timer identifier.
  • uElapse - Timer's time-out interval in milliseconds.
  • lpTimerFunc - An application-defined callback function that processes WM_TIMER messages. May be NULL (more often than not, it is).

Return Value

  • The timer identifier. If hWnd is non-NULL, than it is equal to nIDEvent. In case of error, it is zero.

At some point, we will want to stop the "ticking" of the timer. We can do this by destroying it:

C++
BOOL KillTimer(HWND hWnd, UINT_PTR uIDEvent);

or its MFC equivalent:

C++
BOOL CWnd::KillTimer(UINT_PTR nIDEvent);

Arguments

  • hWnd - The same value as in the call to SetTimer
  • uIDEvent - The timer identifier

Return Value

  • If the function succeeds, TRUE; if it fails, FALSE

A typical use of Win32 timers from a CWnd - derived class looks like this:

C++
void CTimersDlg::OnButtonBegin()
{
	.
	.
	.
    // create the timer

    SetTimer (m_nTimerID, uElapse, NULL);
}

void CTimersDlg::OnButtonStop()
{
    // destroy the timer
    KillTimer(m_nTimerID);
}

void CTimersDlg::OnTimer(UINT nIDEvent)  // called every uElapse milliseconds
{
	// do something, but quickly
	.
	.
	.

	CDialog::OnTimer(nIDEvent);
}

If we need to check our Inbox for new mail every half an hour, Win32 timers are all we want. However, for more accurate time measurement (elapsed time less than 1 sec), these timers are hardly the solution. The main reason is that timer posts WM_TIMER messages to a message queue, and we can never be sure when this message will be processed. Now, you might think that setting lpTimerFunc is a solution to this problem, but that is not the case. If you specify lpTimerFunc, the default window procedure calls it only when it processes WM_TIMER. So, we will still wait for WM_TIMER to be processed.

Note that with a Win32 timer event processing is done from the UI thread. The nice aspect of this fact is that we don't need to worry about corrupting our data from a timer event handler; on the flip side, the time spent in a WM_TIMER handler will affect the responsiveness of the UI. If you don't believe me, try calling something like ::Sleep(10000); within CTimersDlg::OnTimer().

Multimedia Timers

In the original version of this article, written 8 years ago, I described the multimedia timers in detail. In the meantime, they have become deprecated in favor of queue timers. If you are interested about the reasons, check out this Larry Osterman's blog post. Anyway, even at the time I originally wrote the article, the only reason to prefer multimedia timers over the queue timers was the fact that the later were introduced with Windows 2000 which was a relatively new system.

The multimedia timer is a high-resolution timer that does not post any messages to message queues. Instead, it calls the specified callback function directly on a separate thread (or, alternatively, it can set or pulse the specific event, but that option will not be covered in this article). Therefore, it is more accurate than the standard Win32 timer, but also more dangerous. Here, we do not have a message queue to protect us if we specify short elapse time.

To use multimedia timers in your projects, you should include Mmsystem.h, and link it with Winmm.lib.

The first step when using multimedia timers is setting the timer resolution. What is timer resolution? It determines the accuracy of the timer. For instance, if elapse time is 1000, and resolution is 50, multimedia timer will "tick" every 950 - 1050 milliseconds.

That sounds great. Why don't we just set the timer resolution to zero, and have an absolutely accurate timer? That's because different systems support different minimum values for the multimedia timer resolution. We can obtain this minimum value by calling:

C++
MMRESULT timeGetDevCaps(LPTIMECAPS ptc, UINT cbtc); 

Arguments

  • ptc - Pointer to a TIMECAPS structure. It is filled with information about the resolution of the timer device
  • cbtc - Size of TIMECAPS (sizeof (TIMECAPS)).

Return Value

  • TIMERR_NOERROR if successful or TIMERR_STRUCT if it fails

TIMECAPS is pretty simple:

C++
typedef struct {
    UINT wPeriodMin;
    UINT wPeriodMax;
	} TIMECAPS;
  • wPeriodMin - Minimum supported resolution
  • wPeriodMax - Maximum supported resolution

We need to pick our minimum resolution to be in this range. Now, when we have it, let's set the resolution. We will do it by calling the function:

C++
MMRESULT timeBeginPeriod(UINT uPeriod);

Arguments

  • uPeriod - Minimum timer resolution

Return Value

  • TIMERR_NOERROR if successful or TIMERR_NOCANDO if the resolution specified in uPeriod is out of range

Now that we set the resolution, let's create the timer. The multimedia timer equivalent of SetTimer, looks like this:

C++
MMRESULT timeSetEvent(UINT uDelay, UINT uResolution, 
	LPTIMECALLBACK lpTimeProc, DWORD dwUser, UINT fuEvent); 

Arguments

  • uDelay - Event delay, in milliseconds. Pretty much the same as uElapse in SetTimer
  • uResolution - Resolution of the timer event, in milliseconds.
  • lpTimeProc - Pointer to the callback function that we want to be called periodically
  • dwUser - User data passed to the callback function
  • fuEvent - Timer event type. May be either TIME_ONESHOT, in which case the callback function is called only once, or TIME_PERIODIC for periodic calling

Return Value

  • An identifier for the timer event if successful or NULL if it fails

Let's take a look at the callback function. It is declared like this:

C++
void CALLBACK TimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2); 

Arguments

  • uID - Timer ID, returned by timeSetEvent
  • uMsg - Reserved
  • lpTimeProc - Pointer to the callback function that we want to be called periodically
  • dwUser - User data passed to the callback function
  • dw1, dw2 - Reserved

Eventually, we will need to destroy the timer. We can accomplish this by a call to the function:

C++
MMRESULT timeKillEvent(UINT uTimerID);

Argument

  • uTimerID - Timer ID

Return Value

  • TIMERR_NOERROR if successful or MMSYSERR_INVALPARAM if the specified timer event does not exist

Remember setting the timer resolution? Well, after we are finished with the timer, we should "reset" the timer resolution with a call to:

C++
MMRESULT timeEndPeriod(UINT uPeriod);

Argument

  • uPeriod - The same as in timeBeginPeriod

Return Value

  • TIMERR_NOERROR if successful or TIMERR_NOCANDO if fails

The multimedia timer version of the example from the previous chapter:

C++
void CTimersDlg::OnButtonBegin()
{
	.
	.
	.
    // Set resolution to the minimum supported by the system

    TIMECAPS tc;
    timeGetDevCaps(&tc, sizeof(TIMECAPS));
    m_uResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
    timeBeginPeriod(resolution);

    // create the timer

    m_idEvent = timeSetEvent(
        m_elTime,
        resolution,
        TimerFunction,
        (DWORD)this,
        TIME_PERIODIC);
}

void CTimersDlg::OnButtonStop()
{
    // destroy the timer
    timeKillEvent(m_idEvent);

    // reset the timer
    timeEndPeriod (m_uResolution);
}

void CTimersDlg::MMTimerHandler(UINT nIDEvent) // called every elTime milliseconds
{
// do what you want to do, but quickly
	.
	.
	.
}

void CALLBACK TimerFunction(UINT wTimerID, UINT msg,
    DWORD dwUser, DWORD dw1, DWORD dw2)
    {
    // This is used only to call MMTimerHandler

    // Typically, this function is static member of CTimersDlg

    CTimersDlg* obj = (CTimersDlg*) dwUser;
    obj->MMTimerHandler(wTimerID);
    }

The example shown above is written in a way to resemble the handling of standard Win32 timers. In practice, however, I wrap the functionality of multimedia timers in a separate class, and I recommend you to do the same.

As I mentioned before, a multimedia timer runs on its own thread.

Waitable Timers

Waitable timers were introduced with Windows 98 and Windows NT 4.0. and they were designed to work with threads that need to block for some times. These timers are kernel objects which are signaled in the specified time, or in regular time intervals. They can specify the callback function (actually, an asynchronous procedure call, or APC) which gets called when timer gets signaled. This callback function is usually called a completion routine.

In order to enable execution of the completion routine, the thread must be in alertable state (executing SleepEx(), WaitForSingleObjectEx() , WaitForMultipleObjectsEx(), MsgWaitForMultipleObjectsEx() , SignalObjectAndWait() functions). In practice, this means that our main thread will be blocked while we are using waitable timers.

To start working with a waitable timer, we must open an existing timer, or create the new one. Creating can be accomplished with a call to:

C++
HANDLE CreateWaitableTimer(LPSECURITY_ATTRIBUTES lpTimerAttributes, 
	BOOL bManualReset, LPCTSTR lpTimerName);

Arguments

  • lpTimerAttributes - Pointer to a SECURITY_ATTRIBUTES structure that specifies a security descriptor for the waitable timer object. Can be NULL
  • bManualReset - Specifies whether the waitable timer is manual-reset or auto-reset
  • lpTimerName - The name of the new timer. Can be NULL

Return Value

  • A handle to the waitable timer object

Another possibility is to open an existing named waitable timer.

Now, when we have a handle to the waitable timer object, we can do something useful with it. To set it, we will use the function:

C++
BOOL SetWaitableTimer(HANDLE hTimer, const LARGE_INTEGER *pDueTime, 
	LONG lPeriod, PTIMERAPCROUTINE pfnCompletionRoutine, 
	LPVOID lpArgToCompletionRoutine, BOOL fResume); 

Arguments

  • hTimer - A handle to the timer object
  • pDueTime - Specifies when the state of the timer is to be set to signaled
  • lPeriod - The period of the timer in milliseconds, like uElapse in SetTimer()
  • pfnCompletionRoutine - The pointer to a completion routine. Can be NULL
  • fResume - Specifies whether to restore a system in suspended power conservation mode when the timer state is set to signaled.

Return Value

  • Nonzero if the function succeeds

Finally, here is a function that stops the waitable timer:

C++
BOOL CancelWaitableTimer(HANDLE hTimer); 

Argument

  • hTimer - A handle to the timer object

Return Value

  • Nonzero if the function succeeds

The example will be a little different this time:

C++
void CTimersDlg::OnButtonBegin()
{
	.
	.
	.
    // create the timer

    timerHandle = CreateWaitableTimer(NULL, FALSE, NULL);
    // set the timer

	LARGE_INTEGER lElapse;
	lElapse.QuadPart = - ((int)elapse * 10000);
	BOOL succ = SetWaitableTimer(timerHandle, &lElapse, elapse, TimerProc,
                this, FALSE);

	for (int i = 0; i < 10; i++)
		SleepEx(INFINITE, TRUE);
	CancelWaitableTimer(timerHandle);
	CloseHandle (timerHandle);
}

void CTimersDlg::WaitTimerHandler() // called every elTime milliseconds
{
// do what you want to do, but quickly
	.
	.
	.
}

void CALLBACK (LPVOID lpArgToCompletionRoutine,
                                DWORD dwTimerLowValue,
                                DWORD dwTimerHighValue)
    {
    // This is used only to call WaitTimerHandler
    // Typically, this function is static member of CTimersDlg
    CTimersDlg* obj = (CTimersDlg*) lpArgToCompletionRoutine;
    obj->WaitTimerHandler();
    }

As you can see, we don't have OnButtonStop() now. As soon as we set the timer, we must put our calling thread into alertable state, and wait. This means that we cannot do anything in the main thread until we finish with the timer. Of course, nothing prevents us from launching a separate worker thread which won't be blocked.

What can we conclude about waitable timers? They do not spend much CPU time and they do not need a message queue. The main problem is that the thread which sets the waitable timer must put itself in an alertable state, or the completion routine will never be called.

Queue Timers

The last kind of Windows - supported timers that we are going to read about in this article is queue timers. They were introduced with Windows 2000.

Queue timers are lightweight kernel objects that reside in timer queues. Like most timers, they enable us to specify the callback function to be called when the specified due time arrives. In this case, the operation is performed by a thread in the Windows thread pool.

Here, for the sake of simplicity, we are not going to create our timer queues. Instead, we will put our queue timers into default timer queue, provided by the OS.

First, we need to create a timer and add it to the default timer queue. For this, we'll make a call to:

C++
BOOL CreateTimerQueueTimer(PHANDLE phNewTimer, HANDLE TimerQueue , 
	WAITORTIMERCALLBACK Callback, PVOID Parameter, DWORD DueTime, 
	DWORD Period, ULONG Flags); 

Arguments

  • phNewTimer - Pointer to a handle; this is an out value
  • TimerQueue - Timer queue handle. For the default timer queue, NULL
  • Callback - Pointer to the callback function
  • Parameter - Value passed to the callback function
  • DueTime - Time (milliseconds), before the timer is set to the signaled state for the first time
  • Period - Timer period (milliseconds). If zero, timer is signaled only once
  • Flags - One or more of the next values (table taken from MSDN):
WT_EXECUTEINTIMERTHREADThe callback function is invoked by the timer thread itself. This flag should be used only for short tasks or it could affect other timer operations.
WT_EXECUTEINIOTHREADThe callback function is queued to an I/O worker thread. This flag should be used if the function should be executed in a thread that waits in an alertable state.

The callback function is queued as an APC. Be sure to address reentrancy issues if the function performs an alertable wait operation.

WT_EXECUTEINPERSISTENTTHREADThe callback function is queued to a thread that never terminates. This flag should be used only for short tasks or it could affect other timer operations.

Note that currently no worker thread is persistent, although no worker thread will terminate if there are any pending I/O requests.

WT_EXECUTELONGFUNCTIONSpecifies that the callback function can perform a long wait. This flag helps the system to decide if it should create a new thread.
WT_EXECUTEONLYONCEThe timer will be set to the signaled state only once.

Return Value

  • Nonzero if the function succeeds

The callback function is really pretty simple:

C++
VOID CALLBACK WaitOrTimerCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired); 

Arguments

  • lpParameter - Pointer to user-defined data
  • TimerOrWaitFired - always TRUE for timer callbacks

To cancel a queue timer, use the function:

C++
BOOL DeleteTimerQueueTimer(HANDLE TimerQueue, HANDLE Timer, HANDLE CompletionEvent); 

Arguments

  • TimerQueue - A handle to the (default) timer queue
  • Timer - A handle to the timer
  • CompletionEvent - A handle to an optional event to be signaled when the function is successful and all callback functions have completed. Can be NULL.

Return Value

  • Nonzero if the function succeeds

The example for queue timers is given below:

C++
void CTimersDlg::OnButtonBegin()
{
	.
	.
	.
    // create the timer

	BOOL success = ::CreateTimerQueueTimer(
		&m_timerHandle,
		NULL,
		TimerProc,
		this,
		0,
		elTime,
		WT_EXECUTEINTIMERTHREAD);
}

void CTimersDlg::OnButtonStop()
{
    // destroy the timer
	DeleteTimerQueueTimer(NULL, m_timerHandle, NULL);
	CloseHandle (m_timerHandle);
}

void CTimersDlg::QueueTimerHandler() // called every elTime milliseconds
{
// do what you want to do, but quickly
	.
	.
	.
}

void CALLBACK TimerProc(void* lpParametar,
                                    BOOLEAN TimerOrWaitFired)
    {
    // This is used only to call QueueTimerHandler
    // Typically, this function is static member of CTimersDlg
    CTimersDlg* obj = (CTimersDlg*) lpParametar;
    obj->QueueTimerHandler();
    }

As you can see, queue timers are pretty easy to use. I can also add that they are very accurate, and "resource friendly".

As I noted at the beginning of this chapter, queue timers are supported on Windows 2000 and later. If you do not want to support older Windows versions, they are perfect, and should be used instead of multimedia timers.

Conclusion

What's the moral of the whole story?

When you decide that you need a timer in your application, choosing between the different timer variants should not be that hard. Follow these simple rules:

  1. If you want your application to work on every 32 bit Windows platform, you do not need high precision, and the callback operation is fast enough not to disrupt the UI responsiveness, use a standard Win32 timer.
  2. If you want your application to work on every 32 bit Windows platform, and you need high precision, use the multimedia timer.
  3. If you want your application to work on Windows 98/NT4 and later, you need low system overhead, and can afford to block the calling thread, use the waitable timer.
  4. If you want a high-precision, low-overhead, non-blocking timer that will work on Windows 2000 and later, use the queue timer.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
United States United States
Born in Kragujevac, Serbia. Now lives in Boston area with his wife and daughters.

Wrote his first program at the age of 13 on a Sinclair Spectrum, became a professional software developer after he graduated.

Very passionate about programming and software development in general.

Comments and Discussions

 
GeneralRe: unable to use QueueTimer Pin
carl124829-Jan-04 9:43
carl124829-Jan-04 9:43 
GeneralCreateTimerQueueTimer extra configuration Pin
25-Jun-02 1:06
suss25-Jun-02 1:06 
GeneralfResume from Hibernation Pin
10-Jun-02 23:32
suss10-Jun-02 23:32 
Generalthread sleep loop timer Pin
4-Jun-02 14:03
suss4-Jun-02 14:03 
QuestionLarge Intervals - 5mins to an Hour ?? Pin
Garth J Lancaster9-May-02 16:41
professionalGarth J Lancaster9-May-02 16:41 
AnswerRe: Large Intervals - 5mins to an Hour ?? Pin
Nemanja Trifunovic10-May-02 4:49
Nemanja Trifunovic10-May-02 4:49 
GeneralRe: Large Intervals - 5mins to an Hour ?? Pin
Garth J Lancaster10-May-02 13:09
professionalGarth J Lancaster10-May-02 13:09 
GeneralInformative Start Pin
Assyrian23-Apr-02 3:42
Assyrian23-Apr-02 3:42 
Greetings, hopefully someone can point me in the right direction.

Have a VB6 application that polls data from a remote device via the
serial port. The actual action of polling does not occur until the
user clicks on a button marked "data refresh." There are some occasions when requesting the data the application crashes.

I have attached a copy of the Dr. Watson log recording the crash.
It appears that the most prevalent problem is NtWaitForMultipleObjects
I can find no references for this call.

We are talking to a serial port and conducting a wait loop between sending out on the serial port and checking what is in the receive buffer but releasing control back to the OS during the wait loop with the DoEvents function (so the the OS can implement any events that are sitting in the stack to be performed.

Based on the article I would think that the timer is causing this problem.

Here is a sample from Doc Watson's Log. Thanks for helping out a beginner



Application exception occurred:
App: EXE\VB6.dbg (pid=235)
When: 4/20/2002 @ 16:21:30.78
Exception number: c0000005 (access violation)

*----> System Information <----*
Computer Name: STUTTGART
User Name: Administrator
Number of Processors: 1
Processor Type: x86 Family 5 Model 4 Stepping 3
Windows Version: 4.0
Current Build: 1381
Service Pack: 6
Current Type: Uniprocessor Free
Registered Organization: ASTRO Systems, Inc.
Registered Owner: Ralph L. Miller

*----> Task List <----*
0 Idle.exe
2 System.exe
22 smss.exe
30 csrss.exe
36 winlogon.exe
45 services.exe
48 lsass.exe
73 spoolss.exe
38 mxload.exe
49 nddeagnt.exe
85 Explorer.exe
104 SysTray.exe
106 loadwc.exe
95 rcrawler.exe
113 WvStatus.exe
128 RpcSs.exe
131 tapisrv.exe
141 mspmspsv.exe
117 pstores.exe
120 MSTask.exe
152 wnvirq32.exe
161 SPADDIN.exe
196 taskmgr.exe
175 PW4.exe
170 GOLDWAVE.exe
266 AWHOST32.exe
173 VB6.exe
139 lights.exe
235 VB6.exe
280 drwtsn32.exe
0 _Total.exe

(00400000 - 005cc000) EXE\VB6.dbg
(77f60000 - 77fbe000) dll\ntdll.dbg
(0fa90000 - 0fc32000) DLL\VBA6.dbg
(77b20000 - 77bd7000) dll\ole32.dbg
(77e10000 - 77e67000) dll\rpcrt4.dbg
(77f00000 - 77f5e000) dll\kernel32.dbg
(77dc0000 - 77dff000) dll\advapi32.dbg
(77e70000 - 77ec5000) dll\user32.dbg
(77ed0000 - 77efc000) dll\gdi32.dbg
(65340000 - 653d2000) oleaut32.dbg
(0f6f0000 - 0f7ea000) dll\vb6ide.dbg
(67d90000 - 67d90000)
(306c0000 - 30a4a000) mso97rt.dbg
(71590000 - 71617000) COMCTL32.dbg
(279e0000 - 279e0000)
(66000000 - 66152000) DLL\MSVBVM60.dbg
(27580000 - 27685000) ocx\mscomctl.dbg
(77d80000 - 77db2000) dll\comdlg32.dbg
(77c40000 - 77d7c000) dll\shell32.dbg
(217a0000 - 217c3000) ocx\ComDlg32.dbg
(50760000 - 50772000) commtb32.dll
(11000000 - 11000000)
(0f000000 - 0f14d000) MSVBVM50.dbg
(77a40000 - 77a4d000) dll\ntshrui.dbg
(78000000 - 78040000)
(77800000 - 7783a000) dll\netapi32.dbg
(77840000 - 77849000) dll\NetRap.dbg
(777e0000 - 777ed000) dll\samlib.dbg
(77bf0000 - 77bf7000) dll\rpcltc1.dbg
(71190000 - 71197000) dll\msidle.dbg
(70400000 - 70477000) MLANG.dbg
(6da00000 - 6da00000)
(6d800000 - 6d800000)
(77fd0000 - 77ffa000) dll\winmm.dbg
(6c370000 - 6c462000)
(6d110000 - 6d138000) .\Release/wnvwav32.dll
(6d0a0000 - 6d0b7000) .\Release/wnvreg32.dll
(0ffb0000 - 0ffed000) dll\wow32.dbg
(041e0000 - 04283000) exe\ntvdm.dbg
(77a90000 - 77a9b000) dll\version.dbg
(779c0000 - 779c8000) dll\lz32.dbg
(6d200000 - 6d21f000) .\Release/Wnvhad.dll
(6ef00000 - 6ef96000) .\Release/wnvmxr.dll
(6d500000 - 6d519000) .\Release/wnvvsrc.dll
(04ee0000 - 04efc000) .\Release/wnvasrc.dll
(6d030000 - 6d051000) .\Release/wnvim.dll
(6e600000 - 6e600000)
(6dd00000 - 6dd00000)
(77480000 - 77493000) dll\avicap32.dbg
(75b00000 - 75b22000) dll\msvfw32.dbg
(6df00000 - 6df00000)
(6dc00000 - 6dc00000)
(77160000 - 77167000) dll\dciman32.dbg
(74100000 - 74109000) drv\msacm32.dbg
(75d50000 - 75d6a000) dll\msacm32.dbg
(07590000 - 075c3000) .\Release/wnvvid32.dll
(6d400000 - 6d400000)
(6d700000 - 6d728000) .\Release/wnvplay1.dll
(6e700000 - 6e70f000) .\Release/WnvW32.dll
(08670000 - 08687000) .\Release/wnvptz.dll
(6e400000 - 6e400000)
(202b0000 - 20346000) comctl32.dbg
(21c10000 - 21c2a000) MSComm32.dbg
(10000000 - 10000000)
(77c00000 - 77c18000) drv\winspool.dbg
(09250000 - 09250000)
(5f300000 - 5f329000) olepro32.dbg
(763d0000 - 763d9000) dll\mciwave.dbg

State Dump for Thread Id 0x115

eax=038e6f0d ebx=0a7a6ac8 ecx=00000017 edx=00000000 esi=00000017 edi=038e6fe8
eip=0fa9eea5 esp=0012f2f8 ebp=0012f318 iopl=0 nv up ei pl zr na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246


function: rtcUpperCaseBstr
0fa9ee85 0f85b70d0900 jne rtcIsNull+0x29add (0fb2fc42)
0fa9ee8b 90 nop
0fa9ee8c 41 inc ecx
0fa9ee8d ff4508 inc dword ptr [ebp+0x8] ss:02fbdd1e=????????
0fa9ee90 88041e mov [esi+ebx],al ds:0a7a6ac8=4c
0fa9ee93 894dfc mov [ebp-0x4],ecx ss:02fbdd1e=????????
0fa9ee96 46 inc esi
0fa9ee97 81feff030000 cmp esi,0x3ff
0fa9ee9d 0f83c80d0900 jnb rtcIsNull+0x29b06 (0fb2fc6b)
0fa9eea3 eba7 jmp rtcUpperCaseBstr+0x1387 (0fa9ee4c)
FAULT ->0fa9eea5 807c0f010a cmp byte ptr [edi+ecx+0x1],0xa ds:02e8ea1e=??
0fa9eeaa 0f85310d0900 jne rtcIsNull+0x29a7c (0fb2fbe1)
0fa9eeb0 80241e00 and byte ptr [esi+ebx],0x0 ds:0a7a6ac8=4c
0fa9eeb4 8d441102 lea eax,[ecx+edx+0x2] ds:02e8ea07=????????
0fa9eeb8 8b4d18 mov ecx,[ebp+0x18] ss:02fbdd1e=????????
0fa9eebb 8901 mov [ecx],eax ds:00000017=????????
0fa9eebd 6a01 push 0x1
0fa9eebf 58 pop eax
0fa9eec0 eb06 jmp rtcUpperCaseBstr+0x1403 (0fa9eec8)
0fa9eec2 80241e00 and byte ptr [esi+ebx],0x0 ds:0a7a6ac8=4c
0fa9eec6 33c0 xor eax,eax
0fa9eec8 5f pop edi

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
0012f318 0fa9ec0f 038e6fff 00000018 00000000 0a7a6ac8 VBA6!rtcUpperCaseBstr
0012f390 0fa9eacd 038e6fe8 00000018 00000001 00000000 VBA6!rtcUpperCaseBstr
0012f3b8 0fa93e57 00135894 00000018 0012f578 00000018 VBA6!rtcUpperCaseBstr
0012f3e4 0fa93b72 00135894 00000000 03863a54 00000018 VBA6!rtcErrObj
0012f488 0fa93a9d 00135894 00000000 0012f578 00000002 VBA6!rtcErrObj
0012f4ec 0fa9e9e5 00135894 00000000 03513652 0012f520 VBA6!rtcErrObj
0012f510 0fc00d98 03513650 00135894 0012f578 00000000 VBA6!rtcUpperCaseBstr
0012f6f0 0fc00ed2 00175050 0012f80c 0012f7fc 0012f7ec VBA6!ProcCallEngine
0012f7b0 0fc00e95 037e6e58 0012f80c 0012f7fc 0012f7ec VBA6!ProcCallEngine
0012f8f0 0fc00e95 037e6e58 00000000 00000000 00000000 VBA6!ProcCallEngine
0012f9c8 0fc00ed2 037e6e58 00000000 00000000 00000000 VBA6!ProcCallEngine
0012faf0 0fc00ed2 03741268 00000000 00000000 03864874 VBA6!ProcCallEngine
0012fb94 0fc00e95 00175050 00000000 00000000 00030000 VBA6!ProcCallEngine
0012fc30 00459226 00175050 0012fd80 0012fc50 034fceb0 VBA6!ProcCallEngine
0012fc40 034fceb0 001751b0 03503624 0012fc9c 004591ff VB6!VB_CALLBACK_REVOKE_

*----> Raw Stack Dump <----*
0012f2f8 c8 6a 7a 0a 38 00 1a 00 - 00 00 00 00 00 70 8e 03 .jz.8........p..
0012f308 00 00 00 00 04 00 00 00 - e8 6f 8e 03 17 00 00 00 .........o......
0012f318 90 f3 12 00 0f ec a9 0f - ff 6f 8e 03 18 00 00 00 .........o......
0012f328 00 00 00 00 c8 6a 7a 0a - 78 f3 12 00 84 9d 80 03 .....jz.x.......
0012f338 94 58 13 00 00 00 00 00 - 00 00 00 00 c7 00 00 00 .X..............
0012f348 00 00 00 00 c7 00 00 00 - 80 f3 12 00 38 3a 8c 03 ............8:..
0012f358 00 00 00 00 01 00 00 00 - 00 00 00 00 00 00 00 00 ................
0012f368 00 00 00 00 01 00 00 00 - 00 00 00 00 00 00 00 00 ................
0012f378 00 00 00 00 01 00 00 00 - c8 6a 7a 0a 60 00 8c 03 .........jz.`...
0012f388 38 3a 8c 03 c7 00 00 00 - b8 f3 12 00 cd ea a9 0f 8:..............
0012f398 e8 6f 8e 03 18 00 00 00 - 01 00 00 00 00 00 00 00 .o..............
0012f3a8 00 00 00 00 84 9d 80 03 - 54 3a 86 03 e8 6f 8e 03 ........T:...o..
0012f3b8 e4 f3 12 00 57 3e a9 0f - 94 58 13 00 18 00 00 00 ....W>...X......
0012f3c8 78 f5 12 00 18 00 00 00 - 54 3a 86 03 88 f4 12 00 x.......T:......
0012f3d8 44 3b a9 0f 00 00 00 00 - 00 00 00 00 88 f4 12 00 D;..............
0012f3e8 72 3b a9 0f 94 58 13 00 - 00 00 00 00 54 3a 86 03 r;...X......T:..
0012f3f8 18 00 00 00 78 f5 12 00 - 24 f5 12 00 04 00 00 00 ....x...$.......
0012f408 20 4d 2c 09 39 00 00 00 - b8 16 a9 0f 09 04 00 00 M,.9...........
0012f418 03 00 00 00 0c cb 30 03 - 00 00 00 00 d8 ff 41 00 ......0.......A.
0012f428 20 4d 2c 09 e0 f4 12 00 - 59 7b 1c 00 01 00 00 00 M,.....Y{......

State Dump for Thread Id 0x125

eax=00000000 ebx=00000000 ecx=00000301 edx=00000000 esi=0180ff9c edi=ffffffff
eip=77f6791f esp=0180ff88 ebp=0180ffa4 iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000206


function: NtDelayExecution
77f67914 b827000000 mov eax,0x27
77f67919 8d542404 lea edx,[esp+0x4] ss:0469e98f=????????
77f6791d cd2e int 2e
77f6791f c20800 ret 0x8
77f67922 8bc0 mov eax,eax

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
0180ffa4 77f1cebe 00000064 00000000 0fa91698 00000064 ntdll!NtDelayExecution
0180ffec 00000000 0fa91690 00000000 00000000 0df00df0 kernel32!Sleep
00000000 00000000 00000000 00000000 00000000 00000000 VB6!<nosymbols>

*----> Raw Stack Dump <----*
0180ff88 f5 ce f1 77 00 00 00 00 - 9c ff 80 01 b8 fc 12 00 ...w............
0180ff98 00 00 00 00 c0 bd f0 ff - ff ff ff ff ec ff 80 01 ................
0180ffa8 be ce f1 77 64 00 00 00 - 00 00 00 00 98 16 a9 0f ...wd...........
0180ffb8 64 00 00 00 de 4e f0 77 - 00 00 00 00 ff ff ff ff d....N.w........
0180ffc8 b8 fc 12 00 00 00 00 00 - b8 fc 12 00 c4 ff 80 01 ................
0180ffd8 70 07 5b 01 ff ff ff ff - 44 b9 f3 77 38 d2 f3 77 p.[.....D..w8..w
0180ffe8 00 00 00 00 00 00 00 00 - 00 00 00 00 90 16 a9 0f ................
0180fff8 00 00 00 00 00 00 00 00 - f0 0d f0 0d 00 10 ff 03 ................
01810008 01 00 00 00 20 00 00 00 - ff ff ff ff ff ff ff ff .... ...........
01810018 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
01810028 00 00 00 00 f8 03 00 00 - 10 00 00 00 18 1c 6c 30 ..............l0
01810038 01 00 00 00 00 00 00 00 - 00 00 00 00 20 00 00 00 ............ ...
01810048 5c 00 00 00 78 00 00 00 - 00 00 00 00 00 00 3e 58 \...x.........>X
01810058 00 00 3e 58 00 00 00 00 - 81 07 00 00 fc 03 00 00 ..>X............
01810068 18 00 00 00 00 00 00 00 - 01 00 00 00 81 07 00 00 ................
01810078 00 00 00 00 00 00 3e 58 - 34 00 81 01 20 00 00 00 ......>X4... ...
01810088 48 00 00 00 44 00 00 00 - 00 00 00 00 00 00 60 57 H...D.........`W
01810098 00 00 60 57 48 00 81 01 - f0 07 00 00 fb 03 00 00 ..`WH...........
018100a8 18 00 00 00 6c 00 81 01 - 01 00 00 00 f0 07 00 00 ....l...........
018100b8 00 00 00 00 00 00 60 57 - 34 00 81 01 20 00 00 00 ......`W4... ...

State Dump for Thread Id 0xe1

eax=00000001 ebx=00000000 ecx=00164bb8 edx=00000000 esi=00143050 edi=034767a0
eip=77f67fa7 esp=01acfdf0 ebp=01acff90 iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000206


function: ZwReplyWaitReceivePort
77f67f9c b890000000 mov eax,0x90
77f67fa1 8d542404 lea edx,[esp+0x4] ss:0495e7f7=????????
77f67fa5 cd2e int 2e
77f67fa7 c21000 ret 0x10
77f67faa 8bc0 mov eax,eax

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
01acff90 77e15a1d 77e160f7 00143050 01acffec 00000105 ntdll!ZwReplyWaitReceivePort
00003a98 00000000 00000000 00000000 00000000 00000000 rpcrt4!NdrOleAllocate

*----> Raw Stack Dump <----*
01acfdf0 9f 5b e1 77 9c 00 00 00 - 6c ff ac 01 00 00 00 00 .[.w....l.......
01acfe00 90 f9 13 00 70 31 14 00 - 24 7b 13 00 2c 7b 13 00 ....p1..${..,{..
01acfe10 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
01acfe20 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
01acfe30 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
01acfe40 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
01acfe50 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
01acfe60 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
01acfe70 00 00 00 00 00 00 00 00 - 01 00 00 00 57 26 d9 67 ............W&.g
01acfe80 00 00 d9 67 02 00 00 00 - 00 00 00 00 10 48 13 00 ...g.........H..
01acfe90 00 f0 fd 7f 07 26 d9 67 - 08 48 13 00 65 3e f6 77 .....&.g.H..e>.w
01acfea0 00 00 6c 30 02 00 00 00 - 00 00 00 00 1c ff ac 01 ..l0............
01acfeb0 00 00 00 00 92 12 f6 77 - 60 55 fa 77 98 12 f6 77 .......w`U.w...w
01acfec0 30 ff ac 01 00 00 b2 77 - 48 23 13 00 00 00 00 00 0......wH#......
01acfed0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
01acfee0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
01acfef0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
01acff00 00 00 00 00 c0 fe ac 01 - 00 00 00 00 ff ff ff ff ................
01acff10 d4 2c f9 77 e8 d0 f9 77 - ff ff ff ff 00 00 00 00 .,.w...w........
01acff20 d3 63 f7 77 db 63 f7 77 - 30 ff ac 01 01 00 00 00 .c.w.c.w0.......

State Dump for Thread Id 0x111

eax=00000001 ebx=00000000 ecx=0013eee8 edx=00000000 esi=00143050 edi=034767a0
eip=77f67fa7 esp=02aefdf0 ebp=02aeff90 iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000202


function: ZwReplyWaitReceivePort
77f67f9c b890000000 mov eax,0x90
77f67fa1 8d542404 lea edx,[esp+0x4] ss:0597e7f7=????????
77f67fa5 cd2e int 2e
77f67fa7 c21000 ret 0x10
77f67faa 8bc0 mov eax,eax

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
02aeff90 77e15a1d 77e160f7 00143050 02aeffec 01acfc54 ntdll!ZwReplyWaitReceivePort
00003a98 00000000 00000000 00000000 00000000 00000000 rpcrt4!NdrOleAllocate

*----> Raw Stack Dump <----*
02aefdf0 9f 5b e1 77 9c 00 00 00 - 6c ff ae 02 00 00 00 00 .[.w....l.......
02aefe00 38 f8 13 00 38 dd 15 00 - 24 7b 13 00 2c 7b 13 00 8...8...${..,{..
02aefe10 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
02aefe20 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
02aefe30 00 00 00 00 00 00 00 00 - 79 35 00 66 dc e4 10 66 ........y5.f...f
02aefe40 63 35 00 66 ff ff ff ff - 9e 35 00 66 dc e4 10 66 c5.f.....5.f...f
02aefe50 49 35 00 66 00 00 00 00 - 70 e4 10 66 d8 e4 10 66 I5.f....p..f...f
02aefe60 78 fe ae 02 02 35 00 66 - 70 e4 10 66 71 31 00 66 x....5.fp..fq1.f
02aefe70 02 00 00 00 02 00 00 00 - 00 00 00 00 f5 7d 76 50 .............}vP
02aefe80 00 00 76 50 02 00 00 00 - 00 00 00 00 50 9f 15 00 ..vP........P...
02aefe90 58 9f 15 00 00 f0 fd 7f - 70 7d 76 50 65 3e f6 77 X.......p}vPe>.w
02aefea0 00 00 76 50 02 00 00 00 - 00 00 00 00 1c ff ae 02 ..vP............
02aefeb0 00 00 00 00 92 12 f6 77 - 60 55 fa 77 98 12 f6 77 .......w`U.w...w
02aefec0 30 ff ae 02 00 00 00 00 - 60 dd 15 00 00 00 00 00 0.......`.......
02aefed0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
02aefee0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
02aefef0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
02aeff00 00 00 00 00 c0 fe ae 02 - 00 00 00 00 ff ff ff ff ................
02aeff10 d4 2c f9 77 e8 d0 f9 77 - ff ff ff ff 00 00 00 00 .,.w...w........
02aeff20 d3 63 f7 77 db 63 f7 77 - 30 ff ae 02 01 00 00 00 .c.w.c.w0.......

State Dump for Thread Id 0x128

eax=00000000 ebx=00000000 ecx=00000001 edx=00000000 esi=0717fee8 edi=02bdcbf8
eip=77f6791f esp=0717fed4 ebp=0717fef0 iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000206


function: NtDelayExecution
77f67914 b827000000 mov eax,0x27
77f67919 8d542404 lea edx,[esp+0x4] ss:0a00e8db=????????
77f6791d cd2e int 2e
77f6791f c20800 ret 0x8
77f67922 8bc0 mov eax,eax

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
0717fef0 77f1cebe 000001f4 00000000 6e607c81 000001f4 ntdll!NtDelayExecution
00000000 00000000 00000000 00000000 00000000 00000000 kernel32!Sleep

*----> Raw Stack Dump <----*
0717fed4 f5 ce f1 77 00 00 00 00 - e8 fe 17 07 b3 ce f1 77 ...w...........w
0717fee4 38 02 00 00 c0 b4 b3 ff - ff ff ff ff 00 00 00 00 8...............
0717fef4 be ce f1 77 f4 01 00 00 - 00 00 00 00 81 7c 60 6e ...w.........|`n
0717ff04 f4 01 00 00 84 ff 17 07 - 74 e5 12 00 80 0f be 02 ........t.......
0717ff14 38 02 00 00 85 01 38 6c - f8 cb bd 02 a0 cc f1 77 8.....8l.......w
0717ff24 60 07 be 02 60 07 be 02 - 01 00 00 00 b4 b8 40 6c `...`.........@l
0717ff34 01 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0717ff44 01 00 00 00 00 00 00 00 - 08 f8 73 03 00 00 00 00 ..........s.....
0717ff54 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0717ff64 00 00 00 00 00 00 00 00 - 00 00 00 00 80 0f be 02 ................
0717ff74 20 ff 17 07 a8 ff 17 07 - 32 48 40 6c 00 00 00 00 .......2H@l....
0717ff84 b8 ff 17 07 5a 26 00 78 - 74 e5 12 00 a0 cc f1 77 ....Z&.xt......w
0717ff94 e8 01 00 00 60 07 be 02 - c0 7d 55 80 90 ff 17 07 ....`....}U.....
0717ffa4 8b 74 11 80 dc ff 17 07 - 03 ef 00 78 c8 e2 02 78 .t.........x...x
0717ffb4 00 00 00 00 ec ff 17 07 - de 4e f0 77 60 07 be 02 .........N.w`...
0717ffc4 a0 cc f1 77 e8 01 00 00 - 60 07 be 02 e8 01 00 00 ...w....`.......
0717ffd4 c4 ff 17 07 17 4e f6 77 - ff ff ff ff 44 b9 f3 77 .....N.w....D..w
0717ffe4 38 d2 f3 77 00 00 00 00 - 00 00 00 00 00 00 00 00 8..w............
0717fff4 ff 25 00 78 60 07 be 02 - 00 00 00 00 b0 00 00 00 .%.x`...........
07180004 00 01 00 00 ff ee ff ee - 02 10 00 00 00 00 00 00 ................

State Dump for Thread Id 0x127

eax=6d033dc0 ebx=083ffe7c ecx=0012d33c edx=00000000 esi=7ffdf000 edi=00000000
eip=77f682cb esp=083ffe58 ebp=083ffeac iopl=0 nv up ei pl nz ac pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000213


function: NtWaitForMultipleObjects
77f682c0 b8c4000000 mov eax,0xc4
77f682c5 8d542404 lea edx,[esp+0x4] ss:0b28e85f=????????
77f682c9 cd2e int 2e
77f682cb c21400 ret 0x14
77f682ce 8bc0 mov eax,eax

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
083ffeac 77f1cd76 00000002 083ffef4 00000000 ffffffff ntdll!NtWaitForMultipleObjects
083ffec8 6d032ce4 00000002 083ffef4 00000000 ffffffff kernel32!WaitForMultipleObjects
083fff10 6d033365 00000000 057308c0 057308c0 05730940 wnvim!CWNV_Instance_Manager_API::`vector deleting destructor'
083fff2c 6d033516 00000000 057308c0 057308c0 05730940 wnvim!CWNV_Instance_Manager_API::`vector deleting destructor'
083fff48 6d031126 6d0427c8 00000000 057308c0 057308c0 wnvim!CWNV_Instance_Manager_API::`vector deleting destructor'
083fff84 6d033e29 6d0427c8 00000000 00000000 057308c0 wnvim!<nosymbols>
083fffb8 77f04ede 057308c0 00000000 00000000 057308c0 wnvim!<nosymbols>
083fffec 00000000 6d033dc0 057308c0 00000000 0000a700 kernel32!lstrcmpiW
00000000 00000000 00000000 00000000 00000000 00000000 VB6!<nosymbols>

*----> Raw Stack Dump <----*
083ffe58 6b ce f1 77 02 00 00 00 - 7c fe 3f 08 01 00 00 00 k..w....|.?.....
083ffe68 00 00 00 00 00 00 00 00 - 00 00 00 00 c0 08 73 05 ..............s.
083ffe78 c0 08 73 05 c8 01 00 00 - 0c 02 00 00 02 00 00 00 ..s.............
083ffe88 00 00 00 00 60 97 79 03 - a8 fe 3f 08 00 00 00 00 ....`.y...?.....
083ffe98 48 09 73 05 c0 08 73 05 - 9c 8d f8 77 00 00 00 00 H.s...s....w....
083ffea8 01 00 00 00 c8 fe 3f 08 - 76 cd f1 77 02 00 00 00 ......?.v..w....
083ffeb8 f4 fe 3f 08 00 00 00 00 - ff ff ff ff 00 00 00 00 ..?.............
083ffec8 10 ff 3f 08 e4 2c 03 6d - 02 00 00 00 f4 fe 3f 08 ..?..,.m......?.
083ffed8 00 00 00 00 ff ff ff ff - 00 00 00 00 c0 08 73 05 ..............s.
083ffee8 c0 08 73 05 00 00 00 00 - 40 09 73 05 c8 01 00 00 ..s.....@.s.....
083ffef8 0c 02 00 00 05 00 00 00 - ff ff ff ff 00 00 00 00 ................
083fff08 08 02 00 00 00 00 00 00 - 2c ff 3f 08 65 33 03 6d ........,.?.e3.m
083fff18 00 00 00 00 c0 08 73 05 - c0 08 73 05 40 09 73 05 ......s...s.@.s.
083fff28 00 00 00 00 48 ff 3f 08 - 16 35 03 6d 00 00 00 00 ....H.?..5.m....
083fff38 c0 08 73 05 c0 08 73 05 - 40 09 73 05 00 00 00 00 ..s...s.@.s.....
083fff48 84 ff 3f 08 26 11 03 6d - c8 27 04 6d 00 00 00 00 ..?.&..m.'.m....
083fff58 c0 08 73 05 c0 08 73 05 - 70 00 30 c0 10 e5 12 80 ..s...s.p.0.....
083fff68 40 09 73 05 40 09 73 05 - c8 27 04 6d d0 1d bf fd @.s.@.s..'.m....
083fff78 a8 ff 3f 08 75 11 03 6d - ff ff ff ff b8 ff 3f 08 ..?.u..m......?.
083fff88 29 3e 03 6d c8 27 04 6d - 00 00 00 00 00 00 00 00 )>.m.'.m........

State Dump for Thread Id 0x11c

eax=6d033dc0 ebx=0855fe7c ecx=0012d0ec edx=00000000 esi=7ffdf000 edi=00000000
eip=77f682cb esp=0855fe58 ebp=0855feac iopl=0 nv up ei pl nz ac pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000213


function: NtWaitForMultipleObjects
77f682c0 b8c4000000 mov eax,0xc4
77f682c5 8d542404 lea edx,[esp+0x4] ss:0b3ee85f=????????
77f682c9 cd2e int 2e
77f682cb c21400 ret 0x14
77f682ce 8bc0 mov eax,eax

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
0855feac 77f1cd76 00000002 0855fef4 00000000 ffffffff ntdll!NtWaitForMultipleObjects
0855fec8 6d032ce4 00000002 0855fef4 00000000 ffffffff kernel32!WaitForMultipleObjects
0855ff10 6d033365 00000000 05730a30 05730a30 05730ab0 wnvim!CWNV_Instance_Manager_API::`vector deleting destructor'
0855ff2c 6d033516 00000000 05730a30 05730a30 05730ab0 wnvim!CWNV_Instance_Manager_API::`vector deleting destructor'
0855ff48 6d031126 6d042a40 00000000 05730a30 05730a30 wnvim!CWNV_Instance_Manager_API::`vector deleting destructor'
0855ff84 6d033e29 6d042a40 00000000 0012d1dc 05730a30 wnvim!<nosymbols>
0855ffb8 77f04ede 05730a30 00000000 0012d1dc 05730a30 wnvim!<nosymbols>
0855ffec 00000000 00000000 00000000 00000000 00000000 kernel32!lstrcmpiW
00000000 00000000 00000000 00000000 00000000 00000000 VB6!<nosymbols>

State Dump for Thread Id 0xc9

eax=6ef12030 ebx=0865fee4 ecx=00000000 edx=00000000 esi=7ffdf000 edi=00000000
eip=77f682cb esp=0865fec0 ebp=0865ff14 iopl=0 nv up ei pl nz ac pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000213


function: NtWaitForMultipleObjects
77f682c0 b8c4000000 mov eax,0xc4
77f682c5 8d542404 lea edx,[esp+0x4] ss:0b4ee8c7=????????
77f682c9 cd2e int 2e
77f682cb c21400 ret 0x14
77f682ce 8bc0 mov eax,eax

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
0865ff14 77f1cd76 00000001 0865ff60 00000000 ffffffff ntdll!NtWaitForMultipleObjects
0865ff30 6ef019a9 00000001 0865ff60 00000000 ffffffff kernel32!WaitForMultipleObjects
0865ff6c 6ef01477 0000011c 05b40940 05b40940 05b32dd0 wnvmxr!<nosymbols>
0865ff84 6ef12099 05b32dd0 0000011c 00130000 05b40940 wnvmxr!<nosymbols>
0865ffb8 77f04ede 05b40940 0000011c 00130000 05b40940 wnvmxr!mxdMessage
0865ffec 00000000 00000000 00000000 00000000 00000000 kernel32!lstrcmpiW
00000000 00000000 00000000 00000000 00000000 00000000 VB6!<nosymbols>

State Dump for Thread Id 0xce

eax=097eff78 ebx=097efe5c ecx=00000101 edx=00000000 esi=7ffdf000 edi=097efe7c
eip=77f682cb esp=097efe38 ebp=097efe8c iopl=0 nv up ei pl nz ac pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000213


function: NtWaitForMultipleObjects
77f682c0 b8c4000000 mov eax,0xc4
77f682c5 8d542404 lea edx,[esp+0x4] ss:0c67e83f=????????
77f682c9 cd2e int 2e
77f682cb c21400 ret 0x14
77f682ce 8bc0 mov eax,eax

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
097efe8c 77f1cd76 00000005 097eff78 00000000 00001388 ntdll!NtWaitForMultipleObjects
097efea8 0926db46 00000005 097eff78 00000000 00001388 kernel32!WaitForMultipleObjects

State Dump for Thread Id 0xbd

eax=000003a8 ebx=098eff0c ecx=00000000 edx=00000000 esi=7ffdf000 edi=098eff2c
eip=77f682cb esp=098efee8 ebp=098eff3c iopl=0 nv up ei pl nz ac pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000213


function: NtWaitForMultipleObjects
77f682c0 b8c4000000 mov eax,0xc4
77f682c5 8d542404 lea edx,[esp+0x4] ss:0c77e8ef=????????
77f682c9 cd2e int 2e
77f682cb c21400 ret 0x14
77f682ce 8bc0 mov eax,eax

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
098eff3c 77f1cd76 00000004 098eff90 00000000 00001388 ntdll!NtWaitForMultipleObjects
098eff58 0926ddbb 00000004 098eff90 00000000 00001388 kernel32!WaitForMultipleObjects

State Dump for Thread Id 0x53

eax=c000000d ebx=099efed0 ecx=c0000000 edx=00000000 esi=7ffdf000 edi=099efef0
eip=77f682cb esp=099efeac ebp=099eff00 iopl=0 nv up ei pl nz ac pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000213


function: NtWaitForMultipleObjects
77f682c0 b8c4000000 mov eax,0xc4
77f682c5 8d542404 lea edx,[esp+0x4] ss:0c87e8b3=????????
77f682c9 cd2e int 2e
77f682cb c21400 ret 0x14
77f682ce 8bc0 mov eax,eax

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
099eff00 77f1cd76 00000003 099effa8 00000000 00001388 ntdll!NtWaitForMultipleObjects
099eff1c 0926dfe7 00000003 099effa8 00000000 00001388 kernel32!WaitForMultipleObjects

State Dump for Thread Id 0x11e

eax=09aeff78 ebx=09aefe5c ecx=09aeffac edx=00000000 esi=7ffdf000 edi=09aefe7c
eip=77f682cb esp=09aefe38 ebp=09aefe8c iopl=0 nv up ei pl nz ac pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000213


function: NtWaitForMultipleObjects
77f682c0 b8c4000000 mov eax,0xc4
77f682c5 8d542404 lea edx,[esp+0x4] ss:0c97e83f=????????
77f682c9 cd2e int 2e
77f682cb c21400 ret 0x14
77f682ce 8bc0 mov eax,eax

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
09aefe8c 77f1cd76 00000005 09aeff78 00000000 00001388 ntdll!NtWaitForMultipleObjects
09aefea8 0926db46 00000005 09aeff78 00000000 00001388 kernel32!WaitForMultipleObjects

State Dump for Thread Id 0x10e

eax=00000000 ebx=09beff0c ecx=09beffac edx=00000000 esi=7ffdf000 edi=09beff2c
eip=77f682cb esp=09befee8 ebp=09beff3c iopl=0 nv up ei pl nz ac pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000213


function: NtWaitForMultipleObjects
77f682c0 b8c4000000 mov eax,0xc4
77f682c5 8d542404 lea edx,[esp+0x4] ss:0ca7e8ef=????????
77f682c9 cd2e int 2e
77f682cb c21400 ret 0x14
77f682ce 8bc0 mov eax,eax

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
09beff3c 77f1cd76 00000004 09beff90 00000000 00001388 ntdll!NtWaitForMultipleObjects
09beff58 0926ddbb 00000004 09beff90 00000000 00001388 kernel32!WaitForMultipleObjects

State Dump for Thread Id 0x54

eax=00000102 ebx=09cefed0 ecx=00000001 edx=00000000 esi=7ffdf000 edi=09cefef0
eip=77f682cb esp=09cefeac ebp=09ceff00 iopl=0 nv up ei pl nz ac pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000213


function: NtWaitForMultipleObjects
77f682c0 b8c4000000 mov eax,0xc4
77f682c5 8d542404 lea edx,[esp+0x4] ss:0cb7e8b3=????????
77f682c9 cd2e int 2e
77f682cb c21400 ret 0x14
77f682ce 8bc0 mov eax,eax

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
09ceff00 77f1cd76 00000003 09ceffa8 00000000 00001388 ntdll!NtWaitForMultipleObjects
09ceff1c 0926dfe7 00000003 09ceffa8 00000000 00001388 kernel32!WaitForMultipleObjects

State Dump for Thread Id 0xb5

eax=09effa24 ebx=09effe7c ecx=09effa26 edx=00000000 esi=7ffdf000 edi=00000000
eip=77f682cb esp=09effe58 ebp=09effeac iopl=0 nv up ei pl nz ac pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000213
GeneralMissed another important timer Pin
rupen12-Mar-02 8:02
rupen12-Mar-02 8:02 
GeneralRe: Missed another important timer Pin
Nemanja Trifunovic12-Mar-02 8:34
Nemanja Trifunovic12-Mar-02 8:34 
GeneralRe: Missed another important timer Pin
rupen12-Mar-02 8:41
rupen12-Mar-02 8:41 
QuestionError in multimedia timer? Pin
3-Mar-02 15:48
suss3-Mar-02 15:48 
GeneralAbout Apc Pin
17-Jan-02 4:05
suss17-Jan-02 4:05 
GeneralRe: About Apc Pin
Nemanja Trifunovic17-Jan-02 5:23
Nemanja Trifunovic17-Jan-02 5:23 
GeneralRe: About Apc Pin
tom groezer31-May-07 11:04
tom groezer31-May-07 11:04 
QuestionWaitable Timer Section Error? Pin
Mark Kozel31-Dec-01 8:12
Mark Kozel31-Dec-01 8:12 
AnswerRe: Waitable Timer Section Error? Pin
Nemanja Trifunovic31-Dec-01 10:47
Nemanja Trifunovic31-Dec-01 10:47 
Generalunable to use QueueTimer Pin
4-Dec-01 18:42
suss4-Dec-01 18:42 
GeneralRe: unable to use QueueTimer Pin
Nemanja Trifunovic5-Dec-01 6:17
Nemanja Trifunovic5-Dec-01 6:17 
GeneralGreat article Pin
Trapper300119-Nov-01 5:47
Trapper300119-Nov-01 5:47 
GeneralGreat article but... Pin
TinBigTX14-Nov-01 6:44
TinBigTX14-Nov-01 6:44 
GeneralRe: Great article but... Pin
Nemanja Trifunovic14-Nov-01 6:54
Nemanja Trifunovic14-Nov-01 6:54 
GeneralRe: Great article but... Pin
kommon20-Nov-01 10:26
kommon20-Nov-01 10:26 
GeneralRe: Great article but... Pin
Nemanja Trifunovic20-Nov-01 10:54
Nemanja Trifunovic20-Nov-01 10:54 
GeneralCThreadTimer footnote Pin
21-Oct-01 19:27
suss21-Oct-01 19:27 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.