Merge from Wine:

- Add traces at the start of functions
- (reported by Matthew Davison)
  Preserve the spaces before an opening quote in the middle of a token.
- Matthew Davison <mjd77@cam.ac.uk>
  Stub out the error dialog functions.
  Modify the default callbacks to call these for Delete and Rename errors.
  Modify the default callbacks to ignore file missing errors when deleting files.
- Stefan Huehner <stefan@huehner.org>
  Fix some more -Wmissing-declarations warnings.
- Mike McCormack <mike@codeweavers.com>
  gcc 4.0 -Wpointer-sign fixes (Reg* functions).
- Detlef Riekenberg <wine.dev@web.de>
  SetupSetFileQueueAlternatePlatform{AW} implemented as stub.

svn path=/trunk/; revision=16931
This commit is contained in:
Hervé Poussineau 2005-08-01 07:46:06 +00:00
parent 15a077c46a
commit 515aaf6a7e
7 changed files with 157 additions and 36 deletions

View file

@ -668,6 +668,14 @@ DECL_WINELIB_SETUPAPI_TYPE_AW(PFILEPATHS)
#define SPDRP_MAXIMUM_PROPERTY 0x00000023
/* Return values for SetupCopyError/SetupDeleteError/SetupRenameError */
#define DPROMPT_SUCCESS 0x00000000
#define DPROMPT_CANCEL 0x00000001
#define DPROMPT_SKIPFILE 0x00000002
#define DPROMPT_BUFFERTOOSMALL 0x00000003
#define DPROMPT_OUTOFMEMORY 0x00000004
/* Flags for StringTableAddString and StringTableLookUpString */
#define ST_CASE_SENSITIVE_COMPARE 0x00000001
@ -702,9 +710,15 @@ void WINAPI SetupCloseInfFile( HINF hinf );
BOOL WINAPI SetupCommitFileQueueA( HWND, HSPFILEQ, PSP_FILE_CALLBACK_A, PVOID );
BOOL WINAPI SetupCommitFileQueueW( HWND, HSPFILEQ, PSP_FILE_CALLBACK_W, PVOID );
#define SetupCommitFileQueue WINELIB_NAME_AW(SetupCommitFileQueue)
UINT WINAPI SetupCopyErrorA( HWND, PCSTR, PCSTR, PCSTR, PCSTR, PCSTR, UINT, DWORD, PSTR, DWORD, PDWORD );
UINT WINAPI SetupCopyErrorW( HWND, PCWSTR, PCWSTR, PCWSTR, PCWSTR, PCWSTR, UINT, DWORD, PWSTR, DWORD, PDWORD );
#define SetupCopyError WINELIB_NAME_AW(SetupCopyError)
UINT WINAPI SetupDefaultQueueCallbackA( PVOID, UINT, UINT_PTR, UINT_PTR );
UINT WINAPI SetupDefaultQueueCallbackW( PVOID, UINT, UINT_PTR, UINT_PTR );
#define SetupDefaultQueueCallback WINELIB_NAME_AW(SetupDefaultQueueCallback)
UINT WINAPI SetupDeleteErrorA( HWND, PCSTR, PCSTR, UINT, DWORD );
UINT WINAPI SetupDeleteErrorW( HWND, PCWSTR, PCWSTR, UINT, DWORD );
#define SetupDeleteError WINELIB_NAME_AW(SetupDeleteError)
BOOL WINAPI SetupDiBuildClassInfoList(DWORD, LPGUID, DWORD, PDWORD);
BOOL WINAPI SetupDiBuildClassInfoListExA(DWORD, LPGUID, DWORD, PDWORD, PCSTR, PVOID);
BOOL WINAPI SetupDiBuildClassInfoListExW(DWORD, LPGUID, DWORD, PDWORD, PCWSTR, PVOID);
@ -831,6 +845,9 @@ BOOL WINAPI SetupQueueRenameW( HSPFILEQ, PCWSTR, PCWSTR, PCWSTR, PCWSTR );
BOOL WINAPI SetupQueueRenameSectionA( HSPFILEQ, HINF, HINF, PCSTR );
BOOL WINAPI SetupQueueRenameSectionW( HSPFILEQ, HINF, HINF, PCWSTR );
#define SetupQueueRenameSection WINELIB_NAME_AW(SetupQueueRenameSection)
UINT WINAPI SetupRenameErrorA( HWND, PCSTR, PCSTR, PCSTR, UINT, DWORD );
UINT WINAPI SetupRenameErrorW( HWND, PCWSTR, PCWSTR, PCWSTR, UINT, DWORD );
#define SetupRenameError WINELIB_NAME_AW(SetupRenameError)
BOOL WINAPI SetupScanFileQueueA( HSPFILEQ, DWORD, HWND, PSP_FILE_CALLBACK_A, PVOID, PDWORD );
BOOL WINAPI SetupScanFileQueueW( HSPFILEQ, DWORD, HWND, PSP_FILE_CALLBACK_W, PVOID, PDWORD );
#define SetupScanFileQueue WINELIB_NAME_AW(SetupScanFileQueue)

