Из-под виндов есть как минимум 2 способа:
Прямой доступ к устройству (читать MSDN на тему CreateFile):
Код
sprintf(path, "\\\\.\\PhysicalDrive%d", devno);
hDisk = CreateFile(path,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH,
NULL);
if (hDisk == INVALID_HANDLE_VALUE)
{
return 1;
}
if (!DeviceIoControl(hDisk,
FSCTL_LOCK_VOLUME, // dwIoControlCode
NULL, // lpInBuffer
0, // nInBufferSize
NULL, // lpOutBuffer
0, // nOutBufferSize
&BytesReturned, // number of bytes returned
NULL)) // OVERLAPPED structure
{
CloseHandle(hDisk);
return 2;
}
return 0;
int WriteSect(int sect, void *buf)
{
DWORD NumberOfBytesWritten;
if (SetFilePointer(hDisk, // HANDLE hFile,
sect * 512, // LONG lDistanceToMove,
NULL, // PLONG lpDistanceToMoveHigh,
FILE_BEGIN) // DWORD dwMoveMethod
== -1)
{
return 1;
}
if (!WriteFile(hDisk, // HANDLE hFile,
buf, // LPVOID lpBuffer,
512, // DWORD nNumberOfBytesToRead,
&NumberOfBytesWritten, // LPDWORD lpNumberOfBytesRead,
NULL)) // LPOVERLAPPED lpOverlapped
{
return 2;
}
if (NumberOfBytesWritten != 512)
{
return 3;
}
return 0;
}
И более хитрый способ для работы с файловой системой без файловой системы.
Берем карту памяти, форматируем на писишке в FAT, создаем один большой файл во всю свободную область. В этом случае файл получается непрерывный. В начало файла пишем какую-нибудь уникальную сигнатуру + доп информацию типа размера файла.
В устройстве при запуске сканируем карту в поисках сигнатуры. Найдя ее - имеем начало файла и размер. Далее просто читаем или пишем данные, не трогая заголовок.
В итоге устройство ничего не знает о файловой системе, а на писюке можно работать с файлами стандартными способами.