第一篇写技术的文章哦,以前好少写文章,我的文字表达很差劲,大家不要笑哦.
前几天仙剑4通关了,感觉好惆怅,什么都不想去做.今天看了一下书发现一篇比较好玩的文章,于是自己静静地实践一番.文章是<基于硬盘保留扇区的软件保护方法(作者:熊志勇)>,内容是介绍了怎么读写硬盘保留扇区.以下是我的学习日记.
这里是摘自文章里的一个表:硬盘的总体结构
***********************************************************************
编号 名称 备注
1 主引导扇区(含硬盘分区表) 占用一个扇区空间(一个扇区空间为512字节)
2 保留扇区(操作系统不使用的扇区) 占用62个扇区空间
3 第一个分区 C:盘
4 扩展主引导扇区(含扩展分区表) 一个扇区空间(只有存在扩展分区是才存在)
5 保留扇区 占用62个扇区空间
6 第2个分区 D:盘
7 下一个扩展主引导扇区 只有分区链没结束才存在
8 ...... ......
***********************************************************************
通常的软件保护都会向编号为2的保留扇区写一些软件注册信息呀,等等的东西.
而要读写这个没被操作系统利用的部分作者已经给出了代码(幸福呀,不用自己找).
//以下是已经做好的一个函数
BOOL ReadPhysicalSector(unsigned long SectorStart, unsigned long SectorCount, unsigned char *p)
{
unsigned long BytesPerSector = 512;
unsigned long nBytes;
char Drive[] = "////.//PHYSICALDRIVE0";
BOOL result = FALSE;
HANDLE hDeviceHandle = CreateFile(Drive,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,0);
if(hDeviceHandle)
{
long pointer;
long phigh;
pointer = SectorStart;
pointer = pointer*BytesPerSector;
phigh = pointer>>32;
SetFilePointer(hDeviceHandle,(unsigned long)pointer,&phigh,FILE_BEGIN);
if(ReadFile(hDeviceHandle,p,SectorCount*BytesPerSector,&nBytes,NULL))
result = TRUE;
CloseHandle(hDeviceHandle);
}
return result;
}
//调用就这样
int main(int argc, char* argv[])
{
unsigned long SectorStart = 0;//比如我要读的是编号为的那个扇区开始的数据,这里写