⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dlgcode.c

📁 一个提供档案及Partition作加解密的程式支援以下的加密演算法AESBlowfishCAST5SerpentTriple DESTwofishAES-BlowfishAES-TwofishAES-
💻 C
📖 第 1 页 / 共 5 页
字号:
	{
		// Partition/device

		offset.QuadPart = volSize - HIDDEN_VOL_HEADER_OFFSET;

		if (SetFilePointerEx ((HANDLE) dev, offset, &offsetNew, FILE_BEGIN) == 0)
			return FALSE;

		if (offsetNew.QuadPart != offset.QuadPart)
			return FALSE;
	}
	else
	{
		// File-hosted volume

		offset.QuadPart = - HIDDEN_VOL_HEADER_OFFSET;

		if (SetFilePointerEx ((HANDLE) dev, offset, &offsetNew, FILE_END) == 0)
			return FALSE;
	}

	return TRUE;
}


BOOL
BrowseFiles (HWND hwndDlg, UINT nTitleID, char *lpszFileName, BOOL keepHistory)
{
	OPENFILENAME ofn;
	char szFileTitle[TC_MAX_PATH];
	ZeroMemory (&ofn, sizeof (OPENFILENAME));

	*szFileTitle = *lpszFileName = 0;
	ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; //sizeof (OPENFILENAME);
	ofn.hwndOwner = hwndDlg;
	ofn.lpstrFilter = "All Files (*.*)\0*.*\0TrueCrypt Volumes (*.tc)\0*.tc\0";
	ofn.lpstrCustomFilter = NULL;
	ofn.nFilterIndex = 1;
	ofn.lpstrFile = lpszFileName;
	ofn.nMaxFile = TC_MAX_PATH;
	ofn.lpstrFileTitle = szFileTitle;
	ofn.nMaxFileTitle = TC_MAX_PATH;
	ofn.lpstrInitialDir = NULL;
	ofn.lpstrTitle = getstr (nTitleID);
	ofn.Flags = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | (keepHistory ? 0 : OFN_DONTADDTORECENT);
	//ofn.lpstrDefExt = "tc";

	if (!GetOpenFileName (&ofn))
		return FALSE;
	else
		return TRUE;
}


static int CALLBACK
BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lp, LPARAM pData) 
{
	switch(uMsg) {
	case BFFM_INITIALIZED: 
	{
	  /* WParam is TRUE since we are passing a path.
	   It would be FALSE if we were passing a pidl. */
	   SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)pData);
	   break;
	}

	case BFFM_SELCHANGED: 
	{
		char szDir[TC_MAX_PATH];

	   /* Set the status window to the currently selected path. */
	   if (SHGetPathFromIDList((LPITEMIDLIST) lp ,szDir)) 
	   {
		  SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szDir);
	   }
	   break;
	}

	default:
	   break;
	}

	return 0;
}


BOOL
BrowseDirectories (HWND hwndDlg, char *lpszTitle, char *dirName)
{
	BROWSEINFO bi;
	LPITEMIDLIST pidl;
	LPMALLOC pMalloc;
	BOOL bOK  = FALSE;

	if (SUCCEEDED(SHGetMalloc(&pMalloc))) 
	{
		ZeroMemory(&bi,sizeof(bi));
		bi.hwndOwner = hwndDlg;
		bi.pszDisplayName = 0;
		bi.lpszTitle = lpszTitle;
		bi.pidlRoot = 0;
		bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT /*| BIF_EDITBOX*/;
		bi.lpfn = BrowseCallbackProc;
		bi.lParam = (LPARAM)dirName;

		pidl = SHBrowseForFolder(&bi);
		if (pidl!=NULL) 
		{
			if (SHGetPathFromIDList(pidl, dirName)==TRUE) 
			{
				bOK = TRUE;
			}

			pMalloc->lpVtbl->Free(pMalloc,pidl);
			pMalloc->lpVtbl->Release(pMalloc);
		}
	}

	return bOK;
}


void
handleError (HWND hwndDlg, int code)
{
	char szTmp[512];

	switch (code)
	{
	case ERR_OS_ERROR:
		handleWin32Error (hwndDlg);
		break;
	case ERR_OUTOFMEMORY:
		MessageBox (hwndDlg, getstr (IDS_OUTOFMEMORY), lpszTitle, ICON_HAND);
		break;
	case ERR_PASSWORD_WRONG:
		MessageBox (hwndDlg, getstr (CheckCapsLock (NULL, TRUE) ? IDS_PASSWORD_WRONG_CAPSLOCK_ON : IDS_PASSWORD_WRONG), lpszTitle, MB_ICONEXCLAMATION);
		break;
	case ERR_VOL_FORMAT_BAD:
		MessageBox (hwndDlg, getstr (IDS_VOL_FORMAT_BAD), lpszTitle, ICON_HAND);
		break;
	case ERR_BAD_DRIVE_LETTER:
		MessageBox (hwndDlg, getstr (IDS_BAD_DRIVE_LETTER), lpszTitle, ICON_HAND);
		break;
	case ERR_DRIVE_NOT_FOUND:
		MessageBox (hwndDlg, getstr (IDS_NOT_FOUND), lpszTitle, ICON_HAND);
		break;
	case ERR_FILES_OPEN:
		MessageBox (hwndDlg, getstr (IDS_OPENFILES_DRIVER), lpszTitle, ICON_HAND);
		break;
	case ERR_FILES_OPEN_LOCK:
		MessageBox (hwndDlg, getstr (IDS_OPENFILES_LOCK), lpszTitle, ICON_HAND);
		break;
	case ERR_VOL_SIZE_WRONG:
		MessageBox (hwndDlg, getstr (IDS_VOL_SIZE_WRONG), lpszTitle, ICON_HAND);
		break;
	case ERR_COMPRESSION_NOT_SUPPORTED:
		MessageBox (hwndDlg, getstr (IDS_COMPRESSION_NOT_SUPPORTED), lpszTitle, ICON_HAND);
		break;
	case ERR_PASSWORD_CHANGE_VOL_TYPE:
		MessageBox (hwndDlg, getstr (IDS_WRONG_VOL_TYPE), lpszTitle, ICON_HAND);
		break;
	case ERR_PASSWORD_CHANGE_VOL_VERSION:
		MessageBox (hwndDlg, getstr (IDS_WRONG_VOL_VERSION), lpszTitle, ICON_HAND);
		break;
	case ERR_VOL_SEEKING:
		MessageBox (hwndDlg, getstr (IDS_VOL_SEEKING), lpszTitle, ICON_HAND);
		break;
	case ERR_VOL_WRITING:
		MessageBox (hwndDlg, getstr (IDS_VOL_WRITING), lpszTitle, ICON_HAND);
		break;
	case ERR_VOL_READING:
		MessageBox (hwndDlg, getstr (IDS_VOL_READING), lpszTitle, ICON_HAND);
		break;
	case ERR_VOL_ALREADY_MOUNTED:
		MessageBox (hwndDlg, getstr (IDS_VOL_ALREADY_MOUNTED), lpszTitle, ICON_HAND);
		break;
	case ERR_FILE_OPEN_FAILED:
		MessageBox (hwndDlg, getstr (IDS_FILE_OPEN_FAILED), lpszTitle, ICON_HAND);
		break;
	case ERR_VOL_MOUNT_FAILED:
		MessageBox (hwndDlg, getstr (CheckCapsLock (NULL, TRUE) ? IDS_VOL_MOUNT_FAILED_CAPSLOCK_ON : IDS_VOL_MOUNT_FAILED), lpszTitle, MB_ICONEXCLAMATION);
		break;
	case ERR_NO_FREE_SLOTS:
		MessageBox (hwndDlg, getstr (IDS_NO_FREE_SLOTS), lpszTitle, ICON_HAND);
		break;
	case ERR_NO_FREE_DRIVES:
		MessageBox (hwndDlg, getstr (IDS_NO_FREE_DRIVES), lpszTitle, ICON_HAND);
		break;
	case ERR_INVALID_DEVICE:
		MessageBox (hwndDlg, getstr (IDS_INVALID_DEVICE), lpszTitle, ICON_HAND);
		break;
	case ERR_ACCESS_DENIED:
		MessageBox (hwndDlg, getstr (IDS_ACCESS_DENIED), lpszTitle, ICON_HAND);
		break;

	case ERR_DRIVER_VERSION:
		sprintf (szTmp, getstr (IDS_DRIVER_VERSION), VERSION_STRING);
		MessageBox (hwndDlg, szTmp, lpszTitle, ICON_HAND);
		break;

	case ERR_NEW_VERSION_REQUIRED:
		MessageBox (hwndDlg, getstr (IDS_NEW_VERSION_REQUIRED), lpszTitle, ICON_HAND);
		break;

	case ERR_DONT_REPORT:
		break;

	default:
		sprintf (szTmp, getstr (IDS_UNKNOWN), code);
		MessageBox (hwndDlg, szTmp, lpszTitle, ICON_HAND);

	}
}

