type
pDIOCRegs = ^TDIOCRegs;
TDIOCRegs = packed record
rEBX,rEDX,rECX,rEAX,rEDI, rESI, rFlags : DWORD;
end;
const VWIN32_DIOC_DOS_IOCTL = 1;
VWIN32_DIOC_DOS_INT13 = 4; //Ïðåðûâàíèå 13
SectorSize = 512;
function ReadSector(Head, Track, Sector: Integer; buffer : pointer; Floppy: char):Boolean;
var
hDevice : THandle;
Regs : TDIOCRegs;
DevName : string;
nb : DWORD;
begin
if WIN32PLATFORM <> VER_PLATFORM_WIN32_NT then
begin {win95/98 hDevice := CreateFile('\\.\vwin32', GENERIC_READ, 0, nil, 0,
FILE_FLAG_DELETE_ON_CLOSE, 0);
if (hDevice = INVALID_HANDLE_VALUE) then
begin
Result := FALSE;
Exit; end;
regs.rEDX := Head * $100 + Ord(Floppy in ['b', 'B']);
regs.rEAX := $201; // KOH onepam-iM read sector
regs.rEBX := DWORD(buffer); // buffer
regs.rECX := Track * $100 + Sector;
regs.rFlags := $0;
Result := DeviceloControl(hDevice,VWIN32_DIOC_DOS_INT13,
@regs, sizeof(regs), @regs, sizeof(regs), nb, nil)
and ((regs.rFlags and $1)=0); CloseHandle(hDevice); }
end {win95/98}
else
begin // Windows NT/2000
DevName :='\\.\A:';
if Floppy in ['b', 'B'] then DevName[5] := Floppy;
hDevice := CreateFile(pChar(Devname), GENERIC_READ, FILE_SHARE_READ
or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hDevice = INVALID_HANDLE_VALUE) then
begin
Result := FALSE;
Exit;
end;
SetFilePointer(hDevice, (Sector-1)*SectorSize, nil, FILE_BEGIN); // íóìåðàöèÿ ñ 1
Result := ReadFile(hDevice, buffer, SectorSize, nb, 0) and (nb=SectorSize);
CloseHandle(hDevice);
end; // Windows NT/2000
end;
Чтение сектора с дискеты в драйвере под Windows NT
Кто-нибудь знает как считать сектор с дискеты в драйвере под Windows NT. Попробовал использовать int 13h внутри _asm{}(Visual Studio 2003), в момент запуска процедуры обработки комп перезагружается. Тоже самое происходит при выгрузке драйвера. Попробовал реализовать это через порты 3f2h, 3f4h, 3f5h (взял информацию об этом из книги Журдена по ассемблеру). В результате получилось только включить да выключить мотор у диска. После включения мотора нельзя ничего получить из порта 3f4h комп перезагружается.:confused:
запомни что DOS и WшnNT это совсем разные вещи
я думаю что если додумался писать драйвер то должен был знать что эти прерывания не работают в винде
прочитать сектор с дискеты можно с помощью API функций с помощью createfile
вот пример на дельфи
там пример для обоих систем но для 9x систем код закоментарен
функция принимает цилиндр трек и сектор в качестре парметров а также сам буфер во что читать
функция НЕ 100% рабочая так как её я не проверял потму что я не знаю что в реальности записано на дискете
Код:
ответь если что не работает......
case IOCTL_SEND_BYTE_TO_USER:
{
// Размер данных, поступивших от пользователя:
ULONG InputLength = //только лишь для примера
IrpStack->Parameters.DeviceIoControl.InputBufferLength;
// Размер буфера для данных, ожидаемых пользователем
ULONG OutputLength =
IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
/*if( (OutputLength<515) || (InputLength<515))
{// Если не предоставлен буфер v завершить IRP с ошибкой
status = STATUS_INVALID_PARAMETER;
break;
}*/
SREAD *buff; // unsigned char, привыкаем к новой нотации
if(method==METHOD_BUFFERED)
{
buff = (PSREAD)Irp->AssociatedIrp.SystemBuffer;
}
else
if (method==METHOD_NEITHER)
{
buff=(PSREAD)Irp->UserBuffer;
}
else
{
//status = STATUS_INVALID_DEVICE_REQUEST;
break;
}
UCHAR db[512];
UCHAR nt = buff->ntrack;
UCHAR nb;// = buff->nbeginsector;
UCHAR ns = buff->nside;
UCHAR err = 0;
nb = 1;
HANDLE Device;
UNICODE_STRING sName;
POBJECT_ATTRIBUTES pObjAttributes = (POBJECT_ATTRIBUTES)ExAllocatePool(NonPagedPool, sizeof(OBJECT_ATTRIBUTES));
NTSTATUS st;
IO_STATUS_BLOCK ioStBl;
#define SYM_NAME L"\\\\.\\A"
RtlInitUnicodeString( &sName, SYM_NAME );
InitializeObjectAttributes(pObjAttributes, &sName, OBJ_KERNEL_HANDLE, NULL, NULL);
st = ZwCreateFile(&Device, GENERIC_READ|SYNCHRONIZE, pObjAttributes, &ioStBl,
0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_OPEN_IF,
FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); // здесь происходит ошибка
if( NT_SUCCESS(st))
{
LARGE_INTEGER byteOffset;
byteOffset.HighPart = -1;
byteOffset.LowPart = (nb-1)*512;
st = ZwReadFile(Device, NULL, NULL, NULL,
&ioStBl, db, sizeof(db), &byteOffset, NULL);
if(NT_SUCCESS(st))
;//status = STATUS_INVALID_DEVICE_REQUEST;
else
{
for(int i = 0; i < 512; i++)
buff->disk_buffer[0] = db;
status = STATUS_SUCCESS;// Любимое число Штирлица
BytesTxd = 515; // Передали 1 байт
}
}
else
{
BytesTxd = 0;
status = STATUS_INVALID_DEVICE_REQUEST;
}
ZwClose(Device);
ExFreePool(pObjAttributes);
break;
}
Теперь функция ZwCreateFile возвращает код ошибки
если нет проблемы то чучше не выноси свои исходники на обзор публики