Manually resuming a thread
Big Bad Issue:
The callback function for threads libraries are usually a C-function pointer. As such the thread library depends on the callback having a C ABI (not a C++ ABI). This means the function you pass into the threading API must be declared:
extern &quot;C&quot; void* XXXX(void*); // Assuming return and take void* parameters.
                              // Which is basically all you can do with a C API.

Note the extern &quot;C&quot; must be there for it to be a valid C++ program.
You are using a static member function as your callback.
static DWORD WINAPI ThreadProc(LPVOID p)

It may look like it is working but this is just pure coincidence that the ABI for static member function happens to be the same on your platform as the ABI for C functions (there is no requirement in the standard). Nor do any OS that I know give guarantees that they will not change this ABI.
You should declare it like this:
// I also suspect the you are using windows
// They also have some special macro magic you may want to look at to force
// specific calling conventions.:
//
// __cdecl    =&gt;  One of those magic double underscore reserved identifiers.
// http://msdn.microsoft.com/en-us/library/kdzttdcb.aspx
//
extern &quot;C&quot; DWORD WINAPI ThreadProc(LPVOID p)
{
    CThread* pThreadObj = reinterpret_cast&lt;CThread *&gt;(p);
    return pThreadObj-&gt;Execute();
}

class CCreateRestorePointThread: public CThread
{
    friend DWORD WINAPI ThreadProc(LPVOID p);
    ...
};