デジタルちんぶろぐ

デジタルな話題

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  197  : 記事  0  : コメント  709  : トラックバック  64

ニュース

Firefox ブラウザ無料ダウンロード

技術以外は
ちんぶろぐ

記事カテゴリ

書庫

日記カテゴリ

Windowsマシンでストレージからセクタ単位で読み出し、書き込みを行うためにはCreateFileで\\.\PHYSICALDRIVEx (xはドライブの番号、0からスタート)をファイル名(?)にしてオープンすればいいらしい。

 

で、お試し。折角なのでセクタ0(MBR)を読んでパーティションテーブルを見てみた。

環境はg++ 3.4.4 on Cygwin/ EeePC

----------プログラム----------

#include <windows.h>
#include <iostream>

using namespace std;

struct p_table {
    BYTE boot_flag;     // ブートフラグ
    BYTE start_chs[3];  // 開始CHS
    BYTE type;  // パーティションの種類
    BYTE end_chs[3];  // 終了CHS
    DWORD start_lba;  // 開始LBA
    DWORD total_sector; // セクタ数
};

int main(void)
{
    HANDLE h = CreateFile("\\\\.\\PHYSICALDRIVE0",
                          GENERIC_READ,
                          FILE_SHARE_READ | FILE_SHARE_WRITE,
                          NULL,
                          OPEN_EXISTING,
                          FILE_ATTRIBUTE_NORMAL,
                          NULL);
    if(h == INVALID_HANDLE_VALUE) {
        cout << "Could not open physical drive 0" << endl;
        return 1;
    }

    BYTE buf[0x200];
    DWORD read_size;

    ReadFile(h, buf, 0x200, &read_size, NULL);

    p_table* pt = reinterpret_cast<p_table*>(&buf[446]);
    for(int i = 0; i < 4; ++i) {
        const char* bfmes = pt[i].boot_flag & 0x80 ? "Boot" : "Boot Shinai";
        cout << "Partition " << i << " : " << bfmes << endl;
        cout << "Type : " << static_cast<DWORD>(pt[i].type) << endl;
        cout << "Start LBA : " << pt[i].start_lba << endl;
        cout << "Total Sector : " << pt[i].total_sector << endl;
    }

    CloseHandle(h);

    return 0;
}

 

----------実行結果----------

Partition 0 : Boot Shinai
Type : 4 ※ FAT16
Start LBA : 63
Total Sector : 32193
Partition 1 : Boot
Type : 7 ※ NTFS
Start LBA : 32256
Total Sector : 7773696
Partition 2 : Boot Shinai
Type : 0
Start LBA : 0
Total Sector : 0
Partition 3 : Boot Shinai
Type : 0
Start LBA : 0
Total Sector : 0

----------------------------

EeePCでは先頭パーティションに16MB程FATな何かがあって第2パーティションが起動ドライブ(Cドライブ)になってるみたい。

 

ところで、LBA領域が4バイトしかないって事はHDDが2TB超えたらMBRでは管理できなくなりますね。どうなるんだろう?

GPTとかいう規格があるらしいですけど(EFIな環境で使われてる?)、x86なWindowsではそこからは起動できないらしいし。

 

HDDの方は137GBの壁を越えるために採用されたLBA48があるから暫くの間は大丈夫でしょうが…

投稿日時 : 2008年3月27日 20:59

コメント

# re: Windowsでセクタリード 2008/03/28 2:01 通りかかり
cygwinでも読めるんだ,と少しびっくりです.
WindowsだとDisk Probeに頼りきりです・・・

CHSからLBAが主流になってましたが,今のSTATはコマンドなどが異なるんですかね?
Identify Deviceとかが懐かしい・・・

# re: Windowsでセクタリード 2008/03/28 8:13 通りかかり

誤:STAT
正:SATA

# re: Windowsでセクタリード 2008/03/28 9:24 スーパーあんどちん
>> 通りかかりさん
自分でシコシコプログラム書くくらいならDisk Probe使ったほうがいいんじゃないでしょうか^^;

Cygiwin環境ではgcc入れるとwindows用のヘッダがインストールされている(面倒くさがって全部にチェックつけたからかも)し、「Win32API使えるんだろうな。MessageBox出たし」程度の感じでやってみたら出来たってだけですが。
/usr/include/w32api
にwindows関係のヘッダは入ってるみたいです。

SATAはIDE互換モードがあるので、その場合ATA/ATAPIコマンドが使えるはずです。
AHCIの場合は全然違うでしょうけど、不勉強で知りません。
AHCIでWindowsインストールしようとするとインストール時に別途ドライバのインストールが必要になるから、IDE互換モードとは全然違った制御方法になっているのでしょうね。
Vistaだと追加ドライバ無しでインストールできるのかな?




# C#でセクタリード 2008/08/08 0:03 The beast of halfpace
C#でセクタリード

# Javaでセクタリード 2008/08/12 22:25 The beast of halfpace
Javaでセクタリード

# Javaでセクタリード 2008/08/12 22:34 The beast of halfpace
Javaでセクタリード

Post Feedback

タイトル
名前
Url:
コメント: