Various cleanups and fixes

(Logical change 1.445)
edge.strict_endians
(none)!yura 2004-07-04 16:41:24 +00:00
parent 5ec44c6f68
commit 3a41564173
1 changed files with 113 additions and 95 deletions

View File

@ -57,6 +57,7 @@ static void version (void)
printf ("\n%s v%s - Overwrite the unused space on an NTFS Volume.\n\n",
EXEC_NAME, VERSION);
printf ("Copyright (c) 2002-2003 Richard Russon\n");
printf ("Copyright (c) 2004 Yura Pakhuchiy\n");
printf ("\n%s\n%s%s\n", ntfs_gpl, ntfs_bugs, ntfs_home);
}
@ -348,8 +349,9 @@ static int parse_options (int argc, char *argv[])
*
* Read $Bitmap and wipe any clusters that are marked as not in use.
*
* Return: 1 Success, the clusters were wiped
* 0 Error, something went wrong
* Return: >0 Success, the atrribute was wiped
* 0 Nothing to wipe
* -1 Error, something went wrong
*/
static s64 wipe_unused (ntfs_volume *vol, int byte, enum action act)
{
@ -625,8 +627,9 @@ close_inode:
* MFT Records are 1024 bytes long, but some of this space isn't used. Wipe any
* unused space at the end of the record and wipe any unused records.
*
* Return: 1 Success, the clusters were wiped
* 0 Error, something went wrong
* Return: >0 Success, the clusters were wiped
* 0 Nothing to wipe
* -1 Error, something went wrong
*/
static s64 wipe_mft (ntfs_volume *vol, int byte, enum action act)
{
@ -755,8 +758,9 @@ free:
* Directories are kept in sorted B+ Trees. Index blocks may not be full. Wipe
* the unused space at the ends of these blocks.
*
* Return: 1 Success, the clusters were wiped
* 0 Error, something went wrong
* Return: >0 Success, the clusters were wiped
* 0 Nothing to wipe
* -1 Error, something went wrong
*/
static s64 wipe_directory (ntfs_volume *vol, int byte, enum action act)
{
@ -775,8 +779,9 @@ static s64 wipe_directory (ntfs_volume *vol, int byte, enum action act)
* The logfile journals the metadata to give the volume fault-tolerance. If the
* volume is in a consistant state, then this information can be erased.
*
* Return: 1 Success, the clusters were wiped
* 0 Error, something went wrong
* Return: >0 Success, the clusters were wiped
* 0 Nothing to wipe
* -1 Error, something went wrong
*/
static s64 wipe_logfile (ntfs_volume *vol, int byte, enum action act)
{
@ -834,91 +839,7 @@ static s64 wipe_logfile (ntfs_volume *vol, int byte, enum action act)
goto io_error_exit;
}
/* Fill the buffer with 0xff's. */
memset(buf, -1, NTFS_BUF_SIZE2);
/* Set the $DATA attribute. */
pos = 0;
while ((count = len - pos) > 0) {
if (count > NTFS_BUF_SIZE2)
count = NTFS_BUF_SIZE2;
if ((count = ntfs_attr_pwrite(na, pos, count, buf)) <= 0) {
Dprintf("Failed to set the $LogFile attribute value.");
if (count != -1)
errno = EIO;
goto io_error_exit;
}
pos += count;
}
ntfs_attr_close(na);
return ntfs_inode_close(ni);
io_error_exit:
eo = errno;
ntfs_attr_close(na);
errno = eo;
error_exit:
eo = errno;
ntfs_inode_close(ni);
errno = eo;
return -1;
return 0;
}
/**
* wipe_pagefile - Wipe the pagefile (swap space)
* @vol: An ntfs volume obtained from ntfs_mount
* @byte: Overwrite with this value
*
* pagefile.sys is used by Windows as extra virtual memory (swap space).
* Windows recreates the file at bootup, so it can be wiped without harm.
*
* Return: 1 Success, the clusters were wiped
* 0 Error, something went wrong
*/
static s64 wipe_pagefile (ntfs_volume *vol, int byte, enum action act)
{
// wipe completely, chkdsk doesn't do anything, booting writes header
const int NTFS_BUF_SIZE2 = 4096;
ntfs_inode *ni;
ntfs_attr *na;
s64 len, pos, count;
char buf[NTFS_BUF_SIZE2];
int eo;
if (!vol || (byte < 0))
return -1;
//Qprintf ("wipe_pagefile (not implemented) 0x%02x\n", byte);
ni = utils_pathname_to_inode (vol, NULL, "pagefile.sys");
if (!ni) {
Dprintf("Failed to open inode FILE_LogFile.\n");
return -1;
}
if ((na = ntfs_attr_open(ni, AT_DATA, AT_UNNAMED, 0)) == NULL) {
Dprintf("Failed to open $FILE_LogFile/$DATA\n");
goto error_exit;
}
/* The $DATA attribute of the $LogFile has to be non-resident. */
if (!NAttrNonResident(na)) {
Dprintf("$LogFile $DATA attribute is resident!?!\n");
errno = EIO;
goto io_error_exit;
}
/* Get length of $LogFile contents. */
len = na->data_size;
if (!len) {
Dprintf("$LogFile has zero length, no disk write needed.\n");
return 0;
}
/* Fill the buffer with @byte's. */
memset(buf, byte, NTFS_BUF_SIZE2);
/* Set the $DATA attribute. */
@ -938,7 +859,95 @@ static s64 wipe_pagefile (ntfs_volume *vol, int byte, enum action act)
}
ntfs_attr_close(na);
return ntfs_inode_close(ni);
ntfs_inode_close(ni);
Qprintf ("wipe_logfile 0x%02x, %lld bytes\n", byte, pos);
return pos;
io_error_exit:
eo = errno;
ntfs_attr_close(na);
errno = eo;
error_exit:
eo = errno;
ntfs_inode_close(ni);
errno = eo;
return -1;
}
/**
* wipe_pagefile - Wipe the pagefile (swap space)
* @vol: An ntfs volume obtained from ntfs_mount
* @byte: Overwrite with this value
*
* pagefile.sys is used by Windows as extra virtual memory (swap space).
* Windows recreates the file at bootup, so it can be wiped without harm.
*
* Return: >0 Success, the clusters were wiped
* 0 Nothing to wipe
* -1 Error, something went wrong
*/
static s64 wipe_pagefile (ntfs_volume *vol, int byte, enum action act)
{
// wipe completely, chkdsk doesn't do anything, booting writes header
const int NTFS_BUF_SIZE2 = 4096;
ntfs_inode *ni;
ntfs_attr *na;
s64 len, pos, count;
char buf[NTFS_BUF_SIZE2];
int eo;
if (!vol || (byte < 0))
return -1;
//Qprintf ("wipe_pagefile (not implemented) 0x%02x\n", byte);
ni = utils_pathname_to_inode (vol, NULL, "pagefile.sys");
if (!ni) {
Dprintf("Failed to open inode of pagefile.sys.\n");
return 0;
}
if ((na = ntfs_attr_open(ni, AT_DATA, AT_UNNAMED, 0)) == NULL) {
Dprintf("Failed to open pagefile.sys/$DATA\n");
goto error_exit;
}
/* The $DATA attribute of the pagefile.sys has to be non-resident. */
if (!NAttrNonResident(na)) {
Dprintf("pagefile.sys $DATA attribute is resident!?!\n");
errno = EIO;
goto io_error_exit;
}
/* Get length of pagfile.sys contents. */
len = na->data_size;
if (!len) {
Dprintf("pagefile.sys has zero length, no disk write needed.\n");
return 0;
}
memset(buf, byte, NTFS_BUF_SIZE2);
/* Set the $DATA attribute. */
pos = 0;
while ((count = len - pos) > 0) {
if (count > NTFS_BUF_SIZE2)
count = NTFS_BUF_SIZE2;
if ((count = ntfs_attr_pwrite(na, pos, count, buf)) <= 0) {
Dprintf("Failed to set the pagefile.sys attribute value.");
if (count != -1)
errno = EIO;
goto io_error_exit;
}
pos += count;
}
ntfs_attr_close(na);
ntfs_inode_close(ni);
Qprintf ("wipe_pagefile 0x%02x, %lld bytes\n", byte, pos);
return pos;
io_error_exit:
eo = errno;
@ -961,6 +970,7 @@ error_exit:
* Return: 1 Success, displayed some info
* 0 Error, something went wrong
*/
#if 0
static int ntfs_info (ntfs_volume *vol)
{
u8 *buffer;
@ -1128,6 +1138,7 @@ bmpdone:
return 1;
}
#endif
/**
* print_summary - Tell the user what we are about to do
@ -1220,7 +1231,7 @@ int main (int argc, char *argv[])
sleep (5);
}
if (0)
#if 0
{
int i = 0;
runlist_element *rl = vol->mft_na->rl;
@ -1234,6 +1245,7 @@ int main (int argc, char *argv[])
(long long)rl->lcn, (long long)rl->length);
return 0;
}
#endif
printf ("\n");
for (i = 0; i < opts.count; i++) {
@ -1297,6 +1309,12 @@ int main (int argc, char *argv[])
printf ("%lld bytes were wiped\n", (long long)total);
}
if (opts.logfile && (opts.bytes[j - 1] != 0xFF) && (act != act_info)) {
printf ("Fixing logfile: ");
wipe_logfile (vol, 0xFF, act);
}
if (ntfs_volume_set_flags (vol, VOLUME_IS_DIRTY) < 0) {
Eprintf ("Couldn't mark volume dirty\n");