Compare commits
7 Commits
9df1e546cd
...
18a6535bac
Author | SHA1 | Date |
---|---|---|
DavidXanatos | 18a6535bac | |
DavidXanatos | a48bfa616f | |
DavidXanatos | fe10924e71 | |
DavidXanatos | fa5ece955c | |
DavidXanatos | b7dbd35b91 | |
nkh0472 | eebaecd6e3 | |
offhub | af54571823 |
|
@ -11,12 +11,10 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|||
- added file version information for SbieDll.dll and SbieSvc.exe in the Sandboxie Plus About dialog
|
||||
|
||||
### Changed
|
||||
- when creating reparse points (symlinks/junctions), the target path remains the TruePath [#3852](https://github.com/sandboxie-plus/Sandboxie/issues/3852)
|
||||
- the old behaviour can be restored with "BoxReparseTarget=y"
|
||||
- this change should work fine with the recent improvements in handling reparse points
|
||||
- improved checkboxes about DropAdminRights in SandMan [#3851](https://github.com/sandboxie-plus/Sandboxie/pull/3851) (thanks offhub)
|
||||
|
||||
### Fixed
|
||||
- Issue with symbolic linking of files [#3852](https://github.com/sandboxie-plus/Sandboxie/issues/3852)
|
||||
- fixed issue with start agent option [#3844](https://github.com/sandboxie-plus/Sandboxie/pull/3844) (thanks offhub)
|
||||
- fixed issue with Delete V2 introduced in 1.13.5
|
||||
|
||||
|
|
|
@ -262,6 +262,9 @@ static NTSTATUS File_NtDeleteFile(OBJECT_ATTRIBUTES *ObjectAttributes);
|
|||
|
||||
static NTSTATUS File_NtDeleteFileImpl(OBJECT_ATTRIBUTES *ObjectAttributes);
|
||||
|
||||
static NTSTATUS File_OpenForRenameFile(
|
||||
HANDLE* pSourceHandle, const WCHAR *TruePath);
|
||||
|
||||
static NTSTATUS File_RenameFile(
|
||||
HANDLE FileHandle, void *info, BOOLEAN LinkOp);
|
||||
|
||||
|
@ -6659,6 +6662,63 @@ _FX LONG File_RenameOpenFile(
|
|||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// File_OpenForRenameFile
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
_FX NTSTATUS File_OpenForRenameFile(
|
||||
HANDLE* pSourceHandle, const WCHAR *TruePath)
|
||||
{
|
||||
THREAD_DATA *TlsData = Dll_GetTlsData(NULL);
|
||||
|
||||
NTSTATUS status;
|
||||
OBJECT_ATTRIBUTES objattrs;
|
||||
UNICODE_STRING objname;
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
|
||||
InitializeObjectAttributes(
|
||||
&objattrs, &objname, OBJ_CASE_INSENSITIVE, NULL, Secure_NormalSD);
|
||||
|
||||
//
|
||||
// open the file for write access. this should cause the file
|
||||
// to be migrated into the sandbox, including its parent directories
|
||||
//
|
||||
|
||||
RtlInitUnicodeString(&objname, TruePath);
|
||||
|
||||
++TlsData->file_dont_strip_write_access;
|
||||
|
||||
status = NtCreateFile(
|
||||
pSourceHandle, FILE_GENERIC_WRITE | DELETE, &objattrs,
|
||||
&IoStatusBlock, NULL, 0, FILE_SHARE_VALID_FLAGS,
|
||||
FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
|
||||
|
||||
if (status == STATUS_SHARING_VIOLATION ||
|
||||
status == STATUS_ACCESS_DENIED) {
|
||||
|
||||
//
|
||||
// Windows Mail opens *.eml files with a combination of
|
||||
// FILE_SHARE_READ | FILE_SHARE_DELETE, but not FILE_SHARE_WRITE,
|
||||
// which means we can't open them with FILE_GENERIC_WRITE
|
||||
// during rename processing here
|
||||
//
|
||||
// also, for read-only files, we get an error when we open them
|
||||
// for FILE_GENERIC_WRITE, but just DELETE should also work
|
||||
//
|
||||
|
||||
status = NtCreateFile(
|
||||
pSourceHandle, SYNCHRONIZE | DELETE, &objattrs,
|
||||
&IoStatusBlock, NULL, 0, FILE_SHARE_VALID_FLAGS,
|
||||
FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
|
||||
}
|
||||
|
||||
--TlsData->file_dont_strip_write_access;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// File_RenameFile
|
||||
//---------------------------------------------------------------------------
|
||||
|
@ -6718,52 +6778,23 @@ _FX NTSTATUS File_RenameFile(
|
|||
__leave;
|
||||
|
||||
//
|
||||
// open the file for write access. this should cause the file
|
||||
// to be migrated into the sandbox, including its parent directories
|
||||
// migrate into the sandbox, including its parent directories
|
||||
//
|
||||
|
||||
RtlInitUnicodeString(&objname, TruePath);
|
||||
status = File_OpenForRenameFile(&SourceHandle, TruePath);
|
||||
|
||||
++TlsData->file_dont_strip_write_access;
|
||||
//
|
||||
// if we still get STATUS_SHARING_VIOLATION, give up on trying
|
||||
// to make sure the file is migrated into the sandbox, and hope
|
||||
// that the input FileHandle is suitable for a rename operation
|
||||
//
|
||||
|
||||
status = NtCreateFile(
|
||||
&SourceHandle, FILE_GENERIC_WRITE | DELETE, &objattrs,
|
||||
&IoStatusBlock, NULL, 0, FILE_SHARE_VALID_FLAGS,
|
||||
FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
|
||||
if (status == STATUS_SHARING_VIOLATION) {
|
||||
|
||||
if (status == STATUS_SHARING_VIOLATION ||
|
||||
status == STATUS_ACCESS_DENIED) {
|
||||
|
||||
//
|
||||
// Windows Mail opens *.eml files with a combination of
|
||||
// FILE_SHARE_READ | FILE_SHARE_DELETE, but not FILE_SHARE_WRITE,
|
||||
// which means we can't open them with FILE_GENERIC_WRITE
|
||||
// during rename processing here
|
||||
//
|
||||
// also, for read-only files, we get an error when we open them
|
||||
// for FILE_GENERIC_WRITE, but just DELETE should also work
|
||||
//
|
||||
|
||||
status = NtCreateFile(
|
||||
&SourceHandle, SYNCHRONIZE | DELETE, &objattrs,
|
||||
&IoStatusBlock, NULL, 0, FILE_SHARE_VALID_FLAGS,
|
||||
FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
|
||||
|
||||
//
|
||||
// if we still get STATUS_SHARING_VIOLATION, give up on trying
|
||||
// to make sure the file is migrated into the sandbox, and hope
|
||||
// that the input FileHandle is suitable for a rename operation
|
||||
//
|
||||
|
||||
if (status == STATUS_SHARING_VIOLATION) {
|
||||
|
||||
SourceHandle = FileHandle;
|
||||
status = STATUS_SUCCESS;
|
||||
}
|
||||
SourceHandle = FileHandle;
|
||||
status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
--TlsData->file_dont_strip_write_access;
|
||||
|
||||
if (! NT_SUCCESS(status))
|
||||
__leave;
|
||||
|
||||
|
|
|
@ -3162,6 +3162,59 @@ _FX NTSTATUS File_NtQueryVolumeInformationFile(
|
|||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// File_CanonizePath
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
WCHAR* File_CanonizePath(const wchar_t* absolute_path, ULONG abs_path_len, const wchar_t* relative_path, ULONG rel_path_len)
|
||||
{
|
||||
ULONG i, j;
|
||||
|
||||
while(absolute_path[abs_path_len-1] == L'\\')
|
||||
abs_path_len--;
|
||||
|
||||
WCHAR* result = Dll_Alloc((abs_path_len + rel_path_len + 1) * sizeof(wchar_t));
|
||||
if (!result) return NULL;
|
||||
wcsncpy(result, absolute_path, abs_path_len);
|
||||
result[abs_path_len] = 0;
|
||||
|
||||
for (i = 0; i < rel_path_len; ) {
|
||||
|
||||
if (relative_path[i] == L'.' && relative_path[i + 1] == L'.' && (relative_path[i + 2] == L'\\' || relative_path[i + 2] == L'\0')) {
|
||||
|
||||
for (j = abs_path_len - 1; j >= 0 && result[j] != L'\\'; --j)
|
||||
result[j] = L'\0';
|
||||
if (j >= 0)
|
||||
result[j] = L'\0';
|
||||
|
||||
abs_path_len = j;
|
||||
|
||||
i += 3;
|
||||
|
||||
} else if (relative_path[i] == L'.') {
|
||||
|
||||
i += 2;
|
||||
|
||||
} else {
|
||||
|
||||
for (j = i; j < rel_path_len && relative_path[j] != L'\\' && relative_path[j] != L'\0'; ++j)
|
||||
;
|
||||
|
||||
result[abs_path_len] = L'\\';
|
||||
wcsncpy(result + abs_path_len + 1, &relative_path[i], j - i);
|
||||
result[abs_path_len + j - i + 1] = L'\0';
|
||||
|
||||
abs_path_len += j - i + 1;
|
||||
|
||||
i = j + 1;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// File_SetReparsePoint
|
||||
//---------------------------------------------------------------------------
|
||||
|
@ -3170,23 +3223,27 @@ _FX NTSTATUS File_NtQueryVolumeInformationFile(
|
|||
_FX NTSTATUS File_SetReparsePoint(
|
||||
HANDLE FileHandle, PREPARSE_DATA_BUFFER Data, ULONG DataLen)
|
||||
{
|
||||
THREAD_DATA *TlsData;
|
||||
THREAD_DATA *TlsData = Dll_GetTlsData(NULL);
|
||||
|
||||
NTSTATUS status;
|
||||
UNICODE_STRING objname;
|
||||
OBJECT_ATTRIBUTES objattrs;
|
||||
WCHAR *TruePath, *CopyPath;
|
||||
//WCHAR *SourcePath = NULL, *TargetPath = NULL;
|
||||
WCHAR* AbsolutePath = NULL;
|
||||
ULONG FileFlags, mp_flags;
|
||||
PREPARSE_DATA_BUFFER NewData = NULL;
|
||||
ULONG NewDataLen;
|
||||
IO_STATUS_BLOCK MyIoStatusBlock;
|
||||
BOOLEAN MigrateTarget = FALSE;
|
||||
|
||||
if (! Data)
|
||||
return STATUS_BAD_INITIAL_PC;
|
||||
|
||||
//
|
||||
// get paths to source and target directories
|
||||
//
|
||||
|
||||
TlsData = Dll_GetTlsData(NULL);
|
||||
|
||||
Dll_PushTlsNameBuffer(TlsData);
|
||||
|
||||
__try {
|
||||
|
@ -3194,39 +3251,13 @@ _FX NTSTATUS File_SetReparsePoint(
|
|||
WCHAR* SubstituteNameBuffer;
|
||||
USHORT PrintNameLength;
|
||||
WCHAR* PrintNameBuffer;
|
||||
//BOOLEAN RelativePath = FALSE;
|
||||
|
||||
if (! Data)
|
||||
return STATUS_BAD_INITIAL_PC;
|
||||
|
||||
if (Data->ReparseTag == IO_REPARSE_TAG_SYMLINK)
|
||||
{
|
||||
SubstituteNameLength = Data->SymbolicLinkReparseBuffer.SubstituteNameLength;
|
||||
SubstituteNameBuffer = &Data->SymbolicLinkReparseBuffer.PathBuffer[Data->SymbolicLinkReparseBuffer.SubstituteNameOffset/sizeof(WCHAR)];
|
||||
PrintNameLength = Data->SymbolicLinkReparseBuffer.PrintNameLength;
|
||||
PrintNameBuffer = &Data->SymbolicLinkReparseBuffer.PathBuffer[Data->SymbolicLinkReparseBuffer.PrintNameOffset/sizeof(WCHAR)];
|
||||
if (Data->SymbolicLinkReparseBuffer.Flags & SYMLINK_FLAG_RELATIVE)
|
||||
return STATUS_BAD_INITIAL_PC; //RelativePath = TRUE; // let it be done normally
|
||||
|
||||
NewDataLen = (UFIELD_OFFSET(REPARSE_DATA_BUFFER, SymbolicLinkReparseBuffer.PathBuffer) - UFIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer));
|
||||
}
|
||||
else if (Data->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT)
|
||||
{
|
||||
SubstituteNameLength = Data->MountPointReparseBuffer.SubstituteNameLength;
|
||||
SubstituteNameBuffer = &Data->MountPointReparseBuffer.PathBuffer[Data->MountPointReparseBuffer.SubstituteNameOffset/sizeof(WCHAR)];
|
||||
PrintNameLength = Data->MountPointReparseBuffer.PrintNameLength;
|
||||
PrintNameBuffer = &Data->MountPointReparseBuffer.PathBuffer[Data->MountPointReparseBuffer.PrintNameOffset/sizeof(WCHAR)];
|
||||
|
||||
NewDataLen = (UFIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer.PathBuffer) - UFIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer));
|
||||
}
|
||||
else
|
||||
return STATUS_BAD_INITIAL_PC;
|
||||
|
||||
//
|
||||
// get copy path of reparse source
|
||||
//
|
||||
|
||||
RtlInitUnicodeString(&objname, L"");
|
||||
|
||||
InitializeObjectAttributes(
|
||||
&objattrs, &objname, OBJ_CASE_INSENSITIVE, NULL, NULL);
|
||||
|
||||
|
@ -3251,6 +3282,38 @@ _FX NTSTATUS File_SetReparsePoint(
|
|||
__leave;
|
||||
}
|
||||
|
||||
//
|
||||
// get the absolute reparse target path
|
||||
//
|
||||
|
||||
if (Data->ReparseTag == IO_REPARSE_TAG_SYMLINK)
|
||||
{
|
||||
SubstituteNameLength = Data->SymbolicLinkReparseBuffer.SubstituteNameLength;
|
||||
SubstituteNameBuffer = &Data->SymbolicLinkReparseBuffer.PathBuffer[Data->SymbolicLinkReparseBuffer.SubstituteNameOffset/sizeof(WCHAR)];
|
||||
PrintNameLength = Data->SymbolicLinkReparseBuffer.PrintNameLength;
|
||||
PrintNameBuffer = &Data->SymbolicLinkReparseBuffer.PathBuffer[Data->SymbolicLinkReparseBuffer.PrintNameOffset/sizeof(WCHAR)];
|
||||
if (Data->SymbolicLinkReparseBuffer.Flags & SYMLINK_FLAG_RELATIVE) {
|
||||
|
||||
WCHAR* LinkName = wcsrchr(TruePath, L'\\');
|
||||
AbsolutePath = File_CanonizePath(TruePath, (ULONG)(LinkName - TruePath), SubstituteNameBuffer, SubstituteNameLength / sizeof(wchar_t));
|
||||
}
|
||||
|
||||
NewDataLen = (UFIELD_OFFSET(REPARSE_DATA_BUFFER, SymbolicLinkReparseBuffer.PathBuffer) - UFIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer));
|
||||
}
|
||||
else if (Data->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT)
|
||||
{
|
||||
SubstituteNameLength = Data->MountPointReparseBuffer.SubstituteNameLength;
|
||||
SubstituteNameBuffer = &Data->MountPointReparseBuffer.PathBuffer[Data->MountPointReparseBuffer.SubstituteNameOffset/sizeof(WCHAR)];
|
||||
PrintNameLength = Data->MountPointReparseBuffer.PrintNameLength;
|
||||
PrintNameBuffer = &Data->MountPointReparseBuffer.PathBuffer[Data->MountPointReparseBuffer.PrintNameOffset/sizeof(WCHAR)];
|
||||
|
||||
NewDataLen = (UFIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer.PathBuffer) - UFIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer));
|
||||
}
|
||||
else {
|
||||
status = STATUS_BAD_INITIAL_PC;
|
||||
__leave;
|
||||
}
|
||||
|
||||
//if (File_Snapshot != NULL){
|
||||
// WCHAR* TmplName = File_FindSnapshotPath(CopyPath);
|
||||
// if (TmplName) CopyPath = TmplName;
|
||||
|
@ -3263,14 +3326,30 @@ _FX NTSTATUS File_SetReparsePoint(
|
|||
// get copy path of reparse target
|
||||
//
|
||||
|
||||
objname.Length = SubstituteNameLength;
|
||||
if (AbsolutePath) {
|
||||
objname.Length = wcslen(AbsolutePath) * sizeof(wchar_t);
|
||||
objname.Buffer = AbsolutePath;
|
||||
} else {
|
||||
objname.Length = SubstituteNameLength;
|
||||
objname.Buffer = SubstituteNameBuffer;
|
||||
}
|
||||
objname.MaximumLength = objname.Length;
|
||||
objname.Buffer = SubstituteNameBuffer;
|
||||
|
||||
status = File_GetName(NULL, &objname, &TruePath, &CopyPath, NULL);
|
||||
if (! NT_SUCCESS(status))
|
||||
__leave;
|
||||
|
||||
if (AbsolutePath) {
|
||||
|
||||
//
|
||||
// We can allow for a relative path in the box but must ensure the hatget gets migrated
|
||||
//
|
||||
|
||||
MigrateTarget = TRUE;
|
||||
status = STATUS_BAD_INITIAL_PC;
|
||||
__leave;
|
||||
}
|
||||
|
||||
//TargetPath = Dll_Alloc((wcslen(CopyPath) + 4) * sizeof(WCHAR));
|
||||
//wcscpy(TargetPath, CopyPath);
|
||||
|
||||
|
@ -3320,17 +3399,14 @@ _FX NTSTATUS File_SetReparsePoint(
|
|||
|
||||
if (NT_SUCCESS(status)) {
|
||||
|
||||
File_CreateBoxedPath(TruePath);
|
||||
|
||||
status = __sys_NtFsControlFile(
|
||||
FileHandle, NULL, NULL, NULL,
|
||||
&MyIoStatusBlock, FSCTL_SET_REPARSE_POINT,
|
||||
NewData, NewDataLen,
|
||||
NULL, 0);
|
||||
}
|
||||
|
||||
if (NewData)
|
||||
Dll_Free(NewData);
|
||||
MigrateTarget = NT_SUCCESS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
//
|
||||
|
@ -3378,6 +3454,25 @@ _FX NTSTATUS File_SetReparsePoint(
|
|||
if (TargetPath)
|
||||
Dll_Free(TargetPath);*/
|
||||
|
||||
if (MigrateTarget) {
|
||||
|
||||
//
|
||||
// We must migrate the file or directory into the sandbox as the path reparsing by NtCreateFile
|
||||
// is done by the kernel and we do not "manually" reparse the path before invoking it,
|
||||
// hence there must be the expected file at the path we are linking to.
|
||||
//
|
||||
|
||||
HANDLE SourceHandle;
|
||||
if (NT_SUCCESS(File_OpenForRenameFile(&SourceHandle, TruePath)))
|
||||
NtClose(SourceHandle);
|
||||
}
|
||||
|
||||
if (AbsolutePath)
|
||||
Dll_Free(AbsolutePath);
|
||||
|
||||
if (NewData)
|
||||
Dll_Free(NewData);
|
||||
|
||||
Dll_PopTlsNameBuffer(TlsData);
|
||||
|
||||
return status;
|
||||
|
|
|
@ -1152,17 +1152,11 @@ _FX NTSTATUS File_NtFsControlFile(
|
|||
handle = File_GetProxyPipe(FileHandle, NULL);
|
||||
if (! handle) {
|
||||
|
||||
status = STATUS_BAD_INITIAL_PC;
|
||||
|
||||
if (IoControlCode == FSCTL_SET_REPARSE_POINT) {
|
||||
|
||||
BOOLEAN BoxReparseTarget = SbieApi_QueryConfBool(NULL, L"BoxReparseTarget", FALSE);
|
||||
if(BoxReparseTarget) {
|
||||
|
||||
status = File_SetReparsePoint(
|
||||
FileHandle, InputBuffer, InputBufferLength);
|
||||
SetLastError(LastError);
|
||||
}
|
||||
status = File_SetReparsePoint(
|
||||
FileHandle, InputBuffer, InputBufferLength);
|
||||
SetLastError(LastError);
|
||||
|
||||
} else if (IoControlCode == FSCTL_PIPE_WAIT) {
|
||||
|
||||
|
@ -1178,7 +1172,8 @@ _FX NTSTATUS File_NtFsControlFile(
|
|||
else
|
||||
status = STATUS_ACCESS_DENIED;
|
||||
|
||||
}
|
||||
} else
|
||||
status = STATUS_BAD_INITIAL_PC;
|
||||
|
||||
if (status == STATUS_BAD_INITIAL_PC) {
|
||||
|
||||
|
|
|
@ -179,7 +179,7 @@
|
|||
<message>
|
||||
<location filename="Wizards/NewBoxWizard.cpp" line="748"/>
|
||||
<source>Drop rights from Administrators and Power Users groups</source>
|
||||
<translation type="unfinished">Yöneticiler ve Yetkili Kullanıcılar grupları haklarını bırak</translation>
|
||||
<translation>Yöneticiler ve Yetkili Kullanıcılar grupları haklarını bırak</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="Wizards/NewBoxWizard.cpp" line="754"/>
|
||||
|
@ -3499,22 +3499,22 @@ This file is part of Sandboxie and all change done to it will be reverted next t
|
|||
<message>
|
||||
<location filename="SandMan.cpp" line="4303"/>
|
||||
<source><h3>About Sandboxie-Plus</h3><p>Version %1</p><p></source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation><h3>Sandboxie-Plus Hakkında</h3><p>Sürüm %1</p><p></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="SandMan.cpp" line="4311"/>
|
||||
<source>This copy of Sandboxie-Plus is certified for: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Sandboxie'nin bu kopyası şu kişiler için sertifikalandırılmıştır: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="SandMan.cpp" line="4313"/>
|
||||
<source>Sandboxie-Plus is free for personal and non-commercial use.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Sandboxie-Plus, kişisel ve ticari olmayan kullanım için ücretsizdir.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="SandMan.cpp" line="4317"/>
|
||||
<source>Sandboxie-Plus is an open source continuation of Sandboxie.<br />Visit <a href="https://sandboxie-plus.com">sandboxie-plus.com</a> for more information.<br /><br />%2<br /><br />Features: %3<br /><br />Installation: %1<br />SbieDrv.sys: %4<br /> SbieSvc.exe: %5<br /> SbieDll.dll: %6<br /><br />Icons from <a href="https://icons8.com">icons8.com</a></source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Sandboxie-Plus, Sandboxie'nin açık kaynaklı bir devamıdır.<br />Daha fazla bilgi için <a href="https://sandboxie-plus.com">sandboxie-plus.com</a> adresini ziyaret ediniz.<br /><br />%2<br /><br />Özellikler: %3<br /><br />Kurulum: %1<br />SbieDrv.sys: %4<br /> SbieSvc.exe: %5<br /> SbieDll.dll: %6<br /><br />Simgeler için <a href="https://icons8.com">icons8.com</a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="SandMan.cpp" line="3429"/>
|
||||
|
@ -3715,18 +3715,6 @@ Hayır şunları seçer: %2</translation>
|
|||
<source>The selected feature set is only available to project supporters. Processes started in a box with this feature set enabled without a supporter certificate will be terminated after 5 minutes.<br /><a href="https://sandboxie-plus.com/go.php?to=sbie-get-cert">Become a project supporter</a>, and receive a <a href="https://sandboxie-plus.com/go.php?to=sbie-cert">supporter certificate</a></source>
|
||||
<translation>Seçilen özellik seti yalnızca proje destekçileri tarafından kullanılabilir. Bu özellik setinin destekçi sertifikası olmadan etkinleştirildiği bir alanda başlatılan işlemler 5 dakika sonra sonlandırılacaktır.<br /><a href="https://sandboxie-plus.com/go.php?to=sbie-get-cert">Proje destekçisi olmak</a> için bir <a href="https://sandboxie-plus.com/go.php?to=sbie-cert">destekçi sertifikası</a> edinin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This copy of Sandboxie+ is certified for: %1</source>
|
||||
<translation type="vanished">Sandboxie+'nın bu kopyası şu kişiler için sertifikalandırılmıştır: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sandboxie+ is free for personal and non-commercial use.</source>
|
||||
<translation type="vanished">Sandboxie+, kişisel ve ticari olmayan kullanım için ücretsizdir.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sandboxie-Plus is an open source continuation of Sandboxie.<br />Visit <a href="https://sandboxie-plus.com">sandboxie-plus.com</a> for more information.<br /><br />%3<br /><br />Driver version: %1<br />Features: %2<br /><br />Icons from <a href="https://icons8.com">icons8.com</a></source>
|
||||
<translation type="vanished">Sandboxie-Plus, Sandboxie'nin açık kaynaklı bir devamıdır.<br />Daha fazla bilgi için <a href="https://sandboxie-plus.com">sandboxie-plus.com</a> adresini ziyaret edin.<br /><br />%3<br /><br />Sürücü versiyonu: %1<br />Özellikler: %2<br /><br />Simgeler için <a href="https://icons8.com">icons8.com</a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="SandMan.cpp" line="466"/>
|
||||
<source>Uninstall All</source>
|
||||
|
@ -4074,10 +4062,6 @@ Lütfen Sandboxie için bir güncelleme olup olmadığını kontrol edin.</trans
|
|||
<source>All columns</source>
|
||||
<translation>Tüm Sütunlar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><h3>About Sandboxie-Plus</h3><p>Version %1</p><p>Copyright (c) 2020-2024 by DavidXanatos</p></source>
|
||||
<translation type="vanished"><h3>Sandboxie-Plus hakkında</h3><p>Sürüm %1</p><p>Telif hakkı (c) 2020-2024, DavidXanatos</p></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="SandMan.cpp" line="3108"/>
|
||||
<source>The supporter certificate is not valid for this build, please get an updated certificate</source>
|
||||
|
@ -5654,7 +5638,7 @@ Lütfen Sandboxie için bir güncelleme olup olmadığını kontrol edin.</trans
|
|||
<message>
|
||||
<location filename="Windows/SnapshotsWindow.cpp" line="55"/>
|
||||
<source>Revert to empty box</source>
|
||||
<translation>Boş alan haline geri dön</translation>
|
||||
<translation>Boş alan haline geri döndür</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="Windows/SnapshotsWindow.cpp" line="102"/>
|
||||
|
@ -8772,8 +8756,7 @@ The process match level has a higher priority than the specificity and describes
|
|||
<message>
|
||||
<location filename="Forms/SettingsWindow.ui" line="80"/>
|
||||
<source>Hotkey for suspending all processes:</source>
|
||||
<oldsource>Hotkey for suspending all process:</oldsource>
|
||||
<translation type="unfinished">Tüm işlemleri askıya almak için kısayol tuşu:</translation>
|
||||
<translation>Tüm işlemleri askıya almak için kısayol tuşu:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="Forms/SettingsWindow.ui" line="236"/>
|
||||
|
|
|
@ -241,7 +241,7 @@
|
|||
<message>
|
||||
<location filename="Wizards/NewBoxWizard.cpp" line="748"/>
|
||||
<source>Drop rights from Administrators and Power Users groups</source>
|
||||
<translation type="unfinished">撤销管理员和 Power Users 用户组的权限</translation>
|
||||
<translation>撤销管理员和 Power Users 用户组的权限</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="Wizards/NewBoxWizard.cpp" line="754"/>
|
||||
|
@ -4408,27 +4408,27 @@ Error: %1</source>
|
|||
<message>
|
||||
<location filename="SandMan.cpp" line="4012"/>
|
||||
<source>Operation failed for %1 item(s).</source>
|
||||
<translation>%1 项操作失败</translation>
|
||||
<translation>%1 项操作失败。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="SandMan.cpp" line="4303"/>
|
||||
<source><h3>About Sandboxie-Plus</h3><p>Version %1</p><p></source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation><h3>关于 Sandboxie+</h3><p>版本 %1</p><p></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="SandMan.cpp" line="4311"/>
|
||||
<source>This copy of Sandboxie-Plus is certified for: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>本 Sandboxie+ 副本已授权为: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="SandMan.cpp" line="4313"/>
|
||||
<source>Sandboxie-Plus is free for personal and non-commercial use.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Sandboxie+ 可免费用于个人和其他非商业用途。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="SandMan.cpp" line="4317"/>
|
||||
<source>Sandboxie-Plus is an open source continuation of Sandboxie.<br />Visit <a href="https://sandboxie-plus.com">sandboxie-plus.com</a> for more information.<br /><br />%2<br /><br />Features: %3<br /><br />Installation: %1<br />SbieDrv.sys: %4<br /> SbieSvc.exe: %5<br /> SbieDll.dll: %6<br /><br />Icons from <a href="https://icons8.com">icons8.com</a></source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Sandboxie+ 是 Sandboxie 的开源延续。<br />前往 <a href="https://sandboxie-plus.com">sandboxie-plus.com</a> 了解更多信息。<br /><br />%2<br /><br />特性: %3<br /><br />已安装: %1<br />SbieDrv.sys: %4<br /> SbieSvc.exe: %5<br /> SbieDll.dll: %6<br /><br />图标来自于 <a href="https://icons8.com">icons8.com</a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do you want to open %1 in a sandboxed (yes) or unsandboxed (no) Web browser?</source>
|
||||
|
@ -9404,7 +9404,7 @@ Sandboxie 提供了针对这些情况的处理选项,可以在此页面进行
|
|||
<location filename="Forms/SettingsWindow.ui" line="80"/>
|
||||
<source>Hotkey for suspending all processes:</source>
|
||||
<oldsource>Hotkey for suspending all process</oldsource>
|
||||
<translation type="unfinished">暂停沙盒内所有进程的热键:</translation>
|
||||
<translation>暂停沙盒内所有进程的热键:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="Forms/SettingsWindow.ui" line="236"/>
|
||||
|
|
Loading…
Reference in New Issue