2013-09-23 39 views
0

如何在舊的Windows 2000上以字節爲單位獲得硬盤的確切大小?如何在Windows 2000上以字節爲單位獲取硬盤大小?

IOCTL_DISK_GET_LENGTH_INFO工作正常體積,但不能在Windows 2000上的物理磁盤句柄(在//./PHYSICALDISKx東西)

(從XP或物理驅動器後正常工作),我們還是要支持此古OS ...

UPDATE:

的代碼是用C寫的,所以如果可能的話,我會用普通的Windows API。

+0

ioctl不工作的方式是什麼?我認爲它失敗了一個特定的錯誤代碼?您是否嘗試過任何其他ioctls(GET_DRIVE_LAYOUT,GET_LENGTH_INFO等)? – Luke

+0

@Luke在Windows 2000上,當我在通過在////PHYSICALDRIVEx打開驅動器獲得的句柄上使用它時,它會給出ERROR_INVALID_FUNCTION。它稍後在XP上運行良好。所以我正在尋找該操作系統的解決方法。獲取磁盤上確切的字節數是一項要求。 – Calmarius

+0

你可以通過IOCTL_DISK_GET_DRIVE_GEOMETRY得到它。它爲您提供了柱面,每個柱面的軌跡,每個軌道的扇區以及每扇區的字節數。將它們全部疊加在一起,它將爲您提供磁盤的總字節數。 – Luke

回答

0

似乎沒有IOCTL,讓您在Windows 2000上

確切的硬盤驅動器大小

但有一個解決方法,工作:

我用IOCTL_DISK_GET_DRIVE_GEOMETRY來獲取汽缸,軌道/ cyl,扇區/軌道,字節/部門。

乘以它們給了我一個粗略的硬盤大小,但不是確切的大小(小一點)。我可以從中計算出最近的部門ID。

爲了得到確切的大小我用IOCTL_SCSI_PASS_THROUGH和發送SCSI read commands試圖讀取超出磁盤的末尾,所以我有一個扇區號爲一個不存在的部門,然後使用二進制搜索得到最高的部門id在哪裏讀成功。

將它與字節/扇區相乘,我得到硬盤的確切大小,以字節爲單位。

0

每當我需要獲取這類信息時,我通常會使用WMI,因爲它提供了關於任何事情的大量數據。

+0

這是IOCTL調用上面的一層,不是嗎? – Calmarius

2

如果你運行「dir c:\」你可以得到在C自由空間(沒有任何API或等)

,最後一行會給你的可用磁盤空間。

更好的解決方案: 「fsutil volume diskfree c:

或者試試下面的代碼...

void main (int argc, wchar_t **argv) 
     { 
      BOOL fResult; 
      unsigned __int64 i64FreeBytesToCaller, 
          i64TotalBytes, 
          i64FreeBytes; 
      fResult = GetDiskFreeSpaceEx (L"C:", 
            (PULARGE_INTEGER)&i64FreeBytesToCaller, 
            (PULARGE_INTEGER)&i64TotalBytes, 
            (PULARGE_INTEGER)&i64FreeBytes); 
      if (fResult) 
      { 
       printf ("\n\nGetDiskFreeSpaceEx reports\n\n"); 
       printf ("Available space to caller = %I64u MB\n", 
         i64FreeBytesToCaller/(1024*1024)); 
       printf ("Total space    = %I64u MB\n", 
         i64TotalBytes/(1024*1024)); 
       printf ("Free space on drive  = %I64u MB\n", 
         i64FreeBytes/(1024*1024)); 
      } 
     } 
+0

[GetDiskFreeSpaceEx](http://stackoverflow.com/questions/627131/getdiskfreespaceex-reports-wrong-number-of-free-bytes)不準確。 我想知道整個磁盤的大小:包括所有分區和未分配的空間。我們需要直接寫磁盤,並想知道整個磁盤上最後一個有效的扇區號。 – Calmarius

+0

@Calmarius Whoah - 沒有沉重教科書的低級操作。膽大! –

+0

@ PP。沒有其他的方法來刪除那些討厭的引導病毒,這將他們的東西放入最後扇區...;) – Calmarius

相關問題