📄 filedisk.cpp
字号:
// Filedisk.cpp : implementation file
//
#include "stdafx.h"
#include "虚拟光驱.h"
#include "Filedisk.h"
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
#include <stdlib.h>
#define FILE_DEVICE_FILE_DISK 0x8000
#define IOCTL_FILE_DISK_OPEN_FILE CTL_CODE(FILE_DEVICE_FILE_DISK, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_FILE_DISK_CLOSE_FILE CTL_CODE(FILE_DEVICE_FILE_DISK, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_FILE_DISK_QUERY_FILE CTL_CODE(FILE_DEVICE_FILE_DISK, 0x802, METHOD_BUFFERED, FILE_READ_ACCESS)
#ifndef _FILE_DISK_
#define _FILE_DISK_
#ifndef __T
#ifdef _NTDDK_
#define __T(x) L ## x
#else
#define __T(x) x
#endif
#endif
#ifndef _T
#define _T(x) __T(x)
#endif
#define DEVICE_BASE_NAME _T("\\FileDisk")
#define DEVICE_DIR_NAME _T("\\Device") DEVICE_BASE_NAME
#define DEVICE_NAME_PREFIX DEVICE_DIR_NAME DEVICE_BASE_NAME
#endif
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFiledisk
CFiledisk::CFiledisk()
{
}
CFiledisk::~CFiledisk()
{
}
int CFiledisk::FileDiskMount()
{
char VolumeName[] = "\\\\.\\ :";
char DeviceName[255];
HANDLE Device;
DWORD BytesReturned;
VolumeName[4] = m_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]);
CloseHandle(Device);
return -1;
}
if (m_CdImage)
{
sprintf(DeviceName, DEVICE_NAME_PREFIX "Cd" "%u", m_DeviceNumber);
//TRACE("%s",DeviceName);
}
else
{
sprintf(DeviceName, DEVICE_NAME_PREFIX "%u", m_DeviceNumber);
}
if (!DefineDosDevice(
DDD_RAW_TARGET_PATH,
&VolumeName[4],
DeviceName
))
{
PrintLastError(&VolumeName[4]);
CloseHandle(Device);
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,
m_OpenFileInformation,
sizeof(OPEN_FILE_INFORMATION) + m_OpenFileInformation->FileNameLength - 1,
NULL,
0,
&BytesReturned,
NULL
))
{
PrintLastError("FileDisk:");
DefineDosDevice(DDD_REMOVE_DEFINITION, &VolumeName[4], NULL);
CloseHandle(Device);
return -1;
}
CloseHandle(Device);
return 0;
}
int CFiledisk::FileDiskUmount()
{
char VolumeName[] = "\\\\.\\ :";
HANDLE Device;
DWORD BytesReturned;
VolumeName[4] = m_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 -1;
}
if (!DeviceIoControl(
Device,
FSCTL_LOCK_VOLUME,
NULL,
0,
NULL,
0,
&BytesReturned,
NULL
))
{
PrintLastError(&VolumeName[4]);
CloseHandle(Device);
return -1;//
}
if (!DeviceIoControl(
Device,
IOCTL_FILE_DISK_CLOSE_FILE,
NULL,
0,
NULL,
0,
&BytesReturned,
NULL
))
{
PrintLastError("FileDisk:");
CloseHandle(Device);
return -1;
}
if (!DeviceIoControl(
Device,
FSCTL_DISMOUNT_VOLUME,
NULL,
0,
NULL,
0,
&BytesReturned,
NULL
))
{
PrintLastError(&VolumeName[4]);
CloseHandle(Device);
return -1;
}
if (!DeviceIoControl(
Device,
FSCTL_UNLOCK_VOLUME,
NULL,
0,
NULL,
0,
&BytesReturned,
NULL
))
{
PrintLastError(&VolumeName[4]);
CloseHandle(Device);
return -1;
}
CloseHandle(Device);
if (!DefineDosDevice(
DDD_REMOVE_DEFINITION,
&VolumeName[4],
NULL
))
{
PrintLastError(&VolumeName[4]);
return -1;
}
return 0;
}
void CFiledisk::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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -