Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

Как же всё-таки с любых накопителей читать "напрямую"?   Найти похожие ветки 

 
Номолос   (2004-01-01 19:44) [0]

Напрямую - значит вместе с файловой системой и подобной швалью, побайтно? Со всех: с ффлоппи, с нжмд, с компактов, дивиди и пр.


 
Rouse_ ©   (2004-01-02 16:32) [1]

Понятие драйвера имеем?
Если да, то глупый вопрос, если нет... читаем книжки...


 
Дмитрий В. Белькевич ©   (2004-01-02 19:56) [2]

Сам не пробовал, попробуй, если бы еще рассказал о результатах, был бы благодарен.

const
 VWIN32_DIOC_DOS_INT25 = 2;
 VWIN32_DIOC_DOS_INT26 = 3;

type
 DIOC_REGISTERS = packed record
   reg_EBX: DWORD;
   reg_EDX: DWORD;
   reg_ECX: DWORD;
   reg_EAX: DWORD;
   reg_EDI: DWORD;
   reg_ESI: DWORD;
   reg_Flags: DWORD;
 end;

var
 hDevice: THandle;

function AbsRead(Drive: Word; nsects: Integer; lsect: Longint; var Buffer):
Boolean;
var
 fResult: Bool;
 reg: DIOC_REGISTERS;
 cb: DWORD;
begin
 Result := True;
 reg.reg_EAX := Drive;
 reg.reg_ECX := nsects;
 reg.reg_EDX := lsect;
 reg.reg_EBX := DWORD(@Buffer);
 fResult := DeviceIoControl(hDevice, VWIN32_DIOC_DOS_INT25, @reg,
SizeOf(reg),
   @reg, SizeOf(reg), cb, nil);
 if (fResult <> True) or ((reg.reg_Flags and $1) <> 0) then
   Result := False
end;

initialization
 hDevice := CreateFile("\\.\vwin32", 0, 0, nil, 0,
FILE_FLAG_DELETE_ON_CLOSE, 0)
finalization
 CloseHandle(hDevice)
end.


И еще:

=============================================================================
* Переслал Artem Gryaznov (2:6096/10.666)
* Откуда  : RU.DELPHI (RU.DELPHI)
* От кого : Stas Malinovski, 2:5020/400 (16 май 01 18:06)
* Кому    : Andrey Savchenko
* Hа тему : Re: Прямой доступ к секторам диска
=============================================================================
From: Stas Malinovski <stasm@tsl.ru>
Reply-To: Stas Malinovski <stasm@tsl.ru>

Hello Andrey,

AS> Подскажите  плз,  как  осуществить в Delphi сабж (аналогия int 13h int 26h)
AS> ?

Для Win9x int25/26 и int13 "эмулирует" vwin32.vxd, для WinNT -
используй DeviceIOControl. Вот небольшая иллюстрация этого
подхода на Це (на эхотаг перевести нетрудно):

#ifdef _NT_
HANDLE hDrive=CreateFile("\\\\.\\C:",GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NUL L,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL ,NULL);
#endif

HANDLE hVWIN32Device=CreateFile("\\\\.\\vwin32",GENERIC_READ,FILE_SHARE_READ |
FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
int iFileSystem;
int Disk; // Диск, который читаем A=0

typedef struct _param_disk_{
     unsigned long startsec;
     WORD count;
     WORD far * buffer;
} param_disk;

param_disk* pint25_d;

int _cdecl absread4(void)
{
#ifndef _NT_
DIOC_REGISTERS reg;
int ErrorCode;

if(iFileSystem==32) //VFAT32
 return absreadFAT32();
#ifdef _DEBUG
if(IsBadWritePtr(pint25_d->buffer,pint25_d->count*512))
 return 1;
#endif
reg.reg_EAX=Disk;  //Zero based!!!
reg.reg_ECX=0xffffffff;
reg.reg_EBX=(DWORD)pint25_d;
if(!DoIOCTL(&reg,VWIN32_DIOC_DOS_INT25)||(reg.reg_Flags & 1))
{
 ErrorCode=(int)LOBYTE(LOWORD(reg.reg_EAX));
 wsprintf((LPSTR)TextForOut,(LPSTR)ReadError,ErrorCode,Disk+"A");
 MessageBox(hwnd1,TextForOut,NKernelHeader,MB_ICONINFORMATION);
 return ErrorCode;
}
return 0;
#else
DWORD dwReaded;
DWORD dwHi=((pint25_d->startsec))>>23;
if(0xFFFFFFFF==SetFilePointer(hDrive,pint25_d->startsec*512,&dwHi,FILE_BEGIN)
)
 dwReaded=GetLastError();
if(ReadFile(hDrive,pint25_d->buffer,pint25_d->count*512,&dwReaded,NULL))
{
 return 0;
}
dwReaded=GetLastError();
wsprintf((LPSTR)TextForOut,(LPSTR)ReadError,dwReaded,Disk+"A");
OUT_DEBUG_ERROR(TextForOut);
return 0xff;
#endif
}

__declspec(dllexport) int DoIOCTL(PDIOC_REGISTERS preg, DWORD Flag)
{
#ifndef _NT_
DWORD cb;
return
DeviceIoControl(hVWIN32Device,Flag,preg,sizeof(*preg),preg,sizeof(*preg),&cb,0)
;
#else
preg->reg_Flags = CARRY_FLAG;
return 0;
#endif
}

--
Best regards,
Stas Malinovski.           mailto:stasm@tsl.ru

Отправлено через сервер Talk.Ru - http://www.talk.ru
-+- ifmail v.2.15dev5
+ Origin: Talk.Ru (2:5020/400)


 
Alex Konshin ©   (2004-01-03 00:37) [3]

Под NT открывай диск как файл и читай.
Внимательно прочти описание CreateFile:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/createfile.asp


 
Rouse_ ©   (2004-01-03 04:04) [4]

Хм .... смелый эксперимент....


 
DVM ©   (2004-01-05 17:40) [5]


> Напрямую - значит вместе с файловой системой и подобной
> швалью, побайтно? Со всех: с ффлоппи, с нжмд, с компактов,
> дивиди и пр.

Можно через ASPI (расширение от Adaptec, входящее в Win). И не только дисководы, а еще принтеры, стриммеры, сканеры. Не обращайте внимание, что это дело вроде бы для SCSI устройств предназначено - прекрасно работает и с IDE и FDD.


 
Alex Konshin ©   (2004-01-06 06:27) [6]

Все хорошо, вот только ASPI не поддерживается Microsoft и в Windows уже не входит.
И это требует дополнительной установки драйверов ASPI.
То есть, это тоже не решение.


 
Kerk ©   (2004-01-06 14:05) [7]


> Дмитрий В. Белькевич ©   (02.01.04 19:56) [2]
> Для Win9x int25/26 и int13 "эмулирует" vwin32.vxd

vwin32.vxd (кстати, такого файла не существует, а есть драйвер vwin32, который сидит кажется в vmm.vxd) не позволяет использовать int13h для работы с винтами.


> DVM ©   (05.01.04 17:40) [5]
> Можно через ASPI (расширение от Adaptec, входящее в Win).

Где можно об этом почитать и/или посмотреть примеры?


 
DVM ©   (2004-01-06 15:51) [8]


> Alex Konshin ©   (06.01.04 06:27) [6]

Да, это все конечно правильно, но в то же время никто не мешает этот ASPI установить при установке свое программы (как делают очень многие).

> > DVM ©   (05.01.04 17:40) [5]
> > Можно через ASPI (расширение от Adaptec, входящее в Win).
> Где можно об этом почитать и/или посмотреть примеры?

Не знаю где в инете, но есть неплохая книжка:
http://book.vsem.ru/binfo.asp?cod=129585
Правда только бумажный вариант.


 
Alex Konshin ©   (2004-01-06 20:51) [9]

Если говорить уж совсем теоретически, то с SCSI дисками напрямую в NT+ нужно работать через SPTI. Пример есть в DDK.
Для IDE тоже есть аналогичный IOCTL код, но он нигде не описан. Если же кто видел где-нибудь его описание (хотя бы частичное) - дайте знать. Они (MS) его засекретили и понятно почему: по сути это дыра в секьюрити.


 
Nomolos ©   (2004-01-07 23:58) [10]

Я тут подумал: а вся эта фигня кем-то опробована? Она во всех форточках прёт (там 9x, XP, NT, CE...)?


 
Alex Konshin ©   (2004-01-08 01:33) [11]

Фигня прет.

Ты о чем?


 
Nomolos ©   (2004-01-08 23:10) [12]

Мне просто надо писать мультиплатформенную пагу. Я вот и боюсь.


 
Alex Konshin ©   (2004-01-09 06:39) [13]

CE тут точно не в тему, хотя IOCTL там вроде тоже работает, но
только Delphi тебе не пригодится.
А универсального решения нет.


 
Nomolos ©   (2004-01-09 23:00) [14]

Эх... Где ты, родной int 13h?...


 
Alex Konshin ©   (2004-01-10 02:18) [15]

Думаешь тебе бы помог int 13h на Windows CE?
Microsoft не хочет, чтоб кто-то мог лазить грязными руками по диску и понять их можно. Но это можно сделать на Windows NT/2K/XP. Получить прямой доступ там тоже можно, но уже с проблемами:
- для SCSI можно использовать SPTI, но это требует прав администратора;
- для SCSI можно использовать ASPI, но это требует установки драйвера (тоже нужно право администратора) и это не поддерживается MS;
- для IDE ioctl код, аналогичный SPTI недокументирован (вообще никакой информации).



Страницы: 1 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
14-1078405998
Multy
2004-03-04 16:13
2004.03.28
Нашёл тут класный анекдот


4-1074166573
S@shka
2004-01-15 14:36
2004.03.28
Можно ли отправить сообщение из/в консоль


14-1078084245
pomashok
2004-02-29 22:50
2004.03.28
Термины


6-1074013629
TuZ
2004-01-13 20:07
2004.03.28
Документация по сокетам


3-1077783340
Mamed
2004-02-26 11:15
2004.03.28
SQL Transaction(SQlServer 2000)