Drop has_recycle_dot_bin
This commit is contained in:
parent
0c8bbd5888
commit
2fb0813caa
|
@ -223,12 +223,6 @@ static char desktop_ini[] =
|
||||||
static char desktop_ini_ext[] =
|
static char desktop_ini_ext[] =
|
||||||
"LocalizedResourceName=@%SystemRoot%\\system32\\shell32.dll,-8964\r\n";
|
"LocalizedResourceName=@%SystemRoot%\\system32\\shell32.dll,-8964\r\n";
|
||||||
|
|
||||||
static BYTE info2[] =
|
|
||||||
{
|
|
||||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
||||||
};
|
|
||||||
|
|
||||||
enum bin_status
|
enum bin_status
|
||||||
{
|
{
|
||||||
dont_move,
|
dont_move,
|
||||||
|
@ -303,14 +297,7 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access, ULONG flags)
|
||||||
RtlInitEmptyUnicodeString (&recycler, recyclerbuf, sizeof recyclerbuf);
|
RtlInitEmptyUnicodeString (&recycler, recyclerbuf, sizeof recyclerbuf);
|
||||||
if (!pc.isremote ())
|
if (!pc.isremote ())
|
||||||
{
|
{
|
||||||
if (wincap.has_recycle_dot_bin ()) /* NTFS and FAT since Vista, ReFS */
|
|
||||||
RtlAppendUnicodeToString (&recycler, L"\\$Recycle.Bin\\");
|
RtlAppendUnicodeToString (&recycler, L"\\$Recycle.Bin\\");
|
||||||
else if (pc.fs_is_ntfs ()) /* NTFS up to 2K3 */
|
|
||||||
RtlAppendUnicodeToString (&recycler, L"\\RECYCLER\\");
|
|
||||||
else if (pc.fs_is_fat ()) /* FAT up to 2K3 */
|
|
||||||
RtlAppendUnicodeToString (&recycler, L"\\Recycled\\");
|
|
||||||
else
|
|
||||||
goto out;
|
|
||||||
RtlInitCountedUnicodeString(&fname, pfni->FileName, pfni->FileNameLength);
|
RtlInitCountedUnicodeString(&fname, pfni->FileName, pfni->FileNameLength);
|
||||||
/* Is the file a subdir of the recycler? */
|
/* Is the file a subdir of the recycler? */
|
||||||
if (RtlEqualUnicodePathPrefix (&fname, &recycler, TRUE))
|
if (RtlEqualUnicodePathPrefix (&fname, &recycler, TRUE))
|
||||||
|
@ -431,13 +418,9 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access, ULONG flags)
|
||||||
}
|
}
|
||||||
/* Then check if recycler exists by opening and potentially creating it.
|
/* Then check if recycler exists by opening and potentially creating it.
|
||||||
Yes, we can really do that. Typically the recycle bin is created
|
Yes, we can really do that. Typically the recycle bin is created
|
||||||
by the first user actually using the bin. Pre-Vista, the permissions
|
by the first user actually using the bin. */
|
||||||
are the default permissions propagated from the root directory.
|
|
||||||
Since Vista the top-level recycle dir has explicit permissions. */
|
|
||||||
InitializeObjectAttributes (&attr, &recycler, OBJ_CASE_INSENSITIVE,
|
InitializeObjectAttributes (&attr, &recycler, OBJ_CASE_INSENSITIVE,
|
||||||
rootdir,
|
rootdir, recycler_sd (true, true));
|
||||||
wincap.has_recycle_dot_bin ()
|
|
||||||
? recycler_sd (true, true) : NULL);
|
|
||||||
recycler.Length = recycler_base_len;
|
recycler.Length = recycler_base_len;
|
||||||
status = NtCreateFile (&recyclerdir,
|
status = NtCreateFile (&recyclerdir,
|
||||||
READ_CONTROL
|
READ_CONTROL
|
||||||
|
@ -475,9 +458,8 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access, ULONG flags)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* The desktop.ini and INFO2 (pre-Vista) files are expected by
|
/* The desktop.ini file is expected by Windows Explorer. Otherwise,
|
||||||
Windows Explorer. Otherwise, the created bin is treated as
|
the created bin is treated as corrupted */
|
||||||
corrupted */
|
|
||||||
if (io.Information == FILE_CREATED)
|
if (io.Information == FILE_CREATED)
|
||||||
{
|
{
|
||||||
RtlInitUnicodeString (&fname, L"desktop.ini");
|
RtlInitUnicodeString (&fname, L"desktop.ini");
|
||||||
|
@ -495,42 +477,15 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access, ULONG flags)
|
||||||
{
|
{
|
||||||
status = NtWriteFile (tmp_fh, NULL, NULL, NULL, &io, desktop_ini,
|
status = NtWriteFile (tmp_fh, NULL, NULL, NULL, &io, desktop_ini,
|
||||||
sizeof desktop_ini - 1, NULL, NULL);
|
sizeof desktop_ini - 1, NULL, NULL);
|
||||||
if (!NT_SUCCESS (status))
|
if (NT_SUCCESS (status))
|
||||||
debug_printf ("NtWriteFile (%S) failed, status = %y",
|
|
||||||
&fname, status);
|
|
||||||
else if (wincap.has_recycle_dot_bin ())
|
|
||||||
{
|
|
||||||
status = NtWriteFile (tmp_fh, NULL, NULL, NULL, &io,
|
status = NtWriteFile (tmp_fh, NULL, NULL, NULL, &io,
|
||||||
desktop_ini_ext,
|
desktop_ini_ext,
|
||||||
sizeof desktop_ini_ext - 1, NULL, NULL);
|
sizeof desktop_ini_ext - 1, NULL, NULL);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
debug_printf ("NtWriteFile (%S) failed, status = %y",
|
debug_printf ("NtWriteFile (%S) failed, status = %y",
|
||||||
&fname, status);
|
&fname, status);
|
||||||
}
|
|
||||||
NtClose (tmp_fh);
|
NtClose (tmp_fh);
|
||||||
}
|
}
|
||||||
if (!wincap.has_recycle_dot_bin ()) /* No INFO2 file since Vista */
|
|
||||||
{
|
|
||||||
RtlInitUnicodeString (&fname, L"INFO2");
|
|
||||||
status = NtCreateFile (&tmp_fh, FILE_GENERIC_WRITE, &attr, &io,
|
|
||||||
NULL, FILE_ATTRIBUTE_ARCHIVE
|
|
||||||
| FILE_ATTRIBUTE_HIDDEN,
|
|
||||||
FILE_SHARE_VALID_FLAGS, FILE_CREATE,
|
|
||||||
FILE_SYNCHRONOUS_IO_NONALERT
|
|
||||||
| FILE_NON_DIRECTORY_FILE, NULL, 0);
|
|
||||||
if (!NT_SUCCESS (status))
|
|
||||||
debug_printf ("NtCreateFile (%S) failed, status = %y",
|
|
||||||
&recycler, status);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
status = NtWriteFile (tmp_fh, NULL, NULL, NULL, &io, info2,
|
|
||||||
sizeof info2, NULL, NULL);
|
|
||||||
if (!NT_SUCCESS (status))
|
|
||||||
debug_printf ("NtWriteFile (%S) failed, status = %y",
|
|
||||||
&fname, status);
|
|
||||||
NtClose (tmp_fh);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
NtClose (recyclerdir);
|
NtClose (recyclerdir);
|
||||||
/* Shoot again. */
|
/* Shoot again. */
|
||||||
|
|
|
@ -23,7 +23,6 @@ wincaps wincap_xpsp2 __attribute__((section (".cygwin_dll_common"), shared)) = {
|
||||||
is_server:false,
|
is_server:false,
|
||||||
has_mandatory_integrity_control:false,
|
has_mandatory_integrity_control:false,
|
||||||
needs_count_in_si_lpres2:false,
|
needs_count_in_si_lpres2:false,
|
||||||
has_recycle_dot_bin:false,
|
|
||||||
has_gaa_on_link_prefix:false,
|
has_gaa_on_link_prefix:false,
|
||||||
has_gaa_largeaddress_bug:false,
|
has_gaa_largeaddress_bug:false,
|
||||||
supports_all_posix_ai_flags:false,
|
supports_all_posix_ai_flags:false,
|
||||||
|
@ -58,7 +57,6 @@ wincaps wincap_2003 __attribute__((section (".cygwin_dll_common"), shared)) = {
|
||||||
is_server:false,
|
is_server:false,
|
||||||
has_mandatory_integrity_control:false,
|
has_mandatory_integrity_control:false,
|
||||||
needs_count_in_si_lpres2:false,
|
needs_count_in_si_lpres2:false,
|
||||||
has_recycle_dot_bin:false,
|
|
||||||
has_gaa_on_link_prefix:false,
|
has_gaa_on_link_prefix:false,
|
||||||
has_gaa_largeaddress_bug:false,
|
has_gaa_largeaddress_bug:false,
|
||||||
supports_all_posix_ai_flags:false,
|
supports_all_posix_ai_flags:false,
|
||||||
|
@ -93,7 +91,6 @@ wincaps wincap_vista __attribute__((section (".cygwin_dll_common"), shared)) = {
|
||||||
is_server:false,
|
is_server:false,
|
||||||
has_mandatory_integrity_control:true,
|
has_mandatory_integrity_control:true,
|
||||||
needs_count_in_si_lpres2:true,
|
needs_count_in_si_lpres2:true,
|
||||||
has_recycle_dot_bin:true,
|
|
||||||
has_gaa_on_link_prefix:true,
|
has_gaa_on_link_prefix:true,
|
||||||
has_gaa_largeaddress_bug:true,
|
has_gaa_largeaddress_bug:true,
|
||||||
supports_all_posix_ai_flags:true,
|
supports_all_posix_ai_flags:true,
|
||||||
|
@ -128,7 +125,6 @@ wincaps wincap_7 __attribute__((section (".cygwin_dll_common"), shared)) = {
|
||||||
is_server:false,
|
is_server:false,
|
||||||
has_mandatory_integrity_control:true,
|
has_mandatory_integrity_control:true,
|
||||||
needs_count_in_si_lpres2:false,
|
needs_count_in_si_lpres2:false,
|
||||||
has_recycle_dot_bin:true,
|
|
||||||
has_gaa_on_link_prefix:true,
|
has_gaa_on_link_prefix:true,
|
||||||
has_gaa_largeaddress_bug:true,
|
has_gaa_largeaddress_bug:true,
|
||||||
supports_all_posix_ai_flags:true,
|
supports_all_posix_ai_flags:true,
|
||||||
|
@ -163,7 +159,6 @@ wincaps wincap_8 __attribute__((section (".cygwin_dll_common"), shared)) = {
|
||||||
is_server:false,
|
is_server:false,
|
||||||
has_mandatory_integrity_control:true,
|
has_mandatory_integrity_control:true,
|
||||||
needs_count_in_si_lpres2:false,
|
needs_count_in_si_lpres2:false,
|
||||||
has_recycle_dot_bin:true,
|
|
||||||
has_gaa_on_link_prefix:true,
|
has_gaa_on_link_prefix:true,
|
||||||
has_gaa_largeaddress_bug:false,
|
has_gaa_largeaddress_bug:false,
|
||||||
supports_all_posix_ai_flags:true,
|
supports_all_posix_ai_flags:true,
|
||||||
|
@ -198,7 +193,6 @@ wincaps wincap_10 __attribute__((section (".cygwin_dll_common"), shared)) = {
|
||||||
is_server:false,
|
is_server:false,
|
||||||
has_mandatory_integrity_control:true,
|
has_mandatory_integrity_control:true,
|
||||||
needs_count_in_si_lpres2:false,
|
needs_count_in_si_lpres2:false,
|
||||||
has_recycle_dot_bin:true,
|
|
||||||
has_gaa_on_link_prefix:true,
|
has_gaa_on_link_prefix:true,
|
||||||
has_gaa_largeaddress_bug:false,
|
has_gaa_largeaddress_bug:false,
|
||||||
supports_all_posix_ai_flags:true,
|
supports_all_posix_ai_flags:true,
|
||||||
|
@ -233,7 +227,6 @@ wincaps wincap_10_1511 __attribute__((section (".cygwin_dll_common"), shared)) =
|
||||||
is_server:false,
|
is_server:false,
|
||||||
has_mandatory_integrity_control:true,
|
has_mandatory_integrity_control:true,
|
||||||
needs_count_in_si_lpres2:false,
|
needs_count_in_si_lpres2:false,
|
||||||
has_recycle_dot_bin:true,
|
|
||||||
has_gaa_on_link_prefix:true,
|
has_gaa_on_link_prefix:true,
|
||||||
has_gaa_largeaddress_bug:false,
|
has_gaa_largeaddress_bug:false,
|
||||||
supports_all_posix_ai_flags:true,
|
supports_all_posix_ai_flags:true,
|
||||||
|
|
|
@ -16,7 +16,6 @@ struct wincaps
|
||||||
unsigned is_server : 1;
|
unsigned is_server : 1;
|
||||||
unsigned has_mandatory_integrity_control : 1;
|
unsigned has_mandatory_integrity_control : 1;
|
||||||
unsigned needs_count_in_si_lpres2 : 1;
|
unsigned needs_count_in_si_lpres2 : 1;
|
||||||
unsigned has_recycle_dot_bin : 1;
|
|
||||||
unsigned has_gaa_on_link_prefix : 1;
|
unsigned has_gaa_on_link_prefix : 1;
|
||||||
unsigned has_gaa_largeaddress_bug : 1;
|
unsigned has_gaa_largeaddress_bug : 1;
|
||||||
unsigned supports_all_posix_ai_flags : 1;
|
unsigned supports_all_posix_ai_flags : 1;
|
||||||
|
@ -76,7 +75,6 @@ public:
|
||||||
bool IMPLEMENT (is_server)
|
bool IMPLEMENT (is_server)
|
||||||
bool IMPLEMENT (has_mandatory_integrity_control)
|
bool IMPLEMENT (has_mandatory_integrity_control)
|
||||||
bool IMPLEMENT (needs_count_in_si_lpres2)
|
bool IMPLEMENT (needs_count_in_si_lpres2)
|
||||||
bool IMPLEMENT (has_recycle_dot_bin)
|
|
||||||
bool IMPLEMENT (has_gaa_on_link_prefix)
|
bool IMPLEMENT (has_gaa_on_link_prefix)
|
||||||
bool IMPLEMENT (has_gaa_largeaddress_bug)
|
bool IMPLEMENT (has_gaa_largeaddress_bug)
|
||||||
bool IMPLEMENT (supports_all_posix_ai_flags)
|
bool IMPLEMENT (supports_all_posix_ai_flags)
|
||||||
|
|
Loading…
Reference in New Issue