WIN32和Kernel)直接读写硬盘扇区

时间:2022-03-30 21:52:16

第一篇写技术的文章哦,以前好少写文章,我的文字表达很差劲,大家不要笑哦.
前几天仙剑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;//比如我要读的是编号为的那个扇区开始的数据,这里写