📄 flo_data.h
字号:
#define DRVCTL_ENABLE_CONTROLLER 0x04
#define DRVCTL_ENABLE_DMA_AND_INTERRUPTS 0x08
#define DRVCTL_DRIVE_0 0x10
#define DRVCTL_DRIVE_1 0x21
#define DRVCTL_DRIVE_2 0x42
#define DRVCTL_DRIVE_3 0x83
#define DRVCTL_DRIVE_MASK 0x03
#define DRVCTL_MOTOR_MASK 0xf0
//
// Bits in the STATUS register.
//
#define STATUS_DRIVE_0_BUSY 0x01
#define STATUS_DRIVE_1_BUSY 0x02
#define STATUS_DRIVE_2_BUSY 0x04
#define STATUS_DRIVE_3_BUSY 0x08
#define STATUS_CONTROLLER_BUSY 0x10
#define STATUS_DMA_UNUSED 0x20
#define STATUS_DIRECTION_READ 0x40
#define STATUS_DATA_REQUEST 0x80
#define STATUS_IO_READY_MASK 0xc0
#define STATUS_READ_READY 0xc0
#define STATUS_WRITE_READY 0x80
//
// Bits in the DATA_RATE register.
//
#define DATART_0125 0x03
#define DATART_0250 0x02
#define DATART_0300 0x01
#define DATART_0500 0x00
#define DATART_1000 0x03
#define DATART_RESERVED 0xfc
//
// Bits in the DISK_CHANGE register.
//
#define DSKCHG_RESERVED 0x7f
#define DSKCHG_DISKETTE_REMOVED 0x80
//
// Bits in status register 0.
//
#define STREG0_DRIVE_0 0x00
#define STREG0_DRIVE_1 0x01
#define STREG0_DRIVE_2 0x02
#define STREG0_DRIVE_3 0x03
#define STREG0_HEAD 0x04
#define STREG0_DRIVE_NOT_READY 0x08
#define STREG0_DRIVE_FAULT 0x10
#define STREG0_SEEK_COMPLETE 0x20
#define STREG0_END_NORMAL 0x00
#define STREG0_END_ERROR 0x40
#define STREG0_END_INVALID_COMMAND 0x80
#define STREG0_END_DRIVE_NOT_READY 0xC0
#define STREG0_END_MASK 0xC0
//
// Bits in status register 1.
//
#define STREG1_ID_NOT_FOUND 0x01
#define STREG1_WRITE_PROTECTED 0x02
#define STREG1_SECTOR_NOT_FOUND 0x04
#define STREG1_RESERVED1 0x08
#define STREG1_DATA_OVERRUN 0x10
#define STREG1_CRC_ERROR 0x20
#define STREG1_RESERVED2 0x40
#define STREG1_END_OF_DISKETTE 0x80
//
// Bits in status register 2.
//
#define STREG2_SUCCESS 0x00
#define STREG2_DATA_NOT_FOUND 0x01
#define STREG2_BAD_CYLINDER 0x02
#define STREG2_SCAN_FAIL 0x04
#define STREG2_SCAN_EQUAL 0x08
#define STREG2_WRONG_CYLINDER 0x10
#define STREG2_CRC_ERROR 0x20
#define STREG2_DELETED_DATA 0x40
#define STREG2_RESERVED 0x80
//
// Bits in status register 3.
//
#define STREG3_DRIVE_0 0x00
#define STREG3_DRIVE_1 0x01
#define STREG3_DRIVE_2 0x02
#define STREG3_DRIVE_3 0x03
#define STREG3_HEAD 0x04
#define STREG3_TWO_SIDED 0x08
#define STREG3_TRACK_0 0x10
#define STREG3_DRIVE_READY 0x20
#define STREG3_WRITE_PROTECTED 0x40
#define STREG3_DRIVE_FAULT 0x80
//
// Runtime device structures
//
//
// There is one DISKETTE_EXTENSION attached to the device object of each
// floppy drive. Only data directly related to that drive (and the media
// in it) is stored here; common data is in CONTROLLER_DATA. So the
// DISKETTE_EXTENSION has a pointer to the CONTROLLER_DATA.
//
typedef struct _DISKETTE_EXTENSION {
KSPIN_LOCK FlCancelSpinLock;
PDEVICE_OBJECT UnderlyingPDO;
PDEVICE_OBJECT TargetObject;
BOOLEAN IsStarted;
BOOLEAN IsRemoved;
BOOLEAN HoldNewRequests;
LIST_ENTRY NewRequestQueue;
KSPIN_LOCK NewRequestQueueSpinLock;
PDEVICE_OBJECT DeviceObject;
KSEMAPHORE RequestSemaphore;
KSPIN_LOCK ListSpinLock;
FAST_MUTEX ThreadReferenceMutex;
LONG ThreadReferenceCount;
PKTHREAD FloppyThread;
LIST_ENTRY ListEntry;
BOOLEAN HardwareFailed;
UCHAR HardwareFailCount;
ULONG MaxTransferSize;
UCHAR FifoBuffer[10];
PUCHAR IoBuffer;
PMDL IoBufferMdl;
ULONG IoBufferSize;
PDRIVER_OBJECT DriverObject;
DRIVE_MEDIA_TYPE LastDriveMediaType;
BOOLEAN FloppyControllerAllocated;
BOOLEAN ACPI_BIOS;
UCHAR DriveType;
ULONG BytesPerSector;
ULONG ByteCapacity;
MEDIA_TYPE MediaType;
DRIVE_MEDIA_TYPE DriveMediaType;
UCHAR DeviceUnit;
UCHAR DriveOnValue;
BOOLEAN IsReadOnly;
DRIVE_MEDIA_CONSTANTS BiosDriveMediaConstants;
DRIVE_MEDIA_CONSTANTS DriveMediaConstants;
UCHAR PerpendicularMode;
BOOLEAN ControllerConfigurable;
UNICODE_STRING DeviceName;
UNICODE_STRING InterfaceString;
UNICODE_STRING ArcName;
BOOLEAN ReleaseFdcWithMotorRunning;
//
// For power management
//
BOOLEAN PoweringDown;
FAST_MUTEX PowerDownMutex;
FAST_MUTEX HoldNewReqMutex;
} DISKETTE_EXTENSION;
typedef DISKETTE_EXTENSION *PDISKETTE_EXTENSION;
//
// for NEC98.
// IOCTL_DISK_SENSE_DEVICE
//
typedef struct _SENSE_DEVISE_STATUS_PTOS {
UCHAR ST3_PTOS;
} SENSE_DEVISE_STATUS_PTOS, *PSENSE_DEVISE_STATUS_PTOS;
SENSE_DEVISE_STATUS_PTOS Result_Status3_PTOS[4];
//
// Prototypes of driver routines.
//
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
VOID
FloppyUnload(
IN PDRIVER_OBJECT DriverObject
);
NTSTATUS
FlConfigCallBack(
IN PVOID Context,
IN PUNICODE_STRING PathName,
IN INTERFACE_TYPE BusType,
IN ULONG BusNumber,
IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
IN CONFIGURATION_TYPE ControllerType,
IN ULONG ControllerNumber,
IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
IN CONFIGURATION_TYPE PeripheralType,
IN ULONG PeripheralNumber,
IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation
);
NTSTATUS
FlInitializeControllerHardware(
IN PDISKETTE_EXTENSION disketteExtension
);
NTSTATUS
FloppyCreateClose(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
FloppyDeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
FloppyReadWrite(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
FlRecalibrateDrive(
IN PDISKETTE_EXTENSION DisketteExtension
);
NTSTATUS
FlDatarateSpecifyConfigure(
IN PDISKETTE_EXTENSION DisketteExtension
);
NTSTATUS
FlStartDrive(
IN OUT PDISKETTE_EXTENSION DisketteExtension,
IN PIRP Irp,
IN BOOLEAN WriteOperation,
IN BOOLEAN SetUpMedia,
IN BOOLEAN IgnoreChange
);
VOID
FlFinishOperation(
IN OUT PIRP Irp,
IN PDISKETTE_EXTENSION DisketteExtension
);
NTSTATUS
FlDetermineMediaType(
IN OUT PDISKETTE_EXTENSION DisketteExtension
);
VOID
FloppyThread(
IN PVOID Context
);
NTSTATUS
FlReadWrite(
IN OUT PDISKETTE_EXTENSION DisketteExtension,
IN OUT PIRP Irp,
IN BOOLEAN DriveStarted
);
NTSTATUS
FlFormat(
IN PDISKETTE_EXTENSION DisketteExtension,
IN PIRP Irp
);
NTSTATUS
FlIssueCommand(
IN OUT PDISKETTE_EXTENSION DisketteExtension,
IN PUCHAR FifoInBuffer,
OUT PUCHAR FifoOutBuffer,
IN PMDL IoMdl,
IN OUT ULONG IoBuffer,
IN ULONG TransferBytes
);
BOOLEAN
FlCheckFormatParameters(
IN PDISKETTE_EXTENSION DisketteExtension,
IN PFORMAT_PARAMETERS Fp
);
VOID
FlLogErrorDpc(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemContext1,
IN PVOID SystemContext2
);
NTSTATUS
FlQueueIrpToThread(
IN OUT PIRP Irp,
IN OUT PDISKETTE_EXTENSION DisketteExtension
);
NTSTATUS
FlInterpretError(
IN UCHAR StatusRegister1,
IN UCHAR StatusRegister2
);
VOID
FlAllocateIoBuffer(
IN OUT PDISKETTE_EXTENSION DisketteExtension,
IN ULONG BufferSize
);
VOID
FlFreeIoBuffer(
IN OUT PDISKETTE_EXTENSION DisketteExtension
);
VOID
FlConsolidateMediaTypeWithBootSector(
IN OUT PDISKETTE_EXTENSION DisketteExtension,
IN PBOOT_SECTOR_INFO BootSector
);
VOID
FlCheckBootSector(
IN OUT PDISKETTE_EXTENSION DisketteExtension
);
NTSTATUS
FlReadWriteTrack(
IN OUT PDISKETTE_EXTENSION DisketteExtension,
IN OUT PMDL IoMdl,
IN OUT ULONG IoOffset,
IN BOOLEAN WriteOperation,
IN UCHAR Cylinder,
IN UCHAR Head,
IN UCHAR Sector,
IN UCHAR NumberOfSectors,
IN BOOLEAN NeedSeek
);
NTSTATUS
FlFdcDeviceIo(
IN PDEVICE_OBJECT DeviceObject,
IN ULONG Ioctl,
IN OUT PVOID Data
);
NTSTATUS
FloppyAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN OUT PDEVICE_OBJECT PhysicalDeviceObject
);
NTSTATUS
FloppyPnp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
FloppyPower(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
FloppyPnpComplete (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
FloppyQueueRequest (
IN OUT PDISKETTE_EXTENSION DisketteExtension,
IN PIRP Irp
);
NTSTATUS
FloppyStartDevice(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
FloppyProcessQueuedRequests (
IN OUT PDISKETTE_EXTENSION DisketteExtension
);
VOID
FloppyCancelQueuedRequest (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
FlAcpiConfigureFloppy(
PDISKETTE_EXTENSION DisketteExtension,
PFDC_INFO FdcInfo
);
NTSTATUS
FlHdbit(
IN OUT PDISKETTE_EXTENSION DisketteExtension
);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -