WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  доступ для чтения-записи на диск( не в файлы) под Win9x

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   доступ для чтения-записи на диск( не в файлы) под Win9x
ASKER опубликован 25-10-2001 12:51 MSK   Click Here to See the Profile for ASKER   Click Here to Email ASKER  
Привет всем !!!
Написал прогу для чтения-записи файлов в свою файловую систему.
Под Win-2k для доступа к дискам( для поблоковой записи) замечательно работает CreateFile("//./PHYSICALDRIVE0", ...), а под Win9x "Отказано в доступе", "Файл не найден" или "Сетевой путь не найден" .

Посоветуйте чего нибудь...
( про absread() и biosdisk() знаю, но они не хватаются за flash-карты( типа дискет 85 mb), а мне они и нужны)

Заранее благодарен. ivrub@yandex.ru

Susik опубликован 25-10-2001 15:17 MSK     Click Here to See the Profile for Susik  Click Here to Email Susik     
Я занимался этой проблемой недавно (месяца 2-3 назад). Как раз под вин9х. :)
Сначала искал по всяким мсдн-ам, почти нашел и разобрался, но потом наткнулся на уже готовые функции, которые и применил. Они приводятся внизу, комменатрии на аглицком, но там все понятно.
Вот как у меня работает:

1)Дескриптор
HANDLE hVxD=CreateFile("\\\\.\\vwin32",0,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);

if(hVxD==(HANDLE)INVALID_HANDLE_VALUE)
{MessageBox(0,"Error","",MB_OK);
return;
}

2) Чтение/запись:
#define VWIN32_DIOC_DOS_DRIVEINFO 6

- Для чтения:

/*
NewReadSectors(hDev, bDrive, dwStartSector, wSectors, lpSectBuff)
Purpose:
Reads the specified number of sectors into a caller-supplied buffer. Uses Int 21h function 7305h
Parameters:
hDev - Handle of VWIN32
bDrive The MS-DOS logical drive number. 0 = default, 1 = A, 2 = B,3 = C, etc.
dwStartSector The first sector to read.
wSectors The number of sectors to read.
lpSectBuff The caller-supplied buffer to read into.
Return Value:
Returns TRUE if successful, or FALSE if failure.
Comments:
This function does not validate its parameters. It assumes that
lpSectBuff is allocated by the caller and is large enough to
hold all of the data from all of the sectors being read.
*/
BOOL NewReadSectors (HANDLE hDev, BYTE bDrive,DWORD dwStartSector,WORD wSectors,LPBYTE lpSectBuff)
{ BOOL fResult;
DWORD cb;
DIOC_REGISTERS reg = {0};
DISKIO dio;

dio.dwStartSector = dwStartSector;
dio.wSectors = wSectors;
dio.dwBuffer=(DWORD)lpSectBuff;

reg.reg_EAX = 0x7305; // Ext_ABSDiskReadWrite
reg.reg_EBX = (DWORD)&dio; reg.reg_ECX = -1;
reg.reg_EDX = bDrive; // Int 21h, fn 7305h drive numbers are 1-based

fResult = DeviceIoControl(hDev, VWIN32_DIOC_DOS_DRIVEINFO,
®, sizeof(reg),
®, sizeof(reg), &cb, 0);

// Determine if the DeviceIoControl call and the read succeeded.
fResult=fResult&&!(reg.reg_Flags & CARRY_FLAG);
return fResult;
}

- Для записи:

