Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Чтение сектора с дискеты в драйвере под Windows NT

22K
21 ноября 2006 года
Arseniy
2 / / 21.11.2006
Кто-нибудь знает как считать сектор с дискеты в драйвере под Windows NT. Попробовал использовать int 13h внутри _asm{}(Visual Studio 2003), в момент запуска процедуры обработки комп перезагружается. Тоже самое происходит при выгрузке драйвера. Попробовал реализовать это через порты 3f2h, 3f4h, 3f5h (взял информацию об этом из книги Журдена по ассемблеру). В результате получилось только включить да выключить мотор у диска. После включения мотора нельзя ничего получить из порта 3f4h комп перезагружается.:confused:
261
22 ноября 2006 года
ahilles
1.5K / / 03.11.2005
сколько можно повторять что в винде прерывания из доса вообще не работают и вообще обозначают совсем другое
запомни что DOS и WшnNT это совсем разные вещи
я думаю что если додумался писать драйвер то должен был знать что эти прерывания не работают в винде
прочитать сектор с дискеты можно с помощью API функций с помощью createfile

вот пример на дельфи
там пример для обоих систем но для 9x систем код закоментарен
функция принимает цилиндр трек и сектор в качестре парметров а также сам буфер во что читать

функция НЕ 100% рабочая так как её я не проверял потму что я не знаю что в реальности записано на дискете

Код:
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); // &#237;&#243;&#236;&#229;&#240;&#224;&#246;&#232;&#255; &#241; 1
    Result := ReadFile(hDevice, buffer, SectorSize, nb, 0) and (nb=SectorSize);
    CloseHandle(hDevice);
  end; // Windows NT/2000

end;
261
22 ноября 2006 года
ahilles
1.5K / / 03.11.2005
ответь если что не работает......
22K
25 ноября 2006 года
Arseniy
2 / / 21.11.2006
Спасибо за помощь. Вобщем помогло. Код в драйвере выглядит так:
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 возвращает код ошибки
261
26 ноября 2006 года
ahilles
1.5K / / 03.11.2005
в чём проблема то
если нет проблемы то чучше не выноси свои исходники на обзор публики
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог