Improved verify support.
Fixed a joliet filename bug.
svn path=/trunk/; revision=2945
KSPIN_LOCK FcbListLock;
LIST_ENTRY FcbListHead;
+ PVPB Vpb;
PDEVICE_OBJECT StorageDevice;
PFILE_OBJECT StreamFileObject;
#define FCB_CACHE_INITIALIZED 0x0001
+#define FCB_IS_VOLUME_STREAM 0x0002
+#define FCB_IS_VOLUME 0x0004
typedef struct _FCB
{
CdfsClose(PDEVICE_OBJECT DeviceObject,
PIRP Irp);
+/* common.c */
+
+NTSTATUS
+CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG DiskSector,
+ IN ULONG SectorCount,
+ IN OUT PUCHAR Buffer);
+
+NTSTATUS
+CdfsReadRawSectors(IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG DiskSector,
+ IN ULONG SectorCount,
+ IN OUT PUCHAR Buffer);
/* create.c */
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: common.c,v 1.3 2002/04/26 23:21:28 ekohl Exp $
+/* $Id: common.c,v 1.4 2002/05/09 15:53:02 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
return(STATUS_SUCCESS);
}
+
+NTSTATUS
+CdfsReadRawSectors(IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG DiskSector,
+ IN ULONG SectorCount,
+ IN OUT PUCHAR Buffer)
+{
+ PIO_STACK_LOCATION Stack;
+ IO_STATUS_BLOCK IoStatus;
+ LARGE_INTEGER Offset;
+ ULONG BlockSize;
+ KEVENT Event;
+ PIRP Irp;
+ NTSTATUS Status;
+
+ KeInitializeEvent(&Event,
+ NotificationEvent,
+ FALSE);
+
+ Offset.u.LowPart = DiskSector << 11;
+ Offset.u.HighPart = DiskSector >> 21;
+
+ BlockSize = BLOCKSIZE * SectorCount;
+
+ DPRINT("CdfsReadSectors(DeviceObject %x, DiskSector %d, Buffer %x)\n",
+ DeviceObject, DiskSector, Buffer);
+ DPRINT("Offset %I64x BlockSize %ld\n",
+ Offset.QuadPart,
+ BlockSize);
+
+ DPRINT("Building synchronous FSD Request...\n");
+ Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
+ DeviceObject,
+ Buffer,
+ BlockSize,
+ &Offset,
+ &Event,
+ &IoStatus);
+ if (Irp == NULL)
+ {
+ DPRINT("IoBuildSynchronousFsdRequest failed\n");
+ return(STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+// Stack = IoGetCurrentIrpStackLocation(Irp);
+// Stack->Flags |= SL_OVERRIDE_VERIFY_VOLUME;
+
+ DPRINT("Calling IO Driver... with irp %x\n", Irp);
+ Status = IoCallDriver(DeviceObject, Irp);
+
+ DPRINT("Waiting for IO Operation for %x\n", Irp);
+ if (Status == STATUS_PENDING)
+ {
+ DPRINT("Operation pending\n");
+ KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL);
+ DPRINT("Getting IO Status... for %x\n", Irp);
+ Status = IoStatus.Status;
+ }
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("CdfsReadSectors() failed (Status %x)\n", Status);
+ DPRINT("(DeviceObject %x, DiskSector %x, Buffer %x, Offset 0x%I64x)\n",
+ DeviceObject, DiskSector, Buffer,
+ Offset.QuadPart);
+ return(Status);
+ }
+
+ DPRINT("Block request succeeded for %x\n", Irp);
+
+ return(STATUS_SUCCESS);
+}
+
/* EOF */
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: create.c,v 1.2 2002/05/01 13:15:42 ekohl Exp $
+/* $Id: create.c,v 1.3 2002/05/09 15:53:02 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
FileObject = Stack->FileObject;
+ if (RequestedDisposition == FILE_CREATE ||
+ RequestedDisposition == FILE_OVERWRITE_IF ||
+ RequestedDisposition == FILE_SUPERSEDE)
+ {
+ return(STATUS_ACCESS_DENIED);
+ }
+
Status = CdfsOpenFile(DeviceExt,
FileObject,
FileObject->FileName.Buffer);
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: dirctl.c,v 1.3 2002/05/01 13:15:42 ekohl Exp $
+/* $Id: dirctl.c,v 1.4 2002/05/09 15:53:02 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
*/
{
WCHAR name[256];
- char * block;
WCHAR TempStr[2];
+ PVOID Block;
NTSTATUS Status;
ULONG len;
ULONG DirIndex;
ULONG Offset;
- ULONG FirstSector;
ULONG Read;
BOOLEAN IsRoot;
- LARGE_INTEGER FileOffset;
PVOID Context = NULL;
-
ULONG DirSize;
- ULONG BufferSize;
- ULONG SectorCount;
PUCHAR Ptr;
PDIR_RECORD Record;
+ LARGE_INTEGER StreamOffset;
DPRINT("FindFile(Parent %x, FileToFind '%S', DirIndex: %d)\n",
Parent, FileToFind, pDirIndex ? *pDirIndex : 0);
if (Parent)
{
- FirstSector = Parent->Entry.ExtentLocationL;
- if (FirstSector == DeviceExt->CdInfo.RootStart)
+ if (Parent->Entry.ExtentLocationL == DeviceExt->CdInfo.RootStart)
{
IsRoot = TRUE;
}
if (IsRoot == TRUE)
{
- FirstSector = DeviceExt->CdInfo.RootStart;
+ StreamOffset.QuadPart = (LONGLONG)DeviceExt->CdInfo.RootStart * (LONGLONG)BLOCKSIZE;
DirSize = DeviceExt->CdInfo.RootSize;
}
else
{
- FirstSector = Parent->Entry.ExtentLocationL;
+ StreamOffset.QuadPart = (LONGLONG)Parent->Entry.ExtentLocationL * (LONGLONG)BLOCKSIZE;
DirSize = Parent->Entry.DataLengthL;
}
- DPRINT("FirstSector %lu DirSize %lu\n", FirstSector, DirSize);
+ DPRINT("StreamOffset %I64u DirSize %lu\n", StreamOffset.QuadPart, DirSize);
if (pDirIndex && (*pDirIndex))
DirIndex = *pDirIndex;
- BufferSize = ROUND_UP(DirSize, BLOCKSIZE);
- SectorCount = BufferSize / BLOCKSIZE;
-
- DPRINT("FirstSector %lu DirSize %lu BufferSize %lu SectorCount %lu\n",
- FirstSector, DirSize, BufferSize, SectorCount);
-
- block = ExAllocatePool(NonPagedPool, BufferSize);
-
- Status = CdfsReadSectors(DeviceExt->StorageDevice,
- FirstSector,
- SectorCount,
- block);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("Reading directory extent failed (Status %lx)\n", Status);
- ExFreePool(block);
- return(Status);
- }
+ if(!CcMapData(DeviceExt->StreamFileObject, &StreamOffset,
+ DirSize, TRUE, &Context, &Block))
+ {
+ return(STATUS_UNSUCCESSFUL);
+ }
- Ptr = (PUCHAR)block;
+ Ptr = (PUCHAR)Block;
while(TRUE)
{
Record = (PDIR_RECORD)Ptr;
DPRINT("RecordLength %u ExtAttrRecordLength %u NameLength %u\n",
Record->RecordLength, Record->ExtAttrRecordLength, Record->FileIdLength);
- Status = CdfsGetEntryName(DeviceExt, block, DirSize, (PVOID*)&Ptr, name, &DirIndex, pDirIndex2);
+ Status = CdfsGetEntryName(DeviceExt, Block, DirSize, (PVOID*)&Ptr, name, &DirIndex, pDirIndex2);
if (Status == STATUS_NO_MORE_ENTRIES)
{
break;
DPRINT("FindFile: new Pathname %S, new Objectname %S, DirIndex %d\n",
Fcb->PathName, Fcb->ObjectName, DirIndex);
- ExFreePool(block);
+ CcUnpinData(Context);
return(STATUS_SUCCESS);
}
Ptr = Ptr + Record->RecordLength;
DirIndex++;
- if (((ULONG)Ptr - (ULONG)block) >= DirSize)
+ if (((ULONG)Ptr - (ULONG)Block) >= DirSize)
{
DPRINT("Stopped!\n");
break;
}
}
- ExFreePool(block);
+ CcUnpinData(Context);
if (pDirIndex)
*pDirIndex = DirIndex;
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: fcb.c,v 1.4 2002/05/01 13:15:42 ekohl Exp $
+/* $Id: fcb.c,v 1.5 2002/05/09 15:53:02 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
{
WCHAR TempName[2];
WCHAR Name[256];
- PUCHAR Block;
+ PVOID Block;
ULONG FirstSector;
ULONG DirSize;
- ULONG BufferSize;
- ULONG SectorCount;
PDIR_RECORD Record;
ULONG Offset;
NTSTATUS Status;
+ LARGE_INTEGER StreamOffset;
+ PVOID Context;
+
assert(DeviceExt);
assert(DirectoryFcb);
assert(FileToFind);
FileToFind = TempName;
}
- FirstSector = DirectoryFcb->Entry.ExtentLocationL;
DirSize = DirectoryFcb->Entry.DataLengthL;
+ StreamOffset.QuadPart = (LONGLONG)DirectoryFcb->Entry.ExtentLocationL * (LONGLONG)BLOCKSIZE;
- BufferSize = ROUND_UP(DirSize, BLOCKSIZE);
- SectorCount = BufferSize / BLOCKSIZE;
-
- DPRINT("FirstSector %lu DirSize %lu BufferSize %lu SectorCount %lu\n",
- FirstSector, DirSize, BufferSize, SectorCount);
-
- Block = ExAllocatePool(NonPagedPool, BufferSize);
-
- Status = CdfsReadSectors(DeviceExt->StorageDevice,
- FirstSector,
- SectorCount,
- Block);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("Reading directory extent failed (Status %lx)\n", Status);
- ExFreePool(Block);
- return(Status);
- }
+ if(!CcMapData(DeviceExt->StreamFileObject, &StreamOffset,
+ DirSize, TRUE, &Context, &Block))
+ {
+ return(STATUS_UNSUCCESSFUL);
+ }
Offset = 0;
Record = (PDIR_RECORD)Block;
Record,
FoundFCB);
- ExFreePool(Block);
+ CcUnpinData(Context);
return(Status);
}
Record = (PDIR_RECORD)(Block + Offset);
}
-// if (Offset >= BufferSize)
if (Offset >= DirSize)
break;
}
- ExFreePool(Block);
+ CcUnpinData(Context);
return(STATUS_OBJECT_NAME_NOT_FOUND);
}
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: fsctl.c,v 1.3 2002/05/01 13:15:42 ekohl Exp $
+/* $Id: fsctl.c,v 1.4 2002/05/09 15:53:02 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
do
{
/* Read the Primary Volume Descriptor (PVD) */
- Status = CdfsReadSectors(DeviceObject,
- Sector,
- 1,
- Buffer);
+ Status = CdfsReadRawSectors(DeviceObject,
+ Sector,
+ 1,
+ Buffer);
if (!NT_SUCCESS(Status))
return(Status);
DPRINT("CDFS: Checking on mount of device %08x\n", DeviceToMount);
- Status = CdfsReadSectors(DeviceToMount,
- CDFS_PRIMARY_DESCRIPTOR_LOCATION,
- 1,
- Buffer);
+ Status = CdfsReadRawSectors(DeviceToMount,
+ CDFS_PRIMARY_DESCRIPTOR_LOCATION,
+ 1,
+ Buffer);
if (!NT_SUCCESS(Status))
{
return(Status);
PIO_STACK_LOCATION Stack;
PFCB Fcb = NULL;
PCCB Ccb = NULL;
+ PVPB Vpb;
NTSTATUS Status;
DPRINT("CdfsMountVolume() called\n");
Stack = IoGetCurrentIrpStackLocation(Irp);
DeviceToMount = Stack->Parameters.MountVolume.DeviceObject;
+ Vpb = Stack->Parameters.MountVolume.Vpb;
Status = CdfsHasFileSystem(DeviceToMount);
if (!NT_SUCCESS(Status))
sizeof(DEVICE_EXTENSION),
NULL,
FILE_DEVICE_FILE_SYSTEM,
+// FILE_DEVICE_DISK_FILE_SYSTEM,
0,
FALSE,
&NewDeviceObject);
if (!NT_SUCCESS(Status))
goto ByeBye;
+
+
+#if 0
+ NewDeviceObject->StackSize = DeviceToMount->StackSize;
+ Vpb->DeviceObject = NewDeviceObject;
+ DeviceExt->Vpb = Vpb;
+ DeviceExt->StorageDevice = DeviceToMount;
+#endif
+
NewDeviceObject->Vpb = DeviceToMount->Vpb;
NewDeviceObject->Vpb->Flags |= VPB_MOUNTED;
DeviceExt->StorageDevice = IoAttachDeviceToDeviceStack(NewDeviceObject,
DeviceExt->StreamFileObject->FsContext2 = Ccb;
DeviceExt->StreamFileObject->SectionObjectPointers = &Fcb->SectionObjectPointers;
DeviceExt->StreamFileObject->PrivateCacheMap = NULL;
- DeviceExt->StreamFileObject->Vpb = NewDeviceObject->Vpb;
+ DeviceExt->StreamFileObject->Vpb = DeviceExt->Vpb;
Ccb->Fcb = Fcb;
Ccb->PtrFileObject = DeviceExt->StreamFileObject;
Fcb->FileObject = DeviceExt->StreamFileObject;
Fcb->DevExt = (PDEVICE_EXTENSION)DeviceExt->StorageDevice;
+ Fcb->Flags = FCB_IS_VOLUME_STREAM;
+
Fcb->RFCB.FileSize.QuadPart = DeviceExt->CdInfo.VolumeSpaceSize * BLOCKSIZE;
Fcb->RFCB.ValidDataLength.QuadPart = DeviceExt->CdInfo.VolumeSpaceSize * BLOCKSIZE;
Fcb->RFCB.AllocationSize.QuadPart = ROUND_UP(DeviceExt->CdInfo.VolumeSpaceSize * BLOCKSIZE, PAGESIZE);
static NTSTATUS
CdfsVerifyVolume(PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
+ PIRP Irp)
{
PDEVICE_OBJECT DeviceToVerify;
PIO_STACK_LOCATION Stack;
UCHAR Part[4];
} Serial;
- DPRINT("CdfsVerifyVolume() called\n");
+ DPRINT1("CdfsVerifyVolume() called\n");
+#if 0
if (DeviceObject != CdfsGlobalData->DeviceObject)
{
+ DPRINT1("DeviceObject != CdfsGlobalData->DeviceObject\n");
return(STATUS_INVALID_DEVICE_REQUEST);
}
+#endif
Stack = IoGetCurrentIrpStackLocation(Irp);
DeviceToVerify = Stack->Parameters.VerifyVolume.DeviceObject;
+ DPRINT("Device object %p Device to verify %p\n", DeviceObject, DeviceToVerify);
+
Sector = CDFS_PRIMARY_DESCRIPTOR_LOCATION;
Buffer = ExAllocatePool(NonPagedPool,
return(STATUS_INSUFFICIENT_RESOURCES);
}
- Status = STATUS_WRONG_VOLUME;
-
do
{
/* Read the Primary Volume Descriptor (PVD) */
- Status = CdfsReadSectors(DeviceToVerify,
- Sector,
- 1,
- Buffer);
+ Status = CdfsReadRawSectors(DeviceToVerify,
+ Sector,
+ 1,
+ Buffer);
+ DPRINT("CdfsReadRawSectors() status %lx\n", Status);
if (!NT_SUCCESS(Status))
{
goto ByeBye;
if (Buffer[0] == 255)
goto ByeBye;
+ Status = STATUS_WRONG_VOLUME;
/* Calculate the volume serial number */
Serial.Value = 0;
Status = STATUS_SUCCESS;
ByeBye:
-
ExFreePool(Buffer);
-
-// Status = STATUS_INVALID_DEVICE_REQUEST;
-
DPRINT("CdfsVerifyVolume() done (Status: %lx)\n", Status);
return(Status);
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: misc.c,v 1.1 2002/05/01 13:15:42 ekohl Exp $
+/* $Id: misc.c,v 1.2 2002/05/09 15:53:02 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
{
t[i] = In[i+1];
t[i+1] = In[i];
+ if (t[i+1] == 0 && t[i] == ';')
+ break;
}
t[i] = 0;
t[i+1] = 0;
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: rw.c,v 1.2 2002/05/01 21:52:05 ekohl Exp $
+/* $Id: rw.c,v 1.3 2002/05/09 15:53:02 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
PUCHAR Buffer,
ULONG Length,
ULONG ReadOffset,
+ ULONG IrpFlags,
PULONG LengthRead)
/*
* FUNCTION: Reads data from a file
if (Length == 0)
return(STATUS_UNSUCCESSFUL);
-#if 0
- if ((FileObject->Flags & FO_NO_INTERMEDIATE_BUFFERING) == 0)
+ if (!(IrpFlags & (IRP_NOCACHE|IRP_PAGING_IO)))
{
LARGE_INTEGER FileOffset;
IO_STATUS_BLOCK IoStatus;
- FileOffset.QuadPart = ReadOffset;
+ DPRINT1("Try caching!\n");
+
+ FileOffset.QuadPart = (LONGLONG)ReadOffset;
CcCopyRead(FileObject,
&FileOffset,
Length,
return(IoStatus.Status);
}
-#endif
if ((ReadOffset % BLOCKSIZE) != 0)
{
DPRINT("CdfsRead(DeviceObject %x, Irp %x)\n",DeviceObject,Irp);
- if (Irp->Flags & IRP_PAGING_IO)
- {
- Status = STATUS_NOT_SUPPORTED;
- goto ByeBye;
- }
-
DeviceExt = DeviceObject->DeviceExtension;
Stack = IoGetCurrentIrpStackLocation(Irp);
FileObject = Stack->FileObject;
Buffer,
ReadLength,
ReadOffset.u.LowPart,
+ Irp->Flags,
&ReturnedReadLength);
ByeBye: