Форум: "Система";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
ВнизКак же всё-таки с любых накопителей читать "напрямую"? Найти похожие ветки
← →
Номолос (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(®,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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.036 c