static BOOL CALLBACK SetDefaultUserFontEnum( HWND hwnd, LPARAM font)
{
	SendMessage (hwnd, WM_SETFONT, (WPARAM) font, 0);
	return TRUE;
}

void SetDefaultUserFont (HWND hwnd)
{
	NONCLIENTMETRICS metric;

	if (hUserFont == 0)
	{
		metric.cbSize = sizeof (NONCLIENTMETRICS);
		SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &metric, 0);

		metric.lfMessageFont.lfHeight = -11;
		metric.lfMessageFont.lfWidth = 0;

		hUserFont = CreateFontIndirect (&metric.lfMessageFont);

		metric.lfMessageFont.lfUnderline = TRUE;
		hUserUnderlineFont = CreateFontIndirect (&metric.lfMessageFont);

		metric.lfMessageFont.lfUnderline = FALSE;
		metric.lfMessageFont.lfWeight = FW_BOLD;
		hUserBoldFont = CreateFontIndirect (&metric.lfMessageFont);

		metric.lfMessageFont.lfUnderline = TRUE;
		metric.lfMessageFont.lfWeight = FW_BOLD;
		hUserUnderlineBoldFont = CreateFontIndirect (&metric.lfMessageFont);
	}

	EnumChildWindows (hwnd, SetDefaultUserFontEnum, (LPARAM) hUserFont);
}

void OpenVolumeExplorerWindow (int driveNo)
{
	char dosName[5];
	SHFILEINFO fInfo;

	sprintf (dosName, "%c:\\", (char) driveNo + 'A');

	// Force explorer to discover the drive
	SHGetFileInfo (dosName, 0, &fInfo, sizeof (fInfo), 0);

	ShellExecute (NULL, "open", dosName, NULL, NULL, SW_SHOWNORMAL);
}

static BOOL explorerCloseSent;

static BOOL CALLBACK CloseVolumeExplorerWindowsEnum( HWND hwnd, LPARAM driveNo)
{
	char get[128], driveStr[10];
	HWND h;

	GetClassName (hwnd, get, sizeof get);

	if (strcmp (get, "CabinetWClass") == 0)
	{
		sprintf (driveStr, "%c:\\", driveNo + 'A');

		// Title bar
		GetWindowText (hwnd, get, sizeof get);
		if (strstr (get, driveStr) == get)
		{
			PostMessage (hwnd, WM_CLOSE, 0, 0);
			explorerCloseSent = TRUE;
			return TRUE;
		}

		// URL edit box
		h = FindWindowEx (hwnd, 0, "WorkerW", 0);
		if (!h) return TRUE;
		h = FindWindowEx (h, 0, "ReBarWindow32", 0);
		if (!h) return TRUE;
		h = FindWindowEx (h, 0, "ComboBoxEx32", 0);
		if (h)
		{
			SendMessage (h, WM_GETTEXT, sizeof get, (LPARAM) get);
			if (strstr (get, driveStr) == get)
			{
				PostMessage (hwnd, WM_CLOSE, 0, 0);
				explorerCloseSent = TRUE;
			}
		}
	}
	return TRUE;
}

BOOL CloseVolumeExplorerWindows (HWND hwnd, int driveNo)
{
	explorerCloseSent = FALSE;
	EnumWindows (CloseVolumeExplorerWindowsEnum, (LPARAM) driveNo);

	return explorerCloseSent;
}


