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

📄 floppyios.cpp

📁 Device IO Control FloppyImage.zip
💻 CPP
字号:


#include "stdafx.h"
#include "FloppyIos.h"


HANDLE OpenDisk(LPCTSTR filename)
{
	HANDLE hDisk;

	// 打开设备
	hDisk = ::CreateFile(filename,				// 文件名
			GENERIC_READ | GENERIC_WRITE,			// 读写方式
			FILE_SHARE_READ | FILE_SHARE_WRITE,		// 共享方式
			NULL,									// 默认的安全描述符
			OPEN_EXISTING,							// 创建方式
			0,										// 不需设置文件属性
			NULL);									// 不需参照模板文件

	return hDisk;
}

BOOL GetDiskGeometry(HANDLE hDisk, PDISK_GEOMETRY lpGeometry)
{
    DWORD dwOutBytes;
	BOOL bResult;

	// 用IOCTL_DISK_GET_DRIVE_GEOMETRY取磁盘参数
	bResult = ::DeviceIoControl(hDisk,				// 设备句柄
			IOCTL_DISK_GET_DRIVE_GEOMETRY,			// 取磁盘参数
			NULL, 0,								// 不需要输入数据
			lpGeometry, sizeof(DISK_GEOMETRY),		// 输出数据缓冲区
			&dwOutBytes,							// 输出数据长度
			(LPOVERLAPPED)NULL);					// 用同步I/O

	return bResult;
}

BOOL ReadTracks(HANDLE hDisk, PDISK_GEOMETRY lpGeometry, LPVOID pBuf, DWORD dwStartCylinder, DWORD dwCylinderNumber)
{
	DWORD VirtBufSize;
    DWORD BytesRead;
                
	// 大小
	VirtBufSize =  lpGeometry->TracksPerCylinder * lpGeometry->SectorsPerTrack * lpGeometry->BytesPerSector;

	// 偏移
	::SetFilePointer(hDisk, VirtBufSize*dwStartCylinder, NULL, FILE_BEGIN);

	return ::ReadFile(hDisk, pBuf, VirtBufSize*dwCylinderNumber, &BytesRead, NULL);
}

BOOL WriteTracks(HANDLE hDisk, PDISK_GEOMETRY lpGeometry, LPVOID pBuf, DWORD dwStartCylinder, DWORD dwCylinderNumber)
{
	DWORD VirtBufSize;
    DWORD BytesWritten;

	// 大小
	VirtBufSize =  lpGeometry->TracksPerCylinder * lpGeometry->SectorsPerTrack * lpGeometry->BytesPerSector;

	// 偏移
	::SetFilePointer(hDisk, VirtBufSize*dwStartCylinder, NULL, FILE_BEGIN);

    return ::WriteFile(hDisk, pBuf, VirtBufSize*dwCylinderNumber, &BytesWritten, NULL);
}

BOOL LowLevelFormatTracks(HANDLE hDisk, PDISK_GEOMETRY lpGeometry, DWORD dwStartCylinder, DWORD dwCylinderNumber)
{
    FORMAT_PARAMETERS FormatParameters;
    PBAD_TRACK_NUMBER lpBadTrack;
    DWORD dwOutBytes;
	DWORD dwBufSize;
    BOOL bResult;

    FormatParameters.MediaType = lpGeometry->MediaType;
    FormatParameters.StartCylinderNumber = dwStartCylinder;
    FormatParameters.EndCylinderNumber = dwStartCylinder + dwCylinderNumber - 1;
    FormatParameters.StartHeadNumber = 0;
    FormatParameters.EndHeadNumber = lpGeometry->TracksPerCylinder - 1;

	dwBufSize = lpGeometry->TracksPerCylinder * sizeof(BAD_TRACK_NUMBER);

    lpBadTrack = (PBAD_TRACK_NUMBER) new BYTE[dwBufSize];
                
	// 用IOCTL_DISK_FORMAT_TRACKS对连续磁道进行低级格式化
	bResult = ::DeviceIoControl(hDisk,				// 设备句柄
			IOCTL_DISK_FORMAT_TRACKS,				// 低级格式化
			&FormatParameters, sizeof(FormatParameters),	// 输入数据缓冲区
			lpBadTrack, dwBufSize,					// 输出数据缓冲区
			&dwOutBytes,							// 输出数据长度
			(LPOVERLAPPED)NULL);					// 用同步I/O

    delete lpBadTrack;

    return bResult;
}

BOOL LockVolume(HANDLE hDisk)
{
    DWORD dwOutBytes;
    BOOL bResult;

	// 用FSCTL_LOCK_VOLUME锁卷
	bResult = ::DeviceIoControl(hDisk,		// 设备句柄
			FSCTL_LOCK_VOLUME,				// 锁卷
			NULL, 0,						// 不需要输入数据
			NULL, 0,						// 不需要输出数据
			&dwOutBytes,					// 输出数据长度
			(LPOVERLAPPED)NULL);			// 用同步I/O

    return bResult;
}

BOOL UnlockVolume(HANDLE hDisk)
{
    DWORD dwOutBytes;
    BOOL bResult;

	// 用FSCTL_UNLOCK_VOLUME开卷锁
	bResult = ::DeviceIoControl(hDisk,		// 设备句柄
			FSCTL_UNLOCK_VOLUME,			// 开卷锁
			NULL, 0,						// 不需要输入数据
			NULL, 0,						// 不需要输出数据
			&dwOutBytes,					// 输出数据长度
			(LPOVERLAPPED)NULL);			// 用同步I/O

    return bResult;
}

BOOL DismountVolume(HANDLE hDisk)
{
    DWORD dwOutBytes;
    BOOL bResult;

	// 用FSCTL_DISMOUNT_VOLUME卸卷
	bResult = ::DeviceIoControl(hDisk,		// 设备句柄
			FSCTL_DISMOUNT_VOLUME,			// 卸卷
			NULL, 0,						// 不需要输入数据
			NULL, 0,						// 不需要输出数据
			&dwOutBytes,					// 输出数据长度
			(LPOVERLAPPED)NULL);			// 用同步I/O

    return bResult;
}

⌨️ 快捷键说明

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