BITS原本是可以上传下载文件,下载功能也可以作为拷贝文件来使用,实际拷贝是通过后台服务完成, 这样就可以绕过一些杀软的行为检测
#include "stdafx.h"
#include <bits.h>
int _tmain(int argc, _TCHAR* argv[])
{
IBackgroundCopyJob* pJob;
BG_JOB_STATE State;
HANDLE hTimer = NULL;
LARGE_INTEGER liDueTime;
IBackgroundCopyManager* pManager;
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
hr = CoCreateInstance(__uuidof(BackgroundCopyManager),
NULL,
CLSCTX_LOCAL_SERVER,
__uuidof(IBackgroundCopyManager),
(void**)&pManager);
// Create the BITS job
GUID guidJob;
IBackgroundCopyJob* pBackgroundCopyJob;
hr = pManager->CreateJob(L"TransferPolicy",
BG_JOB_TYPE_DOWNLOAD,
&guidJob,
(IBackgroundCopyJob **)&pBackgroundCopyJob);
typedef struct _BG_FILE_INFO {
LPWSTR RemoteName;
LPWSTR LocalName;
} BG_FILE_INFO;
BG_FILE_INFO bg = { L"d:\\1.txt", L"d:\\2.txt" };
// add job
hr = pBackgroundCopyJob->AddFile(bg.RemoteName,bg.LocalName);
hr = pBackgroundCopyJob->Resume();
liDueTime.QuadPart = -10000000; //Poll every 1 second
hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
SetWaitableTimer(hTimer, &liDueTime, 1000, NULL, NULL, 0);
do
{
WaitForSingleObject(hTimer, INFINITE);
pBackgroundCopyJob->GetState(&State);
if (BG_JOB_STATE_TRANSFERRED == State)
pBackgroundCopyJob->Complete();
} while (BG_JOB_STATE_TRANSFERRED == State);
CancelWaitableTimer(hTimer);
CloseHandle(hTimer);
pBackgroundCopyJob->Release();
pBackgroundCopyJob = NULL;
return 0;
}