#ifndef SETUP
void GetSpeedString (unsigned __int64 speed, char *str)
{
	if (speed > 1024I64*1024*1024*1024*1024*99)
		sprintf (str,"%d PB/s", speed/1024/1024/1024/1024/1024);
	else if (speed > 1024I64*1024*1024*1024*1024)
		sprintf (str,"%.1f PB/s",(double)(speed/1024.0/1024/1024/1024/1024));
	else if (speed > 1024I64*1024*1024*1024*99)
		sprintf (str,"%d TB/s",speed/1024/1024/1024/1024);
	else if (speed > 1024I64*1024*1024*1024)
		sprintf (str,"%.1f TB/s",(double)(speed/1024.0/1024/1024/1024));
	else if (speed > 1024I64*1024*1024*99)
		sprintf (str,"%d GB/s",speed/1024/1024/1024);
	else if (speed > 1024I64*1024*1024)
		sprintf (str,"%.1f GB/s",(double)(speed/1024.0/1024/1024));
	else if (speed > 1024I64*1024*99)
		sprintf (str,"%d MB/s", speed/1024/1024);
	else if (speed > 1024I64*1024)
		sprintf (str,"%.1f MB/s",(double)(speed/1024.0/1024));
	else
		sprintf (str,"%d KB/s", speed/1024);
}

static void DisplayBenchmarkResults (HWND hwndDlg)
{
	BENCHMARK_REC tmp_line;
	char item1[100]={0};
	int line = 0;
	LVITEM LvItem;
	HWND hList = GetDlgItem (hwndDlg, IDC_RESULTS);
	int ea, i;
	BOOL unsorted = TRUE;

	/* Sort the list */

	switch (benchmarkSortMethod)
	{
	case BENCHMARK_SORT_BY_SPEED:

		while (unsorted)
		{
			unsorted = FALSE;
			for (i = 0; i < benchmarkTotalItems - 1; i++)
			{
				if (benchmarkTable[i].meanBytesPerSec < benchmarkTable[i+1].meanBytesPerSec)
				{
					unsorted = TRUE;
					memcpy (&tmp_line, &benchmarkTable[i], sizeof(BENCHMARK_REC));
					memcpy (&benchmarkTable[i], &benchmarkTable[i+1], sizeof(BENCHMARK_REC));
					memcpy (&benchmarkTable[i+1], &tmp_line, sizeof(BENCHMARK_REC));
				}
			}
		}
		break;

	case BENCHMARK_SORT_BY_NAME:

		while (unsorted)
		{
			unsorted = FALSE;
			for (i = 0; i < benchmarkTotalItems - 1; i++)
			{
				if (benchmarkTable[i].id > benchmarkTable[i+1].id)
				{
					unsorted = TRUE;
					memcpy (&tmp_line, &benchmarkTable[i], sizeof(BENCHMARK_REC));
					memcpy (&benchmarkTable[i], &benchmarkTable[i+1], sizeof(BENCHMARK_REC));
					memcpy (&benchmarkTable[i+1], &tmp_line, sizeof(BENCHMARK_REC));
				}
			}
		}
		break;
	}
  
	/* Render the results */

	SendMessage (hList,LVM_DELETEALLITEMS,0,(LPARAM)&LvItem);

	for (i = 0; i < benchmarkTotalItems; i++)
	{
		ea = benchmarkTable[i].id;

		memset (&LvItem,0,sizeof(LvItem));
		LvItem.mask = LVIF_TEXT;
		LvItem.iItem = line++;
		LvItem.iSubItem = 0;
		LvItem.pszText = benchmarkTable[i].name;

		SendMessage (hList,LVM_INSERTITEM,0,(LPARAM)&LvItem);

		GetSpeedString((unsigned __int64) (benchmarkLastBufferSize / ((float) benchmarkTable[i].encSpeed / benchmarkPerformanceFrequency.QuadPart)), item1);
		LvItem.iSubItem = 1;
		LvItem.pszText = item1;

		SendMessage (hList,LVM_SETITEM,0,(LPARAM)&LvItem); 
		GetSpeedString((unsigned __int64) (benchmarkLastBufferSize / ((float) benchmarkTable[i].decSpeed / benchmarkPerformanceFrequency.QuadPart)), item1);
		LvItem.iSubItem = 2;
		LvItem.pszText = item1;

		SendMessage (hList,LVM_SETITEM,0,(LPARAM)&LvItem); 

		GetSpeedString(benchmarkTable[i].meanBytesPerSec, item1);
		LvItem.iSubItem = 3;
		LvItem.pszText = item1;

		SendMessage (hList,LVM_SETITEM,0,(LPARAM)&LvItem); 
	}
}

