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
);