/*
NewWriteSectors(hDev, bDrive, dwStartSector, wSectors, lpSectBuff)
Purpose:
Writes the specified number of sectors from a caller-supplied
buffer. Uses Int 21h function 7305h
Parameters:
hDev Handle of VWIN32
bDrive The MS-DOS logical drive number. 0 = default, 1 = A, 2 = B,3 = C, etc.
dwStartSector The first sector to write.
wSectors The number of sectors to write.
lpSectBuff The caller-supplied buffer from which to write.
Return Value:
Returns TRUE if successful, or FALSE if failure.
Comments:
This function does not validate its parameters. It assumes that
lpSectBuff is allocated by the caller and is large enough to
hold all of the data to be written.
*/
BOOL NewWriteSectors (HANDLE hDev, BYTE bDrive,DWORD dwStartSector,WORD wSectors,LPBYTE lpSectBuff)
{ BOOL fResult;
DWORD cb;
DIOC_REGISTERS reg = {0};
DISKIO dio;

dio.dwStartSector = dwStartSector;
dio.wSectors = wSectors;
dio.dwBuffer = (DWORD)lpSectBuff;

reg.reg_EAX = 0x7305; // Ext_ABSDiskReadWrite
reg.reg_EBX = (DWORD)&dio;
reg.reg_ECX = -1;
reg.reg_EDX = bDrive; // Int 21h, fn 7305h drive numbers are 1-based
reg.reg_ESI = 0x6001; // Normal file data (See function
// documentation for other values)

fResult = DeviceIoControl(hDev, VWIN32_DIOC_DOS_DRIVEINFO,
®, sizeof(reg),
®, sizeof(reg), &cb, 0);

// Determine if the DeviceIoControl call and the write succeeded.
fResult = fResult && !(reg.reg_Flags & CARRY_FLAG);
return fResult;
}

Вот.


3) В конце закрываешь свой дескриптор
CloseHandle(hVxD);


ЗЫ: ваще есть ышо 1 способ, но там используются логические диски. Но принцип почти такой же. Если хошь, могу кинуть. Или посмотри сам в МСДНе по ключевым словам VWIN32_DIOC_DOS_INT25 и VWIN32_DIOC_DOS_INT26

Susik опубликован 25-10-2001 15:23 MSK     Click Here to See the Profile for Susik  Click Here to Email Susik     
Да! забыл ышо указать:

#define CARRY_FLAG 1

typedef struct _DIOC_REGISTERS
{DWORD reg_EBX;
DWORD reg_EDX;
DWORD reg_ECX;
DWORD reg_EAX;
DWORD reg_EDI;
DWORD reg_ESI;
DWORD reg_Flags;
} DIOC_REGISTERS, *PDIOC_REGISTERS;


#pragma pack(1)
typedef struct _DISKIO {
DWORD dwStartSector; // starting logical sector number
WORD wSectors; // number of sectors
DWORD dwBuffer; // address of read/write buffer
} DISKIO, * PDISKIO;
#pragma pack()


Если опять я че-то забыл и это все не компилится - обращайся: pafnuty@mailru.com :)

ASKER опубликован 25-10-2001 18:10 MSK     Click Here to See the Profile for ASKER  Click Here to Email ASKER     
THANKS A LOT.
Попробую( вот только есть ли у меня vwin32 и можно ли так достать диски с неузнанной файловой системой ...)

P.S. а флаг:
" FILE_SHARE_READ | FILE_SHARE_WRIrpose "
не очепятка ли ?

Susik опубликован 26-10-2001 17:56 MSK     Click Here to See the Profile for Susik  Click Here to Email Susik     
На самом деле здесь как хошь - либо READ либо WRITE.
А ваще я не знаю. В МСДНе написано, что "When opening a floppy disk or a partition on a hard disk, you must set the FILE_SHARE_WRITE flag in the dwShareMode parameter."
А насчет ШАРЕ_РИД я точно не помню, потому не скажу. Может быть он и не нужен. Но он кашу не портит - у меня все работает до сих пор. :)
Но всегда можно попробовать убрать их - вот и попробуй. :)
ASKER опубликован 29-10-2001 18:00 MSK     Click Here to See the Profile for ASKER  Click Here to Email ASKER     
Сообщаю результаты:
на тестовой проге всё работает, но при попытке вставить всё в основную пограмму выяснилось, что если перед вызывом NewWriteSectors( ... ) есть memcpy(то, пишется, ...), то вылезает противная табличка ( типа пользуетесь старыми функциями) и ничего не пишется.
Вот этот забавный глюк я пока не поборол...
Если кто чего знает, жду с нетерпением.


СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.