2016-10-04 4 views
0

У меня есть виртуальная машина Windows 7 с флоппи-диском (настроен A :). Я пытаюсь прочитать загрузочный сектор флоппи-дисковода в структуру. Однако каждый раз, когда я запускаю эту программу, он не может найти дискету. Я могу подтвердить, что он доступен.Программа C не удается получить дескриптор флоппи-дисковода

Код:

#include "stdafx.h" 
#include<Windows.h> 
#include<stdio.h> 
#include<conio.h> 
#include<WinBase.h> 

#pragma pack(1) 

struct boot 
{ 
    BYTE jump[3]; 
    char bsOemName[8]; 
    WORD bytesperSector;  
    BYTE sectorpercluster; 
    WORD sectorsreservedarea; 
    BYTE copiesFAT; 
    WORD maxrootdirentries; 
    WORD totalSectors; 
    BYTE mediaDescriptor; 
    WORD sectorsperFAT; 
    WORD sectorsperTrack; 
    WORD sides; 
    WORD hiddenSectors; 
    char reserve[480]; 


}; 

void ReadSector(char *src, int ss, int num, void* buff); 

void main() 
{ 
    struct boot b; 
    ReadSector("\\\\.\\A:", 0, 1, &b); 

    printf("\nBoot sector Name: %s\n", b.bsOemName); 
    printf("Bytes per sector: %d\n", b.bytesperSector); 
    printf("Sectors per Cluster: %d\n", b.sectorpercluster); 
    printf("Total Sectors: %d\n", b.totalSectors); 
} 

void ReadSector(char *src, int ss, int num, void* buff) 
{ 
    HANDLE h;  //HANDLE is a typedef of void *HANDLE 
    unsigned int br; 
    h = CreateFile(src, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); 
    DWORD dw = GetLastError(); 
    printf("\nLast Error: %d", dw); 
    if (h != NULL) 
    { 
     printf("\nError reading floppy disk '%s'", src); 
     printf("\nReturn value for handle = %d", h); 

    } 

    else 
    { 
     printf("\nSuccess.."); 
    } 

    SetFilePointer(h, (ss * 512), NULL,FILE_BEGIN); 
    ReadFile(h, buff, num, &br, NULL); 
    CloseHandle(h); 
} 

Выход/Ошибка:

C:\Users\IEUser\Desktop>Hardware.exe 

Last Error: 2 
Error reading floppy disk '\\.\A:' 
Return value for handle = -1 
Boot sector Name: 
Bytes per sector: 14336 
Sectors per Cluster: 248 
Total Sectors: 0 

Output Screenshot

Код ошибки возвращается из системы 2: Система не может найти указанный файл.

Поскольку он не может открыть флоппи-дисковод, переменные структуры хранят значения мусора.

Может кто-нибудь помочь?

+1

Вставить ошибку как _text_ пожалуйста. –

+0

Я уверен, что «A:» не является именем устройства. Найдите свой диск в Диспетчере устройств и попробуйте другие другие «имена», перечисленные для этого устройства. Существуют также некоторые ограничения, перечисленные в [документации] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858 (v = vs.85) .aspx) для доступа к гибким дискам; например, вы в настоящее время не используете 'FILE_SHARE_WRITE', но похоже, что вы должны. –

+1

Обратите внимание, что в [документации] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858 (v = vs.85) .aspx) говорится: «При открытии тома или гибкого диска, параметр dwShareMode должен иметь FILE_SHARE_WRITEflag. " – nos

ответ

1

Похоже, что возникла проблема с аргументами, переданными функции ReadSector() (которая, в свою очередь, передает аргументы функции CreateFile()) и функции ReadFile().

код в вопросе: ReadSector("\\\\.\\A:", 0, 1, &b);

Я просто должен был добавить «L» на первый аргумент: ReadSector(L"\\\\.\\A:", 0, 1, &b);

Это исправили проблему дескриптор файла, но тогда он не мог читать file.i потом понял, что это была функция ReadFile(), которая не работала.

код в вопросе: ReadFile(h, buff, num, &br, NULL);

Я просто должен был заменить «Num» с 512, как эта функция должна знать, сколько байт нужно прочитать. Здесь «num» было установлено 1, и именно по этой причине он работал не так, как ожидалось.

ReadFile(h, buff, 512, &br, NULL) 

Я немного изменил исходный код, чтобы проверить значения CreateFile() и ReadFile().

Вот измененный код:

#include "stdafx.h" 
#include<Windows.h> 
#include<stdio.h> 
#include<conio.h> 
#include<WinBase.h> 

#pragma pack(1) 

struct boot 
{ 
    BYTE jump[3]; //BYTE is a typedef for unsigned char 
    char bsOemName[8]; 
    WORD bytesperSector; //WORD is a typdef for unisigned short 
    BYTE sectorpercluster; 
    WORD sectorsreservedarea; 
    BYTE copiesFAT; 
    WORD maxrootdirentries; 
    WORD totalSectors; 
    BYTE mediaDescriptor; 
    WORD sectorsperFAT; 
    WORD sectorsperTrack; 
    WORD sides; 
    WORD hiddenSectors; 
    char reserve[480]; 


}; 

void ReadSector(char *src, int ss, int num, void* buff); 

void main() 
{ 
    struct boot b; 

    ReadSector(L"\\\\.\\A:", 0, 1, &b); //Machinename.drive, 0 = read 0th logical sector(that is Boot Sector), 1 = Read 1 sector, &b = Read it into Structure b 

    printf("\nOEM Name: %s", b.bsOemName); 
    printf("\nBytes per sector: %d", b.bytesperSector); 
    printf("\nSectors per Cluster: %d", b.sectorpercluster); 
    printf("\nTotal Sectors: %d\n", b.totalSectors); 

void ReadSector(char *src, int ss, int num, void* buff) 
{ 
    HANDLE h ;  //HANDLE is a typedef of void *HANDLE 
    unsigned int br; 
    h = CreateFile(src, 
        GENERIC_READ, 
        FILE_SHARE_READ, 
        0, 
        OPEN_EXISTING, 
        0, 
        0); 

    if (h == INVALID_HANDLE_VALUE) 
    { 
     printf("\nError reading disk '%s'", src); 
     //printf("\nReturn value for handle = %d", h); 
     printf("\nLast Error: %ld", dw); 

    } 

    else 
    { 
     printf("\nReturn value for handle = %d", h); 
    } 

    SetFilePointer(h, (ss * 512), NULL,FILE_BEGIN); 
    if (!ReadFile(h, buff, 512, &br, NULL)) 
    { 
     printf("\nReadFile: %u\n", GetLastError()); 
    } 
    else 
    { 
     printf("\nRead File Success!\n"); 
    } 


    CloseHandle(h); 
} 

Программа выхода:

C:\Users\IEUser\Desktop>Hardware.exe 

Return value for handle = 36 
Read File Success! 

OEM Name: *-v4VIHC 
Bytes per sector: 512 
Sectors per Cluster: 1 
Total Sectors: 2880 

C:\Users\IEUser\Desktop> 

Ссылка: read-and-write-hard-disk-sector-directly-and-efficiently

+0

Если этот код (или, если на то пошло, исходный код) компилируется, не жалуясь на несоответствия типа, то ваш компилятор неправильно сконфигурирован. Параметр 'src' должен быть' wchar_t * 'для соответствия CreateFile(). –

+0

Спасибо @HarryJohnston! – shellcode

+0

Простым решением было бы изменить набор символов на «Множественный набор символов». – shellcode

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

  • Нет связанных вопросов^_^