- ベストアンサー
フロッピーセクタアクセスに関して
初めてお目にかかります。 今、PC98で書き込みを行ったフロッピーディスクを読み取るプログラムを作成しています。 インターネットにて調べて見ましたが、うまくいかない状態です。 問題点等あれば教えていただきたいと思います。 実行環境:Windows XP SP2 ドライブ:LOGITEC LFD-31U4 (USB:3モード) 開発言語:VC++(VS2005にて) BOOL Direct_Drive_Access(char *Drive){ HANDLE hHandle; DISK_GEOMETRY disket; DWORD dw1; BOOL ret; //ハンドルの取得 hHandle = CreateFile(Drive,GENERIC_READ , FILE_SHARE_READ,NULL,OPEN_EXISTING, NULL, NULL); if ( hHandle != INVALID_HANDLE_VALUE ){ //FDの情報を取得 ret = DeviceIoControl(hHandle,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL,0,&disket,sizeof(disket),&dw1,NULL); if (!ret) return FALSE; } } 上記のソースにて取得したdisketの内容が、1.44MBのフロッピーでした。 (この情報だと、次のReadFile関数で"1785:フォーマットされていません"のエラーが返ります) 実際は、Cylinder - 77 Track - 2 Sector - 26 Byte - 256 でフォーマットしているフロッピーです。 BIOS経由のアクセスも調べましたが、32bitOSのため、使用できない様でした。 これから何を調べていいかも分からない状態なので、アドバイスをお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>Cylinder - 77 Track - 2 Sector - 26 Byte - 256 ということは、N88DISK-BASICなり(FDの場合、Cylinder, HeadまちたはSurface, Sector)、IBM互換なりのフォーマットですよね。とすると、Cyliner0 Head0は単密度でセクタ長は128なので、Nが変わりますが、これは大丈夫ですか(Head1は倍密度だったと思う)。 なお、3モードはドライバが組み込まれていれば、OSからはパラメータ変更だけでINITかければ使えると聞いたことがあります(やったことはない) DOSの領域のディスクを作って、FD起動でDOS立ち上げてCからATのシステムコールを使った方が簡単だと思うなあ
その他の回答 (2)
NNo1です。引き続き・・・ 「Windows XP は 1.44 MB ディスク形式のフォーマットのみをサポートします。3 モード フロッピー ドライブ (720 KB、1.2 MB、および 1.44 MB 3.5 インチ フロッピーディスクを読み書き可能なドライブ) は特別なドライバのサポートが必要であり、Windows XP ではサポートしていません。」 http://support.microsoft.com/default.aspx?scid=kb;ja;309623 だそうです。。。 かくなる上は、ハードウェア直接制御、でしょうか。。 ドライバとか作らないと、無理そうですね。。
補足
返事が遅くなり申し訳ありません。 ドライバ…難しいですね… XPではドライバ無しでは1.25MBは読めないみたいですね… 考慮して再度考えて見ます。 ありがとうございました。
「フォーマットされていません」ということは、 rawアクセスできていないのではないでしょうか? デバイス名はあってますか? http://support.microsoft.com/kb/100027/ja
補足
YAMAMAYAさん 早速の回答ありがとうございます。 デバイス名は"\\\\.\\A:"を渡しており、試しに1.44MBの フロッピーでプログラムを実行した所、ReadFileまで 正常に動作しました。 DeviceIoControlで、1.44MBのフロッピーを読んでも、1.25MBの フロッピーを読んでも結局同じdisketが返ってきてしまいます。 1.25MBのダイレクトセクタアクセスは出来ないのでしょうか…
補足
>N88DISK-BASICなり(FDの場合、Cylinder, HeadまちたはSurface, Sector)、IBM互換なりのフォーマットですよね。 ご指摘の通り、IBMフォーマットのディスクをPC98のFD-BIOSで書き出したファイルです。 16bitのときにはBIOSのINT13Hのコールでよさそうですが、NT系のOSでもしかしたらサポートして無いかな? と思い質問いたしました、32bitの場合は難しそうですね… 他のファイル変換ソフトを使用し、バイナリダンプ作成後に処理を行う等の方法を検討してみます。 ありがとうございました。