-/* $Id: copy.c,v 1.9 2002/08/17 15:14:26 hbirr Exp $
+/* $Id: copy.c,v 1.15 2003/02/18 22:06:53 chorns Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
LARGE_INTEGER SegOffset;
NTSTATUS Status;
ULONG TempLength;
+ KEVENT Event;
Status = CcRosGetCacheSegmentChain(Bcb, ReadOffset, Length, &head);
if (!NT_SUCCESS(Status))
offset = 0;
while (current2 != NULL && !current2->Valid)
{
- for (i = 0; i < (Bcb->CacheSegmentSize / PAGESIZE); i++)
+ for (i = 0; i < (Bcb->CacheSegmentSize / PAGE_SIZE); i++)
{
PVOID address;
PHYSICAL_ADDRESS page;
- address = current2->BaseAddress + (i * PAGESIZE);
+ address = current2->BaseAddress + (i * PAGE_SIZE);
page = MmGetPhysicalAddressForProcess(NULL, address);
((PULONG)(Mdl + 1))[offset] = page.u.LowPart;
offset++;
* Read in the information.
*/
SegOffset.QuadPart = current->FileOffset;
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
Status = IoPageRead(Bcb->FileObject,
Mdl,
&SegOffset,
- &Iosb,
- TRUE);
+ &Event,
+ &Iosb);
+ if (Status == STATUS_PENDING)
+ {
+ KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+ Status = Iosb.Status;
+ }
if (!NT_SUCCESS(Status) && Status != STATUS_END_OF_FILE)
{
while (current != NULL)
NTSTATUS Status;
LARGE_INTEGER SegOffset;
IO_STATUS_BLOCK IoStatus;
+ KEVENT Event;
SegOffset.QuadPart = CacheSeg->FileOffset;
Size = CacheSeg->Bcb->AllocationSize.QuadPart - CacheSeg->FileOffset;
}
Mdl = MmCreateMdl(NULL, CacheSeg->BaseAddress, Size);
MmBuildMdlForNonPagedPool(Mdl);
- Status = IoPageRead(CacheSeg->Bcb->FileObject, Mdl, &SegOffset, &IoStatus,
- TRUE);
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
+ Status = IoPageRead(CacheSeg->Bcb->FileObject, Mdl, &SegOffset, & Event, &IoStatus);
+ if (Status == STATUS_PENDING)
+ {
+ KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+ Status = IoStatus.Status;
+ }
+
if (!NT_SUCCESS(Status) && Status != STATUS_END_OF_FILE)
{
CcRosReleaseCacheSegment(CacheSeg->Bcb, CacheSeg, FALSE, FALSE, FALSE);
NTSTATUS Status;
IO_STATUS_BLOCK IoStatus;
LARGE_INTEGER SegOffset;
+ KEVENT Event;
CacheSeg->Dirty = FALSE;
SegOffset.QuadPart = CacheSeg->FileOffset;
}
Mdl = MmCreateMdl(NULL, CacheSeg->BaseAddress, Size);
MmBuildMdlForNonPagedPool(Mdl);
- Status = IoPageWrite(CacheSeg->Bcb->FileObject, Mdl, &SegOffset, &IoStatus,
- TRUE);
- if (!NT_SUCCESS(Status))
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
+ Status = IoPageWrite(CacheSeg->Bcb->FileObject, Mdl, &SegOffset, &Event, &IoStatus);
+ if (Status == STATUS_PENDING)
+ {
+ KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+ Status = IoStatus.Status;
+ }
+ if (!NT_SUCCESS(Status) && (Status != STATUS_END_OF_FILE))
{
DPRINT1("IoPageWrite failed, Status %x\n", Status);
CacheSeg->Dirty = TRUE;
FileObject, (ULONG)FileOffset->QuadPart, Length, Wait,
Buffer, IoStatus);
- Bcb = ((REACTOS_COMMON_FCB_HEADER*)FileObject->FsContext)->Bcb;
+ Bcb = FileObject->SectionObjectPointers->SharedCacheMap;
ReadOffset = FileOffset->QuadPart;
DPRINT("AllocationSize %d, FileSize %d\n",
"Length %d, Wait %d, Buffer %x)\n",
FileObject, (ULONG)FileOffset->QuadPart, Length, Wait, Buffer);
- Bcb = ((REACTOS_COMMON_FCB_HEADER*)FileObject->FsContext)->Bcb;
+ Bcb = FileObject->SectionObjectPointers->SharedCacheMap;
WriteOffset = (ULONG)FileOffset->QuadPart;
if (!Wait)
PMDL Mdl;
ULONG i;
IO_STATUS_BLOCK Iosb;
+ KEVENT Event;
DPRINT("CcZeroData(FileObject %x, StartOffset %I64x, EndOffset %I64x, "
"Wait %d\n", FileObject, StartOffset->QuadPart, EndOffset->QuadPart,
Length = EndOffset->u.LowPart - StartOffset->u.LowPart;
- /*
- * FIXME: NT uses the shared cache map field for cached/non cached detection
- */
if (FileObject->SectionObjectPointers->SharedCacheMap == NULL)
{
/* File is not cached */
while (Length > 0)
{
- if (Length + WriteOffset.u.LowPart % PAGESIZE > 262144)
+ if (Length + WriteOffset.u.LowPart % PAGE_SIZE > 262144)
{
Mdl = MmCreateMdl(NULL, (PVOID)WriteOffset.u.LowPart,
- 262144 - WriteOffset.u.LowPart % PAGESIZE);
+ 262144 - WriteOffset.u.LowPart % PAGE_SIZE);
WriteOffset.QuadPart +=
- (262144 - WriteOffset.u.LowPart % PAGESIZE);
- Length -= (262144 - WriteOffset.u.LowPart % PAGESIZE);
+ (262144 - WriteOffset.u.LowPart % PAGE_SIZE);
+ Length -= (262144 - WriteOffset.u.LowPart % PAGE_SIZE);
}
else
{
Mdl =
MmCreateMdl(NULL, (PVOID)WriteOffset.u.LowPart,
- Length - WriteOffset.u.LowPart % PAGESIZE);
+ Length - WriteOffset.u.LowPart % PAGE_SIZE);
WriteOffset.QuadPart +=
- (Length - WriteOffset.u.LowPart % PAGESIZE);
+ (Length - WriteOffset.u.LowPart % PAGE_SIZE);
Length = 0;
}
if (Mdl == NULL)
{
((PULONG)(Mdl + 1))[i] = CcZeroPage.u.LowPart;
}
- Status = IoPageWrite(FileObject, Mdl, StartOffset, &Iosb, TRUE);
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
+ Status = IoPageWrite(FileObject, Mdl, StartOffset, &Event, &Iosb);
+ if (Status == STATUS_PENDING)
+ {
+ KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+ Status = Iosb.Status;
+ }
if (!NT_SUCCESS(Status))
{
return(FALSE);
PHYSICAL_ADDRESS page;
Start = StartOffset->u.LowPart;
- Bcb = ((REACTOS_COMMON_FCB_HEADER*)FileObject->FsContext)->Bcb;
+ Bcb = FileObject->SectionObjectPointers->SharedCacheMap;
if (Wait)
{
/* testing, if the requested datas are available */
else
{
ULONG RLength;
- Mdl = MmCreateMdl(NULL, (PVOID)RStart,
- ROUND_UP(Start % Bcb->CacheSegmentSize +
- Length, Bcb->CacheSegmentSize));
+ RLength = Start % Bcb->CacheSegmentSize + Length;
+ RLength = ROUND_UP(RLength, Bcb->CacheSegmentSize);
+ Mdl = MmCreateMdl(NULL, (PVOID)RStart, RLength);
if (Mdl == NULL)
{
return(FALSE);
}
- RLength = ROUND_UP(RStart + Length, Bcb->CacheSegmentSize);
- RLength = min(RLength, Bcb->AllocationSize.u.LowPart);
- RLength -= RStart;
Status = CcRosGetCacheSegmentChain (Bcb, RStart, RLength,
&CacheSeg);
if (!NT_SUCCESS(Status))
Length -= TempLength;
size = ((Mdl->Size - sizeof(MDL)) / sizeof(ULONG));
- for (i = 0; i < (Bcb->CacheSegmentSize / PAGESIZE) &&
+ for (i = 0; i < (Bcb->CacheSegmentSize / PAGE_SIZE) &&
count < size; i++)
{
PVOID Address;
- Address = current->BaseAddress + (i * PAGESIZE);
+ Address = current->BaseAddress + (i * PAGE_SIZE);
page =
MmGetPhysicalAddressForProcess(NULL, Address);
((PULONG)(Mdl + 1))[count++] = page.u.LowPart;
}
/* Write the Segment */
- Status = IoPageWrite(FileObject, Mdl, &WriteOffset, &Iosb, TRUE);
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
+ Status = IoPageWrite(FileObject, Mdl, &WriteOffset, &Event, &Iosb);
+ if (Status == STATUS_PENDING)
+ {
+ KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+ Status = Iosb.Status;
+ }
if (!NT_SUCCESS(Status))
{
DPRINT1("IoPageWrite failed, status %x\n", Status);