<Todo: File Description> Message when Norton AV intercepts process

Posted on 2005-04-07
Last Modified: 2013-11-20

Hi experts,

This is a two part question (each part is worth half the total points offered).
This question might sound a bit difficult but I think is not that difficult, it's maybe a problem with naming my processes.Well, here is the description.
I have a MFC dialog application (VS.NET 2003) that copies files from source to target. The copy routine is a recursive function that basically "clones" the tree within source (files and sub-directories) into the target directory.
To do this, I create a working thread with AfxBeginThread(...) and I launch a Modal dialog from the main dialog (this is only to display a progress bar and a "Cancel" button). When large files being copied Norton AV displays its typical msg saying that a file is waiting to be scanned. The funny bit is that instead of showing the process name it says:
TODO: <File Description> is waiting for a virus scan of 'FILE.CAB'

Hence my question, where is "TODO: <File Description>" declared? How can I change that to my Apps name?
I'm using CopyFileEx to copy the files.
Another CopyFileEx related issue, when I cancel the copy process by pressing "cancel" on the modal dialog, the thread is finished with:

which in this case dwError == ERROR_REQUEST_ABORTED
on My main dialog thread, I retrieve this value with GetExitCodeThread and everything works fine. However, if I have my windows explorer open and pointing to the destination directory, it won't let me delete everything. I assume that the problem is that the CopyFileEx thread didn't release the last folder it was working on and that's why I cannot delete all? Any ideas and/or comments on this will be greatly appreciated.

Question by:Trancos
    LVL 16

    Accepted Solution

    >Hence my question, where is "TODO: <File Description>" declared? How can I change that to my Apps name?
    It is about the Version info set in your app's resource. Just go to your resources -> Version -> VS_VERSION_INFO and fill the FileDescription field
    LVL 3

    Expert Comment

    The AfxEndThread function must be called from within a thread to terminate the thread. If you're calling from outside the thread, your thread will not terminate. I will NOT recommend calling TerminateThread(). This function is unsafe and will not release any allocations of your thread. What you really want to do is to create some kind of syncronization object that tells your thread to end by calling AfxEndThread from within itself. Setting a bool and checking for value inside the thread is simplest, but if you want to have nice code, try creating an Event object that will signal to the thread to die.
    As far as the TODO, what nonubik said is correct. Change the info in your resource view under VERSION for the File Description.

    Hope this helps.

    LVL 1

    Author Comment


    Thanks a lot, that's help me. I therefore consider this part of the question as answered.

    Mactep13, thanks for your comments, however that's not the problem. I finish the working thread where CopyFileEx is working with AfxEndThread(dwError);
    This is ofcourse done withing the same thread, so everything is done according to "msdn rules", however, somehow the process doesn't unlock the last folder it was working on. I have tried ExitProcess(dwError) but this will end the whole application (which make sense, since I just managing different thread, not different processes). As for the synchronization objects, I tried to use CEvent, and then WaitforSingleObject(...), but it didn't work. After reading a bit more about CEvent, CSyncObject, and CSingleLock, I didn't really get the mechanism, so I decided to create a new message in my application. After all, I don't really need synchronizing, since I'm not accessing the same resource at anytime.
    LVL 16

    Expert Comment

    >This is ofcourse done withing the same thread, so everything is done according to "msdn rules",

    As you described, I see that when pressing 'Cancel' you somehow tell the worker thread to call AfxEndThread. Can you post some code?
    However, call AfxEndThread is not a clean solution and you can use, as mactep13 suggested, a bool variable that will be set on pressing 'Cancel' and will be read in the working thread loop and terminate the loop.
    LVL 1

    Author Comment

    Hi nonubik,

    I seem to have found the problem. Just to give you an idea of what was going on, here is a bit of code of my program and some comments to show the solution.


          dlg_Progress=new CProgressDlg(this,&g_bCancelOp);      

          //dlg_Progress->Create(IDD_PROGRESSDLG,this);  // Creates the dialog that will display a progress indicator and a Cancel Button
          dlg_Progress->DoModal();                            //This is a Modal dialog that doesn't close on "Cancel" clicked

    CopyFilesThread(LPVOID lpParam)    //The main function of the working thread
          CopySourceFiles(      csSourceDirectory,         // This function calls CopyFileEx with a CopyProgressRoutine
                csTargetDirectory,         // g_bCancelOp is checked inside CopyProgressRoutine, so that whenever
                gigabytes,                    // the use clicks on "Cancel" inside dlg_Progress, g_bCancelOp is updated and
                ResultCopyOp,             // CopyProgressRoutine sends a cancel message.
                (LPVOID*)pbProgress );

          if( ResultCopyOp.bError )      //Error detected
          return ResultCopyOp.dwErrorCode;      // Thread aborted or interrupted
          } else {
          SetCurrentDirectory(csSourceDirectory);     // Change directory to root
          return 0x259; // Thread Successful

    The problem I had is that as you can see from here, when the thread was interrupted by "g_bCancel", the CopySourceFile function didn't change directory and the "CopyFilesThread" function didn't either, so basically I just had to add "SetCurrentDirectory" the "Error detected" branch.

    finally, the main thread's catches the message with:
    OnCopyFinished(WPARAM wParam, LPARAM lParam)

       if( dwExitCode == ERROR_REQUEST_ABORTED || wParam || lParam )
          AfxMessageBox("Copying system files aborted");
       else{ ... }

    Thanks a lot anyway.

    Featured Post

    How your wiki can always stay up-to-date

    Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
    - Increase transparency
    - Onboard new hires faster
    - Access from mobile/offline

    Join & Write a Comment

    In this article, I'll describe -- and show pictures of -- some of the significant additions that have been made available to programmers in the MFC Feature Pack for Visual C++ 2008.  These same feature are in the MFC libraries that come with Visual …
    Introduction: Dynamic window placements and drawing on a form, simple usage of windows registry as a storage place for information. Continuing from the first article about sudoku.  There we have designed the application and put a lot of user int…
    This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
    Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.

    746 members asked questions and received personalized solutions in the past 7 days.

    Join the community of 500,000 technology professionals and ask your questions.

    Join & Ask a Question

    Need Help in Real-Time?

    Connect with top rated Experts

    18 Experts available now in Live!

    Get 1:1 Help Now