2012-04-05 5 views
2

Я начинаю обучение программированию окон, используя C. Моя программа для чтения загрузочных секторов отображает один и тот же вывод для каждого диска, например, на дискете или жестком диске. Программа не должна генерировать один и тот же вывод для каждого диска.программирование окон в 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' терпит неудачу, но вы никогда не узнаете, если не проверите. Внимательно прочитайте тему MSDN для каждой функции API. –

ответ

2
  1. Проверить статус возврата от каждого вызова, чтобы определить, является ли он дает ошибку. Если это так, вы можете узнать немного о том, что вы делаете неправильно, просмотрев код ошибки и определив его значение.

  2. Чтобы быть уверенным, что вы получаете значения, инициализировать структуру перед использованием:

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

Я произвольно выбрал ноль, но любое значение будет делать.

+1

Канонический путь к нулю инициализирует stuct следующим образом: 'struct boot b = {0};' –

Смежные вопросы