📄 filedisk.c
字号:
/*
Control program for a virtual disk driver for Windows NT/2000/XP.
Copyright (C) 1999, 2000, 2001, 2002 Bo Brant閚.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
modified by Stefan Scherrer to add crypt support
*/
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <Wincrypt.h>
#include "filedisk.h"
#include "twofish.h"
#include "rmd160.h"
#include "tom.h"
#include "sha512.h"
int FileDiskSyntax(void)
{
fprintf(stderr, "syntax:\n");
fprintf(stderr, "filedisk /mount <filename> [size[k|M|G] | /ro | /cd] [<drive:>] [Encryption]\n");
fprintf(stderr, "filedisk /umount [<drive:>]\n");
fprintf(stderr, "filedisk /status [<drive:>]\n");
fprintf(stderr, "filedisk /encrypt <filename_plain> <filename_encryped> [Encryption]\n");
fprintf(stderr, "filedisk /decrypt <filename_crypt> <filename_plain> [Encryption]\n");
fprintf(stderr, "filedisk /rnd [/m] (Generate Random key)\n");
fprintf(stderr, "\n");
fprintf(stderr, "filename formats:\n");
fprintf(stderr, " c:\\path\\filedisk.img\n");
fprintf(stderr, " \\Device\\Harddisk0\\Partition1\\path\\filedisk.img\n");
fprintf(stderr, " \\\\server\\share\\path\\filedisk.img\n");
fprintf(stderr, "\n");
fprintf(stderr, "Encryption \n");
fprintf(stderr, "/2f:key encrypt / decrypt with twofish using the given key\n");
fprintf(stderr, "/aes128:key encrypt / decrypt with AES128 using the given key\n");
fprintf(stderr, "/aes256:key encrypt / decrypt with AES256 using the given key\n");
fprintf(stderr, "/aes192:key encrypt / decrypt with AES192 using the given key\n");
fprintf(stderr, "\n");
fprintf(stderr, "example:\n");
fprintf(stderr, "filedisk /mount c:\\temp\\filedisk.img 8M /aes256\n");
fprintf(stderr, "filedisk /mount c:\\temp\\cdimage.iso /cd g:\n");
fprintf(stderr, "filedisk /umount f:\n");
fprintf(stderr, "filedisk /umount\n");
return -1;
}
void PrintLastError(char* Prefix)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
0,
(LPTSTR) &lpMsgBuf,
0,
NULL
);
fprintf(stderr, "%s %s", Prefix, (LPTSTR) lpMsgBuf);
LocalFree(lpMsgBuf);
}
int
FileDiskMount(
int DeviceNumber,
POPEN_FILE_INFORMATION OpenFileInformation,
char DriveLetter,
BOOLEAN CdImage
)
{
char VolumeName[] = "\\\\.\\ :";
char DeviceName[255];
HANDLE Device;
DWORD BytesReturned;
VolumeName[4] = DriveLetter;
Device = CreateFile(
VolumeName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING,
NULL
);
if (Device != INVALID_HANDLE_VALUE)
{
SetLastError(ERROR_BUSY);
PrintLastError(&VolumeName[4]);
return -1;
}
if (CdImage)
{
sprintf(DeviceName, DEVICE_NAME_PREFIX "Cd" "%u", DeviceNumber);
}
else
{
sprintf(DeviceName, DEVICE_NAME_PREFIX "%u", DeviceNumber);
}
if (!DefineDosDevice(
DDD_RAW_TARGET_PATH,
&VolumeName[4],
DeviceName
))
{
PrintLastError(&VolumeName[4]);
return -1;
}
Device = CreateFile(
VolumeName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING,
NULL
);
if (Device == INVALID_HANDLE_VALUE)
{
PrintLastError(&VolumeName[4]);
DefineDosDevice(DDD_REMOVE_DEFINITION, &VolumeName[4], NULL);
return -1;
}
if (!DeviceIoControl(
Device,
IOCTL_FILE_DISK_OPEN_FILE,
OpenFileInformation,
sizeof(OPEN_FILE_INFORMATION) + OpenFileInformation->FileNameLength - 1,
NULL,
0,
&BytesReturned,
NULL
))
{
printf("Fn: %s\n",OpenFileInformation->FileName);
PrintLastError("FileDisk:");
DefineDosDevice(DDD_REMOVE_DEFINITION, &VolumeName[4], NULL);
return -1;
}
return 0;
}
int FileDiskUmount2(char *VolumeName)
{
char DriveLetter[4];
HANDLE Device;
DWORD BytesReturned;
POPEN_FILE_INFORMATION OpenFileInformation;
strcpy(DriveLetter," :");
Device = CreateFile(
VolumeName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING,
NULL
);
if (Device == INVALID_HANDLE_VALUE)
{
//PrintLastError(&VolumeName[4]);
return -3;
}
OpenFileInformation = malloc(sizeof(OPEN_FILE_INFORMATION) + MAX_PATH);
if (!DeviceIoControl(
Device,
IOCTL_FILE_DISK_QUERY_FILE,
NULL,
0,
OpenFileInformation,
sizeof(OPEN_FILE_INFORMATION) + MAX_PATH,
&BytesReturned,
NULL
))
{
//PrintLastError(VolumeName);
free(OpenFileInformation);
CloseHandle(Device);
return -2;
}
DriveLetter[0] = OpenFileInformation->DriveLetter;
free(OpenFileInformation);
if (!DriveLetter[0]) {
CloseHandle(Device);
return 0;
}
if (!DeviceIoControl(
Device,
FSCTL_LOCK_VOLUME,
NULL,
0,
NULL,
0,
&BytesReturned,
NULL
))
{
PrintLastError("Ignored:");
//return -1;
}
if (!DeviceIoControl(
Device,
IOCTL_FILE_DISK_CLOSE_FILE,
NULL,
0,
NULL,
0,
&BytesReturned,
NULL
))
{
PrintLastError("FileDisk:");
return -1;
}
if (!DeviceIoControl(
Device,
FSCTL_DISMOUNT_VOLUME,
NULL,
0,
NULL,
0,
&BytesReturned,
NULL
))
{
PrintLastError(VolumeName);
return -1;
}
if (!DeviceIoControl(
Device,
FSCTL_UNLOCK_VOLUME,
NULL,
0,
NULL,
0,
&BytesReturned,
NULL
))
{
//PrintLastError("Ignored:");
//return -1;
}
CloseHandle(Device);
if (!DefineDosDevice(
DDD_REMOVE_DEFINITION,
DriveLetter,
NULL
))
{
PrintLastError(DriveLetter);
return -1;
}
printf("%s: unmounted\n",DriveLetter);
return 0;
}
int FileDiskUmount(char DriveLetter)
{
char VolumeName[60] = "\\\\.\\ :";
int i;
if (DriveLetter) {
VolumeName[4] = DriveLetter;
i= FileDiskUmount2(VolumeName);
if (i) PrintLastError("Unmount
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -