2012-04-05 19 views
2

私はCを使ってWindowsプログラミングを学習する初心者です。ブートセクタを読み取る私のプログラムは、すべてのドライブ、つまりフロッピーまたはハードディスクの同じ出力を表示します。プログラムはすべてのドライブに対して同じ出力を生成しません。WindowsでのCプログラミング

#include <windows.h> 
#include <stdio.h> 
#include <conio.h> 

#pragma pack(1) 
struct boot 
{ 
BYTE JUMP[3]; 
char bsOemName[8]; 
WORD bytesperSector; 
BYTE sectorspercluster; 
WORD sectorsreservedarea; 
BYTE copiesFAT; 
WORD maxrootdirentries; 
WORD totalSectors; 
BYTE mediaDescripter; 
WORD sectorsperFAT; 
WORD sectorsperTrack; 
WORD sides; 
WORD hiddenSectors; 
char reserve[480]; 
WORD volumelabel; 
}; 
void ReadSector(char *src,int ss,int num,void *buff); 

void main() 
{ 
struct boot b; 
ReadSector("\\\\dell-PC\\c:",0,1,&b); 
printf("Boot Sector name: %d\n",b.bsOemName); 
printf("Bytes per Sector: %d\n",b.bytesperSector); 
printf("Sectors per Cluster: %d\n",b.sectorspercluster); 
printf("Total sectors: %d\n",b.totalSectors); 
printf("copies FAT: %d\n",b.copiesFAT); 
printf("hidden sectors: %d\n",b.hiddenSectors); 
printf("volume label: %d\n",b.volumelabel); 

} 
void ReadSector(char *src,int ss,int num,void *buff) 
{ 
HANDLE h; 
unsigned int br; 
h=CreateFile(src,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0); 
SetFilePointer(h,(ss*512),NULL,FILE_BEGIN); 
ReadFile(h,buff,512*num,&br,NULL); 
    CloseHandle(h); 
} 

ReadSector()関数に渡すすべての引数に対して同じ出力を生成しています。つまり、d:またはe:を渡すと、出力は常に同じになります。ガベージ値を出力として取得していますか?

Boot Sector name: 1637707 
Bytes per Sector: 52428 
Sectors per Cluster: 204 
Total sectors: 52428 
copies FAT: 204 
hidden sectors: 52428 
volume label: 52428 
+0

「h」が「INVALID_HANDLE_VALUE」に等しいかどうかを確かめてください。 – sinelaw

+0

@wallykが投稿した内容をメモしてください。あなたはあなたが望むようなものを達成することは非常に難しいでしょう。 –

+0

成功と失敗のために、すべてのAPI呼び出しをチェックする必要があります。あなたはこれをやっていません。 'CreateFile'への呼び出しが失敗すると想像していますが、あなたがチェックしない限り、あなたは決して知りません。各API関数のMSDNトピックを注意深くお読みください。 –

答えて

2
  1. それがエラーを与えているかどうかを決定するために、各呼び出しからの戻りステータスを確認します。そうであれば、エラーコードを調べてその意味を判断することで、間違っていることをかなり学ぶことができます。

  2. は、それを使用する前に、構造体を初期化し、あなたが値を取得していることを確認しするには、次の

struct boot b; 
    memset (&b, 0, sizeof b); 

私は、任意にゼロを選択しているが、任意の値が行います。

+1

stuctをゼロに初期化する正規の方法は次のようになります: 'struct boot b = {0};' –

関連する問題