mirror of
https://github.com/reactos/reactos.git
synced 2024-08-30 23:28:58 +00:00
155 lines
3.8 KiB
C
155 lines
3.8 KiB
C
/*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS kernel
|
|
* FILE: services/fs/minix/minix.c
|
|
* PURPOSE: Minix FSD
|
|
* PROGRAMMER: David Welch (welch@mcmail.com)
|
|
* UPDATE HISTORY:
|
|
*/
|
|
|
|
/* INCLUDES *****************************************************************/
|
|
|
|
#include <ntddk.h>
|
|
#include <string.h>
|
|
|
|
#define NDEBUG
|
|
#include <debug.h>
|
|
|
|
#include "minix.h"
|
|
|
|
/* FUNCTIONS ***************************************************************/
|
|
|
|
BOOLEAN MinixReadPage(PDEVICE_OBJECT DeviceObject,
|
|
ULONG Offset,
|
|
PVOID Buffer)
|
|
{
|
|
ULONG i;
|
|
BOOLEAN Result;
|
|
|
|
for (i=0; i<4; i++)
|
|
{
|
|
Result = MinixReadSector(DeviceObject,
|
|
(Offset + (i * PAGE_SIZE)) / BLOCKSIZE,
|
|
(Buffer + (i * PAGE_SIZE)));
|
|
if (!Result)
|
|
{
|
|
return(Result);
|
|
}
|
|
}
|
|
return(TRUE);
|
|
}
|
|
|
|
BOOLEAN MinixReadSector(IN PDEVICE_OBJECT pDeviceObject,
|
|
IN ULONG DiskSector,
|
|
IN PVOID Buffer)
|
|
{
|
|
LARGE_INTEGER sectorNumber;
|
|
PIRP irp;
|
|
IO_STATUS_BLOCK ioStatus;
|
|
KEVENT event;
|
|
NTSTATUS status;
|
|
ULONG sectorSize;
|
|
PULONG mbr;
|
|
|
|
DPRINT("MinixReadSector(pDeviceObject %x, DiskSector %d, Buffer %x)\n",
|
|
pDeviceObject,DiskSector,Buffer);
|
|
|
|
sectorNumber.u.HighPart = 0;
|
|
sectorNumber.u.LowPart = DiskSector * BLOCKSIZE;
|
|
|
|
KeInitializeEvent(&event, NotificationEvent, FALSE);
|
|
|
|
sectorSize = BLOCKSIZE;
|
|
|
|
mbr = ExAllocatePool(NonPagedPool, sectorSize);
|
|
|
|
if (!mbr) {
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
|
|
pDeviceObject,
|
|
mbr,
|
|
sectorSize,
|
|
§orNumber,
|
|
&event,
|
|
&ioStatus );
|
|
|
|
if (!irp) {
|
|
ExFreePool(mbr);
|
|
return FALSE;
|
|
}
|
|
|
|
status = IoCallDriver(pDeviceObject,
|
|
irp);
|
|
|
|
if (status == STATUS_PENDING) {
|
|
KeWaitForSingleObject(&event,
|
|
Suspended,
|
|
KernelMode,
|
|
FALSE,
|
|
NULL);
|
|
status = ioStatus.Status;
|
|
}
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
ExFreePool(mbr);
|
|
return FALSE;
|
|
}
|
|
|
|
RtlCopyMemory(Buffer,mbr,sectorSize);
|
|
|
|
ExFreePool(mbr);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOLEAN MinixWriteSector(IN PDEVICE_OBJECT pDeviceObject,
|
|
IN ULONG DiskSector,
|
|
IN PVOID Buffer)
|
|
{
|
|
LARGE_INTEGER sectorNumber;
|
|
PIRP irp;
|
|
IO_STATUS_BLOCK ioStatus;
|
|
KEVENT event;
|
|
NTSTATUS status;
|
|
ULONG sectorSize;
|
|
|
|
DPRINT("MinixWriteSector(pDeviceObject %x, DiskSector %d, Buffer %x)\n",
|
|
pDeviceObject,DiskSector,Buffer);
|
|
|
|
sectorNumber.u.HighPart = 0;
|
|
sectorNumber.u.LowPart = DiskSector * BLOCKSIZE;
|
|
|
|
KeInitializeEvent(&event, NotificationEvent, FALSE);
|
|
|
|
sectorSize = BLOCKSIZE;
|
|
|
|
irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE,
|
|
pDeviceObject,
|
|
Buffer,
|
|
sectorSize,
|
|
§orNumber,
|
|
&event,
|
|
&ioStatus );
|
|
|
|
|
|
status = IoCallDriver(pDeviceObject,
|
|
irp);
|
|
|
|
if (status == STATUS_PENDING) {
|
|
KeWaitForSingleObject(&event,
|
|
Suspended,
|
|
KernelMode,
|
|
FALSE,
|
|
NULL);
|
|
status = ioStatus.Status;
|
|
}
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|