static BOOL PerformBenchmark(HWND hwndDlg)
{
    LARGE_INTEGER performanceCountStart, performanceCountEnd;
	BYTE *lpTestBuffer;
	HWND hList = GetDlgItem (hwndDlg, IDC_RESULTS);
	int ea;
	unsigned char iv[DISK_IV_SIZE];
	unsigned char ks[MAX_EXPANDED_KEY];
	unsigned char key[DISKKEY_SIZE];

	if (QueryPerformanceFrequency (&benchmarkPerformanceFrequency) == 0)
	{
		MessageBox (hwndDlg, "Error: Your hardware does not support a high-resolution performance counter.", lpszTitle, ICON_HAND);
		return FALSE;
	}

	ArrowWaitCursor ();

	lpTestBuffer = malloc(benchmarkBufferSize - (benchmarkBufferSize % 16));
	if (lpTestBuffer == NULL)
	{
		NormalCursor ();
		MessageBox (hwndDlg, "Error: Cannot allocate memory.", lpszTitle, ICON_HAND);
		return FALSE;
	}
	VirtualLock (lpTestBuffer, benchmarkBufferSize - (benchmarkBufferSize % 16));

	benchmarkTotalItems = 0;
	
	for (ea = EAGetFirst(); ea != 0; ea = EAGetNext(ea))
	{
		EAInit (ea, key, ks);
        
		if (QueryPerformanceCounter (&performanceCountStart) == 0)
			goto counter_error;

		EncryptBuffer ((unsigned long *) lpTestBuffer, (unsigned __int64) benchmarkBufferSize, ks, iv, iv, ea);

		if (QueryPerformanceCounter (&performanceCountEnd) == 0)
			goto counter_error;

		benchmarkTable[benchmarkTotalItems].encSpeed = performanceCountEnd.QuadPart - performanceCountStart.QuadPart;

		if (QueryPerformanceCounter (&performanceCountStart) == 0)
			goto counter_error;

		DecryptBuffer ((unsigned long *) lpTestBuffer, (unsigned __int64) benchmarkBufferSize, ks, iv, iv, ea);
		
		if (QueryPerformanceCounter (&performanceCountEnd) == 0)
			goto counter_error;

		benchmarkTable[benchmarkTotalItems].decSpeed = performanceCountEnd.QuadPart - performanceCountStart.QuadPart;
		benchmarkTable[benchmarkTotalItems].id = ea;
		benchmarkTable[benchmarkTotalItems].meanBytesPerSec = ((unsigned __int64) (benchmarkBufferSize / ((float) benchmarkTable[benchmarkTotalItems].encSpeed / benchmarkPerformanceFrequency.QuadPart)) + (unsigned __int64) (benchmarkBufferSize / ((float) benchmarkTable[benchmarkTotalItems].decSpeed / benchmarkPerformanceFrequency.QuadPart))) / 2;
		EAGetName (benchmarkTable[benchmarkTotalItems].name, ea);

		benchmarkTotalItems++;

	}

	VirtualUnlock (lpTestBuffer, benchmarkBufferSize - (benchmarkBufferSize % 16));

	free(lpTestBuffer);

	benchmarkLastBufferSize = benchmarkBufferSize;

	DisplayBenchmarkResults(hwndDlg);

	EnableWindow (GetDlgItem (hwndDlg, ID_PERFORM_BENCHMARK), TRUE);
	EnableWindow (GetDlgItem (hwndDlg, IDCLOSE), TRUE);

	NormalCursor ();
	return TRUE;

⌨️ 快捷键说明

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