format.c

来自「加密硬盘、分区、虚拟盘的程序源码」· C语言 代码 · 共 117 行

C
117
字号
/* Copyright (C) 2004 TrueCrypt Team, truecrypt.org
   This product uses components written by Paul Le Roux <pleroux@swprofessionals.com> */

#include "TCdefs.h"

#include "crypto.h"
#include "fat.h"
#include "format.h"
#include "volumes.h"
#include "progress.h"
#include "apidrvr.h"
#include "dlgcode.h"

int
FormatVolume (char *lpszFilename,
	      BOOL bDevice,
	      unsigned __int64 size,
	      char *lpszPassword,
	      int cipher,
	      int pkcs5,
	      fatparams * ft,
		  BOOL quickFormat,
	      HWND hwndDlg)
{
	int nStatus;
	PCRYPTO_INFO cryptoInfo;
	void *dev = INVALID_HANDLE_VALUE;
	OPEN_TEST_STRUCT driver;
	DISKIO_STRUCT win9x_r0;
	DWORD dwError;
	diskio_f write;

	if (nCurrentOS == WIN_NT || bDevice == FALSE)
	{
		write = (diskio_f) _lwrite;

		if (bDevice == TRUE)
		{
			dev = CreateFile (lpszFilename, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
		}
		else
		{
			/* We could support FILE_ATTRIBUTE_HIDDEN as an
			   option! */
			dev = CreateFile (lpszFilename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
		}

		if (dev == INVALID_HANDLE_VALUE)
		{
			return ERR_OS_ERROR;
		}
	}
	else
	{
		write = (diskio_f) win9x_io;

		if (OpenDevice (lpszFilename, &driver) == FALSE)
		{
			return ERR_OS_ERROR;
		}

		win9x_r0.devicenum = driver.device;
		win9x_r0.sectorstart = driver.secstart;
		win9x_r0.mode = 1;

		dev = &win9x_r0;
	}

	size -= SECTOR_SIZE;	// less the first TC sector

	ft->num_sectors = (int) (size / SECTOR_SIZE);
	memcpy (ft->volume_name, "           ", 11);

	{
		// Avoid random init delay before time counters start
		char tmp[1];
		RandgetBytes(&tmp, 1);
	}

	InitProgressBar (ft->num_sectors);

	/* Calculate the fats, root dir etc, and update ft */
	GetFatParams (ft);

	/* Copies any header structures into ft->header, but does not do any
	   disk io */
	nStatus = VolumeWriteHeader (ft->header,
				     cipher,
				     lpszPassword,
				     pkcs5,
					 0,
					 0,
				     &cryptoInfo);

	if (nStatus != 0)
		return nStatus;

	KillTimer (hwndDlg, 0xff);

	/* This does the disk io, both copying out the header, init the
	   sectors, and writing the FAT tables etc */
	nStatus = Format (ft, (HFILE) dev, cryptoInfo, 1000, write, bDevice==TRUE ? quickFormat:FALSE);

	dwError = GetLastError();

	crypto_close (cryptoInfo);

	if (dev != &win9x_r0)
		CloseHandle (dev);

	if (nStatus!=0)
		SetLastError(dwError);
	
	return nStatus;

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?