2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: services/fs/minix/rw.c
6 * PROGRAMMER: David Welch (welch@mcmail.com)
10 /* INCLUDES *****************************************************************/
12 #include <ddk/ntddk.h>
14 #include <ntos/minmax.h>
21 /* FUNCTIONS ****************************************************************/
24 MinixWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp)
26 DPRINT("MinixWrite(DeviceObject %x Irp %x)\n",DeviceObject,Irp);
28 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
29 Irp->IoStatus.Information = 0;
30 return(STATUS_UNSUCCESSFUL);
33 static NTSTATUS MinixReadFilePage(PDEVICE_OBJECT DeviceObject,
34 PMINIX_DEVICE_EXTENSION DeviceExt,
35 PMINIX_FSCONTEXT FsContext,
43 *Buffer = ExAllocatePool(NonPagedPool, 4096);
47 Status = MinixReadBlock(DeviceObject,
50 Offset + (i * BLOCKSIZE),
52 MinixReadSector(DeviceObject,
53 DiskOffset / BLOCKSIZE,
54 (*Buffer) + (i * BLOCKSIZE));
56 return(STATUS_SUCCESS);
60 MinixRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
66 PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
67 PFILE_OBJECT FileObject = Stack->FileObject;
68 MINIX_DEVICE_EXTENSION* DeviceExt = DeviceObject->DeviceExtension;
69 PMINIX_FSCONTEXT FsContext = (PMINIX_FSCONTEXT)FileObject->FsContext;
73 DPRINT("MinixRead(DeviceObject %x, Irp %x)\n",DeviceObject,Irp);
75 Length = Stack->Parameters.Read.Length;
76 Buffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
77 Offset = Stack->Parameters.Read.ByteOffset.u.LowPart;
79 DPRINT("Length %d Buffer %x Offset %x\n",Length,Buffer,Offset);
83 DPRINT("inode->i_size %d\n",inode->i_size);
85 if (Offset > FsContext->inode.i_size)
87 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
88 Irp->IoStatus.Information = 0;
89 IoCompleteRequest(Irp,IO_NO_INCREMENT);
90 return(STATUS_UNSUCCESSFUL);
92 if ((Offset+Length) > FsContext->inode.i_size)
94 Length = FsContext->inode.i_size - Offset;
97 if ((Offset%PAGE_SIZE)!=0)
99 CurrentOffset = Offset - (Offset%PAGE_SIZE);
101 MinixReadFilePage(DeviceObject,
108 DiskBuffer+(Offset%PAGE_SIZE),
109 min(PAGE_SIZE - (Offset%PAGE_SIZE),Length));
111 ExFreePool(DiskBuffer);
113 DPRINT("(BLOCKSIZE - (Offset%BLOCKSIZE)) %d\n",
114 (BLOCKSIZE - (Offset%BLOCKSIZE)));
115 DPRINT("Length %d\n",Length);
116 CurrentOffset = CurrentOffset + PAGE_SIZE;
117 Buffer = Buffer + PAGE_SIZE - (Offset%PAGE_SIZE);
118 Length = Length - min(PAGE_SIZE - (Offset%PAGE_SIZE),Length);
119 DPRINT("CurrentOffset %d Buffer %x Length %d\n",CurrentOffset,Buffer,
122 for (i=0;i<(Length/PAGE_SIZE);i++)
126 DPRINT("Length %d\n",Length);
128 MinixReadFilePage(DeviceObject,
133 memcpy(Buffer, DiskBuffer, PAGE_SIZE);
135 ExFreePool(DiskBuffer);
137 CurrentOffset = CurrentOffset + PAGE_SIZE;
138 Buffer = Buffer + PAGE_SIZE;
140 if ((Length%PAGE_SIZE) > 0)
144 DPRINT("Length %x Buffer %x\n",(Length%PAGE_SIZE),Buffer);
146 MinixReadFilePage(DeviceObject,
152 memcpy(Buffer, DiskBuffer, (Length%PAGE_SIZE));
154 ExFreePool(DiskBuffer);
158 Irp->IoStatus.Status = STATUS_SUCCESS;
159 Irp->IoStatus.Information = Length;
160 IoCompleteRequest(Irp,IO_NO_INCREMENT);
161 return(STATUS_SUCCESS);