- ベストアンサー
ファイルポインタ
HDDを先導から終端までを0で埋めるものを作りたいのですが それってCの許容を超えてるのでしょうか? (アセンブラじゃないと無理?) ファイルポインタについてよくわからないのですが ファイルポインタのさすアドレスは 相対的なものなのでしょうか? あとアセンブラでは8086アセンブラやMASMという言葉をよく聞きますが そちらについてもご存じであればご教授ください。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
HDD廃棄用ソフトを作るのが目的でしょうか?もし、そうであれば下記の回答は意味がありませんが、目的については触れないで回答します。 1)”普通の方法では”「HDDを先導から終端までを0で埋める」ことはできません。ファイルに対してのアクセスはできますが、HDDへの直接のアクセスはできません。(あくまで、普通は、です) ファイルの先頭から終端までなら0で埋めることはできます。 2)Cのファイルポインタはlong(signedだったかも)ですのでその範囲でアクセスできます。 3)ファイルポインタのさすアドレスは、相対と絶対がありますが、どちらにしてもファイルの中の話です。HDD中のファイルの位置は”普通では”わかりません。そういう意味では相対です。 4)「HDDを先導から終端までを0で埋めるもの」、そのようなソフトを作ることはCで可能です。ですが、Windows上で作ることは「許容を越えて」います。 つまり、WindowsではHDDの様なハードウエアを直接触ることはできないようになっています。間違えればOS自体が飛んでしまうからです。 直接操作したいと言うことであれば、この質問を終えて、具体的に別の質問をされると良いと思います。 ----- アセンブラはCPUの種類に応じて(対応して)存在します。8086というのはインテルのCPUで、元祖(色々な意見があると思いますが)PCに使われていたCPUです。その8086CPU用のアセンブラです。 (以下は多少誤りを含む可能性があります) MASMは商品名ですが、MacroASseMblerから来ています。マクロが使える8086対応アセンブラです。たぶん現在は8086だけではなくP4くらいまで対応しているのではないかと思います。←このあたりは推測です。
その他の回答 (8)
- itohh
- ベストアンサー率45% (210/459)
こんにちは。itohhといいます。 >その場合だと大容量のHDDの場合MS-DOSの扱える上限以下でパーテーションをきると >いうことでしょうか。 パーテーションまでは、考えていませんでしたが、そういうことになると思います。 コピーを実行するプログラミング的にはそんなに難しくないですよね?
お礼
レスありがとうございます。色々な方法を検討かつ勉強していきたいと思います。 お答えくださった皆様、本当にありがとうございました。
- itohh
- ベストアンサー率45% (210/459)
こんにちは。itohhといいます。 >具体的にはフロッピーから起動して、そこからHDDを復元不可能な状態にしたいのです。 目的は、「HDDを復元不可能な状態」にしたいということなら、以下の案は如何ですか? (1) 1MB程度のファイルを用意する。 (2) HDDをFDISK&FORMATを済ませた状態にする。 (3) (1)で用意したファイルをHDDがいっぱいになるまでファイル名を変更しながらコピーする。 batファイルだけで行えるかは、ちょっと自信がないのでDOSで動くように16ビットアプリを 作成することをお薦めします。。 今現在、16ビットアプリを作成できるコンパイラーは「LSI C-86」しかないと思います。 もしかしたら、DOSでは1ディレクトリ上に置けるファイル数に上限があるかもしれません。 (ちょっと忘れてしまいました) もし、上限がある場合は、適当にサブディレクトリを作ってファイルをHDDがいっぱいになるまで コピーすることになると思います。 細かいロジックは省きましたが如何でしょうか? 最後に「LSI C-86」に関係するサイトを載せておきます。 「LSI C-86 ダウンロード」 URL:http://www.vector.co.jp/soft/maker/lsi/se001169.html 「LSI C-86 開発環境(きときと-CPad)」 URL:http://hp.vector.co.jp/authors/VA017148/pages/cpad.html
お礼
レスありがとうございます。その場合だと大容量のHDDの場合MS-DOSの扱える上限以下でパーテーションをきるということでしょうか。
- terra5
- ベストアンサー率34% (574/1662)
>具体的にはフロッピーから起動して、そこからHDDを復元不可能な状態にしたいのです。OSはWindows上じゃなくてもいいです。 LinuxやFreeBSDのようなOSだとコマンドでも可能です。 おおまかに言えば、FDブートなどでHDDをマウントせずにブートし、 HDDデバイスをファイルシステムでなくrawデバイスとしてアクセスして書き込めば実現できたと思います。 これはHDD全体を一つのファイルとしてアクセスするようなものなので、通常のファイルアクセスでHDDを埋め尽くすことが可能になります。 多分fopen系の関数でも問題無いような気が。 まあ、open系なら可能でしょう。 windows系のOSではこういうアクセスの方法が無いのでできないでしょう。 というか、FDだけで動かすという時点でWindowsはアウトですが。 FDで動作するLinuxのディストリビューションを使うか、 インストール用のFDの中身を細工(必要なコマンド、プログラムを追加し、インストーラーを起動せずshellを起動する等)すれば 可能なはずです。 コマンド自体は dd if=/dev/zero of=/dev/hdd....のような感じでいけるかと。 まあ、実際に使う際はよく調べてからどうぞ。 hddのデバイス名とか,ddコマンドのパラメタとか。
お礼
Linuxでそういうコマンドがあるんですね。その方面でも色々調べてみます。ありがとうございました。
- k-family
- ベストアンサー率34% (180/523)
やはり、そういう目的なんですね。 先の回答で、目的に触れない、と言ったのは、その目的を実現するだけならもっと簡便な方法がいくらでもあるからなのです。 この想定される目的と、質問内容から、失礼ながらsha-girlさんの経験を推定して先のような回答をしました。良く読んでいただれればわかると思いますが、”普通は”とか、そのような表現を多用しているのはそのためです。 ------ >具体的にはフロッピーから起動して そこまで考えられているのならなんでもできます。Cだけでできないことであってもアセンブラとリンクすればいいわけですから。 ただ、fopenのような関数はOSの機能を利用しているので、ファイルポインタで簡単に済ますのは難しいです。自分でHDDアクセス関数を作る必要があります。BIOScallを使う必要がありますが、可能です。
お礼
勉強する事がいっぱいありますね。ありがとうございました。
- KOH_da
- ベストアンサー率31% (161/506)
HDDの読み書きには、論理的に行なうものと、 物理的に行なう方法があります。 普通の読み書きは、すべて論理的なものです。 これはファイルシステムを通して処理するので、 FAT(ファイル名や、ファイルの配置を記録するとこ)で 表された部分しか読み書きできません。 物理的に読み書きするには、 そのHDDをアクセスするための方法を調べ、 その手順に従えば可能です。 またその処理ルーチンは、BIOSとして用意されており、 そのコマンドをBIOSに対して順に送ればいいことになります。 たとえばfdiskや、formatというコマンドは、 そのように作られていると思います。 もちろんC言語だけで開発できると思います。 ただ開発途中で、その手順を間違えてしまうと、 開発していたHDDの内容も消してしまいます。 正直なところ、sha-girlさんには荷が重いと思いますが、 参考文献を紹介しておきます。 CQ出版社 パソコンのレガシィI/O活用大全 桑野 雅彦著 定価1,800円 読むべきページは p.108くらいからですかね。 特にp.110をながめれば、約2秒で挫折を味わうかと思います。 □k-familyさん >WindowsではHDDの様なハードウエアを >直接触ることはできないようになっています。 HDDを消すために、そのソフトをHDDから起動するとは思えません。 FDDから起動するプログラムを記述するとすれば、 OSなんて関係ないような気がします。 また、WindowsNT/2000/XPはどうだか知りませんが、Windows95/98/Meではハードウエアを、 自由に操作することができますよ。 その後OSに戻って来れる保証はありませんが。
お礼
書籍の紹介ありがとうございます。早速注文しました。アセンブラについても勉強しようと思います。
- terra5
- ベストアンサー率34% (574/1662)
honiyonさんの書いた方法だとうまくいきません。 1. ファイルとして書ける部分はHDDの全体ではない。 例えば,ファイル名,ファイルのタイムスタンプが保存されている部分はこの方法では消すことができません。 alicia-yさんが書いているような方法でないと無理です. 2. エラーが出るまでゼロを追記書き込みしていっても、 HDDを埋め尽くすことはできない可能性がある。 使っているOSやファイルシステムによりますが、 たとえばファイルサイズが最大2Gの制限がある場合、 パーティションが2G以上あれば,おそらく2Gを超えた部分には 何も書き込まれません。
補足
そういえばfat32だとファイル2Gの壁とかありましたね。 参考にさせて頂きます。ありがとうございます。
- alicia-y
- ベストアンサー率40% (85/208)
OS やハード等の環境がわからないので適切な回答をすることが出来ませんが、 ご使用の OS にハードディスクにローレベルでアクセス出来るインターフェースが あれば可能です。 PC AT互換機などであれば BIOS の機能を使って行うことも出来ます。 (BIOS のメニュー画面でということではない) 開発言語から上記のようなインターフェースを使用できるならどんな言語を使っても 出来ます。
お礼
ありがとうございます。 具体的にCでBIOSの機能を使うにはどうすればいいのでしょうか? あと気になるのはBIOSを呼び出したとき、BIOSのメーカーに依存するのでしょうか?
- honiyon
- ベストアンサー率37% (331/872)
こんにちは、honiyonです。 HDDの空き領域を全てゼロで埋め尽くしたいという事でしょうか? それでしたら... 1.ファイルを新規作成して開く 2.エラーが出るまでゼロを追記書き込みしていく。 3.ファイルを閉じる。 で可能だと思います。 但し、この方法ですと処理が終了するまで非常に時間がかかるので、それを改善するには少し工夫が必要になってきます。 参考になれば幸いです(..
お礼
レスありがとうございます。参考にさせていただきます。
お礼
具体的にはフロッピーから起動して、そこからHDDを復元不可能な状態にしたいのです。OSはWindows上じゃなくてもいいです。 勉強になりました。ありがとうございます。