#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#ifndef INVALID_SET_FILE_POINTER
#define INVALID_SET_FILE_POINTER (DWORD)-1
#endif
#define FILE_BEGIN 0
#define FILE_CURRENT 1
#define FILE_END 2
HANDLE m_hDisk = NULL;
bool Open(char *vol)
{
char szDrive[10];
sprintf(szDrive, "\\\\.\\%c:", vol[0]);
//sprintf(szDrive, "\\\\.\\scsi1:");
m_hDisk = ::CreateFile(
szDrive,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
DWORD dwError = ::GetLastError();
return m_hDisk != INVALID_HANDLE_VALUE;
}
void Close()
{
if (m_hDisk != INVALID_HANDLE_VALUE)
::CloseHandle(m_hDisk);
}
bool ReadSector (DWORD sector, char *Buffer, int sectorSize)
{
DWORD read = 0;
if (::SetFilePointer(m_hDisk, sector, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
return false;
if (!::ReadFile(m_hDisk, Buffer, sectorSize, &read, NULL))
return false;
return true;
}
bool WriteSector(DWORD sector, char *Buffer, int sectorSize)
{
DWORD wrote = 0;
if (::SetFilePointer(m_hDisk, sector, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
return false;
if (!::WriteFile(m_hDisk, Buffer, sectorSize, &wrote, NULL))
return false;
return true;
}
int main()
{
bool ret = Open("e");
int i = 0;
if (ret != true)
{
printf("open error");
return 0;
}
char buf[512] = {0};
ret = ReadSector(0, buf, 512);
if (ret != true)
{
printf("ReadSector error");
return 0;
}
for (i = 0; i < 512; i++)
{
printf("%02x ", (unsigned char)(buf[i] & 0xFF));
if ((i+1) % 16 == 0)
printf("%c",'\n');
}
buf[464] = 'e';
ret = WriteSector(0, buf, 512);
if (ret != true)
{
printf("WriteSector error");
return 0;
}
Close();
}
1、查看U盘所在的磁盘盘符,e盘:
2、在main函数中Open("e"):
Open("e");
3、通过ReadSector函数从第0个扇区读取一个扇区:
ret = ReadSector(0, buf, 512);
4、显示读取到的每一个字段:
for (i = 0; i < 512; i++)
{
printf("%02x ", (unsigned char)(buf[i] & 0xFF)); //注意这个地方,如果不写成这样,显示的时候会变成ffffffxx这样,就是前边会多6个f,所以这样操作了下
if ((i+1) % 16 == 0)
printf("%c",'\n');
}
显示多个f如下图所示:
正常显示如下:
再看看winhex工具读取并显示的结果:
其实是差不多的,但是代码里边有一个修改字符的操作:
buf[464] = 'e';
为啥会修改464这个位置的字符呢,主要是为了测试,另外464的十六进制是0x1D0,我们看下:
是因为这边是一个打印字符串,修改这边不会影响U盘引导,也不会影响操作系统识别FAT32文件系统,所以才修改的这。
红色方框这个是已经 修改后的值,表示我们的程序读取U盘的引导(第0个)扇区和写入功能是没有问题的。
这样,如果是需要手动通过程序对U盘进行写入启动U盘这样会比较方便。