View file

@ -25,7 +25,6 @@
#include "wingdi.h"
#include "winuser.h"
#include "winreg.h"
#include "winver.h"
#include "setupapi.h"
#include "wine/unicode.h"
@ -162,7 +161,7 @@ LONG WINAPI QueryRegistryValue(HKEY hKey,
{
LONG lError;
TRACE("%lx %s %p %p %p\n",
TRACE("%p %s %p %p %p\n",
hKey, debugstr_w(lpValueName), lpData, lpType, lpcbData);
/* Get required buffer size */
@ -284,7 +283,7 @@ LPWSTR WINAPI MultiByteToUnicode(LPCSTR lpMultiByteStr, UINT uCodePage)
LPWSTR lpUnicodeStr;
int nLength;
TRACE("%s %lu\n", debugstr_a(lpMultiByteStr), uCodePage);
TRACE("%s %d\n", debugstr_a(lpMultiByteStr), uCodePage);
nLength = MultiByteToWideChar(uCodePage, 0, lpMultiByteStr,
-1, NULL, 0);
@ -327,7 +326,7 @@ LPSTR WINAPI UnicodeToMultiByte(LPCWSTR lpUnicodeStr, UINT uCodePage)
LPSTR lpMultiByteStr;
int nLength;
TRACE("%s %lu\n", debugstr_w(lpUnicodeStr), uCodePage);
TRACE("%s %d\n", debugstr_w(lpUnicodeStr), uCodePage);
nLength = WideCharToMultiByte(uCodePage, 0, lpUnicodeStr, -1,
NULL, 0, NULL, NULL);
@ -667,7 +666,7 @@ DWORD WINAPI OpenAndMapFileForRead(LPCWSTR lpFileName,
*/
BOOL WINAPI UnmapAndCloseFile(HANDLE hFile, HANDLE hMapping, LPVOID lpBuffer)
{
TRACE("%x %x %p\n",
TRACE("%p %p %p\n",
hFile, hMapping, lpBuffer);
if (!UnmapViewOfFile(lpBuffer))

View file

@ -647,7 +647,7 @@ static const WCHAR *key_name_state( struct parser *parser, const WCHAR *pos )
set_state( parser, COMMENT );
return p + 1;
case '"':
push_token( parser, token_end );
push_token( parser, p );
parser->start = p + 1;
push_state( parser, KEY_NAME );
set_state( parser, QUOTES );
@ -699,7 +699,7 @@ static const WCHAR *value_name_state( struct parser *parser, const WCHAR *pos )
set_state( parser, LEADING_SPACES );
return p + 1;
case '"':
push_token( parser, token_end );
push_token( parser, p );
parser->start = p + 1;
push_state( parser, VALUE_NAME );
set_state( parser, QUOTES );

View file

@ -979,8 +979,8 @@ BOOL static do_file_copyW( LPCWSTR source, LPCWSTR target, DWORD style)
if ((GetFileAttributesW(target) != INVALID_FILE_ATTRIBUTES) &&
(GetFileAttributesW(source) != INVALID_FILE_ATTRIBUTES))
{
VersionSizeSource = GetFileVersionInfoSizeW((LPWSTR)source,&zero);
VersionSizeTarget = GetFileVersionInfoSizeW((LPWSTR)target,&zero);
VersionSizeSource = GetFileVersionInfoSizeW(source,&zero);
VersionSizeTarget = GetFileVersionInfoSizeW(target,&zero);
}
TRACE("SizeTarget %li ... SizeSource %li\n",VersionSizeTarget,
@ -999,9 +999,9 @@ BOOL static do_file_copyW( LPCWSTR source, LPCWSTR target, DWORD style)
VersionSource = HeapAlloc(GetProcessHeap(),0,VersionSizeSource);
VersionTarget = HeapAlloc(GetProcessHeap(),0,VersionSizeTarget);
ret = GetFileVersionInfoW((LPWSTR)source,0,VersionSizeSource,VersionSource);
ret = GetFileVersionInfoW(source,0,VersionSizeSource,VersionSource);
if (ret)
ret = GetFileVersionInfoW((LPWSTR)target, 0, VersionSizeTarget,
ret = GetFileVersionInfoW(target, 0, VersionSizeTarget,
VersionTarget);
if (ret)
@ -1267,6 +1267,26 @@ BOOL WINAPI SetupSetFileQueueFlags( HSPFILEQ handle, DWORD mask, DWORD flags )
}
/***********************************************************************
* SetupSetFileQueueAlternatePlatformA (SETUPAPI.@)
*/
BOOL WINAPI SetupSetFileQueueAlternatePlatformA(HSPFILEQ handle, PSP_ALTPLATFORM_INFO platform, PCSTR catalogfile)
{
FIXME("(%p, %p, %s) stub!\n", handle, platform, debugstr_a(catalogfile));
return FALSE;
}
/***********************************************************************
* SetupSetFileQueueAlternatePlatformW (SETUPAPI.@)
*/
BOOL WINAPI SetupSetFileQueueAlternatePlatformW(HSPFILEQ handle, PSP_ALTPLATFORM_INFO platform, PCWSTR catalogfile)
{
FIXME("(%p, %p, %s) stub!\n", handle, platform, debugstr_w(catalogfile));
return FALSE;
}
/***********************************************************************
* SetupInitDefaultQueueCallback (SETUPAPI.@)
*/
@ -1310,6 +1330,7 @@ UINT WINAPI SetupDefaultQueueCallbackA( PVOID context, UINT notification,
UINT_PTR param1, UINT_PTR param2 )
{
FILEPATHS_A *paths = (FILEPATHS_A *)param1;
struct default_callback_context *ctx = (struct default_callback_context *)context;
switch(notification)
{
@ -1332,7 +1353,9 @@ UINT WINAPI SetupDefaultQueueCallbackA( PVOID context, UINT notification,
TRACE( "end delete %s\n", debugstr_a(paths->Target) );
return 0;
case SPFILENOTIFY_DELETEERROR:
ERR( "delete error %d %s\n", paths->Win32Error, debugstr_a(paths->Target) );
/*Windows Ignores attempts to delete files / folders which do not exist*/
if ((paths->Win32Error != ERROR_FILE_NOT_FOUND) && (paths->Win32Error != ERROR_PATH_NOT_FOUND))
SetupDeleteErrorA(ctx->owner, NULL, paths->Target, paths->Win32Error, 0);
return FILEOP_SKIP;
case SPFILENOTIFY_STARTRENAME:
TRACE( "start rename %s -> %s\n", debugstr_a(paths->Source), debugstr_a(paths->Target) );
@ -1341,8 +1364,7 @@ UINT WINAPI SetupDefaultQueueCallbackA( PVOID context, UINT notification,
TRACE( "end rename %s -> %s\n", debugstr_a(paths->Source), debugstr_a(paths->Target) );
return 0;
case SPFILENOTIFY_RENAMEERROR:
ERR( "rename error %d %s -> %s\n", paths->Win32Error,
debugstr_a(paths->Source), debugstr_a(paths->Target) );
SetupRenameErrorA(ctx->owner, NULL, paths->Source, paths->Target, paths->Win32Error, 0);
return FILEOP_SKIP;
case SPFILENOTIFY_STARTCOPY:
TRACE( "start copy %s -> %s\n", debugstr_a(paths->Source), debugstr_a(paths->Target) );
@ -1372,6 +1394,7 @@ UINT WINAPI SetupDefaultQueueCallbackW( PVOID context, UINT notification,
UINT_PTR param1, UINT_PTR param2 )
{
FILEPATHS_W *paths = (FILEPATHS_W *)param1;
struct default_callback_context *ctx = (struct default_callback_context *)context;
switch(notification)
{
@ -1394,10 +1417,12 @@ UINT WINAPI SetupDefaultQueueCallbackW( PVOID context, UINT notification,
TRACE( "end delete %s\n", debugstr_w(paths->Target) );
return 0;
case SPFILENOTIFY_DELETEERROR:
ERR( "delete error %d %s\n", paths->Win32Error, debugstr_w(paths->Target) );
/*Windows Ignores attempts to delete files / folders which do not exist*/
if ((paths->Win32Error != ERROR_FILE_NOT_FOUND) && (paths->Win32Error != ERROR_PATH_NOT_FOUND))
SetupDeleteErrorW(ctx->owner, NULL, paths->Target, paths->Win32Error, 0);
return FILEOP_SKIP;
case SPFILENOTIFY_STARTRENAME:
TRACE( "start rename %s -> %s\n", debugstr_w(paths->Source), debugstr_w(paths->Target) );
SetupRenameErrorW(ctx->owner, NULL, paths->Source, paths->Target, paths->Win32Error, 0);
return FILEOP_DOIT;
case SPFILENOTIFY_ENDRENAME:
TRACE( "end rename %s -> %s\n", debugstr_w(paths->Source), debugstr_w(paths->Target) );
@ -1425,3 +1450,80 @@ UINT WINAPI SetupDefaultQueueCallbackW( PVOID context, UINT notification,
}
return 0;
}
/***********************************************************************
* SetupDeleteErrorA (SETUPAPI.@)
*/
UINT WINAPI SetupDeleteErrorA( HWND parent, PCSTR dialogTitle, PCSTR file,
UINT w32error, DWORD style)
{
FIXME( "stub: (Error Number %d when attempting to delete %s)\n",
w32error, debugstr_a(file) );
return DPROMPT_SKIPFILE;
}
/***********************************************************************
* SetupDeleteErrorW (SETUPAPI.@)
*/
UINT WINAPI SetupDeleteErrorW( HWND parent, PCWSTR dialogTitle, PCWSTR file,
UINT w32error, DWORD style)
{
FIXME( "stub: (Error Number %d when attempting to delete %s)\n",
w32error, debugstr_w(file) );
return DPROMPT_SKIPFILE;
}
/***********************************************************************
* SetupRenameErrorA (SETUPAPI.@)
*/
UINT WINAPI SetupRenameErrorA( HWND parent, PCSTR dialogTitle, PCSTR source,
PCSTR target, UINT w32error, DWORD style)
{
FIXME( "stub: (Error Number %d when attempting to rename %s to %s)\n",
w32error, debugstr_a(source), debugstr_a(target));
return DPROMPT_SKIPFILE;
}
/***********************************************************************
* SetupRenameErrorW (SETUPAPI.@)
*/
UINT WINAPI SetupRenameErrorW( HWND parent, PCWSTR dialogTitle, PCWSTR source,
PCWSTR target, UINT w32error, DWORD style)
{
FIXME( "stub: (Error Number %d when attempting to rename %s to %s)\n",
w32error, debugstr_w(source), debugstr_w(target));
return DPROMPT_SKIPFILE;
}
/***********************************************************************
* SetupCopyErrorA (SETUPAPI.@)
*/
UINT WINAPI SetupCopyErrorA( HWND parent, PCSTR dialogTitle, PCSTR diskname,
PCSTR sourcepath, PCSTR sourcefile, PCSTR targetpath,
UINT w32error, DWORD style, PSTR pathbuffer,
DWORD buffersize, PDWORD requiredsize)
{
FIXME( "stub: (Error Number %d when attempting to copy file %s from %s to %s)\n",
w32error, debugstr_a(sourcefile), debugstr_a(sourcepath) ,debugstr_a(targetpath));
return DPROMPT_SKIPFILE;
}
/***********************************************************************
* SetupCopyErrorW (SETUPAPI.@)
*/
UINT WINAPI SetupCopyErrorW( HWND parent, PCWSTR dialogTitle, PCWSTR diskname,
PCWSTR sourcepath, PCWSTR sourcefile, PCWSTR targetpath,
UINT w32error, DWORD style, PWSTR pathbuffer,
DWORD buffersize, PDWORD requiredsize)
{
FIXME( "stub: (Error Number %d when attempting to copy file %s from %s to %s)\n",
w32error, debugstr_w(sourcefile), debugstr_w(sourcepath) ,debugstr_w(targetpath));
return DPROMPT_SKIPFILE;
}

View file

@ -248,11 +248,10 @@
@ stdcall SetupCloseFileQueue(ptr)
@ stdcall SetupCloseInfFile(long)
@ stub SetupCloseLog
@ stdcall SetupCommitFileQueue(long long ptr ptr) SetupCommitFileQueueW
@ stdcall SetupCommitFileQueueA(long long ptr ptr)
@ stdcall SetupCommitFileQueueW(long long ptr ptr)
@ stub SetupCopyErrorA
@ stub SetupCopyErrorW
@ stdcall SetupCopyErrorA(long str str str str str long long str long ptr)
@ stdcall SetupCopyErrorW(long wstr wstr wstr wstr wstr long long wstr long ptr)
@ stdcall SetupCopyOEMInfA(str str long long ptr long ptr ptr)
@ stdcall SetupCopyOEMInfW(wstr wstr long long ptr long ptr ptr)
@ stdcall SetupCreateDiskSpaceListA(ptr long long)
@ -262,8 +261,8 @@
@ stub SetupDefaultQueueCallback
@ stdcall SetupDefaultQueueCallbackA(ptr long long long)
@ stdcall SetupDefaultQueueCallbackW(ptr long long long)
@ stub SetupDeleteErrorA
@ stub SetupDeleteErrorW
@ stdcall SetupDeleteErrorA(long str str long long)
@ stdcall SetupDeleteErrorW(long wstr wstr long long)
@ stdcall SetupDestroyDiskSpaceList(long)
@ stub SetupDiAskForOEMDisk
@ stdcall SetupDiBuildClassInfoList(long ptr long ptr)
@ -494,8 +493,8 @@
@ stub SetupRemoveInstallSectionFromDiskSpaceListW
@ stub SetupRemoveSectionFromDiskSpaceListA
@ stub SetupRemoveSectionFromDiskSpaceListW
@ stub SetupRenameErrorA
@ stub SetupRenameErrorW
@ stdcall SetupRenameErrorA(long str str str long long)
@ stdcall SetupRenameErrorW(long wstr wstr wstr long long)
@ stub SetupScanFileQueue
@ stdcall SetupScanFileQueueA(long long long ptr ptr ptr)
@ stdcall SetupScanFileQueueW(long long long ptr ptr ptr)
@ -503,8 +502,8 @@
@ stub SetupSetDirectoryIdExA
@ stub SetupSetDirectoryIdExW
@ stdcall SetupSetDirectoryIdW(long long wstr)
@ stub SetupFileQueueAlternatePlatformA
@ stub SetupFileQueueAlternatePlatformW
@ stdcall SetupSetFileQueueAlternatePlatformA(ptr ptr str)
@ stdcall SetupSetFileQueueAlternatePlatformW(ptr ptr wstr)
@ stdcall SetupSetFileQueueFlags(long long long)
@ stub SetupSetPlatformPathOverrideA
@ stub SetupSetPlatformPathOverrideW

View file

@ -300,7 +300,7 @@ void SETUPX_CreateStandardLDDs(void)
len = MAX_PATH;
if ( (hKey) && (LDID_Data[n].RegValName)
&& (RegQueryValueExA(hKey, LDID_Data[n].RegValName,
NULL, &type, buffer, &len) == ERROR_SUCCESS)
NULL, &type, (LPBYTE)buffer, &len) == ERROR_SUCCESS)
&& (type == REG_SZ) )
{
TRACE("found value '%s' for LDID %d\n", buffer, n);

View file

@ -218,7 +218,7 @@ static LPVIRTNODE *pvnlist = NULL;
static DWORD vn_num = 0;
static DWORD vn_last = 0;
RETERR16 VCP_VirtnodeCreate(LPVCPFILESPEC vfsSrc, LPVCPFILESPEC vfsDst, WORD fl, LPARAM lParam, LPEXPANDVTBL lpExpandVtbl)
static RETERR16 VCP_VirtnodeCreate(LPVCPFILESPEC vfsSrc, LPVCPFILESPEC vfsDst, WORD fl, LPARAM lParam, LPEXPANDVTBL lpExpandVtbl)
{
HANDLE heap;
LPVIRTNODE lpvn;
@ -266,7 +266,8 @@ RETERR16 VCP_VirtnodeCreate(LPVCPFILESPEC vfsSrc, LPVCPFILESPEC vfsDst, WORD fl,
return OK;
}
BOOL VCP_VirtnodeDelete(LPVIRTNODE lpvnDel)
#if 0
static BOOL VCP_VirtnodeDelete(LPVIRTNODE lpvnDel)
{
DWORD n;
RETERR16 cbres;
@ -283,6 +284,7 @@ BOOL VCP_VirtnodeDelete(LPVIRTNODE lpvnDel)
}
return FALSE;
}
#endif
/***********************************************************************
* VcpOpen (SETUPX.200)
@ -452,7 +454,7 @@ LPCSTR WINAPI VcpExplain16(LPVIRTNODE lpVn, DWORD dwWhat)
return buffer;
}
RETERR16 VCP_CheckPaths(void)
static RETERR16 VCP_CheckPaths(void)
{
DWORD n;
LPVIRTNODE lpvn;
@ -470,7 +472,7 @@ RETERR16 VCP_CheckPaths(void)
return OK;
}
RETERR16 VCP_CopyFiles(void)
static RETERR16 VCP_CopyFiles(void)
{
char fn_src[MAX_PATH], fn_dst[MAX_PATH];
RETERR16 res = OK, cbres;
@ -559,7 +561,8 @@ RETERR16 WINAPI VcpClose16(WORD fl, LPCSTR lpszBackupDest)
return OK;
}
RETERR16 VCP_RenameFiles(void)
#if 0
static RETERR16 VCP_RenameFiles(void)
{
char fn_src[MAX_PATH], fn_dst[MAX_PATH];
RETERR16 res = OK, cbres;
@ -582,6 +585,7 @@ RETERR16 VCP_RenameFiles(void)
cbres = VCP_Callback(&vcp_status, VCPM_VSTATRENAMEEND, 0, 0, VCP_MsgRef);
return res;
}
#endif
/***********************************************************************
* vcpDefCallbackProc (SETUPX.202)
@ -616,7 +620,7 @@ static INT_PTR CALLBACK VCP_UI_FileCopyDlgProc(HWND hWndDlg, UINT iMsg, WPARAM w
return retval;
}
BOOL VCP_UI_GetDialogTemplate(LPCVOID *template32)
static BOOL VCP_UI_GetDialogTemplate(LPCVOID *template32)
{
HRSRC hResInfo;
HGLOBAL hDlgTmpl32;
@ -646,7 +650,7 @@ VCP_UI_FileCopyWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return 0;
}
void VCP_UI_RegisterProgressClass(void)
static void VCP_UI_RegisterProgressClass(void)
{
static BOOL registered = FALSE;
WNDCLASSA wndClass;
@ -667,7 +671,7 @@ void VCP_UI_RegisterProgressClass(void)
RegisterClassA (&wndClass);
}
RETERR16 VCP_UI_NodeCompare(LPVIRTNODE vn1, LPVIRTNODE vn2)
static RETERR16 VCP_UI_NodeCompare(LPVIRTNODE vn1, LPVIRTNODE vn2)
{
LPCSTR file1, file2;
file1 = vsmGetStringRawName16(vn1->vfsSrc.vhstrFileName);
@ -675,7 +679,7 @@ RETERR16 VCP_UI_NodeCompare(LPVIRTNODE vn1, LPVIRTNODE vn2)
return (RETERR16)strcmp(file1, file2);
}
RETERR16 VCP_UI_CopyStart(void)
static RETERR16 VCP_UI_CopyStart(void)
{
LPCVOID template32;
char buf[256]; /* plenty */
@ -715,7 +719,7 @@ RETERR16 VCP_UI_CopyStart(void)
if (RegSetValueExA(hKeyConflict, "Dirty", 0, REG_BINARY, (LPBYTE)&dirty, 1))
return VCPN_FAIL;
len = 12;
if (!(RegQueryValueExA(hKeyConflict, "BackupDirectory", NULL, 0, BackupDir, &len)))
if (!(RegQueryValueExA(hKeyConflict, "BackupDirectory", NULL, 0, (LPBYTE)BackupDir, &len)))
strcpy(BackupDir, "VCM");
/* create C:\WINDOWS\[BackupDir] and set registry key to it */