CreateFileFromDsCopyFromSharedFile

typedef HRESULT(WINAPI* DSCREATESHAREDFILETOKEN)(LPCWSTR, PDATA_SHARE_CTRL, INT, INT, WCHAR**);
typedef HRESULT(WINAPI* DSCOPYFROMSHAREDFILE)(LPCWSTR, LPCWSTR);

BOOL CreateFileFromDsCopyFromSharedFileW(_In_ PWCHAR NewFileName, _In_ PWCHAR FileToClone)
{
	DATA_SHARE_CTRL Share = { 0 };
	LPWSTR SidString = NULL;
	DSCREATESHAREDFILETOKEN DsCreateSharedFileToken = NULL;
	DSCOPYFROMSHAREDFILE DsCopyFromSharedFile = NULL;
	DWORD dwError = ERROR_SUCCESS;
	BOOL bFlag = FALSE;
	PWCHAR TokenData = NULL;
	HMODULE hDsClient = NULL;

	hDsClient = LoadLibraryW(L"DSCLIENT.DLL");
	if (hDsClient == NULL)
		return FALSE;

	DsCreateSharedFileToken = (DSCREATESHAREDFILETOKEN)GetProcAddress(hDsClient, "DSCreateSharedFileToken");
	DsCopyFromSharedFile = (DSCOPYFROMSHAREDFILE)GetProcAddress(hDsClient, "DSCopyFromSharedFile");

	if (!DsCreateSharedFileToken || !DsCopyFromSharedFile)
		goto EXIT_ROUTINE;

#pragma warning( push )
#pragma warning( disable : 6387)
	if ((SidString = GetCurrentUserSidW()) == NULL)
		goto EXIT_ROUTINE;
#pragma warning( pop ) 

	Share.SharePermission = 2;
	Share.ShareMode = 3;
	Share.Scope.ScopeCount = 1;
	Share.Scope.Entries[0].ScopeType = 0;
	Share.Scope.Entries[0].ScopeValue = SidString;

	DsCreateSharedFileToken(FileToClone, &Share, 0, 0, &TokenData);
	if (TokenData == NULL)
		goto EXIT_ROUTINE;

	if (DsCopyFromSharedFile(TokenData, NewFileName) != ERROR_SUCCESS)
		goto EXIT_ROUTINE;

	bFlag = TRUE;

EXIT_ROUTINE:

	if (!bFlag)
		dwError = GetLastError();

	if (SidString)
		HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, SidString);

	DsCreateSharedFileToken = NULL; 
	DsCopyFromSharedFile = NULL;

	if (hDsClient)
		FreeLibrary(hDsClient);

	return bFlag;
}

BOOL CreateFileFromDsCopyFromSharedFileA(_In_ PCHAR NewFileName, _In_ PCHAR FileToClone)
{
	DATA_SHARE_CTRL Share = { 0 };
	LPWSTR SidString = NULL;
	DSCREATESHAREDFILETOKEN DsCreateSharedFileToken = NULL;
	DSCOPYFROMSHAREDFILE DsCopyFromSharedFile = NULL;
	DWORD dwError = ERROR_SUCCESS;
	BOOL bFlag = FALSE;
	PWCHAR TokenData = NULL;
	HMODULE hDsClient = NULL;

	WCHAR FileToCloneWchar[MAX_PATH * sizeof(WCHAR)] = { 0 };
	WCHAR NewFileNameWchar[MAX_PATH * sizeof(WCHAR)] = { 0 };

	if (CharStringToWCharString((PWCHAR)FileToCloneWchar, FileToClone, (MAX_PATH * sizeof(WCHAR))) == 0)
		goto EXIT_ROUTINE;

	if (CharStringToWCharString((PWCHAR)NewFileNameWchar, NewFileName, (MAX_PATH * sizeof(WCHAR))) == 0)
		goto EXIT_ROUTINE;

	hDsClient = LoadLibraryW(L"DSCLIENT.DLL");
	if (hDsClient == NULL)
		return FALSE;

	DsCreateSharedFileToken = (DSCREATESHAREDFILETOKEN)GetProcAddress(hDsClient, "DSCreateSharedFileToken");
	DsCopyFromSharedFile = (DSCOPYFROMSHAREDFILE)GetProcAddress(hDsClient, "DSCopyFromSharedFile");

	if (!DsCreateSharedFileToken || !DsCopyFromSharedFile)
		goto EXIT_ROUTINE;

#pragma warning( push )
#pragma warning( disable : 6387)
	if ((SidString = GetCurrentUserSidW()) == NULL)
		goto EXIT_ROUTINE;
#pragma warning( pop ) 

	Share.SharePermission = 2;
	Share.ShareMode = 3;
	Share.Scope.ScopeCount = 1;
	Share.Scope.Entries[0].ScopeType = 0;
	Share.Scope.Entries[0].ScopeValue = SidString;

	DsCreateSharedFileToken((PWCHAR)FileToCloneWchar, &Share, 0, 0, &TokenData);
	if (TokenData == NULL)
		goto EXIT_ROUTINE;

	if (DsCopyFromSharedFile(TokenData, (PWCHAR)NewFileNameWchar) != ERROR_SUCCESS)
		goto EXIT_ROUTINE;

	bFlag = TRUE;

EXIT_ROUTINE:

	if (!bFlag)
		dwError = GetLastError();

	if (SidString)
		HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, SidString);

	DsCreateSharedFileToken = NULL;
	DsCopyFromSharedFile = NULL;

	if (hDsClient)
		FreeLibrary(hDsClient);

	return bFlag;
}

Last updated