一般来说,可以精确到一个逻辑柱面。
逻辑柱面大小=逻辑磁头数+逻辑扇区数
除非你用的是二、三百兆的小硬盘,
否则现在的所有硬盘的逻辑磁头数都是63
逻辑扇区数都是255
所以,最小精确值为63*255*512=8225280 bytes
大约是8兆注意,上面所说的都是“逻辑”单位
用于INT13h界面,现代硬盘的物理磁头数没有超过8的

解决方案 »

  1.   

    就像内存的分页机制,他分配空间都是按某个单元的倍数来分配的,比如你VirtualAlloc()一个字节的空间,系统还是给你4K,这样当然没法精确到字节,但是只要是分配了4K,就是一样的了。这个加密机制不保险。
      

  2.   

    查了一下MSDN,这个函数果然不保险。
    MSDN说:
    lpTotalNumberOfBytes 
    [out] Pointer to a variable that receives the total number of bytes on the disk that are available to the user associated with the calling thread. 
    很明显,这个函数作用于一个盘符,而不一定是一个分区。在Windows下直接操作硬盘是可以的,但是比较难,涉及Thunk、VxD、WDM等
    如果没有特别的要求,还是写DOS程序简单一些。
      

  3.   

    奇怪:为什么从“管理”上可以看到下面的给分,而直接看不到?  回复人:oldmonsterman(飞龙在天) () 信誉:100  2002-4-6 18:33:42 得分: 10 删除  
     
      一般都是让你输入百分比或者以兆字节为分区的单位  
    你分区时有必要精确到字节吗?  
     
      回复人:wjlcq(新手) () 信誉:100  2002-4-6 18:47:34 得分: 0 删除  
     
      如果不能精确到字节,那么即使两个同样的硬盘,按相同的大小分区,也不能保证分区一定完全相同,再换句话说,不容易找到两个完全的硬盘,可由此增加一道加密机制!  
     
      回复人:gnw(往往) () 信誉:100  2002-4-6 18:59:40 得分: 20 删除  
     
      一般来说,可以精确到一个逻辑柱面。  
    逻辑柱面大小=逻辑磁头数+逻辑扇区数  
    除非你用的是二、三百兆的小硬盘,  
    否则现在的所有硬盘的逻辑磁头数都是63  
    逻辑扇区数都是255  
    所以,最小精确值为63*255*512=8225280  bytes  
    大约是8兆  
     
    注意,上面所说的都是“逻辑”单位  
    用于INT13h界面,现代硬盘的物理磁头数没有超过8的  
     
     
      回复人:ExitWindows(void) () 信誉:97  2002-4-6 19:17:02 得分: 10 删除  
     
      我认为gnw(往往)说的对。  
     
      回复人:gamedragon(gamedragon) () 信誉:100  2002-4-6 19:35:29 得分: 10 删除  
     
      就像内存的分页机制,他分配空间都是按某个单元的倍数来分配的,比如你VirtualAlloc()一个字节的空间,系统还是给你4K,这样当然没法精确到字节,但是只要是分配了4K,就是一样的了。  
     
    这个加密机制不保险。  
     
      回复人:ExitWindows(void) () 信誉:97  2002-4-6 19:38:01 得分: 10 删除  
     
      这个加密机制不是不保险,是根本就不行。  
     
    分区的大小并不是随机的,如果是两块一样的硬盘,按同样的方式来分区,那么,它们的分区大小一定是相同的。  
     
      回复人:wjlcq(新手) () 信誉:100  2002-4-6 22:49:44 得分: 0 删除  
     
      关于这个问题,我原来也认为一定是相同的,但有一件事使我产生了困惑:我们学校有个机房的30多台计算机全是一批从一家公司进的,配置全是一样,硬盘也是通过一个机子克隆的,但我读出的硬盘的分区大小就是有的不一样。我本来按照一个机器的分区做了一个密码,想整个机房都可以用了,结果却并不象我想象的那样。有的相同,有的不同!到底是怎么回事,还请专家指点!  
     
      回复人:gnw(往往) () 信誉:100  2002-4-6 23:13:31 得分: 10 删除  
     
      我曾经做过很多关于直接操作硬盘的程序,这种情况还没遇到过。  
    肯定是某些过程中出了问题。  
     
    你可以把测试得到的具体数据列一下,也好分析。  
    没有具体数据的话,就没有办法了。  
     
     
      回复人:ExitWindows(void) () 信誉:97  2002-4-6 23:22:00 得分: 10 删除  
     
      你是用什么方式得到分区大小的?  
     
      回复人:wjlcq(新手) () 信誉:100  2002-4-7 0:38:46 得分: 0 删除  
     
      用GetDiskFreeSpaceEx函数  
     
      回复人:gnw(往往) () 信誉:100  2002-4-7 1:20:06 得分: 10 删除  
     
      这………………  
    这个函数不行吧………………  
    我没用过,但感觉上不行。  
     
     
      回复人:gnw(往往) () 信誉:100  2002-4-7 1:54:46 得分: 10 删除  
     
      查了一下MSDN,这个函数果然不保险。  
    MSDN说:  
    lpTotalNumberOfBytes    
    [out]  Pointer  to  a  variable  that  receives  the  total  number  of  bytes  on  the  disk  that  are  available  to  the  user  associated  with  the  calling  thread.    
    很明显,这个函数作用于一个盘符,而不一定是一个分区。  
     
    在Windows下直接操作硬盘是可以的,但是比较难,涉及Thunk、VxD、WDM等  
    如果没有特别的要求,还是写DOS程序简单一些。  
     
     
      回复人:wjlcq(新手) () 信誉:100  2002-4-7 15:26:24 得分: 0 删除  
     
      题目说的分区就是指的盘符。这个问题暂时还没有结论,请大家继续讨论,最近很忙,过几天来给大家记分。