Example #1
0
NTSTATUS
DokanSetRenameInformation(
PEVENT_CONTEXT		EventContext,
	 PDOKAN_FILE_INFO	FileInfo,
	 PDOKAN_OPERATIONS	DokanOperations)
{
	PDOKAN_RENAME_INFORMATION renameInfo =
		(PDOKAN_RENAME_INFORMATION)((PCHAR)EventContext + EventContext->Operation.SetFile.BufferOffset);

	WCHAR newName[MAX_PATH];
	ZeroMemory(newName, sizeof(newName));

	if (renameInfo->FileName[0] != L'\\') {
		ULONG pos;
		for (pos = EventContext->Operation.SetFile.FileNameLength / sizeof(WCHAR);
			pos != 0; --pos) {
			if (EventContext->Operation.SetFile.FileName[pos] == '\\')
				break;
		}
		RtlCopyMemory(newName, EventContext->Operation.SetFile.FileName, (pos + 1)*sizeof(WCHAR));
		RtlCopyMemory((PCHAR)newName + (pos+1)*sizeof(WCHAR), renameInfo->FileName, renameInfo->FileNameLength);
	} else {
		RtlCopyMemory(newName, renameInfo->FileName, renameInfo->FileNameLength);
	}

	if (!DokanOperations->MoveFile)
		return STATUS_NOT_IMPLEMENTED;

	return DokanOperations->MoveFile(
		EventContext->Operation.SetFile.FileName,
		newName,
		renameInfo->ReplaceIfExists,
		FileInfo);
}