#include "pch.h" #pragma hdrstop #include "lib3.h" #include "assert.h" //this variable is used as the receiver of the BytesReturned for DeviceIoControl Calls //the value is never actually used...it is declared in lib3.c extern ULONG DummyBytesReturned; /* assert/debug stuff */ AssertData; AssertError; #define MAX_USERNAME 8 // this is not used any more // error codes on which we decide that we are in disconnected state static const DWORD rgdwErrorTab[] = { ERROR_BAD_NETPATH ,ERROR_NETWORK_BUSY ,ERROR_REM_NOT_LIST ,ERROR_DEV_NOT_EXIST ,ERROR_ADAP_HDW_ERR ,ERROR_BAD_NET_RESP ,ERROR_UNEXP_NET_ERR ,ERROR_BAD_REM_ADAP ,ERROR_BAD_NET_NAME ,ERROR_TOO_MANY_NAMES ,ERROR_TOO_MANY_SESS ,ERROR_NO_NET_OR_BAD_PATH ,ERROR_NETNAME_DELETED ,ERROR_NETWORK_UNREACHABLE }; typedef struct tagREINT_IO { HANDLE hShadowDBAsync; OVERLAPPED sOverlapped; } REINT_IO, *LPREINT_IO; /*--------------------------- Widecharacter APIs ----------------------------------------*/ /***************************************************************************** * GetUNCPath(). Pass in hShare, hDir, hShadow and get a LPCOPYPARAMS * filled out fully. */ int GetUNCPathW( HANDLE hShadowDB, HSHARE hShare, HSHADOW hDir, HSHADOW hShadow, LPCOPYPARAMSW lpCP ) { int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } lpCP->uOp = 0; // this means we are looking for a local path of the driveletter kind // ie. c:\winnt\csc\80000002. That is the only kind that any // usermode code should want // on nt it can be \dosdevice\harddisk0\winnt\csc\80000002 lpCP->hShare = hShare; lpCP->hDir = hDir; lpCP->hShadow = hShadow; iRet = DeviceIoControl( hShadowDB, IOCTL_SHADOW_GET_UNC_PATH, (LPVOID)(lpCP), 0, NULL, 0, &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(lpCP->dwError); } return (iRet); } /***************************************************************************** */ int ChkUpdtStatusW( HANDLE hShadowDB, unsigned long hDir, unsigned long hShadow, LPWIN32_FIND_DATAW lpFind32, unsigned long *lpulShadowStatus ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.hShadow = hShadow; sSI.lpFind32 = lpFind32; if(DeviceIoControl(hShadowDB , IOCTL_SHADOW_CHK_UPDT_STATUS ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL)) { *lpulShadowStatus = sSI.uStatus; iRet = 1; } else { *lpulShadowStatus = 0; iRet = 0; } if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return (iRet); } int GetShareInfoW( HANDLE hShadowDB, HSHARE hShare, LPSHAREINFOW lpSVRI, unsigned long *lpulStatus ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.hShare = hShare; sSI.lpFind32 = (WIN32_FIND_DATAW *)lpSVRI; iRet = DeviceIoControl(hShadowDB , IOCTL_GET_SHARE_STATUS ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if(iRet) *lpulStatus = sSI.uStatus; else *lpulStatus = 0; if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return iRet; } BOOL CopyShadowA( HANDLE hShadowDB, HSHADOW hDir, HSHADOW hShadow, LPSTR lpszFileName ) { SHADOWINFO sSI; int iRet, len; BOOL fDBOpened = FALSE; WIN32_FIND_DATAA sFind32; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(sFind32.cFileName, 0, sizeof(sFind32.cFileName)); len = min(sizeof(sFind32.cFileName)-1,strlen(lpszFileName)); strncpy(sFind32.cFileName, lpszFileName, len); sFind32.dwFileAttributes = FILE_ATTRIBUTE_SYSTEM; // to make it explicit sSI.hDir = hDir; sSI.hShadow = hShadow; sSI.uOp = SHADOW_COPY_INODE_FILE; sSI.lpFind32 = (WIN32_FIND_DATAW *)&sFind32; iRet = DeviceIoControl(hShadowDB, IOCTL_DO_SHADOW_MAINTENANCE, (LPVOID)&(sSI), 0, NULL, 0, &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (iRet) { iRet = SetFileAttributesA(lpszFileName, 0); } if (!iRet) { DeleteFileA(lpszFileName); SetLastError(sSI.dwError); } return (iRet); } /***************************************************************************** * GetUNCPath(). Pass in hShare, hDir, hShadow and get a LPCOPYPARAMS * filled out fully. */ int GetUNCPathA( HANDLE hShadowDB, HSHARE hShare, HSHADOW hDir, HSHADOW hShadow, LPCOPYPARAMSA lpCP ) { int iRet = 0; LPCOPYPARAMSW lpCPW; if (lpCPW = LpAllocCopyParamsW()) { iRet = GetUNCPathW(hShadowDB, hShare, hDir, hShadow, lpCPW); if (iRet == 1) { ConvertCopyParamsFromUnicodeToAnsi(lpCPW, lpCP); } FreeCopyParamsW(lpCPW); } return (iRet); } /***************************************************************************** */ int ChkUpdtStatusA( HANDLE hShadowDB, unsigned long hDir, unsigned long hShadow, LPWIN32_FIND_DATAA lpFind32, unsigned long *lpulShadowStatus ) { WIN32_FIND_DATAW sFind32W; int iRet; iRet = ChkUpdtStatusW(hShadowDB, hDir, hShadow, (lpFind32)?&sFind32W:NULL, lpulShadowStatus); if ((iRet == 1) && lpFind32) { Find32WToFind32A(&sFind32W, lpFind32); } return (iRet); } int GetShareInfoA( HANDLE hShadowDB, HSHARE hShare, LPSHAREINFOA lpSVRI, unsigned long *lpulStatus ) { int iRet; SHAREINFOW sShareInfoW; iRet = GetShareInfoW(hShadowDB, hShare, (lpSVRI)?&sShareInfoW:NULL, lpulStatus); if ((iRet==1) && lpSVRI) { ShareInfoWToShareInfoA(&sShareInfoW, lpSVRI); } return iRet; } BOOL CopyShadowW( HANDLE hShadowDB, HSHADOW hDir, HSHADOW hShadow, LPWSTR lpwFileName ) { char chBuff[MAX_PATH]; memset(chBuff, 0, sizeof(chBuff)); WideCharToMultiByte(CP_ACP, 0, lpwFileName, wcslen(lpwFileName), chBuff, MAX_PATH, NULL, NULL); return (CopyShadowA(INVALID_HANDLE_VALUE, hDir, hShadow, chBuff)); } /***************************************************************************** * Cache maintenance ioctl */ int DoShadowMaintenance( HANDLE hShadowDB, unsigned long uOp ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } sSI.uOp = uOp; iRet = DeviceIoControl(hShadowDB, IOCTL_DO_SHADOW_MAINTENANCE, (LPVOID)&(sSI), 0, NULL, 0, &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return (iRet); } int SetMaxShadowSpace( HANDLE hShadowDB, long nFileSizeHigh, long nFileSizeLow ) { SHADOWINFO sSI; WIN32_FIND_DATAW sFind32; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sFind32, 0, sizeof(WIN32_FIND_DATAW)); memset(&sSI, 0, sizeof(SHADOWINFO)); sFind32.nFileSizeHigh = nFileSizeHigh; sFind32.nFileSizeLow = nFileSizeLow; sSI.lpFind32 = &sFind32; sSI.uOp = SHADOW_SET_MAX_SPACE; iRet = DeviceIoControl(hShadowDB , IOCTL_DO_SHADOW_MAINTENANCE ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return (iRet); } BOOL PurgeUnpinnedFiles( HANDLE hShadowDB, LONG Timeout, PULONG pnFiles, PULONG pnYoungFiles) { SHADOWINFO sSI; WIN32_FIND_DATAW sFind32; BOOL fDBOpened = FALSE; BOOL bRet; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sFind32, 0, sizeof(WIN32_FIND_DATAW)); memset(&sSI, 0, sizeof(SHADOWINFO)); sFind32.nFileSizeHigh = Timeout; sSI.lpFind32 = &sFind32; sSI.uOp = SHADOW_PURGE_UNPINNED_FILES; bRet = DeviceIoControl( hShadowDB, IOCTL_DO_SHADOW_MAINTENANCE, (LPVOID)(&sSI), 0, NULL, 0, &DummyBytesReturned, NULL); if (fDBOpened) CloseShadowDatabaseIO(hShadowDB); if (bRet == TRUE) { *pnFiles = sFind32.nFileSizeHigh; *pnYoungFiles = sFind32.nFileSizeLow; } return (bRet); } BOOL ShareIdToShareName( HANDLE hShadowDB, ULONG ShareId, PBYTE Buffer, LPDWORD pBufSize) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) return 0; fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.hShare = ShareId; sSI.lpBuffer = (LPVOID)(Buffer); sSI.cbBufferSize = *pBufSize; iRet = DeviceIoControl( hShadowDB, IOCTL_SHAREID_TO_SHARENAME, (LPVOID)(&sSI), 0, NULL, 0, &DummyBytesReturned, NULL); if (fDBOpened) CloseShadowDatabaseIO(hShadowDB); if (!iRet) { *pBufSize = sSI.cbBufferSize; SetLastError(sSI.dwError); } return (iRet); } /***************************************************************************** * Priority queue enumerators */ int BeginPQEnum( HANDLE hShadowDB, LPPQPARAMS lpPQP ) { return DeviceIoControl(hShadowDB, IOCTL_SHADOW_BEGIN_PQ_ENUM ,(LPVOID)(lpPQP), 0, NULL, 0, &DummyBytesReturned, NULL); } int NextPriShadow( HANDLE hShadowDB, LPPQPARAMS lpPQP ) { return DeviceIoControl(hShadowDB, IOCTL_SHADOW_NEXT_PRI_SHADOW ,(LPVOID)(lpPQP), 0, NULL, 0, &DummyBytesReturned, NULL); } int PrevPriShadow( HANDLE hShadowDB, LPPQPARAMS lpPQP ) { return DeviceIoControl(hShadowDB, IOCTL_SHADOW_PREV_PRI_SHADOW ,(LPVOID)(lpPQP), 0, NULL, 0, &DummyBytesReturned, NULL); } int EndPQEnum( HANDLE hShadowDB, LPPQPARAMS lpPQP ) { return DeviceIoControl(hShadowDB, IOCTL_SHADOW_END_PQ_ENUM ,(LPVOID)(lpPQP), 0, NULL, 0, &DummyBytesReturned, NULL); } /***************************************************************************** * FreeShadowSpace(). Pass in lpFind32 with filesize stuff filled out?. * tHACK: not a very elegant interface. */ int FreeShadowSpace( HANDLE hShadowDB, long nFileSizeHigh, long nFileSizeLow, BOOL fClearAll ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; WIN32_FIND_DATAW sFind32; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); memset(&sFind32, 0, sizeof(sFind32)); sFind32.nFileSizeHigh = nFileSizeHigh; sFind32.nFileSizeLow = nFileSizeLow; sSI.lpFind32 = (LPWIN32_FIND_DATAW)&sFind32; sSI.uOp = SHADOW_MAKE_SPACE; if (fClearAll) { sSI.ulHintPri = 0xffffffff; } iRet = DeviceIoControl(hShadowDB , IOCTL_DO_SHADOW_MAINTENANCE ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return (iRet); } int GetSpaceStats( HANDLE hShadowDB, SHADOWSTORE *lpsST ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; SHADOWSTORE sST; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); memset(&sST, 0, sizeof(sST)); sSI.lpBuffer = (LPVOID)&sST; sSI.cbBufferSize = sizeof(sST); sSI.uOp = SHADOW_GET_SPACE_STATS; iRet = DeviceIoControl(hShadowDB , IOCTL_DO_SHADOW_MAINTENANCE ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } *lpsST = sST; return (iRet); } /***************************************************************************** */ #ifndef NT int CopyChunk( HANDLE hShadowDB, LPSHADOWINFO lpSI, struct tagCOPYCHUNKCONTEXT FAR *CopyChunkContext ) { int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } iRet = DeviceIoControl(hShadowDB , IOCTL_SHADOW_COPYCHUNK ,(LPVOID)(lpSI), 0 , (LPVOID)CopyChunkContext, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } return (iRet); } #else int CopyChunk( HANDLE hShadowDB, LPSHADOWINFO lpSI, struct tagCOPYCHUNKCONTEXT FAR *CopyChunkContext ) { BOOL Success; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } CopyChunkContext->LastAmountRead = 0; Success = DeviceIoControl(hShadowDB , IOCTL_SHADOW_COPYCHUNK , (LPVOID)(lpSI), 0 , (LPVOID)CopyChunkContext, sizeof(*CopyChunkContext) , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } return(Success); } int CloseFileWithCopyChunkIntent( HANDLE hShadowDB, struct tagCOPYCHUNKCONTEXT FAR *CopyChunkContext ) { BOOL Success; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } Success = DeviceIoControl(hShadowDB , IOCTL_CLOSEFORCOPYCHUNK , NULL, 0 , (LPVOID)CopyChunkContext, sizeof(*CopyChunkContext) , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } return(Success); } int OpenFileWithCopyChunkIntent( HANDLE hShadowDB, LPCWSTR lpFileName, struct tagCOPYCHUNKCONTEXT FAR *CopyChunkContext, int ChunkSize ) { BOOL Success; int FileNameLength; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } FileNameLength = wcslen(lpFileName) * sizeof(USHORT); CopyChunkContext->ChunkSize = ChunkSize; Success = DeviceIoControl(hShadowDB , IOCTL_OPENFORCOPYCHUNK , (LPVOID)lpFileName, FileNameLength , (LPVOID)CopyChunkContext, sizeof(*CopyChunkContext) , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } return(Success); } #endif int BeginReint( HSHARE hShare, BOOL fBlockingReint, LPREINT_IO *lplpReintIO ) { SHADOWINFO sSI; LPREINT_IO lpReintIO = NULL; BOOL fSuccess = FALSE; memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.hShare = hShare; lpReintIO = LocalAlloc(LPTR, sizeof(REINT_IO)); if (!lpReintIO) { return 0; } // don't create hevent in the overlapped structure because we are not going to do any read write // on this if (!fBlockingReint) { sSI.uOp = 1; } // create an async handle lpReintIO->hShadowDBAsync = OpenShadowDatabaseIOex(1, FILE_FLAG_OVERLAPPED); if (lpReintIO->hShadowDBAsync == INVALID_HANDLE_VALUE) { goto bailout; } *lplpReintIO = lpReintIO; // issue an overlapped I/O request // This creates an IRP which is cancelled when the thread that is merging // dies in the middle of a merge fSuccess = DeviceIoControl(lpReintIO->hShadowDBAsync , IOCTL_SHADOW_BEGIN_REINT ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, &(lpReintIO->sOverlapped)); bailout: if (!fSuccess) { DWORD dwError; dwError = GetLastError(); if (dwError != ERROR_IO_PENDING) { if (lpReintIO->hShadowDBAsync != INVALID_HANDLE_VALUE) { CloseHandle(lpReintIO->hShadowDBAsync); } LocalFree(lpReintIO); SetLastError(dwError); *lplpReintIO = NULL; } else { fSuccess = TRUE; } } return fSuccess; } int EndReint( HSHARE hShare, LPREINT_IO lpReintIO ) { SHADOWINFO sSI; BOOL fSuccess; DWORD dwError = NO_ERROR; memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.hShare = hShare; fSuccess = DeviceIoControl(lpReintIO->hShadowDBAsync , IOCTL_SHADOW_END_REINT ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (!fSuccess) { dwError = GetLastError(); } CloseHandle(lpReintIO->hShadowDBAsync); LocalFree(lpReintIO); if (!fSuccess) { SetLastError(dwError); } return fSuccess; } int SetShareStatus( HANDLE hShadowDB, HSHARE hShare, unsigned long uStatus, unsigned long uOp ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.hShare = hShare; sSI.uStatus = uStatus; sSI.uOp = uOp; iRet = DeviceIoControl(hShadowDB , IOCTL_SET_SHARE_STATUS ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return (iRet); } int GetShareStatus( HANDLE hShadowDB, HSHARE hShare, unsigned long *lpulStatus ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.hShare = hShare; iRet = DeviceIoControl(hShadowDB , IOCTL_GET_SHARE_STATUS ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if(iRet) { *lpulStatus = sSI.uStatus; } else { *lpulStatus = 0; } if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return iRet; } int ShadowSwitches( HANDLE hShadowDB, unsigned long *lpuSwitches, unsigned long uOp ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.uStatus = *lpuSwitches; sSI.uOp = uOp; iRet = DeviceIoControl(hShadowDB , IOCTL_SWITCHES ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); *lpuSwitches = sSI.uStatus; if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return (iRet); } int GetShadowDatabaseLocationW( HANDLE hShadowDB, WIN32_FIND_DATAW *lpFind32W ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.uStatus = SHADOW_SWITCH_SHADOWING; sSI.uOp = SHADOW_SWITCH_GET_STATE; sSI.lpFind32 = lpFind32W; iRet = DeviceIoControl(hShadowDB , IOCTL_SWITCHES ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return (iRet); } int EnableShadowing( HANDLE hShadowDB, LPCSTR lpszDatabaseLocation, // location of the shadowing directory LPCSTR lpszUserName, // name of the user DWORD dwDefDataSizeHigh, // cache size if being created for the first time DWORD dwDefDataSizeLow, DWORD dwClusterSize, BOOL fReformat ) { SHADOWINFO sSI; WIN32_FIND_DATAA sFind32; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); memset(&sFind32, 0, sizeof(WIN32_FIND_DATAA)); sFind32.nFileSizeHigh = dwDefDataSizeHigh; sFind32.nFileSizeLow = dwDefDataSizeLow; sFind32.dwReserved1 = dwClusterSize; if (lpszDatabaseLocation) { if (strlen(lpszDatabaseLocation) > sizeof(sFind32.cFileName)) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } strcpy(sFind32.cFileName, lpszDatabaseLocation); } if (lpszUserName) { strncpy(sFind32.cAlternateFileName, lpszUserName, MAX_USERNAME); } sSI.uStatus = SHADOW_SWITCH_SHADOWING; sSI.uOp = SHADOW_SWITCH_ON; sSI.ulRefPri = fReformat; sSI.lpFind32 = (WIN32_FIND_DATAW *)&sFind32; iRet = DeviceIoControl(hShadowDB , IOCTL_SWITCHES ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return (iRet); } int RegisterAgent( HANDLE hShadowDB, HWND hwndAgent, HANDLE hEvent ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = __OpenShadowDatabaseIO(1); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(sSI)); sSI.hShare = HandleToUlong(hwndAgent); sSI.hDir = HandleToUlong(hEvent); // // Ensure that we're dealing with truncatable handles here // Assert( (HANDLE)sSI.hShare == hwndAgent ); Assert( (HANDLE)sSI.hDir == hEvent ); iRet = DeviceIoControl(hShadowDB, IOCTL_SHADOW_REGISTER_AGENT, (LPVOID)&sSI, 0, NULL, 0, &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return (iRet); } int UnregisterAgent( HANDLE hShadowDB, HWND hwndAgent ) { int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } iRet = DeviceIoControl(hShadowDB, IOCTL_SHADOW_UNREGISTER_AGENT, (LPVOID)hwndAgent, 0, NULL, 0, &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } return (iRet); } int DisableShadowingForThisThread( HANDLE hShadowDB ) { int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } iRet = DoShadowMaintenance(hShadowDB, SHADOW_PER_THREAD_DISABLE); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } return (iRet); } int EnableShadowingForThisThread( HANDLE hShadowDB ) { int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } iRet = DoShadowMaintenance(hShadowDB, SHADOW_PER_THREAD_ENABLE); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } return (iRet); } int ReinitShadowDatabase( HANDLE hShadowDB, LPCSTR lpszDatabaseLocation, // location of the shadowing directory LPCSTR lpszUserName, // name of the user DWORD dwDefDataSizeHigh, // cache size if being created for the first time DWORD dwDefDataSizeLow, DWORD dwClusterSize ) { SHADOWINFO sSI; WIN32_FIND_DATAA sFind32; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); memset(&sFind32, 0, sizeof(WIN32_FIND_DATAA)); sFind32.nFileSizeHigh = dwDefDataSizeHigh; sFind32.nFileSizeLow = dwDefDataSizeLow; sFind32.dwReserved1 = dwClusterSize; if (lpszDatabaseLocation) { if (strlen(lpszDatabaseLocation) > sizeof(sFind32.cFileName)) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } strcpy(sFind32.cFileName, lpszDatabaseLocation); } if (lpszUserName) { strncpy(sFind32.cAlternateFileName, lpszUserName, MAX_USERNAME); } sSI.uOp = SHADOW_REINIT_DATABASE; sSI.lpFind32 = (WIN32_FIND_DATAW *)&sFind32; iRet = DeviceIoControl(hShadowDB , IOCTL_DO_SHADOW_MAINTENANCE ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return (iRet); } BOOL IsNetDisconnected( DWORD dwErrorCode ) { int i; if (dwErrorCode != NO_ERROR) { for (i=0; i< (sizeof(rgdwErrorTab)/sizeof(DWORD)); ++i) { if (rgdwErrorTab[i] == dwErrorCode) { // DEBUG_PRINT(("lib3: IsNetDisconnected on %d\r\n", dwErrorCode)); return TRUE; } } } return FALSE; } int FindCreatePrincipalIDFromSID( HANDLE hShadowDB, LPVOID lpSidBuffer, ULONG cbSidLength, ULONG *lpuPrincipalID, BOOL fCreate ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.uSubOperation = SHADOW_FIND_CREATE_PRINCIPAL_ID; sSI.lpBuffer = lpSidBuffer; sSI.cbBufferSize = cbSidLength; sSI.uStatus = fCreate; iRet = DeviceIoControl(hShadowDB , IOCTL_DO_SHADOW_MAINTENANCE ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (iRet) { *lpuPrincipalID = sSI.ulPrincipalID; } else { SetLastError(sSI.dwError); } return (iRet); } int GetSecurityInfoForCSC( HANDLE hShadowDB, HSHADOW hDir, HSHADOW hShadow, LPSECURITYINFO lpSecurityInfo, DWORD *lpdwBufferSize ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.uSubOperation = SHADOW_GET_SECURITY_INFO; sSI.lpBuffer = lpSecurityInfo; sSI.cbBufferSize = *lpdwBufferSize; sSI.hDir = hDir; sSI.hShadow = hShadow; iRet = DeviceIoControl(hShadowDB , IOCTL_DO_SHADOW_MAINTENANCE ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (iRet) { *lpdwBufferSize = sSI.cbBufferSize; } else { SetLastError(sSI.dwError); } return (iRet); } BOOL SetExclusionList( HANDLE hShadowDB, LPWSTR lpwList, DWORD cbSize ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.uSubOperation = SHADOW_SET_EXCLUSION_LIST; sSI.lpBuffer = lpwList; sSI.cbBufferSize = cbSize; iRet = DeviceIoControl(hShadowDB , IOCTL_DO_SHADOW_MAINTENANCE ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return (iRet); } BOOL SetBandwidthConservationList( HANDLE hShadowDB, LPWSTR lpwList, DWORD cbSize ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.uSubOperation = SHADOW_SET_BW_CONSERVE_LIST; sSI.lpBuffer = lpwList; sSI.cbBufferSize = cbSize; iRet = DeviceIoControl(hShadowDB , IOCTL_DO_SHADOW_MAINTENANCE ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return (iRet); } BOOL TransitionShareInternal( HANDLE hShadowDB, HSHARE hShare, BOOL fTrue, BOOL fOnlineToOffline ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.hShare = hShare; sSI.uStatus = fTrue; iRet = DeviceIoControl( hShadowDB, (fOnlineToOffline)?IOCTL_TRANSITION_SERVER_TO_OFFLINE:IOCTL_TRANSITION_SERVER_TO_ONLINE ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } return (iRet); } BOOL TransitionShareToOffline( HANDLE hShadowDB, HSHARE hShare, BOOL fTrue ) { return TransitionShareInternal( hShadowDB, hShare, // which share fTrue, // transtion or not TRUE); // online to offline } BOOL TransitionShareToOnline( HANDLE hShadowDB, HSHARE hShare ) { return TransitionShareInternal( hShadowDB, hShare, // which share TRUE, // really a don't care FALSE); // offlinetoonline } BOOL IsServerOfflineW( HANDLE hShadowDB, LPCWSTR lptzShare, BOOL *lpfIsOffline ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); if (lptzShare) { sSI.lpBuffer = (LPVOID)(lptzShare); sSI.cbBufferSize = sizeof(WORD) * (lstrlenW(lptzShare)+1); } iRet = DeviceIoControl( hShadowDB, IOCTL_IS_SERVER_OFFLINE ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (iRet) { *lpfIsOffline = sSI.uStatus; } return (iRet); } BOOL IsServerOfflineA( HANDLE hShadowDB, LPCSTR lptzShare, BOOL *lpfIsOffline ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } int GetShadowDatabaseLocationA( HANDLE hShadowDB, WIN32_FIND_DATAA *lpFind32A ) { int iRet = 0; WIN32_FIND_DATAW sFind32W; if (GetShadowDatabaseLocationW(hShadowDB, &sFind32W)) { memset(lpFind32A, 0, sizeof(*lpFind32A)); iRet = WideCharToMultiByte(CP_ACP, 0, sFind32W.cFileName, wcslen(sFind32W.cFileName), lpFind32A->cFileName, sizeof(lpFind32A->cFileName), NULL, NULL); } return (iRet); } BOOL GetNameOfServerGoingOfflineW( HANDLE hShadowDB, LPBYTE lpBuffer, LPDWORD lpdwSize ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.lpBuffer = (LPVOID)(lpBuffer); sSI.cbBufferSize = *lpdwSize; iRet = DeviceIoControl( hShadowDB, IOCTL_NAME_OF_SERVER_GOING_OFFLINE ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { *lpdwSize = sSI.cbBufferSize; } return (iRet); } BOOL RenameShadow( HANDLE hShadowDB, HSHADOW hDirFrom, HSHADOW hShadowFrom, HSHADOW hDirTo, LPWIN32_FIND_DATAW lpFind32, BOOL fReplaceFile, HSHADOW *lphShadowTo ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.hDir = hDirFrom; sSI.hShadow = hShadowFrom; sSI.hDirTo = hDirTo; sSI.uSubOperation = SHADOW_RENAME; sSI.uStatus = fReplaceFile; sSI.lpFind32 = lpFind32; iRet = DeviceIoControl( hShadowDB ,IOCTL_DO_SHADOW_MAINTENANCE ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } else { if (lphShadowTo) { *lphShadowTo = sSI.hShadow; } } return (iRet); } BOOL GetSparseStaleDetectionCounter( HANDLE hShadowDB, LPDWORD lpdwCounter ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.uSubOperation = SHADOW_SPARSE_STALE_DETECTION_COUNTER; iRet = DeviceIoControl( hShadowDB ,IOCTL_DO_SHADOW_MAINTENANCE ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } else { *lpdwCounter = sSI.dwError; } return (iRet); } BOOL GetManualFileDetectionCounter( HANDLE hShadowDB, LPDWORD lpdwCounter ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.uSubOperation = SHADOW_MANUAL_FILE_DETECTION_COUNTER; iRet = DeviceIoControl( hShadowDB ,IOCTL_DO_SHADOW_MAINTENANCE ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } else { *lpdwCounter = sSI.dwError; } return (iRet); } int EnableShadowingForUser( HANDLE hShadowDB, LPCSTR lpszDatabaseLocation, // location of the shadowing directory LPCSTR lpszUserName, // name of the user DWORD dwDefDataSizeHigh, // cache size if being created for the first time DWORD dwDefDataSizeLow, DWORD dwClusterSize, BOOL fFormat ) { SHADOWINFO sSI; WIN32_FIND_DATAA sFind32; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); memset(&sFind32, 0, sizeof(WIN32_FIND_DATAA)); sFind32.nFileSizeHigh = dwDefDataSizeHigh; sFind32.nFileSizeLow = dwDefDataSizeLow; sFind32.dwReserved1 = dwClusterSize; if (lpszDatabaseLocation) { if (strlen(lpszDatabaseLocation) > sizeof(sFind32.cFileName)) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } strcpy(sFind32.cFileName, lpszDatabaseLocation); } if (lpszUserName) { strncpy(sFind32.cAlternateFileName, lpszUserName, MAX_USERNAME); } sSI.lpFind32 = (WIN32_FIND_DATAW *)&sFind32; sSI.uSubOperation = SHADOW_ENABLE_CSC_FOR_USER; sSI.ulRefPri = fFormat; iRet = DeviceIoControl(hShadowDB ,IOCTL_DO_SHADOW_MAINTENANCE,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return (iRet); } int DisableShadowingForUser( HANDLE hShadowDB ) { SHADOWINFO sSI; WIN32_FIND_DATAA sFind32; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.uSubOperation = SHADOW_DISABLE_CSC_FOR_USER; iRet = DeviceIoControl(hShadowDB ,IOCTL_DO_SHADOW_MAINTENANCE,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return (iRet); } LPCOPYPARAMSW LpAllocCopyParamsW( VOID ) { LPCOPYPARAMSW lpCPW = NULL; DWORD dwMinSize = (sizeof(COPYPARAMSW) + MAX_PATH+MAX_PATH+MAX_SERVER_SHARE_NAME_FOR_CSC)*sizeof(unsigned short); lpCPW = (LPCOPYPARAMSW)LocalAlloc(LPTR, dwMinSize); if (lpCPW) { lpCPW->lpLocalPath = (LPWSTR)((LPBYTE)lpCPW+sizeof(COPYPARAMSW)); lpCPW->lpRemotePath = (lpCPW->lpLocalPath + MAX_PATH); lpCPW->lpSharePath = (lpCPW->lpRemotePath + MAX_PATH); } return (lpCPW); } VOID FreeCopyParamsW( IN LPCOPYPARAMSW lpCPW ) { LocalFree(lpCPW); } LPCOPYPARAMSA LpAllocCopyParamsA( VOID ) { LPCOPYPARAMSA lpCPA = NULL; DWORD dwMinSize = (sizeof(COPYPARAMSA) + MAX_PATH+MAX_PATH+MAX_SERVER_SHARE_NAME_FOR_CSC); lpCPA = (LPCOPYPARAMSA)LocalAlloc(LPTR, dwMinSize); if (lpCPA) { lpCPA->lpLocalPath = (LPSTR)((LPBYTE)lpCPA+sizeof(COPYPARAMSA)); lpCPA->lpRemotePath = (lpCPA->lpLocalPath + MAX_PATH); lpCPA->lpSharePath = (lpCPA->lpRemotePath + MAX_PATH); } return (lpCPA); } VOID FreeCopyParamsA( IN LPCOPYPARAMSA lpCPA ) { LocalFree(lpCPA); } BOOL ConvertCopyParamsFromUnicodeToAnsi( LPCOPYPARAMSW lpCPUni, LPCOPYPARAMSA lpCP ) { memset(lpCP->lpLocalPath, 0, MAX_PATH); memset(lpCP->lpRemotePath, 0, MAX_PATH); memset(lpCP->lpSharePath, 0, MAX_SERVER_SHARE_NAME_FOR_CSC); WideCharToMultiByte(CP_ACP, 0, lpCPUni->lpLocalPath, wcslen(lpCPUni->lpLocalPath), lpCP->lpLocalPath, MAX_PATH, NULL, NULL); WideCharToMultiByte(CP_ACP, 0, lpCPUni->lpRemotePath, wcslen(lpCPUni->lpRemotePath), lpCP->lpRemotePath, MAX_PATH, NULL, NULL); WideCharToMultiByte(CP_ACP, 0, lpCPUni->lpSharePath, wcslen(lpCPUni->lpSharePath), lpCP->lpSharePath, MAX_SERVER_SHARE_NAME_FOR_CSC, NULL, NULL); return TRUE; } BOOL Find32WToFind32A( WIN32_FIND_DATAW *lpFind32W, WIN32_FIND_DATAA *lpFind32A ) { memset(lpFind32A, 0, sizeof(WIN32_FIND_DATAA)); memcpy(lpFind32A, lpFind32W, sizeof(WIN32_FIND_DATAA)-sizeof(lpFind32A->cFileName)-sizeof(lpFind32A->cAlternateFileName)); if ( WideCharToMultiByte(CP_ACP, 0, lpFind32W->cFileName, wcslen(lpFind32W->cFileName), lpFind32A->cFileName, sizeof(lpFind32A->cFileName), NULL, NULL) && WideCharToMultiByte(CP_OEMCP, 0, lpFind32W->cAlternateFileName, wcslen(lpFind32W->cAlternateFileName), lpFind32A->cAlternateFileName, sizeof(lpFind32A->cAlternateFileName), NULL, NULL)) { return TRUE; } return FALSE; } BOOL Find32AToFind32W( WIN32_FIND_DATAA *lpFind32A, WIN32_FIND_DATAW *lpFind32W ) { memset(lpFind32W, 0, sizeof(WIN32_FIND_DATAW)); memcpy(lpFind32W, lpFind32A, sizeof(WIN32_FIND_DATAW)-sizeof(lpFind32W->cFileName)-sizeof(lpFind32W->cAlternateFileName)); if ( MultiByteToWideChar(CP_ACP, 0, lpFind32A->cFileName, strlen(lpFind32A->cFileName), lpFind32W->cFileName, sizeof(lpFind32W->cFileName)/sizeof(WCHAR)) && MultiByteToWideChar(CP_OEMCP, 0, lpFind32A->cAlternateFileName, strlen(lpFind32A->cAlternateFileName), lpFind32W->cAlternateFileName, sizeof(lpFind32W->cAlternateFileName)/sizeof(WCHAR))) { return TRUE; } return FALSE; } BOOL ShareInfoWToShareInfoA( LPSHAREINFOW lpShareInfoW, LPSHAREINFOA lpShareInfoA ) { memset(lpShareInfoA, 0, sizeof(*lpShareInfoA)); lpShareInfoA->hShare = lpShareInfoW->hShare; lpShareInfoA->usCaps = lpShareInfoW->usCaps; lpShareInfoA->usState = lpShareInfoW->usState; WideCharToMultiByte( CP_ACP, 0, lpShareInfoW->rgSharePath, wcslen(lpShareInfoW->rgSharePath), lpShareInfoA->rgSharePath, sizeof(lpShareInfoA->rgSharePath), NULL, NULL); WideCharToMultiByte( CP_ACP, 0, lpShareInfoW->rgFileSystem, wcslen(lpShareInfoW->rgFileSystem), lpShareInfoA->rgFileSystem, sizeof(lpShareInfoA->rgFileSystem), NULL, NULL); return TRUE; } BOOL RecreateShadow( HANDLE hShadowDB, HSHADOW hDir, HSHADOW hShadow, ULONG ulAttrib ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.hDir = hDir; sSI.hShadow = hShadow; sSI.uStatus = ulAttrib; sSI.uSubOperation = SHADOW_RECREATE; iRet = DeviceIoControl( hShadowDB ,IOCTL_DO_SHADOW_MAINTENANCE ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return (iRet); } BOOL SetDatabaseStatus( HANDLE hShadowDB, ULONG ulStatus, ULONG uMask ) { SHADOWINFO sSI; int iRet; BOOL fDBOpened = FALSE; if (hShadowDB == INVALID_HANDLE_VALUE) { hShadowDB = OpenShadowDatabaseIO(); if (hShadowDB == INVALID_HANDLE_VALUE) { return 0; } fDBOpened = TRUE; } memset(&sSI, 0, sizeof(SHADOWINFO)); sSI.uStatus = ulStatus; sSI.uSubOperation = SHADOW_SET_DATABASE_STATUS; sSI.ulHintFlags = uMask; iRet = DeviceIoControl( hShadowDB ,IOCTL_DO_SHADOW_MAINTENANCE ,(LPVOID)(&sSI), 0 , NULL, 0 , &DummyBytesReturned, NULL); if (fDBOpened) { CloseShadowDatabaseIO(hShadowDB); } if (!iRet) { SetLastError(sSI.dwError); } return (iRet); }