https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5795254933b462a0a960c…
commit 5795254933b462a0a960c32900bde63c815bcc48
Author: Pierre Schweitzer <pierre(a)reactos.org>
AuthorDate: Tue Aug 21 12:27:35 2018 +0200
Commit: Pierre Schweitzer <pierre(a)reactos.org>
CommitDate: Tue Aug 21 12:27:35 2018 +0200
[CDFS] Delete the old CDFS driver.
You served us well!
---
drivers/filesystems/cdfs/CMakeLists.txt | 28 --
drivers/filesystems/cdfs/cdfs.c | 141 ------
drivers/filesystems/cdfs/cdfs.h | 531 ---------------------
drivers/filesystems/cdfs/cdfs.rc | 5 -
drivers/filesystems/cdfs/cdfs_reg.inf | 7 -
drivers/filesystems/cdfs/cleanup.c | 129 -----
drivers/filesystems/cdfs/close.c | 115 -----
drivers/filesystems/cdfs/common.c | 242 ----------
drivers/filesystems/cdfs/create.c | 297 ------------
drivers/filesystems/cdfs/devctrl.c | 69 ---
drivers/filesystems/cdfs/dirctl.c | 812 --------------------------------
drivers/filesystems/cdfs/dispatch.c | 222 ---------
drivers/filesystems/cdfs/fastio.c | 116 -----
drivers/filesystems/cdfs/fcb.c | 722 ----------------------------
drivers/filesystems/cdfs/finfo.c | 498 --------------------
drivers/filesystems/cdfs/fsctl.c | 702 ---------------------------
drivers/filesystems/cdfs/misc.c | 380 ---------------
drivers/filesystems/cdfs/rw.c | 251 ----------
drivers/filesystems/cdfs/volinfo.c | 297 ------------
19 files changed, 5564 deletions(-)
diff --git a/drivers/filesystems/cdfs/CMakeLists.txt
b/drivers/filesystems/cdfs/CMakeLists.txt
deleted file mode 100644
index 6cd539b95e..0000000000
--- a/drivers/filesystems/cdfs/CMakeLists.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-
-include_directories(${REACTOS_SOURCE_DIR}/sdk/include/reactos/drivers)
-
-list(APPEND SOURCE
- cdfs.c
- cleanup.c
- close.c
- common.c
- create.c
- devctrl.c
- dirctl.c
- dispatch.c
- fastio.c
- fcb.c
- finfo.c
- fsctl.c
- misc.c
- rw.c
- volinfo.c
- cdfs.h)
-
-add_library(cdfs SHARED ${SOURCE} cdfs.rc)
-set_module_type(cdfs kernelmodedriver)
-target_link_libraries(cdfs ${PSEH_LIB})
-add_importlibs(cdfs ntoskrnl hal)
-add_pch(cdfs cdfs.h SOURCE)
-add_cd_file(TARGET cdfs DESTINATION reactos/system32/drivers NO_CAB FOR all)
-add_registry_inf(cdfs_reg.inf)
diff --git a/drivers/filesystems/cdfs/cdfs.c b/drivers/filesystems/cdfs/cdfs.c
deleted file mode 100644
index aa51948f61..0000000000
--- a/drivers/filesystems/cdfs/cdfs.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * ReactOS kernel
- * Copyright (C) 2002, 2003 ReactOS Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: drivers/filesystems/cdfs/cdfs.c
- * PURPOSE: CDROM (ISO 9660) filesystem driver
- * PROGRAMMER: Art Yerkes
- * Eric Kohl
- */
-
-/* INCLUDES *****************************************************************/
-
-#include "cdfs.h"
-
-#define NDEBUG
-#include <debug.h>
-
-#if defined(ALLOC_PRAGMA)
-#pragma alloc_text(INIT, DriverEntry)
-#endif
-
-/* GLOBALS ******************************************************************/
-
-PCDFS_GLOBAL_DATA CdfsGlobalData;
-
-
-/* FUNCTIONS ****************************************************************/
-
-INIT_SECTION
-NTSTATUS NTAPI
-DriverEntry(PDRIVER_OBJECT DriverObject,
- PUNICODE_STRING RegistryPath)
- /*
- * FUNCTION: Called by the system to initialize the driver
- * ARGUMENTS:
- * DriverObject = object describing this driver
- * RegistryPath = path to our configuration entries
- * RETURNS: Success or failure
- */
-{
- NTSTATUS Status;
- PDEVICE_OBJECT CdFsDeviceObject;
- PDEVICE_OBJECT HddFsDeviceObject;
- UNICODE_STRING CdFsDeviceName = RTL_CONSTANT_STRING(L"\\Cdfs");
- UNICODE_STRING HddFsDeviceName = RTL_CONSTANT_STRING(L"\\CdfsHdd");
-
- UNREFERENCED_PARAMETER(RegistryPath);
-
- DPRINT("CDFS 0.0.3\n");
-
- Status = IoCreateDevice(DriverObject,
- sizeof(CDFS_GLOBAL_DATA),
- &CdFsDeviceName,
- FILE_DEVICE_CD_ROM_FILE_SYSTEM,
- 0,
- FALSE,
- &CdFsDeviceObject);
- if (!NT_SUCCESS(Status))
- {
- return(Status);
- }
-
- Status = IoCreateDevice(DriverObject,
- 0,
- &HddFsDeviceName,
- FILE_DEVICE_DISK_FILE_SYSTEM,
- 0,
- FALSE,
- &HddFsDeviceObject);
- if (!NT_SUCCESS(Status))
- {
- return(Status);
- }
-
- /* Initialize global data */
- CdfsGlobalData = CdFsDeviceObject->DeviceExtension;
- RtlZeroMemory(CdfsGlobalData,
- sizeof(CDFS_GLOBAL_DATA));
- CdfsGlobalData->DriverObject = DriverObject;
- CdfsGlobalData->CdFsDeviceObject = CdFsDeviceObject;
- CdfsGlobalData->HddFsDeviceObject = HddFsDeviceObject;
- HddFsDeviceObject->DeviceExtension = CdfsGlobalData;
-
- /* Initialize driver data */
- DriverObject->MajorFunction[IRP_MJ_CLOSE] = CdfsFsdDispatch;
- DriverObject->MajorFunction[IRP_MJ_CLEANUP] = CdfsFsdDispatch;
- DriverObject->MajorFunction[IRP_MJ_CREATE] = CdfsFsdDispatch;
- DriverObject->MajorFunction[IRP_MJ_READ] = CdfsFsdDispatch;
- DriverObject->MajorFunction[IRP_MJ_WRITE] = CdfsFsdDispatch;
- DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = CdfsFsdDispatch;
- DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = CdfsFsdDispatch;
- DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = CdfsFsdDispatch;
- DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = CdfsFsdDispatch;
- DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] = CdfsFsdDispatch;
- DriverObject->MajorFunction[IRP_MJ_SET_VOLUME_INFORMATION] = CdfsFsdDispatch;
- DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = CdfsFsdDispatch;
- DriverObject->MajorFunction[IRP_MJ_LOCK_CONTROL] = CdfsFsdDispatch;
-
- CdfsGlobalData->FastIoDispatch.SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH);
- CdfsGlobalData->FastIoDispatch.FastIoCheckIfPossible = CdfsFastIoCheckIfPossible;
- CdfsGlobalData->FastIoDispatch.FastIoRead = CdfsFastIoRead;
- CdfsGlobalData->FastIoDispatch.FastIoWrite = CdfsFastIoWrite;
- DriverObject->FastIoDispatch = &CdfsGlobalData->FastIoDispatch;
-
- /* Initialize lookaside list for IRP contexts */
- ExInitializeNPagedLookasideList(&CdfsGlobalData->IrpContextLookasideList,
- NULL, NULL, 0, sizeof(CDFS_IRP_CONTEXT),
'PRIC', 0);
-
- DriverObject->DriverUnload = NULL;
-
- /* Cache manager */
- CdfsGlobalData->CacheMgrCallbacks.AcquireForLazyWrite = CdfsAcquireForLazyWrite;
- CdfsGlobalData->CacheMgrCallbacks.ReleaseFromLazyWrite =
CdfsReleaseFromLazyWrite;
- CdfsGlobalData->CacheMgrCallbacks.AcquireForReadAhead = CdfsAcquireForLazyWrite;
- CdfsGlobalData->CacheMgrCallbacks.ReleaseFromReadAhead =
CdfsReleaseFromLazyWrite;
-
- CdFsDeviceObject->Flags |= DO_DIRECT_IO | DO_LOW_PRIORITY_FILESYSTEM;
- HddFsDeviceObject->Flags |= DO_DIRECT_IO | DO_LOW_PRIORITY_FILESYSTEM;
-
- IoRegisterFileSystem(CdFsDeviceObject);
- IoRegisterFileSystem(HddFsDeviceObject);
-
- return(STATUS_SUCCESS);
-}
diff --git a/drivers/filesystems/cdfs/cdfs.h b/drivers/filesystems/cdfs/cdfs.h
deleted file mode 100644
index b23846f647..0000000000
--- a/drivers/filesystems/cdfs/cdfs.h
+++ /dev/null
@@ -1,531 +0,0 @@
-#ifndef CDFS_H
-#define CDFS_H
-
-#include <ntifs.h>
-#include <ntddcdrm.h>
-#include <pseh/pseh2.h>
-
-#ifdef __GNUC__
-#define INIT_SECTION __attribute__((section ("INIT")))
-#else
-#define INIT_SECTION /* Done via alloc_text for MSC */
-#endif
-
-#define CDFS_BASIC_SECTOR 2048
-#define CDFS_PRIMARY_DESCRIPTOR_LOCATION 16
-#define BLOCKSIZE CDFS_BASIC_SECTOR
-#define CDFS_MAX_NAME_LEN 256
-
-/* Volume descriptor types (VdType) */
-#define BOOT_VOLUME_DESCRIPTOR_TYPE 0
-#define PRIMARY_VOLUME_DESCRIPTOR_TYPE 1
-#define SUPPLEMENTARY_VOLUME_DESCRIPTOR_TYPE 2
-#define VOLUME_PARTITION_DESCRIPTOR_TYPE 3
-#define VOLUME_DESCRIPTOR_SET_TERMINATOR 255
-
-#include <pshpack1.h>
-struct _DIR_RECORD
-{
- UCHAR RecordLength; // 1
- UCHAR ExtAttrRecordLength; // 2
- ULONG ExtentLocationL; // 3-6
- ULONG ExtentLocationM; // 7-10
- ULONG DataLengthL; // 11-14
- ULONG DataLengthM; // 15-18
- UCHAR Year; // 19
- UCHAR Month; // 20
- UCHAR Day; // 21
- UCHAR Hour; // 22
- UCHAR Minute; // 23
- UCHAR Second; // 24
- UCHAR TimeZone; // 25
- UCHAR FileFlags; // 26
- UCHAR FileUnitSize; // 27
- UCHAR InterleaveGapSize; // 28
- ULONG VolumeSequenceNumber; // 29-32
- UCHAR FileIdLength; // 33
- UCHAR FileId[1]; // 34
-};
-#include <poppack.h>
-
-typedef struct _DIR_RECORD DIR_RECORD, *PDIR_RECORD;
-
-/* DIR_RECORD.FileFlags */
-#define FILE_FLAG_HIDDEN 0x01
-#define FILE_FLAG_DIRECTORY 0x02
-#define FILE_FLAG_SYSTEM 0x04
-#define FILE_FLAG_READONLY 0x10
-
-
-/* Volume Descriptor header*/
-#include <pshpack1.h>
-struct _VD_HEADER
-{
- UCHAR VdType; // 1
- UCHAR StandardId[5]; // 2-6
- UCHAR VdVersion; // 7
-};
-
-typedef struct _VD_HEADER VD_HEADER, *PVD_HEADER;
-
-
-
-/* Primary Volume Descriptor */
-struct _PVD
-{
- UCHAR VdType; // 1
- UCHAR StandardId[5]; // 2-6
- UCHAR VdVersion; // 7
- UCHAR unused0; // 8
- UCHAR SystemId[32]; // 9-40
- UCHAR VolumeId[32]; // 41-72
- UCHAR unused1[8]; // 73-80
- ULONG VolumeSpaceSizeL; // 81-84
- ULONG VolumeSpaceSizeM; // 85-88
- UCHAR unused2[32]; // 89-120
- ULONG VolumeSetSize; // 121-124
- ULONG VolumeSequenceNumber; // 125-128
- ULONG LogicalBlockSize; // 129-132
- ULONG PathTableSizeL; // 133-136
- ULONG PathTableSizeM; // 137-140
- ULONG LPathTablePos; // 141-144
- ULONG LOptPathTablePos; // 145-148
- ULONG MPathTablePos; // 149-152
- ULONG MOptPathTablePos; // 153-156
- DIR_RECORD RootDirRecord; // 157-190
- UCHAR VolumeSetIdentifier[128]; // 191-318
- UCHAR PublisherIdentifier[128]; // 319-446
-
- /* more data ... */
-
-};
-typedef struct _PVD PVD, *PPVD;
-
-
-/* Supplementary Volume Descriptor */
-struct _SVD
-{
- UCHAR VdType; // 1
- UCHAR StandardId[5]; // 2-6
- UCHAR VdVersion; // 7
- UCHAR VolumeFlags; // 8
- UCHAR SystemId[32]; // 9-40
- UCHAR VolumeId[32]; // 41-72
- UCHAR unused1[8]; // 73-80
- ULONG VolumeSpaceSizeL; // 81-84
- ULONG VolumeSpaceSizeM; // 85-88
- UCHAR EscapeSequences[32]; // 89-120
- ULONG VolumeSetSize; // 121-124
- ULONG VolumeSequenceNumber; // 125-128
- ULONG LogicalBlockSize; // 129-132
- ULONG PathTableSizeL; // 133-136
- ULONG PathTableSizeM; // 137-140
- ULONG LPathTablePos; // 141-144
- ULONG LOptPathTablePos; // 145-148
- ULONG MPathTablePos; // 149-152
- ULONG MOptPathTablePos; // 153-156
- DIR_RECORD RootDirRecord; // 157-190
- UCHAR VolumeSetIdentifier[128]; // 191-318
- UCHAR PublisherIdentifier[128]; // 319-446
-
- // more data ...
-};
-#include <poppack.h>
-
-typedef struct _SVD SVD, *PSVD;
-
-
-
-
-
-
-
-typedef struct _CDINFO
-{
- ULONG VolumeOffset;
- ULONG VolumeSpaceSize;
- ULONG JolietLevel;
- ULONG RootStart;
- ULONG RootSize;
- WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
- USHORT VolumeLabelLength;
- ULONG SerialNumber;
-} CDINFO, *PCDINFO;
-
-
-#define VCB_VOLUME_LOCKED 0x0001
-
-typedef struct
-{
- ERESOURCE VcbResource;
- ERESOURCE DirResource;
-
- KSPIN_LOCK FcbListLock;
- LIST_ENTRY FcbListHead;
-
- PDEVICE_OBJECT VolumeDevice;
- PDEVICE_OBJECT StorageDevice;
- PFILE_OBJECT StreamFileObject;
-
- ULONG Flags;
-
- CDINFO CdInfo;
-
- /* Notifications */
- LIST_ENTRY NotifyList;
- PNOTIFY_SYNC NotifySync;
-
- /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
- ULONG OpenHandleCount;
-} DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB;
-
-
-#define FCB_CACHE_INITIALIZED 0x0001
-#define FCB_IS_VOLUME_STREAM 0x0002
-#define FCB_IS_VOLUME 0x0004
-
-#define MAX_PATH 260
-
-typedef struct _CDFS_SHORT_NAME
-{
- LIST_ENTRY Entry;
- LARGE_INTEGER StreamOffset;
- UNICODE_STRING Name;
- WCHAR NameBuffer[13];
-} CDFS_SHORT_NAME, *PCDFS_SHORT_NAME;
-
-typedef struct _FCB
-{
- FSRTL_COMMON_FCB_HEADER RFCB;
- SECTION_OBJECT_POINTERS SectionObjectPointers;
- ERESOURCE MainResource;
- ERESOURCE PagingIoResource;
-
- PFILE_OBJECT FileObject;
- PDEVICE_EXTENSION DevExt;
-
- UNICODE_STRING ShortNameU;
-
- WCHAR *ObjectName; /* point on filename (250 chars max) in PathName */
- UNICODE_STRING PathName; /* path+filename 260 max */
- WCHAR PathNameBuffer[MAX_PATH]; /* Buffer for PathName */
- WCHAR ShortNameBuffer[13];
-
- LIST_ENTRY FcbListEntry;
- struct _FCB* ParentFcb;
-
- ULONG DirIndex;
-
- LARGE_INTEGER IndexNumber; /* HighPart: Parent directory start sector */
- /* LowPart: Directory record offset in the parent directory file */
-
- LONG RefCount;
- ULONG Flags;
-
- DIR_RECORD Entry;
-
- ERESOURCE NameListResource;
- LIST_ENTRY ShortNameList;
- FILE_LOCK FileLock;
-} FCB, *PFCB;
-
-
-typedef struct _CCB
-{
- LIST_ENTRY NextCCB;
- PFILE_OBJECT PtrFileObject;
- LARGE_INTEGER CurrentByteOffset;
- /* for DirectoryControl */
- ULONG Entry;
- ULONG Offset;
- /* for DirectoryControl */
- UNICODE_STRING DirectorySearchPattern;
- ULONG LastCluster;
- ULONG LastOffset;
-} CCB, *PCCB;
-
-#define CDFS_TAG 'sfdC'
-#define CDFS_CCB_TAG 'ccdC'
-#define CDFS_NONPAGED_FCB_TAG 'nfdC'
-#define CDFS_SHORT_NAME_TAG 'sgdC'
-#define CDFS_SEARCH_PATTERN_TAG 'eedC'
-#define CDFS_FILENAME_TAG 'nFdC'
-
-typedef struct _CDFS_GLOBAL_DATA
-{
- PDRIVER_OBJECT DriverObject;
- PDEVICE_OBJECT CdFsDeviceObject;
- PDEVICE_OBJECT HddFsDeviceObject;
- ULONG Flags;
- CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
- FAST_IO_DISPATCH FastIoDispatch;
- NPAGED_LOOKASIDE_LIST IrpContextLookasideList;
-} CDFS_GLOBAL_DATA, *PCDFS_GLOBAL_DATA;
-
-#define IRPCONTEXT_CANWAIT 0x1
-#define IRPCONTEXT_COMPLETE 0x2
-#define IRPCONTEXT_QUEUE 0x4
-
-typedef struct _CDFS_IRP_CONTEXT
-{
-// NTFSIDENTIFIER Identifier;
- ULONG Flags;
- PIO_STACK_LOCATION Stack;
- UCHAR MajorFunction;
- UCHAR MinorFunction;
- WORK_QUEUE_ITEM WorkQueueItem;
- PIRP Irp;
- BOOLEAN IsTopLevel;
- PDEVICE_OBJECT DeviceObject;
- PFILE_OBJECT FileObject;
- NTSTATUS SavedExceptionCode;
- CCHAR PriorityBoost;
-} CDFS_IRP_CONTEXT, *PCDFS_IRP_CONTEXT;
-
-
-extern PCDFS_GLOBAL_DATA CdfsGlobalData;
-
-/* cdfs.c */
-
-NTSTATUS
-NTAPI
-DriverEntry(
- PDRIVER_OBJECT DriverObject,
- PUNICODE_STRING RegistryPath);
-
-/* cleanup.c */
-
-NTSTATUS
-NTAPI
-CdfsCleanup(
- PCDFS_IRP_CONTEXT IrpContext);
-
-
-/* close.c */
-
-NTSTATUS
-NTAPI
-CdfsClose(
- PCDFS_IRP_CONTEXT IrpContext);
-
-NTSTATUS
-CdfsCloseFile(PDEVICE_EXTENSION DeviceExt,
- PFILE_OBJECT FileObject);
-
-
-/* common.c */
-
-NTSTATUS
-CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
- IN ULONG DiskSector,
- IN ULONG SectorCount,
- IN OUT PUCHAR Buffer,
- IN BOOLEAN Override);
-
-NTSTATUS
-CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
- IN ULONG CtlCode,
- IN PVOID InputBuffer,
- IN ULONG InputBufferSize,
- IN OUT PVOID OutputBuffer,
- IN OUT PULONG pOutputBufferSize,
- IN BOOLEAN Override);
-
-/* create.c */
-
-NTSTATUS
-NTAPI
-CdfsCreate(
- PCDFS_IRP_CONTEXT IrpContext);
-
-/* devctrl.c */
-
-NTSTATUS NTAPI
-CdfsDeviceControl(
- PCDFS_IRP_CONTEXT IrpContext);
-
-/* dirctl.c */
-
-NTSTATUS
-NTAPI
-CdfsDirectoryControl(
- PCDFS_IRP_CONTEXT IrpContext);
-
-/* dispatch.c */
-
-DRIVER_DISPATCH CdfsFsdDispatch;
-NTSTATUS
-NTAPI
-CdfsFsdDispatch(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
-
-/* fastio.c */
-
-BOOLEAN
-NTAPI
-CdfsAcquireForLazyWrite(IN PVOID Context,
- IN BOOLEAN Wait);
-
-VOID
-NTAPI
-CdfsReleaseFromLazyWrite(IN PVOID Context);
-
-FAST_IO_CHECK_IF_POSSIBLE CdfsFastIoCheckIfPossible;
-FAST_IO_READ CdfsFastIoRead;
-FAST_IO_WRITE CdfsFastIoWrite;
-
-/* fcb.c */
-
-PFCB
-CdfsCreateFCB(PCWSTR FileName);
-
-VOID
-CdfsDestroyFCB(PFCB Fcb);
-
-BOOLEAN
-CdfsFCBIsDirectory(PFCB Fcb);
-
-BOOLEAN
-CdfsFCBIsRoot(PFCB Fcb);
-
-VOID
-CdfsGrabFCB(PDEVICE_EXTENSION Vcb,
- PFCB Fcb);
-
-VOID
-CdfsReleaseFCB(PDEVICE_EXTENSION Vcb,
- PFCB Fcb);
-
-VOID
-CdfsAddFCBToTable(PDEVICE_EXTENSION Vcb,
- PFCB Fcb);
-
-PFCB
-CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
- PUNICODE_STRING FileName);
-
-NTSTATUS
-CdfsFCBInitializeCache(PVCB Vcb,
- PFCB Fcb);
-
-PFCB
-CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb);
-
-PFCB
-CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb);
-
-NTSTATUS
-CdfsMakeFCBFromDirEntry(PVCB Vcb,
- PFCB DirectoryFCB,
- PWSTR LongName,
- PWSTR ShortName,
- PDIR_RECORD Record,
- ULONG DirectorySector,
- ULONG DirectoryOffset,
- PFCB * fileFCB);
-
-NTSTATUS
-CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
- PFCB Fcb,
- PFILE_OBJECT FileObject);
-
-NTSTATUS
-CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt,
- PFCB DirectoryFcb,
- PUNICODE_STRING FileToFind,
- PFCB *FoundFCB);
-
-NTSTATUS
-CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
- PFCB *pParentFCB,
- PFCB *pFCB,
- PUNICODE_STRING FileName);
-
-
-/* finfo.c */
-
-NTSTATUS
-NTAPI
-CdfsQueryInformation(
- PCDFS_IRP_CONTEXT IrpContext);
-
-NTSTATUS
-NTAPI
-CdfsSetInformation(
- PCDFS_IRP_CONTEXT IrpContext);
-
-
-/* fsctl.c */
-
-NTSTATUS NTAPI
-CdfsFileSystemControl(
- PCDFS_IRP_CONTEXT IrpContext);
-
-
-/* misc.c */
-
-BOOLEAN
-CdfsIsIrpTopLevel(
- PIRP Irp);
-
-PCDFS_IRP_CONTEXT
-CdfsAllocateIrpContext(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp);
-
-VOID
-CdfsSwapString(PWCHAR Out,
- PUCHAR In,
- ULONG Count);
-
-VOID
-CdfsDateTimeToSystemTime(PFCB Fcb,
- PLARGE_INTEGER SystemTime);
-
-VOID
-CdfsFileFlagsToAttributes(PFCB Fcb,
- PULONG FileAttributes);
-
-VOID
-CdfsShortNameCacheGet
-(PFCB DirectoryFcb,
- PLARGE_INTEGER StreamOffset,
- PUNICODE_STRING LongName,
- PUNICODE_STRING ShortName);
-
-BOOLEAN
-CdfsIsRecordValid(IN PDEVICE_EXTENSION DeviceExt,
- IN PDIR_RECORD Record);
-
-VOID
-CdfsGetDirEntryName(PDEVICE_EXTENSION DeviceExt,
- PDIR_RECORD Record,
- PWSTR Name);
-
-/* rw.c */
-
-NTSTATUS
-NTAPI
-CdfsRead(
- PCDFS_IRP_CONTEXT IrpContext);
-
-NTSTATUS
-NTAPI
-CdfsWrite(
- PCDFS_IRP_CONTEXT IrpContext);
-
-
-/* volinfo.c */
-
-NTSTATUS
-NTAPI
-CdfsQueryVolumeInformation(
- PCDFS_IRP_CONTEXT IrpContext);
-
-NTSTATUS
-NTAPI
-CdfsSetVolumeInformation(
- PCDFS_IRP_CONTEXT IrpContext);
-
-#endif /* CDFS_H */
diff --git a/drivers/filesystems/cdfs/cdfs.rc b/drivers/filesystems/cdfs/cdfs.rc
deleted file mode 100644
index f0ac8d551e..0000000000
--- a/drivers/filesystems/cdfs/cdfs.rc
+++ /dev/null
@@ -1,5 +0,0 @@
-#define REACTOS_VERSION_DLL
-#define REACTOS_STR_FILE_DESCRIPTION "ISO9660 Driver"
-#define REACTOS_STR_INTERNAL_NAME "cdfs"
-#define REACTOS_STR_ORIGINAL_FILENAME "cdfs.sys"
-#include <reactos/version.rc>
diff --git a/drivers/filesystems/cdfs/cdfs_reg.inf
b/drivers/filesystems/cdfs/cdfs_reg.inf
deleted file mode 100644
index 9ae7413c61..0000000000
--- a/drivers/filesystems/cdfs/cdfs_reg.inf
+++ /dev/null
@@ -1,7 +0,0 @@
-; Cdfs (ISO96660) filesystem driver
-[AddReg]
-HKLM,"SYSTEM\CurrentControlSet\Services\Cdfs","ErrorControl",0x00010001,0x00000000
-HKLM,"SYSTEM\CurrentControlSet\Services\Cdfs","Group",0x00000000,"File
System"
-HKLM,"SYSTEM\CurrentControlSet\Services\Cdfs","ImagePath",0x00020000,"system32\drivers\cdfs.sys"
-HKLM,"SYSTEM\CurrentControlSet\Services\Cdfs","Start",0x00010001,0x00000003
-HKLM,"SYSTEM\CurrentControlSet\Services\Cdfs","Type",0x00010001,0x00000002
diff --git a/drivers/filesystems/cdfs/cleanup.c b/drivers/filesystems/cdfs/cleanup.c
deleted file mode 100644
index 63ae24f7d9..0000000000
--- a/drivers/filesystems/cdfs/cleanup.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * ReactOS kernel
- * Copyright (C) 2002 ReactOS Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: drivers/filesystems/cdfs/cleanup.c
- * PURPOSE: CDROM (ISO 9660) filesystem driver
- * PROGRAMMER:
- * UPDATE HISTORY:
- */
-
-/* INCLUDES *****************************************************************/
-
-#include "cdfs.h"
-
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS ****************************************************************/
-
-static NTSTATUS
-CdfsCleanupFile(PCDFS_IRP_CONTEXT IrpContext,
- PFILE_OBJECT FileObject)
- /*
- * FUNCTION: Cleans up after a file has been closed.
- */
-{
- PDEVICE_EXTENSION DeviceExt;
- PFCB Fcb;
-
- DPRINT("CdfsCleanupFile(IrpContext %p, FileObject %p)\n",
- IrpContext,
- FileObject);
-
- DeviceExt = IrpContext->DeviceObject->DeviceExtension;
- Fcb = FileObject->FsContext;
- if (!Fcb)
- {
- return STATUS_SUCCESS;
- }
-
- DeviceExt->OpenHandleCount--;
-
- /* Notify about the cleanup */
- FsRtlNotifyCleanup(DeviceExt->NotifySync,
- &(DeviceExt->NotifyList),
- FileObject->FsContext2);
-
- if (!CdfsFCBIsDirectory(Fcb) &&
- FsRtlAreThereCurrentFileLocks(&Fcb->FileLock))
- {
- FsRtlFastUnlockAll(&Fcb->FileLock,
- FileObject,
- IoGetRequestorProcess(IrpContext->Irp),
- NULL);
- }
-
- /* Uninitialize file cache if initialized for this file object. */
- if (FileObject->SectionObjectPointer &&
FileObject->SectionObjectPointer->SharedCacheMap)
- {
- CcUninitializeCacheMap (FileObject, NULL, NULL);
- }
-
- /* Inform cleanup is complete */
- FileObject->Flags |= FO_CLEANUP_COMPLETE;
-
- return STATUS_SUCCESS;
-}
-
-NTSTATUS NTAPI
-CdfsCleanup(
- PCDFS_IRP_CONTEXT IrpContext)
-{
- PIRP Irp;
- PDEVICE_OBJECT DeviceObject;
- PDEVICE_EXTENSION DeviceExtension;
- PIO_STACK_LOCATION Stack;
- PFILE_OBJECT FileObject;
- NTSTATUS Status;
-
- DPRINT("CdfsCleanup() called\n");
-
- ASSERT(IrpContext);
-
- Irp = IrpContext->Irp;
- DeviceObject = IrpContext->DeviceObject;
- Stack = IrpContext->Stack;
-
- if (DeviceObject == CdfsGlobalData->CdFsDeviceObject || DeviceObject ==
CdfsGlobalData->HddFsDeviceObject)
- {
- DPRINT("Closing file system\n");
- Status = STATUS_SUCCESS;
- goto ByeBye;
- }
-
- FileObject = Stack->FileObject;
- DeviceExtension = DeviceObject->DeviceExtension;
-
- KeEnterCriticalRegion();
- ExAcquireResourceExclusiveLite(&DeviceExtension->DirResource, TRUE);
-
- Status = CdfsCleanupFile(IrpContext, FileObject);
-
- ExReleaseResourceLite(&DeviceExtension->DirResource);
- KeLeaveCriticalRegion();
-
-ByeBye:
- Irp->IoStatus.Information = 0;
-
- return(Status);
-}
-
-/* EOF */
diff --git a/drivers/filesystems/cdfs/close.c b/drivers/filesystems/cdfs/close.c
deleted file mode 100644
index eaf645d9c8..0000000000
--- a/drivers/filesystems/cdfs/close.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * ReactOS kernel
- * Copyright (C) 2002 ReactOS Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: drivers/filesystems/cdfs/close.c
- * PURPOSE: CDROM (ISO 9660) filesystem driver
- * PROGRAMMER: Art Yerkes
- * UPDATE HISTORY:
- */
-
-/* INCLUDES *****************************************************************/
-
-#include "cdfs.h"
-
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS ****************************************************************/
-
-NTSTATUS
-CdfsCloseFile(PDEVICE_EXTENSION DeviceExt,
- PFILE_OBJECT FileObject)
- /*
- * FUNCTION: Closes a file
- */
-{
- PCCB Ccb;
-
- DPRINT("CdfsCloseFile(DeviceExt %p, FileObject %p)\n",
- DeviceExt,
- FileObject);
-
- Ccb = (PCCB)(FileObject->FsContext2);
-
- DPRINT("Ccb %p\n", Ccb);
- if (Ccb == NULL)
- {
- return(STATUS_SUCCESS);
- }
-
- FileObject->FsContext2 = NULL;
-
- if (FileObject->FileName.Buffer)
- {
- // This a FO, that was created outside from FSD.
- // Some FO's are created with IoCreateStreamFileObject() insid from FSD.
- // This FO's don't have a FileName.
- CdfsReleaseFCB(DeviceExt, FileObject->FsContext);
- }
-
- if (Ccb->DirectorySearchPattern.Buffer)
- {
- ExFreePoolWithTag(Ccb->DirectorySearchPattern.Buffer,
CDFS_SEARCH_PATTERN_TAG);
- }
- ExFreePoolWithTag(Ccb, CDFS_CCB_TAG);
-
- return(STATUS_SUCCESS);
-}
-
-
-NTSTATUS NTAPI
-CdfsClose(
- PCDFS_IRP_CONTEXT IrpContext)
-{
- PIRP Irp;
- PDEVICE_OBJECT DeviceObject;
- PDEVICE_EXTENSION DeviceExtension;
- PIO_STACK_LOCATION Stack;
- PFILE_OBJECT FileObject;
- NTSTATUS Status;
-
- DPRINT("CdfsClose() called\n");
-
- ASSERT(IrpContext);
-
- Irp = IrpContext->Irp;
- DeviceObject = IrpContext->DeviceObject;
- Stack = IrpContext->Stack;
-
- if (DeviceObject == CdfsGlobalData->CdFsDeviceObject || DeviceObject ==
CdfsGlobalData->HddFsDeviceObject)
- {
- DPRINT("Closing file system\n");
- Status = STATUS_SUCCESS;
- goto ByeBye;
- }
-
- FileObject = Stack->FileObject;
- DeviceExtension = DeviceObject->DeviceExtension;
-
- Status = CdfsCloseFile(DeviceExtension,FileObject);
-
-ByeBye:
- Irp->IoStatus.Information = 0;
-
- return(Status);
-}
-
-/* EOF */
diff --git a/drivers/filesystems/cdfs/common.c b/drivers/filesystems/cdfs/common.c
deleted file mode 100644
index 38e4b5fca7..0000000000
--- a/drivers/filesystems/cdfs/common.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * ReactOS kernel
- * Copyright (C) 2002, 2003 ReactOS Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: drivers/filesystems/cdfs/common.c
- * PURPOSE: CDROM (ISO 9660) filesystem driver
- * PROGRAMMER: Art Yerkes
- * Eric Kohl
- */
-
-/* INCLUDES *****************************************************************/
-
-#include "cdfs.h"
-
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS ****************************************************************/
-
-NTSTATUS
-CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
- IN ULONG DiskSector,
- IN ULONG SectorCount,
- IN OUT PUCHAR Buffer,
- IN BOOLEAN Override)
-{
- PIO_STACK_LOCATION Stack;
- IO_STATUS_BLOCK IoStatus;
- LARGE_INTEGER Offset;
- ULONG BlockSize;
- KEVENT Event;
- PIRP Irp;
- NTSTATUS Status;
- BOOLEAN LastChance = FALSE;
-
-again:
- KeInitializeEvent(&Event,
- NotificationEvent,
- FALSE);
-
- Offset.u.LowPart = DiskSector << 11;
- Offset.u.HighPart = DiskSector >> 21;
-
- BlockSize = BLOCKSIZE * SectorCount;
-
- DPRINT("CdfsReadSectors(DeviceObject %p, DiskSector %u, Buffer %p)\n",
- DeviceObject, DiskSector, Buffer);
- DPRINT("Offset %I64x BlockSize %u\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);
- }
-
- if (Override)
- {
- Stack = IoGetNextIrpStackLocation(Irp);
- Stack->Flags |= SL_OVERRIDE_VERIFY_VOLUME;
- }
-
- DPRINT("Calling IO Driver... with irp %p\n", Irp);
- Status = IoCallDriver(DeviceObject, Irp);
-
- DPRINT("Waiting for IO Operation for %p\n", Irp);
- if (Status == STATUS_PENDING)
- {
- DPRINT("Operation pending\n");
- KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL);
- DPRINT("Getting IO Status... for %p\n", Irp);
- Status = IoStatus.Status;
- }
-
- if (!NT_SUCCESS(Status))
- {
- if (Status == STATUS_VERIFY_REQUIRED)
- {
- PDEVICE_OBJECT DeviceToVerify;
-
- DeviceToVerify = IoGetDeviceToVerify(PsGetCurrentThread());
- IoSetDeviceToVerify(PsGetCurrentThread(), NULL);
-
- Status = IoVerifyVolume(DeviceToVerify, FALSE);
-
- if (NT_SUCCESS(Status) && !LastChance)
- {
- DPRINT("Volume verify succeeded; trying request again\n");
- LastChance = TRUE;
- goto again;
- }
- else if (NT_SUCCESS(Status))
- {
- DPRINT1("Failed to read after successful verify, aborting\n");
- Status = STATUS_DEVICE_NOT_READY;
- }
- else
- {
- DPRINT1("IoVerifyVolume() failed (Status %lx)\n", Status);
- }
- }
-
- DPRINT("CdfsReadSectors() failed (Status %x)\n", Status);
- DPRINT("(DeviceObject %p, DiskSector %u, Buffer %p, Offset
0x%I64x)\n",
- DeviceObject, DiskSector, Buffer,
- Offset.QuadPart);
- return(Status);
- }
-
- DPRINT("Block request succeeded for %p\n", Irp);
-
- return(STATUS_SUCCESS);
-}
-
-
-NTSTATUS
-CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
- IN ULONG CtlCode,
- IN PVOID InputBuffer,
- IN ULONG InputBufferSize,
- IN OUT PVOID OutputBuffer,
- IN OUT PULONG OutputBufferSize,
- IN BOOLEAN Override)
-{
- PIO_STACK_LOCATION Stack;
- IO_STATUS_BLOCK IoStatus;
- KEVENT Event;
- PIRP Irp;
- NTSTATUS Status;
- BOOLEAN LastChance = FALSE;
-
- DPRINT("CdfsDeviceIoControl(DeviceObject %p, CtlCode %u, "
- "InputBuffer %p, InputBufferSize %u, OutputBuffer %p, "
- "POutputBufferSize %p (%x)\n", DeviceObject, CtlCode,
- InputBuffer, InputBufferSize, OutputBuffer, OutputBufferSize,
- OutputBufferSize ? *OutputBufferSize : 0);
-
-again:
- KeInitializeEvent (&Event, NotificationEvent, FALSE);
-
- DPRINT("Building device I/O control request ...\n");
- Irp = IoBuildDeviceIoControlRequest(CtlCode,
- DeviceObject,
- InputBuffer,
- InputBufferSize,
- OutputBuffer,
- (OutputBufferSize != NULL) ? *OutputBufferSize : 0,
- FALSE,
- &Event,
- &IoStatus);
- if (Irp == NULL)
- {
- DPRINT("IoBuildDeviceIoControlRequest failed\n");
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- if (Override)
- {
- Stack = IoGetNextIrpStackLocation(Irp);
- Stack->Flags |= SL_OVERRIDE_VERIFY_VOLUME;
- }
-
- DPRINT ("Calling IO Driver... with irp %p\n", Irp);
- Status = IoCallDriver(DeviceObject, Irp);
-
- DPRINT ("Waiting for IO Operation for %p\n", Irp);
- if (Status == STATUS_PENDING)
- {
- DPRINT ("Operation pending\n");
- KeWaitForSingleObject (&Event, Suspended, KernelMode, FALSE, NULL);
- DPRINT ("Getting IO Status... for %p\n", Irp);
-
- Status = IoStatus.Status;
- }
-
- if (OutputBufferSize != NULL)
- {
- *OutputBufferSize = IoStatus.Information;
- }
-
- if (Status == STATUS_VERIFY_REQUIRED)
- {
- PDEVICE_OBJECT DeviceToVerify;
-
- DeviceToVerify = IoGetDeviceToVerify(PsGetCurrentThread());
- IoSetDeviceToVerify(PsGetCurrentThread(), NULL);
-
- if (DeviceToVerify)
- {
- Status = IoVerifyVolume(DeviceToVerify, FALSE);
- DPRINT("IoVerifyVolume() returned (Status %lx)\n", Status);
- }
-
- if (NT_SUCCESS(Status) && !LastChance)
- {
- DPRINT1("Volume verify succeeded; trying request again\n");
- LastChance = TRUE;
- goto again;
- }
- else if (NT_SUCCESS(Status))
- {
- DPRINT1("Failed to read after successful verify, aborting\n");
- Status = STATUS_DEVICE_NOT_READY;
- }
- else
- {
- DPRINT1("IoVerifyVolume() failed (Status %lx)\n", Status);
- }
- }
-
- DPRINT("Returning Status %x\n", Status);
-
- return Status;
-}
-
-/* EOF */
diff --git a/drivers/filesystems/cdfs/create.c b/drivers/filesystems/cdfs/create.c
deleted file mode 100644
index 704a4cfc91..0000000000
--- a/drivers/filesystems/cdfs/create.c
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * ReactOS kernel
- * Copyright (C) 2002, 2003, 2004 ReactOS Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: drivers/filesystems/cdfs/cdfs.c
- * PURPOSE: CDROM (ISO 9660) filesystem driver
- * PROGRAMMER: Art Yerkes
- * Eric Kohl
- */
-
-/* INCLUDES *****************************************************************/
-
-#include "cdfs.h"
-
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS ****************************************************************/
-
-static NTSTATUS
-CdfsMakeAbsoluteFilename(PFILE_OBJECT FileObject,
- PUNICODE_STRING RelativeFileName,
- PUNICODE_STRING AbsoluteFileName)
-{
- USHORT Length;
- PFCB Fcb;
- NTSTATUS Status;
-
- DPRINT("try related for %wZ\n", RelativeFileName);
- Fcb = FileObject->FsContext;
- ASSERT(Fcb);
-
- /* verify related object is a directory and target name
- don't start with \. */
- if ((Fcb->Entry.FileFlags & FILE_FLAG_DIRECTORY) == 0 ||
- (RelativeFileName->Length >= sizeof(WCHAR) &&
- RelativeFileName->Buffer[0] == L'\\'))
- {
- return STATUS_INVALID_PARAMETER;
- }
-
- /* construct absolute path name */
- Length = Fcb->PathName.Length +
- sizeof(WCHAR) +
- RelativeFileName->Length +
- sizeof(WCHAR);
- AbsoluteFileName->Length = 0;
- AbsoluteFileName->MaximumLength = Length;
- AbsoluteFileName->Buffer = ExAllocatePoolWithTag(NonPagedPool, Length,
CDFS_FILENAME_TAG);
- if (AbsoluteFileName->Buffer == NULL)
- {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- Status = RtlAppendUnicodeStringToString(AbsoluteFileName,
- &Fcb->PathName);
- if (!NT_SUCCESS(Status))
- {
- RtlFreeUnicodeString(AbsoluteFileName);
- return Status;
- }
-
- if (!CdfsFCBIsRoot(Fcb))
- {
- Status = RtlAppendUnicodeToString(AbsoluteFileName,
- L"\\");
- if (!NT_SUCCESS(Status))
- {
- RtlFreeUnicodeString(AbsoluteFileName);
- return Status;
- }
- }
-
- Status = RtlAppendUnicodeStringToString(AbsoluteFileName,
- RelativeFileName);
- if (!NT_SUCCESS(Status))
- {
- RtlFreeUnicodeString(AbsoluteFileName);
- return Status;
- }
-
- return STATUS_SUCCESS;
-}
-
-
-/*
-* FUNCTION: Opens a file
-*/
-static NTSTATUS
-CdfsOpenFile(PDEVICE_EXTENSION DeviceExt,
- PFILE_OBJECT FileObject,
- PUNICODE_STRING FileName)
-{
- PFCB ParentFcb;
- PFCB Fcb;
- NTSTATUS Status;
- UNICODE_STRING AbsFileName;
-
- DPRINT("CdfsOpenFile(%p, %p, %wZ)\n", DeviceExt, FileObject, FileName);
-
- if (FileObject->RelatedFileObject)
- {
- DPRINT("Converting relative filename to absolute filename\n");
-
- Status = CdfsMakeAbsoluteFilename(FileObject->RelatedFileObject,
- FileName,
- &AbsFileName);
- if (!NT_SUCCESS(Status))
- {
- return Status;
- }
-
- FileName = &AbsFileName;
- }
-
- Status = CdfsDeviceIoControl (DeviceExt->StorageDevice,
- IOCTL_CDROM_CHECK_VERIFY,
- NULL,
- 0,
- NULL,
- 0,
- FALSE);
- DPRINT ("Status %lx\n", Status);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1 ("Status %lx\n", Status);
- return Status;
- }
-
- DPRINT("PathName to open: %wZ\n", FileName);
-
- /* try first to find an existing FCB in memory */
- DPRINT("Checking for existing FCB in memory\n");
- Fcb = CdfsGrabFCBFromTable(DeviceExt,
- FileName);
- if (Fcb == NULL)
- {
- DPRINT("No existing FCB found, making a new one if file exists.\n");
- Status = CdfsGetFCBForFile(DeviceExt,
- &ParentFcb,
- &Fcb,
- FileName);
- if (ParentFcb != NULL)
- {
- CdfsReleaseFCB(DeviceExt,
- ParentFcb);
- }
-
- if (!NT_SUCCESS (Status))
- {
- DPRINT("Could not make a new FCB, status: %x\n", Status);
-
- if (FileName == &AbsFileName)
- RtlFreeUnicodeString(&AbsFileName);
-
- return Status;
- }
- }
-
- DPRINT("Attaching FCB to fileObject\n");
- Status = CdfsAttachFCBToFileObject(DeviceExt,
- Fcb,
- FileObject);
-
- if ((FileName == &AbsFileName) && AbsFileName.Buffer)
- ExFreePoolWithTag(AbsFileName.Buffer, CDFS_FILENAME_TAG);
-
- return Status;
-}
-
-
-/*
-* FUNCTION: Opens a file
-*/
-static NTSTATUS
-CdfsCreateFile(PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
- PDEVICE_EXTENSION DeviceExt;
- PIO_STACK_LOCATION Stack;
- PFILE_OBJECT FileObject;
- ULONG RequestedDisposition;
- ULONG RequestedOptions;
- PFCB Fcb;
- NTSTATUS Status;
-
- DPRINT("CdfsCreateFile() called\n");
-
- DeviceExt = DeviceObject->DeviceExtension;
- ASSERT(DeviceExt);
- Stack = IoGetCurrentIrpStackLocation (Irp);
- ASSERT(Stack);
-
- RequestedDisposition = ((Stack->Parameters.Create.Options >> 24) &
0xff);
- RequestedOptions = Stack->Parameters.Create.Options &
FILE_VALID_OPTION_FLAGS;
- DPRINT("RequestedDisposition %x, RequestedOptions %x\n",
- RequestedDisposition, RequestedOptions);
-
- FileObject = Stack->FileObject;
-
- if (RequestedDisposition == FILE_CREATE ||
- RequestedDisposition == FILE_OVERWRITE_IF ||
- RequestedDisposition == FILE_SUPERSEDE)
- {
- return STATUS_ACCESS_DENIED;
- }
-
- Status = CdfsOpenFile(DeviceExt,
- FileObject,
- &FileObject->FileName);
- if (NT_SUCCESS(Status))
- {
- Fcb = FileObject->FsContext;
-
- /* Check whether the file has the requested attributes */
- if (RequestedOptions & FILE_NON_DIRECTORY_FILE &&
CdfsFCBIsDirectory(Fcb))
- {
- CdfsCloseFile (DeviceExt, FileObject);
- return STATUS_FILE_IS_A_DIRECTORY;
- }
-
- if (RequestedOptions & FILE_DIRECTORY_FILE &&
!CdfsFCBIsDirectory(Fcb))
- {
- CdfsCloseFile (DeviceExt, FileObject);
- return STATUS_NOT_A_DIRECTORY;
- }
-
- DeviceExt->OpenHandleCount++;
- }
-
- /*
- * If the directory containing the file to open doesn't exist then
- * fail immediately
- */
- Irp->IoStatus.Information = (NT_SUCCESS(Status)) ? FILE_OPENED : 0;
-
- return Status;
-}
-
-
-NTSTATUS NTAPI
-CdfsCreate(
- PCDFS_IRP_CONTEXT IrpContext)
-{
- PDEVICE_OBJECT DeviceObject;
- PDEVICE_EXTENSION DeviceExt;
- NTSTATUS Status;
-
- DPRINT("CdfsCreate()\n");
-
- ASSERT(IrpContext);
-
- DeviceObject = IrpContext->DeviceObject;
- DeviceExt = DeviceObject->DeviceExtension;
- if (BooleanFlagOn(DeviceExt->Flags, VCB_VOLUME_LOCKED))
- {
- return STATUS_ACCESS_DENIED;
- }
-
- if (DeviceObject == CdfsGlobalData->CdFsDeviceObject || DeviceObject ==
CdfsGlobalData->HddFsDeviceObject)
- {
- /* DeviceObject represents FileSystem instead of logical volume */
- DPRINT("Opening file system\n");
- IrpContext->Irp->IoStatus.Information = FILE_OPENED;
- DeviceExt->OpenHandleCount++;
- return STATUS_SUCCESS;
- }
-
- KeEnterCriticalRegion();
- ExAcquireResourceExclusiveLite(&DeviceExt->DirResource,
- TRUE);
- Status = CdfsCreateFile(DeviceObject,
- IrpContext->Irp);
- ExReleaseResourceLite(&DeviceExt->DirResource);
- KeLeaveCriticalRegion();
-
- return Status;
-}
-
-/* EOF */
diff --git a/drivers/filesystems/cdfs/devctrl.c b/drivers/filesystems/cdfs/devctrl.c
deleted file mode 100644
index 7e2221a331..0000000000
--- a/drivers/filesystems/cdfs/devctrl.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: drivers/filesystems/cdfs/devctrl.c
- * PURPOSE: CDROM (ISO 9660) filesystem driver
- * PROGRAMMER: Pierre Schweitzer
- *
- */
-
-/* INCLUDES *****************************************************************/
-
-#include "cdfs.h"
-
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS ****************************************************************/
-
-NTSTATUS NTAPI
-CdfsDeviceControl(
- PCDFS_IRP_CONTEXT IrpContext)
-{
- PIRP Irp;
- NTSTATUS Status;
- PVCB Vcb = NULL;
- PFILE_OBJECT FileObject;
- PIO_STACK_LOCATION Stack;
-
- DPRINT("CdfsDeviceControl()\n");
-
- ASSERT(IrpContext);
-
- Irp = IrpContext->Irp;
- Stack = IrpContext->Stack;
- FileObject = Stack->FileObject;
- Irp->IoStatus.Information = 0;
-
- /* FIXME: HACK, it means that CD has changed */
- if (!FileObject)
- {
- DPRINT1("FIXME: CdfsDeviceControl called without FileObject!\n");
- return STATUS_INVALID_DEVICE_REQUEST;
- }
-
- /* Only support such operations on volume */
- if (!(FileObject->RelatedFileObject == NULL ||
FileObject->RelatedFileObject->FsContext2 != NULL))
- {
- return STATUS_INVALID_PARAMETER;
- }
-
- if (Stack->Parameters.DeviceIoControl.IoControlCode == IOCTL_CDROM_DISK_TYPE)
- {
- /* We should handle this one, but we don't! */
- Status = STATUS_NOT_IMPLEMENTED;
- }
- else
- {
- /* Pass it to storage driver */
- IoSkipCurrentIrpStackLocation(Irp);
- Vcb = (PVCB)Stack->DeviceObject->DeviceExtension;
-
- /* Lower driver will complete - we don't have to */
- IrpContext->Flags &= ~IRPCONTEXT_COMPLETE;
-
- Status = IoCallDriver(Vcb->StorageDevice, Irp);
- }
-
- return Status;
-}
diff --git a/drivers/filesystems/cdfs/dirctl.c b/drivers/filesystems/cdfs/dirctl.c
deleted file mode 100644
index c3d2878007..0000000000
--- a/drivers/filesystems/cdfs/dirctl.c
+++ /dev/null
@@ -1,812 +0,0 @@
-/*
- * ReactOS kernel
- * Copyright (C) 2002, 2004 ReactOS Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: drivers/filesystems/cdfs/dirctl.c
- * PURPOSE: CDROM (ISO 9660) filesystem driver
- * PROGRAMMER: Art Yerkes
- * Eric Kohl
- * UPDATE HISTORY:
- */
-
-/* INCLUDES *****************************************************************/
-
-#include "cdfs.h"
-
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS ****************************************************************/
-
-#define ROUND_DOWN(N, S) (((N) / (S)) * (S))
-#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
-
-/* FUNCTIONS ****************************************************************/
-
-/*
-* FUNCTION: Retrieves the file name, be it in short or long file name format
-*/
-static NTSTATUS
-CdfsGetEntryName(PDEVICE_EXTENSION DeviceExt,
- PVOID *Context,
- PVOID *Block,
- PLARGE_INTEGER StreamOffset,
- ULONG DirLength,
- PVOID *Ptr,
- PWSTR Name,
- PULONG pIndex,
- PULONG CurrentOffset)
-{
- PDIR_RECORD Record = *Ptr;
- ULONG Index;
-
- if (*CurrentOffset >= DirLength)
- return(STATUS_NO_MORE_ENTRIES);
-
- if (*CurrentOffset == 0)
- {
- Index = 0;
- Record = (PDIR_RECORD)*Block;
- while (Index < *pIndex)
- {
- (*Ptr) = (PVOID)((ULONG_PTR)(*Ptr) + Record->RecordLength);
- (*CurrentOffset) += Record->RecordLength;
- Record = *Ptr;
- if ((ULONG_PTR)(*Ptr) - (ULONG_PTR)(*Block) >= BLOCKSIZE ||
Record->RecordLength == 0)
- {
- DPRINT("Map next sector\n");
- CcUnpinData(*Context);
- StreamOffset->QuadPart += BLOCKSIZE;
- *CurrentOffset = ROUND_UP(*CurrentOffset, BLOCKSIZE);
- _SEH2_TRY
- {
- CcMapData(DeviceExt->StreamFileObject, StreamOffset, BLOCKSIZE,
MAP_WAIT, Context, Block);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- DPRINT("CcMapData() failed\n");
- _SEH2_YIELD(return _SEH2_GetExceptionCode());
- }
- _SEH2_END;
- *Ptr = *Block;
- Record = (PDIR_RECORD)*Ptr;
- }
- if (*CurrentOffset >= DirLength)
- return(STATUS_NO_MORE_ENTRIES);
-
- Index++;
- }
- }
-
- if ((ULONG_PTR)(*Ptr) - (ULONG_PTR)(*Block) >= BLOCKSIZE ||
Record->RecordLength == 0)
- {
- DPRINT("Map next sector\n");
- CcUnpinData(*Context);
- StreamOffset->QuadPart += BLOCKSIZE;
- *CurrentOffset = ROUND_UP(*CurrentOffset, BLOCKSIZE);
- _SEH2_TRY
- {
- CcMapData(DeviceExt->StreamFileObject, StreamOffset, BLOCKSIZE, MAP_WAIT,
Context, Block);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- DPRINT("CcMapData() failed\n");
- _SEH2_YIELD(return _SEH2_GetExceptionCode());
- }
- _SEH2_END;
- *Ptr = *Block;
- Record = (PDIR_RECORD)*Ptr;
- }
-
- if (*CurrentOffset >= DirLength)
- return STATUS_NO_MORE_ENTRIES;
-
- DPRINT("Index %lu RecordLength %lu Offset %lu\n",
- *pIndex, Record->RecordLength, *CurrentOffset);
-
- if (!CdfsIsRecordValid(DeviceExt, Record))
- {
- CcUnpinData(*Context);
- return STATUS_DISK_CORRUPT_ERROR;
- }
-
- CdfsGetDirEntryName(DeviceExt, Record, Name);
-
- *Ptr = Record;
-
- return(STATUS_SUCCESS);
-}
-
-
-/*
-* FUNCTION: Find a file
-*/
-static NTSTATUS
-CdfsFindFile(PDEVICE_EXTENSION DeviceExt,
- PFCB Fcb,
- PFCB Parent,
- PUNICODE_STRING FileToFind,
- PULONG pDirIndex,
- PULONG pOffset)
-{
- WCHAR name[256];
- WCHAR ShortNameBuffer[13];
- UNICODE_STRING TempString;
- UNICODE_STRING ShortName;
- UNICODE_STRING LongName;
- UNICODE_STRING FileToFindUpcase;
- PVOID Block;
- NTSTATUS Status;
- ULONG len;
- ULONG DirIndex;
- ULONG Offset = 0;
- BOOLEAN IsRoot;
- PVOID Context = NULL;
- ULONG DirSize;
- PDIR_RECORD Record;
- LARGE_INTEGER StreamOffset, OffsetOfEntry;
-
- DPRINT("FindFile(Parent %p, FileToFind '%wZ', DirIndex: %u)\n",
- Parent, FileToFind, pDirIndex ? *pDirIndex : 0);
- DPRINT("FindFile: old Pathname %p, old Objectname %p)\n",
- Fcb->PathName, Fcb->ObjectName);
-
- IsRoot = FALSE;
- DirIndex = 0;
-
- if (FileToFind == NULL || FileToFind->Length == 0)
- {
- RtlInitUnicodeString(&TempString, L".");
- FileToFind = &TempString;
- }
-
- if (Parent)
- {
- if (Parent->Entry.ExtentLocationL == DeviceExt->CdInfo.RootStart)
- {
- IsRoot = TRUE;
- }
- }
- else
- {
- IsRoot = TRUE;
- }
-
- if (IsRoot != FALSE)
- {
- StreamOffset.QuadPart = (LONGLONG)DeviceExt->CdInfo.RootStart *
(LONGLONG)BLOCKSIZE;
- DirSize = DeviceExt->CdInfo.RootSize;
-
-
- if (FileToFind->Buffer[0] == 0 ||
- (FileToFind->Buffer[0] == '\\' && FileToFind->Buffer[1]
== 0) ||
- (FileToFind->Buffer[0] == '.' && FileToFind->Buffer[1]
== 0))
- {
- /* it's root : complete essentials fields then return ok */
- RtlZeroMemory(Fcb, sizeof(FCB));
- RtlInitEmptyUnicodeString(&Fcb->PathName, Fcb->PathNameBuffer,
sizeof(Fcb->PathNameBuffer));
-
- Fcb->PathNameBuffer[0] = '\\';
- Fcb->PathName.Length = sizeof(WCHAR);
- Fcb->ObjectName = &Fcb->PathNameBuffer[1];
- Fcb->Entry.ExtentLocationL = DeviceExt->CdInfo.RootStart;
- Fcb->Entry.DataLengthL = DeviceExt->CdInfo.RootSize;
- Fcb->Entry.FileFlags = 0x02; //FILE_ATTRIBUTE_DIRECTORY;
-
- if (pDirIndex)
- *pDirIndex = 0;
- if (pOffset)
- *pOffset = 0;
- DPRINT("CdfsFindFile: new Pathname %wZ, new Objectname
%S)\n",&Fcb->PathName, Fcb->ObjectName);
- return STATUS_SUCCESS;
- }
- }
- else
- {
- StreamOffset.QuadPart = (LONGLONG)Parent->Entry.ExtentLocationL *
(LONGLONG)BLOCKSIZE;
- DirSize = Parent->Entry.DataLengthL;
- }
-
- DPRINT("StreamOffset %I64d DirSize %u\n", StreamOffset.QuadPart,
DirSize);
-
- if (pDirIndex && (*pDirIndex))
- DirIndex = *pDirIndex;
-
- if (pOffset && (*pOffset))
- {
- Offset = *pOffset;
- StreamOffset.QuadPart += ROUND_DOWN(Offset, BLOCKSIZE);
- }
-
- _SEH2_TRY
- {
- CcMapData(DeviceExt->StreamFileObject, &StreamOffset, BLOCKSIZE, MAP_WAIT,
&Context, &Block);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- DPRINT("CcMapData() failed\n");
- _SEH2_YIELD(return _SEH2_GetExceptionCode());
- }
- _SEH2_END;
-
- Record = (PDIR_RECORD) ((ULONG_PTR)Block + Offset % BLOCKSIZE);
- if (Offset)
- {
- Offset += Record->RecordLength;
- Record = (PDIR_RECORD)((ULONG_PTR)Record + Record->RecordLength);
- }
-
- /* Upper case the expression for FsRtlIsNameInExpression */
- Status = RtlUpcaseUnicodeString(&FileToFindUpcase, FileToFind, TRUE);
- if (!NT_SUCCESS(Status))
- {
- return Status;
- }
-
- while(TRUE)
- {
- DPRINT("RecordLength %u ExtAttrRecordLength %u NameLength %u\n",
- Record->RecordLength, Record->ExtAttrRecordLength,
Record->FileIdLength);
-
- Status = CdfsGetEntryName
- (DeviceExt, &Context, &Block, &StreamOffset,
- DirSize, (PVOID*)&Record, name, &DirIndex, &Offset);
-
- if (Status == STATUS_NO_MORE_ENTRIES)
- {
- break;
- }
- else if (Status == STATUS_UNSUCCESSFUL || Status == STATUS_DISK_CORRUPT_ERROR)
- {
- /* Note: the directory cache has already been unpinned */
- RtlFreeUnicodeString(&FileToFindUpcase);
- return Status;
- }
-
- DPRINT("Name '%S'\n", name);
-
- RtlInitUnicodeString(&LongName, name);
-
- ShortName.Length = 0;
- ShortName.MaximumLength = 26;
- ShortName.Buffer = ShortNameBuffer;
-
- OffsetOfEntry.QuadPart = StreamOffset.QuadPart + Offset;
- CdfsShortNameCacheGet(Parent, &OffsetOfEntry, &LongName,
&ShortName);
-
- DPRINT("ShortName '%wZ'\n", &ShortName);
-
- if (FsRtlIsNameInExpression(&FileToFindUpcase, &LongName, TRUE, NULL) ||
- FsRtlIsNameInExpression(&FileToFindUpcase, &ShortName, TRUE, NULL))
- {
- if (Parent->PathName.Buffer[0])
- {
- RtlCopyUnicodeString(&Fcb->PathName, &Parent->PathName);
- len = Parent->PathName.Length / sizeof(WCHAR);
- Fcb->ObjectName=&Fcb->PathName.Buffer[len];
- if (len != 1 || Fcb->PathName.Buffer[0] != '\\')
- {
- Fcb->ObjectName[0] = '\\';
- Fcb->ObjectName = &Fcb->ObjectName[1];
- }
- }
- else
- {
- Fcb->ObjectName=Fcb->PathName.Buffer;
- Fcb->ObjectName[0]='\\';
- Fcb->ObjectName=&Fcb->ObjectName[1];
- }
-
- DPRINT("PathName '%wZ' ObjectName '%S'\n",
&Fcb->PathName, Fcb->ObjectName);
-
- memcpy(&Fcb->Entry, Record, sizeof(DIR_RECORD));
- wcsncpy(Fcb->ObjectName, name, min(wcslen(name) + 1,
- MAX_PATH - (Fcb->PathName.Length / sizeof(WCHAR)) +
wcslen(Fcb->ObjectName)));
-
- /* Copy short name */
- Fcb->ShortNameU.Length = ShortName.Length;
- Fcb->ShortNameU.MaximumLength = ShortName.Length;
- Fcb->ShortNameU.Buffer = Fcb->ShortNameBuffer;
- memcpy(Fcb->ShortNameBuffer, ShortName.Buffer, ShortName.Length);
-
- if (pDirIndex)
- *pDirIndex = DirIndex;
- if (pOffset)
- *pOffset = Offset;
-
- DPRINT("FindFile: new Pathname %wZ, new Objectname %S, DirIndex
%u\n",
- &Fcb->PathName, Fcb->ObjectName, DirIndex);
-
- RtlFreeUnicodeString(&FileToFindUpcase);
- CcUnpinData(Context);
-
- return STATUS_SUCCESS;
- }
-
- Offset += Record->RecordLength;
- Record = (PDIR_RECORD)((ULONG_PTR)Record + Record->RecordLength);
- DirIndex++;
- }
-
- RtlFreeUnicodeString(&FileToFindUpcase);
- CcUnpinData(Context);
-
- if (pDirIndex)
- *pDirIndex = DirIndex;
-
- if (pOffset)
- *pOffset = Offset;
-
- return STATUS_UNSUCCESSFUL;
-}
-
-
-static NTSTATUS
-CdfsGetNameInformation(PFCB Fcb,
- PDEVICE_EXTENSION DeviceExt,
- PFILE_NAMES_INFORMATION Info,
- ULONG BufferLength)
-{
- ULONG Length;
-
- DPRINT("CdfsGetNameInformation() called\n");
-
- UNREFERENCED_PARAMETER(DeviceExt);
-
- Length = wcslen(Fcb->ObjectName) * sizeof(WCHAR);
- if ((sizeof(FILE_NAMES_INFORMATION) + Length) > BufferLength)
- return(STATUS_BUFFER_OVERFLOW);
-
- Info->FileNameLength = Length;
- Info->NextEntryOffset =
- ROUND_UP(sizeof(FILE_NAMES_INFORMATION) + Length, sizeof(ULONG));
- RtlCopyMemory(Info->FileName, Fcb->ObjectName, Length);
-
- // Info->FileIndex=;
-
- return(STATUS_SUCCESS);
-}
-
-
-static NTSTATUS
-CdfsGetDirectoryInformation(PFCB Fcb,
- PDEVICE_EXTENSION DeviceExt,
- PFILE_DIRECTORY_INFORMATION Info,
- ULONG BufferLength)
-{
- ULONG Length;
-
- DPRINT("CdfsGetDirectoryInformation() called\n");
-
- UNREFERENCED_PARAMETER(DeviceExt);
-
- Length = wcslen(Fcb->ObjectName) * sizeof(WCHAR);
- if ((sizeof (FILE_DIRECTORY_INFORMATION) + Length) > BufferLength)
- return(STATUS_BUFFER_OVERFLOW);
-
- Info->FileNameLength = Length;
- Info->NextEntryOffset =
- ROUND_UP(sizeof(FILE_DIRECTORY_INFORMATION) + Length, sizeof(ULONG));
- RtlCopyMemory(Info->FileName, Fcb->ObjectName, Length);
-
- /* Convert file times */
- CdfsDateTimeToSystemTime(Fcb,
- &Info->CreationTime);
- Info->LastWriteTime = Info->CreationTime;
- Info->ChangeTime = Info->CreationTime;
-
- /* Convert file flags */
- CdfsFileFlagsToAttributes(Fcb,
- &Info->FileAttributes);
- if (CdfsFCBIsDirectory(Fcb))
- {
- Info->EndOfFile.QuadPart = 0;
- Info->AllocationSize.QuadPart = 0;
- }
- else
- {
- Info->EndOfFile.QuadPart = Fcb->Entry.DataLengthL;
-
- /* Make AllocSize a rounded up multiple of the sector size */
- Info->AllocationSize.QuadPart = ROUND_UP(Fcb->Entry.DataLengthL,
BLOCKSIZE);
- }
-
- // Info->FileIndex=;
-
- return(STATUS_SUCCESS);
-}
-
-
-static NTSTATUS
-CdfsGetFullDirectoryInformation(PFCB Fcb,
- PDEVICE_EXTENSION DeviceExt,
- PFILE_FULL_DIR_INFORMATION Info,
- ULONG BufferLength)
-{
- ULONG Length;
-
- DPRINT("CdfsGetFullDirectoryInformation() called\n");
-
- UNREFERENCED_PARAMETER(DeviceExt);
-
- Length = wcslen(Fcb->ObjectName) * sizeof(WCHAR);
- if ((sizeof (FILE_FULL_DIR_INFORMATION) + Length) > BufferLength)
- return(STATUS_BUFFER_OVERFLOW);
-
- Info->FileNameLength = Length;
- Info->NextEntryOffset =
- ROUND_UP(sizeof(FILE_FULL_DIR_INFORMATION) + Length, sizeof(ULONG));
- RtlCopyMemory(Info->FileName, Fcb->ObjectName, Length);
-
- /* Convert file times */
- CdfsDateTimeToSystemTime(Fcb,
- &Info->CreationTime);
- Info->LastWriteTime = Info->CreationTime;
- Info->ChangeTime = Info->CreationTime;
-
- /* Convert file flags */
- CdfsFileFlagsToAttributes(Fcb,
- &Info->FileAttributes);
-
- if (CdfsFCBIsDirectory(Fcb))
- {
- Info->EndOfFile.QuadPart = 0;
- Info->AllocationSize.QuadPart = 0;
- }
- else
- {
- Info->EndOfFile.QuadPart = Fcb->Entry.DataLengthL;
-
- /* Make AllocSize a rounded up multiple of the sector size */
- Info->AllocationSize.QuadPart = ROUND_UP(Fcb->Entry.DataLengthL,
BLOCKSIZE);
- }
-
- // Info->FileIndex=;
- Info->EaSize = 0;
-
- return(STATUS_SUCCESS);
-}
-
-
-static NTSTATUS
-CdfsGetBothDirectoryInformation(PFCB Fcb,
- PDEVICE_EXTENSION DeviceExt,
- PFILE_BOTH_DIR_INFORMATION Info,
- ULONG BufferLength)
-{
- ULONG Length;
-
- DPRINT("CdfsGetBothDirectoryInformation() called\n");
-
- UNREFERENCED_PARAMETER(DeviceExt);
-
- Length = wcslen(Fcb->ObjectName) * sizeof(WCHAR);
- if ((sizeof (FILE_BOTH_DIR_INFORMATION) + Length) > BufferLength)
- return(STATUS_BUFFER_OVERFLOW);
-
- Info->FileNameLength = Length;
- Info->NextEntryOffset =
- ROUND_UP(sizeof(FILE_BOTH_DIR_INFORMATION) + Length, sizeof(ULONG));
- RtlCopyMemory(Info->FileName, Fcb->ObjectName, Length);
-
- /* Convert file times */
- CdfsDateTimeToSystemTime(Fcb,
- &Info->CreationTime);
- Info->LastWriteTime = Info->CreationTime;
- Info->ChangeTime = Info->CreationTime;
-
- /* Convert file flags */
- CdfsFileFlagsToAttributes(Fcb,
- &Info->FileAttributes);
-
- if (CdfsFCBIsDirectory(Fcb))
- {
- Info->EndOfFile.QuadPart = 0;
- Info->AllocationSize.QuadPart = 0;
- }
- else
- {
- Info->EndOfFile.QuadPart = Fcb->Entry.DataLengthL;
-
- /* Make AllocSize a rounded up multiple of the sector size */
- Info->AllocationSize.QuadPart = ROUND_UP(Fcb->Entry.DataLengthL,
BLOCKSIZE);
- }
-
- // Info->FileIndex=;
- Info->EaSize = 0;
-
- /* Copy short name */
- ASSERT(Fcb->ShortNameU.Length / sizeof(WCHAR) <= 12);
- Info->ShortNameLength = (CCHAR)Fcb->ShortNameU.Length;
- RtlCopyMemory(Info->ShortName, Fcb->ShortNameU.Buffer,
Fcb->ShortNameU.Length);
-
- return(STATUS_SUCCESS);
-}
-
-
-static NTSTATUS
-CdfsQueryDirectory(PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
- PDEVICE_EXTENSION DeviceExtension;
- LONG BufferLength = 0;
- PUNICODE_STRING SearchPattern = NULL;
- FILE_INFORMATION_CLASS FileInformationClass;
- ULONG FileIndex = 0;
- PUCHAR Buffer = NULL;
- PFILE_NAMES_INFORMATION Buffer0 = NULL;
- PFCB Fcb;
- PCCB Ccb;
- FCB TempFcb;
- BOOLEAN First = FALSE;
- PIO_STACK_LOCATION Stack;
- PFILE_OBJECT FileObject;
- NTSTATUS Status = STATUS_SUCCESS;
-
- DPRINT("CdfsQueryDirectory() called\n");
-
- DeviceExtension = DeviceObject->DeviceExtension;
- Stack = IoGetCurrentIrpStackLocation(Irp);
- FileObject = Stack->FileObject;
- RtlInitEmptyUnicodeString(&TempFcb.PathName, TempFcb.PathNameBuffer,
sizeof(TempFcb.PathNameBuffer));
-
- Ccb = (PCCB)FileObject->FsContext2;
- Fcb = (PFCB)FileObject->FsContext;
-
- /* Obtain the callers parameters */
- BufferLength = Stack->Parameters.QueryDirectory.Length;
- SearchPattern = Stack->Parameters.QueryDirectory.FileName;
- FileInformationClass =
- Stack->Parameters.QueryDirectory.FileInformationClass;
- FileIndex = Stack->Parameters.QueryDirectory.FileIndex;
-
- /* Determine Buffer for result */
- if (Irp->MdlAddress)
- {
- Buffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
- }
- else
- {
- Buffer = Irp->UserBuffer;
- }
-
- /* Allocate search pattern in case:
- * -> We don't have one already in context
- * -> We have been given an input pattern
- * -> The pattern length is not null
- * -> The pattern buffer is not null
- * Otherwise, we'll fall later and allocate a match all (*) pattern
- */
- if (SearchPattern != NULL &&
- SearchPattern->Length != 0 && SearchPattern->Buffer != NULL)
- {
- if (Ccb->DirectorySearchPattern.Buffer == NULL)
- {
- First = TRUE;
- Ccb->DirectorySearchPattern.Buffer =
- ExAllocatePoolWithTag(NonPagedPool, SearchPattern->Length +
sizeof(WCHAR), CDFS_SEARCH_PATTERN_TAG);
- if (Ccb->DirectorySearchPattern.Buffer == NULL)
- {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
- Ccb->DirectorySearchPattern.MaximumLength = SearchPattern->Length +
sizeof(WCHAR);
- RtlCopyUnicodeString(&Ccb->DirectorySearchPattern, SearchPattern);
- Ccb->DirectorySearchPattern.Buffer[SearchPattern->Length /
sizeof(WCHAR)] = 0;
- }
- }
- else if (Ccb->DirectorySearchPattern.Buffer == NULL)
- {
- First = TRUE;
- Ccb->DirectorySearchPattern.Buffer = ExAllocatePoolWithTag(NonPagedPool, 2 *
sizeof(WCHAR), CDFS_SEARCH_PATTERN_TAG);
- if (Ccb->DirectorySearchPattern.Buffer == NULL)
- {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- Ccb->DirectorySearchPattern.Length = sizeof(WCHAR);
- Ccb->DirectorySearchPattern.MaximumLength = 2 * sizeof(WCHAR);
- Ccb->DirectorySearchPattern.Buffer[0] = L'*';
- Ccb->DirectorySearchPattern.Buffer[1] = 0;
- }
- DPRINT("Search pattern '%wZ'\n",
&Ccb->DirectorySearchPattern);
-
- /* Determine directory index */
- if (Stack->Flags & SL_INDEX_SPECIFIED)
- {
- Ccb->Entry = Stack->Parameters.QueryDirectory.FileIndex;
- Ccb->Offset = Ccb->CurrentByteOffset.u.LowPart;
- }
- else if (First || (Stack->Flags & SL_RESTART_SCAN))
- {
- Ccb->Entry = 0;
- Ccb->Offset = 0;
- }
- DPRINT("Buffer = %p tofind = %wZ\n", Buffer,
&Ccb->DirectorySearchPattern);
-
- TempFcb.ObjectName = TempFcb.PathName.Buffer;
- while (Status == STATUS_SUCCESS && BufferLength > 0)
- {
- Status = CdfsFindFile(DeviceExtension,
- &TempFcb,
- Fcb,
- &Ccb->DirectorySearchPattern,
- &Ccb->Entry,
- &Ccb->Offset);
- DPRINT("Found %S, Status=%x, entry %x\n", TempFcb.ObjectName, Status,
Ccb->Entry);
-
- if (NT_SUCCESS(Status))
- {
- switch (FileInformationClass)
- {
- case FileNameInformation:
- Status = CdfsGetNameInformation(&TempFcb,
- DeviceExtension,
- (PFILE_NAMES_INFORMATION)Buffer,
- BufferLength);
- break;
-
- case FileDirectoryInformation:
- Status = CdfsGetDirectoryInformation(&TempFcb,
- DeviceExtension,
- (PFILE_DIRECTORY_INFORMATION)Buffer,
- BufferLength);
- break;
-
- case FileFullDirectoryInformation:
- Status = CdfsGetFullDirectoryInformation(&TempFcb,
- DeviceExtension,
- (PFILE_FULL_DIR_INFORMATION)Buffer,
- BufferLength);
- break;
-
- case FileBothDirectoryInformation:
- Status = CdfsGetBothDirectoryInformation(&TempFcb,
- DeviceExtension,
- (PFILE_BOTH_DIR_INFORMATION)Buffer,
- BufferLength);
- break;
-
- default:
- Status = STATUS_INVALID_INFO_CLASS;
- }
-
- if (Status == STATUS_BUFFER_OVERFLOW)
- {
- break;
- }
- }
- else
- {
- if (First)
- {
- Status = STATUS_NO_SUCH_FILE;
- }
- else
- {
- Status = STATUS_NO_MORE_FILES;
- }
- break;
- }
-
- Buffer0 = (PFILE_NAMES_INFORMATION)Buffer;
- Buffer0->FileIndex = FileIndex++;
- Ccb->Entry++;
- BufferLength -= Buffer0->NextEntryOffset;
-
- if (Stack->Flags & SL_RETURN_SINGLE_ENTRY)
- {
- break;
- }
-
- Buffer += Buffer0->NextEntryOffset;
- }
-
- if (Buffer0)
- {
- Buffer0->NextEntryOffset = 0;
- }
-
- if (FileIndex > 0)
- {
- Status = STATUS_SUCCESS;
- Irp->IoStatus.Information = Stack->Parameters.QueryDirectory.Length -
BufferLength;
- }
-
- return(Status);
-}
-
-
-static NTSTATUS
-CdfsNotifyChangeDirectory(PDEVICE_OBJECT DeviceObject,
- PIRP Irp,
- PCDFS_IRP_CONTEXT IrpContext)
-{
- PDEVICE_EXTENSION DeviceExtension;
- PFCB Fcb;
- PCCB Ccb;
- PIO_STACK_LOCATION Stack;
- PFILE_OBJECT FileObject;
-
- DPRINT("CdfsNotifyChangeDirectory() called\n");
-
- DeviceExtension = DeviceObject->DeviceExtension;
- Stack = IoGetCurrentIrpStackLocation(Irp);
- FileObject = Stack->FileObject;
-
- Ccb = (PCCB)FileObject->FsContext2;
- Fcb = (PFCB)FileObject->FsContext;
-
- FsRtlNotifyFullChangeDirectory(DeviceExtension->NotifySync,
- &(DeviceExtension->NotifyList),
- Ccb,
- (PSTRING)&(Fcb->PathName),
- BooleanFlagOn(Stack->Flags, SL_WATCH_TREE),
- FALSE,
-
Stack->Parameters.NotifyDirectory.CompletionFilter,
- Irp,
- NULL,
- NULL);
-
- /* We won't handle IRP completion */
- IrpContext->Flags &= ~IRPCONTEXT_COMPLETE;
-
- return STATUS_PENDING;
-}
-
-
-NTSTATUS NTAPI
-CdfsDirectoryControl(
- PCDFS_IRP_CONTEXT IrpContext)
-{
- PIRP Irp;
- PDEVICE_OBJECT DeviceObject;
- NTSTATUS Status;
-
- DPRINT("CdfsDirectoryControl() called\n");
-
- ASSERT(IrpContext);
-
- Irp = IrpContext->Irp;
- DeviceObject = IrpContext->DeviceObject;
-
- Irp->IoStatus.Information = 0;
-
- switch (IrpContext->MinorFunction)
- {
- case IRP_MN_QUERY_DIRECTORY:
- Status = CdfsQueryDirectory(DeviceObject,
- Irp);
- break;
-
- case IRP_MN_NOTIFY_CHANGE_DIRECTORY:
- Status = CdfsNotifyChangeDirectory(DeviceObject,
- Irp, IrpContext);
- break;
-
- default:
- DPRINT1("CDFS: MinorFunction %u\n", IrpContext->MinorFunction);
- Status = STATUS_INVALID_DEVICE_REQUEST;
- break;
- }
-
- return(Status);
-}
-
-/* EOF */
diff --git a/drivers/filesystems/cdfs/dispatch.c b/drivers/filesystems/cdfs/dispatch.c
deleted file mode 100644
index 4b1434757b..0000000000
--- a/drivers/filesystems/cdfs/dispatch.c
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * ReactOS kernel
- * Copyright (C) 2008 ReactOS Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: drivers/filesystems/cdfs/dispatch.c
- * PURPOSE: CDROM (ISO 9660) filesystem driver
- * PROGRAMMER: Pierre Schweitzer
- */
-
-/* INCLUDES *****************************************************************/
-
-#include "cdfs.h"
-
-#define NDEBUG
-#include <debug.h>
-
-static LONG QueueCount = 0;
-
-/* FUNCTIONS ****************************************************************/
-
-static WORKER_THREAD_ROUTINE CdfsDoRequest;
-
-static
-NTSTATUS
-CdfsQueueRequest(PCDFS_IRP_CONTEXT IrpContext)
-{
- InterlockedIncrement(&QueueCount);
- DPRINT("CdfsQueueRequest(IrpContext %p), %d\n", IrpContext, QueueCount);
-
- ASSERT(!(IrpContext->Flags & IRPCONTEXT_QUEUE) &&
- (IrpContext->Flags & IRPCONTEXT_COMPLETE));
- IrpContext->Flags |= IRPCONTEXT_CANWAIT;
- IoMarkIrpPending(IrpContext->Irp);
- ExInitializeWorkItem(&IrpContext->WorkQueueItem, CdfsDoRequest, IrpContext);
- ExQueueWorkItem(&IrpContext->WorkQueueItem, CriticalWorkQueue);
-
- return STATUS_PENDING;
-}
-
-static
-NTSTATUS
-CdfsLockControl(
- IN PCDFS_IRP_CONTEXT IrpContext)
-{
- PFCB Fcb;
- NTSTATUS Status;
-
- DPRINT("CdfsLockControl(IrpContext %p)\n", IrpContext);
-
- if (IrpContext->DeviceObject == CdfsGlobalData->CdFsDeviceObject ||
IrpContext->DeviceObject == CdfsGlobalData->HddFsDeviceObject)
- {
- return STATUS_INVALID_DEVICE_REQUEST;
- }
-
- Fcb = IrpContext->FileObject->FsContext;
- if (CdfsFCBIsDirectory(Fcb))
- {
- return STATUS_INVALID_PARAMETER;
- }
-
- IrpContext->Flags &= ~IRPCONTEXT_COMPLETE;
- Status = FsRtlProcessFileLock(&Fcb->FileLock,
- IrpContext->Irp,
- NULL);
- return Status;
-}
-
-static
-NTSTATUS
-CdfsDispatch(PCDFS_IRP_CONTEXT IrpContext)
-{
- PIRP Irp = IrpContext->Irp;
- NTSTATUS Status = STATUS_UNSUCCESSFUL;
-
- DPRINT("CdfsDispatch()\n");
-
- FsRtlEnterFileSystem();
-
- CdfsIsIrpTopLevel(Irp);
-
- switch (IrpContext->MajorFunction)
- {
- case IRP_MJ_QUERY_VOLUME_INFORMATION:
- Status = CdfsQueryVolumeInformation(IrpContext);
- break;
-
- case IRP_MJ_SET_VOLUME_INFORMATION:
- Status = CdfsSetVolumeInformation(IrpContext);
- break;
-
- case IRP_MJ_QUERY_INFORMATION:
- Status = CdfsQueryInformation(IrpContext);
- break;
-
- case IRP_MJ_SET_INFORMATION:
- Status = CdfsSetInformation(IrpContext);
- break;
-
- case IRP_MJ_DIRECTORY_CONTROL:
- Status = CdfsDirectoryControl(IrpContext);
- break;
-
- case IRP_MJ_READ:
- Status = CdfsRead(IrpContext);
- break;
-
- case IRP_MJ_DEVICE_CONTROL:
- Status = CdfsDeviceControl(IrpContext);
- break;
-
- case IRP_MJ_WRITE:
- Status = CdfsWrite(IrpContext);
- break;
-
- case IRP_MJ_CLOSE:
- Status = CdfsClose(IrpContext);
- break;
-
- case IRP_MJ_CREATE:
- Status = CdfsCreate(IrpContext);
- break;
-
- case IRP_MJ_CLEANUP:
- Status = CdfsCleanup(IrpContext);
- break;
-
- case IRP_MJ_FILE_SYSTEM_CONTROL:
- Status = CdfsFileSystemControl(IrpContext);
- break;
-
- case IRP_MJ_LOCK_CONTROL:
- Status = CdfsLockControl(IrpContext);
- break;
- }
-
- ASSERT((!(IrpContext->Flags & IRPCONTEXT_COMPLETE) &&
!(IrpContext->Flags & IRPCONTEXT_QUEUE)) ||
- ((IrpContext->Flags & IRPCONTEXT_COMPLETE) &&
!(IrpContext->Flags & IRPCONTEXT_QUEUE)) ||
- (!(IrpContext->Flags & IRPCONTEXT_COMPLETE) &&
(IrpContext->Flags & IRPCONTEXT_QUEUE)));
-
- if (IrpContext->Flags & IRPCONTEXT_COMPLETE)
- {
- Irp->IoStatus.Status = Status;
- IoCompleteRequest(Irp, IrpContext->PriorityBoost);
- }
-
- if (IrpContext->Flags & IRPCONTEXT_QUEUE)
- {
- /* Reset our status flags before queueing the IRP */
- IrpContext->Flags |= IRPCONTEXT_COMPLETE;
- IrpContext->Flags &= ~IRPCONTEXT_QUEUE;
- Status = CdfsQueueRequest(IrpContext);
- }
- else
- {
- ExFreeToNPagedLookasideList(&CdfsGlobalData->IrpContextLookasideList,
IrpContext);
- }
-
- IoSetTopLevelIrp(NULL);
- FsRtlExitFileSystem();
-
- return Status;
-}
-
-static
-VOID
-NTAPI
-CdfsDoRequest(PVOID IrpContext)
-{
- InterlockedDecrement(&QueueCount);
- DPRINT("CdfsDoRequest(IrpContext %p), MajorFunction %x, %d\n",
- IrpContext, ((PCDFS_IRP_CONTEXT)IrpContext)->MajorFunction, QueueCount);
- CdfsDispatch((PCDFS_IRP_CONTEXT)IrpContext);
-}
-
-/*
- * FUNCTION: This function manages IRP for various major functions
- * ARGUMENTS:
- * DriverObject = object describing this driver
- * Irp = IRP to be passed to internal functions
- * RETURNS: Status of I/O Request
- */
-NTSTATUS
-NTAPI
-CdfsFsdDispatch(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
- PCDFS_IRP_CONTEXT IrpContext = NULL;
- NTSTATUS Status;
-
- DPRINT("CdfsFsdDispatch()\n");
-
- IrpContext = CdfsAllocateIrpContext(DeviceObject, Irp);
- if (IrpContext == NULL)
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- Irp->IoStatus.Status = Status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- }
- else
- {
- Status = CdfsDispatch(IrpContext);
- }
-
- return Status;
-}
diff --git a/drivers/filesystems/cdfs/fastio.c b/drivers/filesystems/cdfs/fastio.c
deleted file mode 100644
index 49547b5637..0000000000
--- a/drivers/filesystems/cdfs/fastio.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: drivers/filesystems/cdfs/fastio.c
- * PURPOSE: CDROM (ISO 9660) filesystem driver
- * PROGRAMMER: Pierre Schweitzer
- */
-
-/* INCLUDES *****************************************************************/
-
-#include "cdfs.h"
-
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS ****************************************************************/
-
-BOOLEAN
-NTAPI
-CdfsAcquireForLazyWrite(
- _In_ PVOID Context,
- _In_ BOOLEAN Wait)
-{
- PFCB Fcb = (PFCB)Context;
- ASSERT(Fcb);
- DPRINT("CdfsAcquireForLazyWrite(): Fcb %p\n", Fcb);
-
- if (!ExAcquireResourceExclusiveLite(&(Fcb->MainResource), Wait))
- {
- DPRINT("CdfsAcquireForLazyWrite(): ExReleaseResourceLite failed.\n");
- return FALSE;
- }
- return TRUE;
-}
-
-VOID
-NTAPI
-CdfsReleaseFromLazyWrite(
- _In_ PVOID Context)
-{
- PFCB Fcb = (PFCB)Context;
- ASSERT(Fcb);
- DPRINT("CdfsReleaseFromLazyWrite(): Fcb %p\n", Fcb);
-
- ExReleaseResourceLite(&(Fcb->MainResource));
-}
-
-BOOLEAN
-NTAPI
-CdfsFastIoCheckIfPossible(
- _In_ PFILE_OBJECT FileObject,
- _In_ PLARGE_INTEGER FileOffset,
- _In_ ULONG Length,
- _In_ BOOLEAN Wait,
- _In_ ULONG LockKey,
- _In_ BOOLEAN CheckForReadOperation,
- _Out_ PIO_STATUS_BLOCK IoStatus,
- _In_ PDEVICE_OBJECT DeviceObject)
-{
- /* Deny FastIo */
- UNREFERENCED_PARAMETER(FileObject);
- UNREFERENCED_PARAMETER(FileOffset);
- UNREFERENCED_PARAMETER(Length);
- UNREFERENCED_PARAMETER(Wait);
- UNREFERENCED_PARAMETER(LockKey);
- UNREFERENCED_PARAMETER(CheckForReadOperation);
- UNREFERENCED_PARAMETER(IoStatus);
- UNREFERENCED_PARAMETER(DeviceObject);
- return FALSE;
-}
-
-BOOLEAN
-NTAPI
-CdfsFastIoRead(
- _In_ PFILE_OBJECT FileObject,
- _In_ PLARGE_INTEGER FileOffset,
- _In_ ULONG Length,
- _In_ BOOLEAN Wait,
- _In_ ULONG LockKey,
- _Out_ PVOID Buffer,
- _Out_ PIO_STATUS_BLOCK IoStatus,
- _In_ PDEVICE_OBJECT DeviceObject)
-{
- DBG_UNREFERENCED_PARAMETER(FileObject);
- DBG_UNREFERENCED_PARAMETER(FileOffset);
- DBG_UNREFERENCED_PARAMETER(Length);
- DBG_UNREFERENCED_PARAMETER(Wait);
- DBG_UNREFERENCED_PARAMETER(LockKey);
- DBG_UNREFERENCED_PARAMETER(Buffer);
- DBG_UNREFERENCED_PARAMETER(IoStatus);
- DBG_UNREFERENCED_PARAMETER(DeviceObject);
- return FALSE;
-}
-
-BOOLEAN
-NTAPI
-CdfsFastIoWrite(
- _In_ PFILE_OBJECT FileObject,
- _In_ PLARGE_INTEGER FileOffset,
- _In_ ULONG Length,
- _In_ BOOLEAN Wait,
- _In_ ULONG LockKey,
- _In_ PVOID Buffer,
- _Out_ PIO_STATUS_BLOCK IoStatus,
- _In_ PDEVICE_OBJECT DeviceObject)
-{
- DBG_UNREFERENCED_PARAMETER(FileObject);
- DBG_UNREFERENCED_PARAMETER(FileOffset);
- DBG_UNREFERENCED_PARAMETER(Length);
- DBG_UNREFERENCED_PARAMETER(Wait);
- DBG_UNREFERENCED_PARAMETER(LockKey);
- DBG_UNREFERENCED_PARAMETER(Buffer);
- DBG_UNREFERENCED_PARAMETER(IoStatus);
- DBG_UNREFERENCED_PARAMETER(DeviceObject);
- return FALSE;
-}
diff --git a/drivers/filesystems/cdfs/fcb.c b/drivers/filesystems/cdfs/fcb.c
deleted file mode 100644
index 4a361d9ede..0000000000
--- a/drivers/filesystems/cdfs/fcb.c
+++ /dev/null
@@ -1,722 +0,0 @@
-/*
- * ReactOS kernel
- * Copyright (C) 2002, 2004 ReactOS Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: drivers/filesystems/cdfs/fcb.c
- * PURPOSE: CDROM (ISO 9660) filesystem driver
- * PROGRAMMER: Art Yerkes
- * UPDATE HISTORY:
- */
-
-/* INCLUDES *****************************************************************/
-
-#include "cdfs.h"
-
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS ****************************************************************/
-
-#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
-
-
-/* FUNCTIONS ****************************************************************/
-
-static BOOLEAN
-CdfsGetNextPathElement(PCUNICODE_STRING CurrentElement, PUNICODE_STRING NextElement)
-{
- *NextElement = *CurrentElement;
-
- if (NextElement->Length == 0)
- return FALSE;
-
- while ((NextElement->Length) && (NextElement->Buffer[0] !=
L'\\'))
- {
- NextElement->Buffer++;
- NextElement->Length -= sizeof(WCHAR);
- NextElement->MaximumLength -= sizeof(WCHAR);
- }
-
- return TRUE;
-}
-
-
-PFCB
-CdfsCreateFCB(PCWSTR FileName)
-{
- PFCB Fcb;
-
- Fcb = ExAllocatePoolWithTag(NonPagedPool,
- sizeof(FCB),
- CDFS_NONPAGED_FCB_TAG);
- if(!Fcb) return NULL;
-
- RtlZeroMemory(Fcb, sizeof(FCB));
- RtlInitEmptyUnicodeString(&Fcb->PathName, Fcb->PathNameBuffer,
sizeof(Fcb->PathNameBuffer));
-
- if (FileName)
- {
- RtlAppendUnicodeToString(&Fcb->PathName, FileName);
- if (wcsrchr(Fcb->PathName.Buffer, '\\') != 0)
- {
- Fcb->ObjectName = wcsrchr(Fcb->PathName.Buffer, '\\');
- }
- else
- {
- Fcb->ObjectName = Fcb->PathName.Buffer;
- }
- }
-
- ExInitializeResourceLite(&Fcb->PagingIoResource);
- ExInitializeResourceLite(&Fcb->MainResource);
- ExInitializeResourceLite(&Fcb->NameListResource);
- Fcb->RFCB.PagingIoResource = &Fcb->PagingIoResource;
- Fcb->RFCB.Resource = &Fcb->MainResource;
- Fcb->RFCB.IsFastIoPossible = FastIoIsNotPossible;
- InitializeListHead(&Fcb->ShortNameList);
- FsRtlInitializeFileLock(&Fcb->FileLock, NULL, NULL);
-
- return(Fcb);
-}
-
-
-VOID
-CdfsDestroyFCB(PFCB Fcb)
-{
- PLIST_ENTRY Entry;
-
- FsRtlUninitializeFileLock(&Fcb->FileLock);
- ExDeleteResourceLite(&Fcb->PagingIoResource);
- ExDeleteResourceLite(&Fcb->MainResource);
-
- while (!IsListEmpty(&Fcb->ShortNameList))
- {
- Entry = Fcb->ShortNameList.Flink;
- RemoveEntryList(Entry);
- ExFreePoolWithTag(Entry, CDFS_SHORT_NAME_TAG);
- }
-
- ExDeleteResourceLite(&Fcb->NameListResource);
- ExFreePoolWithTag(Fcb, CDFS_NONPAGED_FCB_TAG);
-}
-
-
-BOOLEAN
-CdfsFCBIsDirectory(PFCB Fcb)
-{
- return(Fcb->Entry.FileFlags & FILE_FLAG_DIRECTORY);
-}
-
-
-BOOLEAN
-CdfsFCBIsRoot(PFCB Fcb)
-{
- return (Fcb->PathName.Length == sizeof(WCHAR) &&
Fcb->PathName.Buffer[0] == L'\\');
-}
-
-
-VOID
-CdfsGrabFCB(PDEVICE_EXTENSION Vcb,
- PFCB Fcb)
-{
- KIRQL oldIrql;
-
- DPRINT("grabbing FCB at %p: %wZ, refCount:%d\n",
- Fcb,
- &Fcb->PathName,
- Fcb->RefCount);
-
- KeAcquireSpinLock(&Vcb->FcbListLock, &oldIrql);
- Fcb->RefCount++;
- KeReleaseSpinLock(&Vcb->FcbListLock, oldIrql);
-}
-
-
-VOID
-CdfsReleaseFCB(PDEVICE_EXTENSION Vcb,
- PFCB Fcb)
-{
- KIRQL oldIrql;
-
- DPRINT("releasing FCB at %p: %wZ, refCount:%d\n",
- Fcb,
- &Fcb->PathName,
- Fcb->RefCount);
-
- KeAcquireSpinLock(&Vcb->FcbListLock, &oldIrql);
- Fcb->RefCount--;
- if (Fcb->RefCount <= 0 && !CdfsFCBIsDirectory(Fcb))
- {
- RemoveEntryList(&Fcb->FcbListEntry);
- CdfsDestroyFCB(Fcb);
- }
- KeReleaseSpinLock(&Vcb->FcbListLock, oldIrql);
-}
-
-
-VOID
-CdfsAddFCBToTable(PDEVICE_EXTENSION Vcb,
- PFCB Fcb)
-{
- KIRQL oldIrql;
-
- KeAcquireSpinLock(&Vcb->FcbListLock, &oldIrql);
- Fcb->DevExt = Vcb;
- InsertTailList(&Vcb->FcbListHead, &Fcb->FcbListEntry);
- KeReleaseSpinLock(&Vcb->FcbListLock, oldIrql);
-}
-
-
-PFCB
-CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
- PUNICODE_STRING FileName)
-{
- KIRQL oldIrql;
- PFCB Fcb;
- PLIST_ENTRY current_entry;
-
- KeAcquireSpinLock(&Vcb->FcbListLock, &oldIrql);
-
- if (FileName == NULL || FileName->Length == 0 || FileName->Buffer[0] == 0)
- {
- DPRINT("Return FCB for stream file object\n");
- Fcb = Vcb->StreamFileObject->FsContext;
- Fcb->RefCount++;
- KeReleaseSpinLock(&Vcb->FcbListLock, oldIrql);
- return(Fcb);
- }
-
- current_entry = Vcb->FcbListHead.Flink;
- while (current_entry != &Vcb->FcbListHead)
- {
- Fcb = CONTAINING_RECORD(current_entry, FCB, FcbListEntry);
-
- // Disabled the DPRINT! Can't be called at DISPATCH_LEVEL!
- //DPRINT("Comparing '%wZ' and '%wZ'\n", FileName,
&Fcb->PathName);
- if (RtlCompareUnicodeString(FileName, &Fcb->PathName, TRUE) == 0)
- {
- Fcb->RefCount++;
- KeReleaseSpinLock(&Vcb->FcbListLock, oldIrql);
- return(Fcb);
- }
-
- //FIXME: need to compare against short name in FCB here
-
- current_entry = current_entry->Flink;
- }
- KeReleaseSpinLock(&Vcb->FcbListLock, oldIrql);
-
- return(NULL);
-}
-
-
-NTSTATUS
-CdfsFCBInitializeCache(PVCB Vcb,
- PFCB Fcb)
-{
- PFILE_OBJECT FileObject;
- PCCB newCCB;
-
- FileObject = IoCreateStreamFileObject(NULL, Vcb->StorageDevice);
-
- newCCB = ExAllocatePoolWithTag(NonPagedPool, sizeof(CCB), CDFS_CCB_TAG);
- if (newCCB == NULL)
- {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
- RtlZeroMemory(newCCB,
- sizeof(CCB));
-
- FileObject->ReadAccess = TRUE;
- FileObject->WriteAccess = FALSE;
- FileObject->DeleteAccess = FALSE;
- FileObject->SectionObjectPointer = &Fcb->SectionObjectPointers;
- FileObject->FsContext = Fcb;
- FileObject->FsContext2 = newCCB;
- newCCB->PtrFileObject = FileObject;
- Fcb->FileObject = FileObject;
- Fcb->DevExt = Vcb;
-
- _SEH2_TRY
- {
- CcInitializeCacheMap(FileObject,
- (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
- FALSE,
- &(CdfsGlobalData->CacheMgrCallbacks),
- Fcb);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- FileObject->FsContext2 = NULL;
- ExFreePoolWithTag(newCCB, CDFS_CCB_TAG);
- ObDereferenceObject(FileObject);
- Fcb->FileObject = NULL;
- return _SEH2_GetExceptionCode();
- }
- _SEH2_END;
-
- ObDereferenceObject(FileObject);
- Fcb->Flags |= FCB_CACHE_INITIALIZED;
-
- return STATUS_SUCCESS;
-}
-
-
-PFCB
-CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb)
-{
- PFCB Fcb;
-
- Fcb = CdfsCreateFCB(L"\\");
-
- Fcb->Entry.DataLengthL = Vcb->CdInfo.RootSize;
- Fcb->Entry.ExtentLocationL = Vcb->CdInfo.RootStart;
- Fcb->Entry.FileFlags = FILE_FLAG_DIRECTORY;
- Fcb->IndexNumber.QuadPart = 0LL;
- Fcb->RefCount = 1;
- Fcb->DirIndex = 0;
- Fcb->RFCB.FileSize.QuadPart = Vcb->CdInfo.RootSize;
- Fcb->RFCB.ValidDataLength.QuadPart = Vcb->CdInfo.RootSize;
- Fcb->RFCB.AllocationSize.QuadPart = Vcb->CdInfo.RootSize;
-
- CdfsFCBInitializeCache(Vcb, Fcb);
- CdfsAddFCBToTable(Vcb, Fcb);
- CdfsGrabFCB(Vcb, Fcb);
-
- return(Fcb);
-}
-
-
-PFCB
-CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb)
-{
- UNICODE_STRING FileName;
- PFCB Fcb;
-
- RtlInitUnicodeString(&FileName, L"\\");
-
- Fcb = CdfsGrabFCBFromTable(Vcb,
- &FileName);
- if (Fcb == NULL)
- {
- Fcb = CdfsMakeRootFCB(Vcb);
- }
-
- return(Fcb);
-}
-
-
-NTSTATUS
-CdfsMakeFCBFromDirEntry(PVCB Vcb,
- PFCB DirectoryFCB,
- PWSTR LongName,
- PWSTR ShortName,
- PDIR_RECORD Record,
- ULONG DirectorySector,
- ULONG DirectoryOffset,
- PFCB * fileFCB)
-{
- WCHAR pathName[MAX_PATH];
- PFCB rcFCB;
- ULONG Size;
-
- /* Check if the full string would overflow the pathName buffer (the additional
characters are for '\\' and '\0') */
- if ((LongName[0] != 0) &&
- ((DirectoryFCB->PathName.Length / sizeof(WCHAR)) + 1 + wcslen(LongName) + 1
> MAX_PATH))
- {
- return(STATUS_OBJECT_NAME_INVALID);
- }
-
- wcscpy(pathName, DirectoryFCB->PathName.Buffer);
- if (!CdfsFCBIsRoot(DirectoryFCB))
- {
- wcscat(pathName, L"\\");
- }
-
- if (LongName[0] != 0)
- {
- wcscat(pathName, LongName);
- }
- else
- {
- WCHAR entryName[MAX_PATH];
-
- CdfsGetDirEntryName(Vcb, Record, entryName);
- wcscat(pathName, entryName);
- }
-
- rcFCB = CdfsCreateFCB(pathName);
- memcpy(&rcFCB->Entry, Record, sizeof(DIR_RECORD));
-
- /* Copy short name into FCB */
- rcFCB->ShortNameU.Length = wcslen(ShortName) * sizeof(WCHAR);
- rcFCB->ShortNameU.MaximumLength = rcFCB->ShortNameU.Length;
- rcFCB->ShortNameU.Buffer = rcFCB->ShortNameBuffer;
- wcscpy(rcFCB->ShortNameBuffer, ShortName);
-
- Size = rcFCB->Entry.DataLengthL;
-
- rcFCB->RFCB.FileSize.QuadPart = Size;
- rcFCB->RFCB.ValidDataLength.QuadPart = Size;
- rcFCB->RFCB.AllocationSize.QuadPart = ROUND_UP(Size, BLOCKSIZE);
- if (CdfsFCBIsDirectory(rcFCB))
- {
- CdfsFCBInitializeCache(Vcb, rcFCB);
- }
- rcFCB->IndexNumber.u.HighPart = DirectorySector;
- rcFCB->IndexNumber.u.LowPart = DirectoryOffset;
- rcFCB->RefCount++;
- CdfsAddFCBToTable(Vcb, rcFCB);
- *fileFCB = rcFCB;
-
- DPRINT("%S %u %I64d\n", LongName, Size,
rcFCB->RFCB.AllocationSize.QuadPart);
-
- return(STATUS_SUCCESS);
-}
-
-
-NTSTATUS
-CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
- PFCB Fcb,
- PFILE_OBJECT FileObject)
-{
- PCCB newCCB;
-
- newCCB = ExAllocatePoolWithTag(NonPagedPool, sizeof(CCB), CDFS_CCB_TAG);
- if (newCCB == NULL)
- {
- return(STATUS_INSUFFICIENT_RESOURCES);
- }
- memset(newCCB, 0, sizeof(CCB));
-
- FileObject->ReadAccess = TRUE;
- FileObject->WriteAccess = FALSE;
- FileObject->DeleteAccess = FALSE;
- FileObject->SectionObjectPointer = &Fcb->SectionObjectPointers;
- FileObject->FsContext = Fcb;
- FileObject->FsContext2 = newCCB;
- newCCB->PtrFileObject = FileObject;
- Fcb->DevExt = Vcb;
-
- if (CdfsFCBIsDirectory(Fcb))
- {
- _SEH2_TRY
- {
- CcInitializeCacheMap(FileObject,
- (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
- FALSE,
- &(CdfsGlobalData->CacheMgrCallbacks),
- Fcb);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- FileObject->FsContext2 = NULL;
- ExFreePoolWithTag(newCCB, CDFS_CCB_TAG);
- return _SEH2_GetExceptionCode();
- }
- _SEH2_END;
- Fcb->Flags |= FCB_CACHE_INITIALIZED;
- }
-
- DPRINT("file open: fcb:%p file size: %u\n", Fcb,
Fcb->Entry.DataLengthL);
-
- return(STATUS_SUCCESS);
-}
-
-
-NTSTATUS
-CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt,
- PFCB DirectoryFcb,
- PUNICODE_STRING FileToFind,
- PFCB *FoundFCB)
-{
- UNICODE_STRING TempName;
- WCHAR Name[256];
- PVOID Block;
- ULONG DirSize;
- PDIR_RECORD Record;
- ULONG Offset;
- ULONG BlockOffset;
- NTSTATUS Status;
-
- LARGE_INTEGER StreamOffset, OffsetOfEntry;
- PVOID Context;
-
- WCHAR ShortNameBuffer[13];
- UNICODE_STRING ShortName;
- UNICODE_STRING LongName;
- UNICODE_STRING FileToFindUpcase;
-
- ASSERT(DeviceExt);
- ASSERT(DirectoryFcb);
- ASSERT(FileToFind);
-
- DPRINT("CdfsDirFindFile(VCB:%p, dirFCB:%p, File:%wZ)\n",
- DeviceExt,
- DirectoryFcb,
- FileToFind);
- DPRINT("Dir Path:%wZ\n", &DirectoryFcb->PathName);
-
- /* default to '.' if no filename specified */
- if (FileToFind->Length == 0)
- {
- RtlInitUnicodeString(&TempName, L".");
- FileToFind = &TempName;
- }
-
- DirSize = DirectoryFcb->Entry.DataLengthL;
- StreamOffset.QuadPart = (LONGLONG)DirectoryFcb->Entry.ExtentLocationL *
(LONGLONG)BLOCKSIZE;
-
- _SEH2_TRY
- {
- CcMapData(DeviceExt->StreamFileObject, &StreamOffset, BLOCKSIZE, MAP_WAIT,
&Context, &Block);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- DPRINT("CcMapData() failed\n");
- _SEH2_YIELD(return _SEH2_GetExceptionCode());
- }
- _SEH2_END;
-
- Offset = 0;
- BlockOffset = 0;
- Record = (PDIR_RECORD)Block;
-
- /* Upper case the expression for FsRtlIsNameInExpression */
- Status = RtlUpcaseUnicodeString(&FileToFindUpcase, FileToFind, TRUE);
- if (!NT_SUCCESS(Status))
- {
- return Status;
- }
-
- while(TRUE)
- {
- if (Record->RecordLength == 0)
- {
- DPRINT("RecordLength == 0 Stopped!\n");
- break;
- }
-
- DPRINT("RecordLength %u ExtAttrRecordLength %u NameLength %u\n",
- Record->RecordLength, Record->ExtAttrRecordLength,
Record->FileIdLength);
-
- if (!CdfsIsRecordValid(DeviceExt, Record))
- {
- RtlFreeUnicodeString(&FileToFindUpcase);
- CcUnpinData(Context);
- return STATUS_DISK_CORRUPT_ERROR;
- }
-
- CdfsGetDirEntryName(DeviceExt, Record, Name);
- DPRINT ("Name '%S'\n", Name);
- DPRINT ("Sector %lu\n", DirectoryFcb->Entry.ExtentLocationL);
- DPRINT ("Offset %lu\n", Offset);
-
- RtlInitUnicodeString(&LongName, Name);
- RtlInitEmptyUnicodeString(&ShortName, ShortNameBuffer,
sizeof(ShortNameBuffer));
- RtlZeroMemory(ShortNameBuffer, sizeof(ShortNameBuffer));
-
- OffsetOfEntry.QuadPart = StreamOffset.QuadPart + Offset;
- CdfsShortNameCacheGet(DirectoryFcb, &OffsetOfEntry, &LongName,
&ShortName);
-
- DPRINT("ShortName '%wZ'\n", &ShortName);
-
- ASSERT(LongName.Length >= sizeof(WCHAR));
- ASSERT(ShortName.Length >= sizeof(WCHAR));
- if (FsRtlIsNameInExpression(&FileToFindUpcase, &LongName, TRUE, NULL) ||
- FsRtlIsNameInExpression(&FileToFindUpcase, &ShortName, TRUE, NULL))
- {
- DPRINT("Match found, %S\n", Name);
- Status = CdfsMakeFCBFromDirEntry(DeviceExt,
- DirectoryFcb,
- Name,
- ShortNameBuffer,
- Record,
- DirectoryFcb->Entry.ExtentLocationL,
- Offset,
- FoundFCB);
-
- RtlFreeUnicodeString(&FileToFindUpcase);
- CcUnpinData(Context);
-
- return(Status);
- }
-
- Offset += Record->RecordLength;
- BlockOffset += Record->RecordLength;
- Record = (PDIR_RECORD)((ULONG_PTR)Block + BlockOffset);
- if (BlockOffset >= BLOCKSIZE || Record->RecordLength == 0)
- {
- DPRINT("Map next sector\n");
- CcUnpinData(Context);
- StreamOffset.QuadPart += BLOCKSIZE;
- Offset = ROUND_UP(Offset, BLOCKSIZE);
- BlockOffset = 0;
-
- _SEH2_TRY
- {
- CcMapData(DeviceExt->StreamFileObject, &StreamOffset, BLOCKSIZE,
MAP_WAIT, &Context, &Block);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- DPRINT("CcMapData() failed\n");
- RtlFreeUnicodeString(&FileToFindUpcase);
- _SEH2_YIELD(return _SEH2_GetExceptionCode());
- }
- _SEH2_END;
- Record = (PDIR_RECORD)((ULONG_PTR)Block + BlockOffset);
- }
-
- if (Offset >= DirSize)
- break;
- }
-
- RtlFreeUnicodeString(&FileToFindUpcase);
- CcUnpinData(Context);
-
- return(STATUS_OBJECT_NAME_NOT_FOUND);
-}
-
-
-NTSTATUS
-CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
- PFCB *pParentFCB,
- PFCB *pFCB,
- PUNICODE_STRING FileName)
-{
- UNICODE_STRING PathName;
- UNICODE_STRING NextElement;
- UNICODE_STRING CurrentElement;
- NTSTATUS Status;
- PFCB FCB;
- PFCB parentFCB;
-
- DPRINT("CdfsGetFCBForFile(%p, %p, %p, '%wZ')\n",
- Vcb,
- pParentFCB,
- pFCB,
- FileName);
-
- /* Trivial case, open of the root directory on volume */
- if (FileName->Length == 0 ||
- ((FileName->Buffer[0] == '\\') && (FileName->Length ==
sizeof(WCHAR))))
- {
- DPRINT("returning root FCB\n");
-
- FCB = CdfsOpenRootFCB(Vcb);
- *pFCB = FCB;
- *pParentFCB = NULL;
-
- return((FCB != NULL) ? STATUS_SUCCESS : STATUS_OBJECT_PATH_NOT_FOUND);
- }
- else
- {
- /* Start with empty path */
- PathName = *FileName;
- PathName.Length = 0;
- CurrentElement = *FileName;
-
- FCB = CdfsOpenRootFCB (Vcb);
- }
- parentFCB = NULL;
-
- /* Parse filename and check each path element for existence and access */
- while (CdfsGetNextPathElement(&CurrentElement, &NextElement))
- {
- /* Skip blank directory levels */
- if (CurrentElement.Buffer[0] == L'\\')
- {
- CurrentElement.Buffer++;
- CurrentElement.Length -= sizeof(WCHAR);
- CurrentElement.MaximumLength -= sizeof(WCHAR);
- continue;
- }
-
- DPRINT("Parsing, currentElement:%wZ\n", &CurrentElement);
- DPRINT(" parentFCB:%p FCB:%p\n", parentFCB, FCB);
-
- /* Descend to next directory level */
- if (parentFCB)
- {
- CdfsReleaseFCB(Vcb, parentFCB);
- parentFCB = NULL;
- }
-
- /* fail if element in FCB is not a directory */
- if (!CdfsFCBIsDirectory(FCB))
- {
- DPRINT("Element in requested path is not a directory\n");
-
- CdfsReleaseFCB(Vcb, FCB);
- FCB = 0;
- *pParentFCB = NULL;
- *pFCB = NULL;
-
- return(STATUS_OBJECT_PATH_NOT_FOUND);
- }
- parentFCB = FCB;
-
- /* Extract next directory level */
- PathName.Length = (NextElement.Buffer - FileName->Buffer) * sizeof(WCHAR);
- DPRINT(" PathName:%wZ\n", &PathName);
-
- FCB = CdfsGrabFCBFromTable(Vcb, &PathName);
- if (FCB == NULL)
- {
- UNICODE_STRING ChildElement = CurrentElement;
- ChildElement.Length = (NextElement.Buffer - CurrentElement.Buffer) *
sizeof(WCHAR);
-
- Status = CdfsDirFindFile(Vcb,
- parentFCB,
- &ChildElement,
- &FCB);
- if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
- {
- *pParentFCB = parentFCB;
- *pFCB = NULL;
-
- if (NextElement.Length == 0)
- {
- return(STATUS_OBJECT_NAME_NOT_FOUND);
- }
- else
- {
- return(STATUS_OBJECT_PATH_NOT_FOUND);
- }
- }
- else if (!NT_SUCCESS(Status))
- {
- CdfsReleaseFCB(Vcb, parentFCB);
- *pParentFCB = NULL;
- *pFCB = NULL;
-
- return(Status);
- }
- }
- CurrentElement = NextElement;
- }
-
- *pParentFCB = parentFCB;
- *pFCB = FCB;
-
- return STATUS_SUCCESS;
-}
-
-/* EOF */
diff --git a/drivers/filesystems/cdfs/finfo.c b/drivers/filesystems/cdfs/finfo.c
deleted file mode 100644
index e0e08e1abe..0000000000
--- a/drivers/filesystems/cdfs/finfo.c
+++ /dev/null
@@ -1,498 +0,0 @@
-/*
- * ReactOS kernel
- * Copyright (C) 2002, 2004 ReactOS Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: drivers/filesystems/cdfs/finfo.c
- * PURPOSE: CDROM (ISO 9660) filesystem driver
- * PROGRAMMER: Art Yerkes
- * Eric Kohl
- * UPDATE HISTORY:
- */
-
-/* INCLUDES *****************************************************************/
-
-#include "cdfs.h"
-
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS ****************************************************************/
-
-/*
-* FUNCTION: Retrieve the standard file information
-*/
-static NTSTATUS
-CdfsGetStandardInformation(PFCB Fcb,
- PDEVICE_OBJECT DeviceObject,
- PFILE_STANDARD_INFORMATION StandardInfo,
- PULONG BufferLength)
-{
- DPRINT("CdfsGetStandardInformation() called\n");
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (*BufferLength < sizeof(FILE_STANDARD_INFORMATION))
- return STATUS_BUFFER_OVERFLOW;
-
- /* PRECONDITION */
- ASSERT(StandardInfo != NULL);
- ASSERT(Fcb != NULL);
-
- RtlZeroMemory(StandardInfo,
- sizeof(FILE_STANDARD_INFORMATION));
-
- if (CdfsFCBIsDirectory(Fcb))
- {
- StandardInfo->AllocationSize.QuadPart = 0LL;
- StandardInfo->EndOfFile.QuadPart = 0LL;
- StandardInfo->Directory = TRUE;
- }
- else
- {
- StandardInfo->AllocationSize = Fcb->RFCB.AllocationSize;
- StandardInfo->EndOfFile = Fcb->RFCB.FileSize;
- StandardInfo->Directory = FALSE;
- }
- StandardInfo->NumberOfLinks = 0;
- StandardInfo->DeletePending = FALSE;
-
- *BufferLength -= sizeof(FILE_STANDARD_INFORMATION);
- return(STATUS_SUCCESS);
-}
-
-
-/*
-* FUNCTION: Retrieve the file position information
-*/
-static NTSTATUS
-CdfsGetPositionInformation(PFILE_OBJECT FileObject,
- PFILE_POSITION_INFORMATION PositionInfo,
- PULONG BufferLength)
-{
- DPRINT("CdfsGetPositionInformation() called\n");
-
- if (*BufferLength < sizeof(FILE_POSITION_INFORMATION))
- return STATUS_BUFFER_OVERFLOW;
-
- PositionInfo->CurrentByteOffset.QuadPart =
- FileObject->CurrentByteOffset.QuadPart;
-
- DPRINT("Getting position %I64x\n",
- PositionInfo->CurrentByteOffset.QuadPart);
-
- *BufferLength -= sizeof(FILE_POSITION_INFORMATION);
- return(STATUS_SUCCESS);
-}
-
-
-/*
-* FUNCTION: Retrieve the basic file information
-*/
-static NTSTATUS
-CdfsGetBasicInformation(PFILE_OBJECT FileObject,
- PFCB Fcb,
- PDEVICE_OBJECT DeviceObject,
- PFILE_BASIC_INFORMATION BasicInfo,
- PULONG BufferLength)
-{
- DPRINT("CdfsGetBasicInformation() called\n");
-
- UNREFERENCED_PARAMETER(FileObject);
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (*BufferLength < sizeof(FILE_BASIC_INFORMATION))
- return STATUS_BUFFER_OVERFLOW;
-
- CdfsDateTimeToSystemTime(Fcb,
- &BasicInfo->CreationTime);
- CdfsDateTimeToSystemTime(Fcb,
- &BasicInfo->LastAccessTime);
- CdfsDateTimeToSystemTime(Fcb,
- &BasicInfo->LastWriteTime);
- CdfsDateTimeToSystemTime(Fcb,
- &BasicInfo->ChangeTime);
-
- CdfsFileFlagsToAttributes(Fcb,
- &BasicInfo->FileAttributes);
-
- *BufferLength -= sizeof(FILE_BASIC_INFORMATION);
-
- return(STATUS_SUCCESS);
-}
-
-
-/*
-* FUNCTION: Retrieve the file name information
-*/
-static NTSTATUS
-CdfsGetNameInformation(PFILE_OBJECT FileObject,
- PFCB Fcb,
- PDEVICE_OBJECT DeviceObject,
- PFILE_NAME_INFORMATION NameInfo,
- PULONG BufferLength)
-{
- ULONG NameLength;
- ULONG BytesToCopy;
-
- DPRINT("CdfsGetNameInformation() called\n");
-
- ASSERT(NameInfo != NULL);
- ASSERT(Fcb != NULL);
-
- UNREFERENCED_PARAMETER(FileObject);
- UNREFERENCED_PARAMETER(DeviceObject);
-
- /* If buffer can't hold at least the file name length, bail out */
- if (*BufferLength < (ULONG)FIELD_OFFSET(FILE_NAME_INFORMATION, FileName[0]))
- return STATUS_BUFFER_OVERFLOW;
-
- /* Calculate file name length in bytes */
- NameLength = Fcb->PathName.Length;
- NameInfo->FileNameLength = NameLength;
-
- /* Calculate amount of bytes to copy not to overflow the buffer */
- BytesToCopy = min(NameLength,
- *BufferLength - FIELD_OFFSET(FILE_NAME_INFORMATION, FileName[0]));
-
- /* Fill in the bytes */
- RtlCopyMemory(NameInfo->FileName, Fcb->PathName.Buffer, BytesToCopy);
-
- /* Check if we could write more but are not able to */
- if (*BufferLength < NameLength + FIELD_OFFSET(FILE_NAME_INFORMATION,
FileName[0]))
- {
- /* Return number of bytes written */
- *BufferLength -= FIELD_OFFSET(FILE_NAME_INFORMATION, FileName[0]) + BytesToCopy;
- return STATUS_BUFFER_OVERFLOW;
- }
-
- /* We filled up as many bytes, as needed */
- *BufferLength -= (FIELD_OFFSET(FILE_NAME_INFORMATION, FileName[0]) + NameLength);
-
- return STATUS_SUCCESS;
-}
-
-
-/*
-* FUNCTION: Retrieve the internal file information
-*/
-static NTSTATUS
-CdfsGetInternalInformation(PFCB Fcb,
- PFILE_INTERNAL_INFORMATION InternalInfo,
- PULONG BufferLength)
-{
- DPRINT("CdfsGetInternalInformation() called\n");
-
- ASSERT(InternalInfo);
- ASSERT(Fcb);
-
- if (*BufferLength < sizeof(FILE_INTERNAL_INFORMATION))
- return(STATUS_BUFFER_OVERFLOW);
-
- InternalInfo->IndexNumber.QuadPart = Fcb->IndexNumber.QuadPart;
-
- *BufferLength -= sizeof(FILE_INTERNAL_INFORMATION);
-
- return(STATUS_SUCCESS);
-}
-
-
-/*
-* FUNCTION: Retrieve the file network open information
-*/
-static NTSTATUS
-CdfsGetNetworkOpenInformation(PFCB Fcb,
- PFILE_NETWORK_OPEN_INFORMATION NetworkInfo,
- PULONG BufferLength)
-{
- ASSERT(NetworkInfo);
- ASSERT(Fcb);
-
- if (*BufferLength < sizeof(FILE_NETWORK_OPEN_INFORMATION))
- return(STATUS_BUFFER_OVERFLOW);
-
- CdfsDateTimeToSystemTime(Fcb,
- &NetworkInfo->CreationTime);
- CdfsDateTimeToSystemTime(Fcb,
- &NetworkInfo->LastAccessTime);
- CdfsDateTimeToSystemTime(Fcb,
- &NetworkInfo->LastWriteTime);
- CdfsDateTimeToSystemTime(Fcb,
- &NetworkInfo->ChangeTime);
- if (CdfsFCBIsDirectory(Fcb))
- {
- NetworkInfo->AllocationSize.QuadPart = 0LL;
- NetworkInfo->EndOfFile.QuadPart = 0LL;
- }
- else
- {
- NetworkInfo->AllocationSize = Fcb->RFCB.AllocationSize;
- NetworkInfo->EndOfFile = Fcb->RFCB.FileSize;
- }
- CdfsFileFlagsToAttributes(Fcb,
- &NetworkInfo->FileAttributes);
-
- *BufferLength -= sizeof(FILE_NETWORK_OPEN_INFORMATION);
-
- return(STATUS_SUCCESS);
-}
-
-
-/*
-* FUNCTION: Retrieve all file information
-*/
-static NTSTATUS
-CdfsGetAllInformation(PFILE_OBJECT FileObject,
- PFCB Fcb,
- PFILE_ALL_INFORMATION Info,
- PULONG BufferLength)
-{
- ULONG NameLength;
-
- ASSERT(Info);
- ASSERT(Fcb);
-
- NameLength = Fcb->PathName.Length;
- if (*BufferLength < sizeof(FILE_ALL_INFORMATION) + NameLength)
- return(STATUS_BUFFER_OVERFLOW);
-
- /* Basic Information */
- CdfsDateTimeToSystemTime(Fcb,
- &Info->BasicInformation.CreationTime);
- CdfsDateTimeToSystemTime(Fcb,
- &Info->BasicInformation.LastAccessTime);
- CdfsDateTimeToSystemTime(Fcb,
- &Info->BasicInformation.LastWriteTime);
- CdfsDateTimeToSystemTime(Fcb,
- &Info->BasicInformation.ChangeTime);
- CdfsFileFlagsToAttributes(Fcb,
- &Info->BasicInformation.FileAttributes);
-
- /* Standard Information */
- if (CdfsFCBIsDirectory(Fcb))
- {
- Info->StandardInformation.AllocationSize.QuadPart = 0LL;
- Info->StandardInformation.EndOfFile.QuadPart = 0LL;
- Info->StandardInformation.Directory = TRUE;
- }
- else
- {
- Info->StandardInformation.AllocationSize = Fcb->RFCB.AllocationSize;
- Info->StandardInformation.EndOfFile = Fcb->RFCB.FileSize;
- Info->StandardInformation.Directory = FALSE;
- }
- Info->StandardInformation.NumberOfLinks = 0;
- Info->StandardInformation.DeletePending = FALSE;
-
- /* Internal Information */
- Info->InternalInformation.IndexNumber.QuadPart = Fcb->IndexNumber.QuadPart;
-
- /* EA Information */
- Info->EaInformation.EaSize = 0;
-
- /* Access Information */
- /* The IO-Manager adds this information */
-
- /* Position Information */
- Info->PositionInformation.CurrentByteOffset.QuadPart =
FileObject->CurrentByteOffset.QuadPart;
-
- /* Mode Information */
- /* The IO-Manager adds this information */
-
- /* Alignment Information */
- /* The IO-Manager adds this information */
-
- /* Name Information */
- Info->NameInformation.FileNameLength = NameLength;
- RtlCopyMemory(Info->NameInformation.FileName,
- Fcb->PathName.Buffer,
- NameLength + sizeof(WCHAR));
-
- *BufferLength -= (sizeof(FILE_ALL_INFORMATION) + NameLength + sizeof(WCHAR));
-
- return STATUS_SUCCESS;
-}
-
-
-/*
-* FUNCTION: Retrieve the specified file information
-*/
-NTSTATUS NTAPI
-CdfsQueryInformation(
- PCDFS_IRP_CONTEXT IrpContext)
-{
- PIRP Irp;
- PDEVICE_OBJECT DeviceObject;
- FILE_INFORMATION_CLASS FileInformationClass;
- PIO_STACK_LOCATION Stack;
- PFILE_OBJECT FileObject;
- PFCB Fcb;
- PVOID SystemBuffer;
- ULONG BufferLength;
-
- NTSTATUS Status = STATUS_SUCCESS;
-
- DPRINT("CdfsQueryInformation() called\n");
-
- Irp = IrpContext->Irp;
- DeviceObject = IrpContext->DeviceObject;
- Stack = IrpContext->Stack;
- FileInformationClass = Stack->Parameters.QueryFile.FileInformationClass;
- FileObject = Stack->FileObject;
- Fcb = FileObject->FsContext;
-
- SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
- BufferLength = Stack->Parameters.QueryFile.Length;
-
- switch (FileInformationClass)
- {
- case FileStandardInformation:
- Status = CdfsGetStandardInformation(Fcb,
- DeviceObject,
- SystemBuffer,
- &BufferLength);
- break;
-
- case FilePositionInformation:
- Status = CdfsGetPositionInformation(FileObject,
- SystemBuffer,
- &BufferLength);
- break;
-
- case FileBasicInformation:
- Status = CdfsGetBasicInformation(FileObject,
- Fcb,
- DeviceObject,
- SystemBuffer,
- &BufferLength);
- break;
-
- case FileNameInformation:
- Status = CdfsGetNameInformation(FileObject,
- Fcb,
- DeviceObject,
- SystemBuffer,
- &BufferLength);
- break;
-
- case FileInternalInformation:
- Status = CdfsGetInternalInformation(Fcb,
- SystemBuffer,
- &BufferLength);
- break;
-
- case FileNetworkOpenInformation:
- Status = CdfsGetNetworkOpenInformation(Fcb,
- SystemBuffer,
- &BufferLength);
- break;
-
- case FileAllInformation:
- Status = CdfsGetAllInformation(FileObject,
- Fcb,
- SystemBuffer,
- &BufferLength);
- break;
-
- case FileAlternateNameInformation:
- Status = STATUS_NOT_IMPLEMENTED;
- break;
-
- default:
- DPRINT("Unimplemented information class %x\n", FileInformationClass);
- Status = STATUS_INVALID_PARAMETER;
- break;
- }
-
- if (NT_SUCCESS(Status) || Status == STATUS_BUFFER_OVERFLOW)
- Irp->IoStatus.Information =
- Stack->Parameters.QueryFile.Length - BufferLength;
- else
- Irp->IoStatus.Information = 0;
-
- return(Status);
-}
-
-
-/*
-* FUNCTION: Set the file position information
-*/
-static NTSTATUS
-CdfsSetPositionInformation(PFILE_OBJECT FileObject,
- PFILE_POSITION_INFORMATION PositionInfo)
-{
- DPRINT ("CdfsSetPositionInformation()\n");
-
- DPRINT ("PositionInfo %p\n", PositionInfo);
- DPRINT ("Setting position %I64d\n",
PositionInfo->CurrentByteOffset.QuadPart);
-
- FileObject->CurrentByteOffset.QuadPart =
- PositionInfo->CurrentByteOffset.QuadPart;
-
- return STATUS_SUCCESS;
-}
-
-
-/*
-* FUNCTION: Set the specified file information
-*/
-NTSTATUS NTAPI
-CdfsSetInformation(
- PCDFS_IRP_CONTEXT IrpContext)
-{
- PIRP Irp;
- FILE_INFORMATION_CLASS FileInformationClass;
- PIO_STACK_LOCATION Stack;
- PFILE_OBJECT FileObject;
- PVOID SystemBuffer;
-
- NTSTATUS Status = STATUS_SUCCESS;
-
- DPRINT("CdfsSetInformation() called\n");
-
- Irp = IrpContext->Irp;
- Stack = IrpContext->Stack;
- FileInformationClass = Stack->Parameters.SetFile.FileInformationClass;
- FileObject = Stack->FileObject;
-
- SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
-
- switch (FileInformationClass)
- {
- case FilePositionInformation:
- Status = CdfsSetPositionInformation(FileObject,
- SystemBuffer);
- break;
-
- case FileBasicInformation:
- case FileRenameInformation:
- Status = STATUS_NOT_IMPLEMENTED;
- break;
-
- default:
- Status = STATUS_NOT_SUPPORTED;
- break;
- }
-
- Irp->IoStatus.Information = 0;
-
- return Status;
-}
-
-/* EOF */
diff --git a/drivers/filesystems/cdfs/fsctl.c b/drivers/filesystems/cdfs/fsctl.c
deleted file mode 100644
index 925819fb8e..0000000000
--- a/drivers/filesystems/cdfs/fsctl.c
+++ /dev/null
@@ -1,702 +0,0 @@
-/*
-* ReactOS kernel
-* Copyright (C) 2002, 2003 ReactOS Team
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation; either version 2 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License along
-* with this program; if not, write to the Free Software Foundation, Inc.,
-* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-/*
-* COPYRIGHT: See COPYING in the top level directory
-* PROJECT: ReactOS kernel
-* FILE: drivers/filesystems/cdfs/fsctl.c
-* PURPOSE: CDROM (ISO 9660) filesystem driver
-* PROGRAMMER: Art Yerkes
-* Eric Kohl
-* Pierre Schweitzer
-*/
-
-/* INCLUDES *****************************************************************/
-
-#include "cdfs.h"
-
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS ****************************************************************/
-
-static __inline
-int msf_to_lba (UCHAR m, UCHAR s, UCHAR f)
-{
- return (((m * 60) + s) * 75 + f) - 150;
-}
-
-
-static
-VOID
-CdfsGetPVDData(
- PUCHAR Buffer,
- PCDINFO CdInfo)
-{
- PPVD Pvd;
- USHORT i;
- PUCHAR pc;
- PWCHAR pw;
-
- union
- {
- ULONG Value;
- UCHAR Part[4];
- } Serial;
-
- Pvd = (PPVD)Buffer;
-
- /* Calculate the volume serial number */
- Serial.Value = 0;
- for (i = 0; i < 2048; i += 4)
- {
- /* DON'T optimize this to ULONG!!! (breaks overflow) */
- Serial.Part[3] += Buffer[i+0];
- Serial.Part[2] += Buffer[i+1];
- Serial.Part[1] += Buffer[i+2];
- Serial.Part[0] += Buffer[i+3];
- }
- CdInfo->SerialNumber = Serial.Value;
-
- /* Extract the volume label */
- pc = Pvd->VolumeId;
- pw = CdInfo->VolumeLabel;
- for (i = 0; i < (MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)) - 1; i++)
- {
- *pw++ = (WCHAR)*pc++;
- }
- *pw = 0;
-
- /* Trim trailing spaces */
- while (pw > CdInfo->VolumeLabel)
- {
- if (*--pw != ' ') break;
-
- /* Remove the space */
- *pw = '\0';
-
- /* Decrease size */
- i--;
- }
-
- CdInfo->VolumeLabelLength = i * sizeof(WCHAR);
-
- CdInfo->VolumeSpaceSize = Pvd->VolumeSpaceSizeL;
- CdInfo->RootStart = Pvd->RootDirRecord.ExtentLocationL;
- CdInfo->RootSize = Pvd->RootDirRecord.DataLengthL;
-
- DPRINT("VolumeSerial: %08lx\n", CdInfo->SerialNumber);
- DPRINT("VolumeLabel: '%S'\n", CdInfo->VolumeLabel);
- DPRINT("VolumeLabelLength: %lu\n", CdInfo->VolumeLabelLength);
- DPRINT("VolumeSize: %lu\n", Pvd->VolumeSpaceSizeL);
- DPRINT("RootStart: %lu\n", Pvd->RootDirRecord.ExtentLocationL);
- DPRINT("RootSize: %lu\n", Pvd->RootDirRecord.DataLengthL);
- DPRINT("PathTableSize: %lu\n", Pvd->PathTableSizeL);
- DPRINT("PathTablePos: %lu\n", Pvd->LPathTablePos);
- DPRINT("OptPathTablePos: %lu\n", Pvd->LOptPathTablePos);
-
-#if 0
- DbgPrint("******** PVD **********\n");
- DbgPrint("VdType: %d\n", Pvd->VdType);
- DbgPrint("StandardId: '%.*s'\n", 5, Pvd->StandardId);
- DbgPrint("VdVersion: %d\n", Pvd->VdVersion);
- DbgPrint("SystemId: '%.*s'\n", 32, Pvd->SystemId);
- DbgPrint("VolumeId: '%.*s'\n", 32, Pvd->VolumeId);
- DbgPrint("VolumeSpaceSizeL: %d (%x)\n", Pvd->VolumeSpaceSizeL,
Pvd->VolumeSpaceSizeL);
- DbgPrint("VolumeSpaceSizeM: %d (%x)\n", Pvd->VolumeSpaceSizeM,
Pvd->VolumeSpaceSizeM);
- DbgPrint("VolumeSetSize: %d (%x)\n", Pvd->VolumeSequenceNumber,
Pvd->VolumeSequenceNumber);
- DbgPrint("VolumeSequenceNumber: %d (%x)\n", Pvd->VolumeSequenceNumber,
Pvd->VolumeSequenceNumber);
- DbgPrint("LogicalBlockSize: %d (%x)\n", Pvd->LogicalBlockSize,
Pvd->LogicalBlockSize);
- DbgPrint("PathTableSizeL: %d (%x)\n", Pvd->PathTableSizeL,
Pvd->PathTableSizeL);
- DbgPrint("PathTableSizeM: %d (%x)\n", Pvd->PathTableSizeM,
Pvd->PathTableSizeM);
- DbgPrint("LPathTablePos: %d (%x)\n", Pvd->LPathTablePos,
Pvd->LPathTablePos);
- DbgPrint("LOptPathTablePos: %d (%x)\n", Pvd->LOptPathTablePos,
Pvd->LOptPathTablePos);
- DbgPrint("MPathTablePos: %d (%x)\n", Pvd->MPathTablePos,
Pvd->MPathTablePos);
- DbgPrint("MOptPathTablePos: %d (%x)\n", Pvd->MOptPathTablePos,
Pvd->MOptPathTablePos);
- DbgPrint("VolumeSetIdentifier: '%.*s'\n", 128,
Pvd->VolumeSetIdentifier);
- DbgPrint("PublisherIdentifier: '%.*s'\n", 128,
Pvd->PublisherIdentifier);
- DbgPrint("******** Root *********\n");
- DbgPrint("RecordLength: %d\n",
Pvd->RootDirRecord.RecordLength);
- DbgPrint("ExtAttrRecordLength: %d\n",
Pvd->RootDirRecord.ExtAttrRecordLength);
- DbgPrint("ExtentLocationL: %d\n",
Pvd->RootDirRecord.ExtentLocationL);
- DbgPrint("DataLengthL: %d\n", Pvd->RootDirRecord.DataLengthL);
- DbgPrint("Year: %d\n", Pvd->RootDirRecord.Year);
- DbgPrint("Month: %d\n", Pvd->RootDirRecord.Month);
- DbgPrint("Day: %d\n", Pvd->RootDirRecord.Day);
- DbgPrint("Hour: %d\n", Pvd->RootDirRecord.Hour);
- DbgPrint("Minute: %d\n", Pvd->RootDirRecord.Minute);
- DbgPrint("Second: %d\n", Pvd->RootDirRecord.Second);
- DbgPrint("TimeZone: %d\n", Pvd->RootDirRecord.TimeZone);
- DbgPrint("FileFlags: %d\n", Pvd->RootDirRecord.FileFlags);
- DbgPrint("FileUnitSize: %d\n",
Pvd->RootDirRecord.FileUnitSize);
- DbgPrint("InterleaveGapSize: %d\n",
Pvd->RootDirRecord.InterleaveGapSize);
- DbgPrint("VolumeSequenceNumber: %d\n",
Pvd->RootDirRecord.VolumeSequenceNumber);
- DbgPrint("FileIdLength: %d\n",
Pvd->RootDirRecord.FileIdLength);
- DbgPrint("FileId: '%.*s'\n",
Pvd->RootDirRecord.FileId);
- DbgPrint("***********************\n");
-#endif
-}
-
-
-static
-VOID
-CdfsGetSVDData(
- PUCHAR Buffer,
- PCDINFO CdInfo)
-{
- PSVD Svd;
- ULONG JolietLevel = 0;
-
- Svd = (PSVD)Buffer;
-
- DPRINT("EscapeSequences: '%.32s'\n", Svd->EscapeSequences);
-
- if (strncmp((PCHAR)Svd->EscapeSequences, "%/@", 3) == 0)
- {
- DPRINT("Joliet extension found (UCS-2 Level 1)\n");
- JolietLevel = 1;
- }
- else if (strncmp((PCHAR)Svd->EscapeSequences, "%/C", 3) == 0)
- {
- DPRINT("Joliet extension found (UCS-2 Level 2)\n");
- JolietLevel = 2;
- }
- else if (strncmp((PCHAR)Svd->EscapeSequences, "%/E", 3) == 0)
- {
- DPRINT("Joliet extension found (UCS-2 Level 3)\n");
- JolietLevel = 3;
- }
-
- CdInfo->JolietLevel = JolietLevel;
-
- if (JolietLevel != 0)
- {
- CdInfo->RootStart = Svd->RootDirRecord.ExtentLocationL;
- CdInfo->RootSize = Svd->RootDirRecord.DataLengthL;
-
- DPRINT("RootStart: %lu\n", Svd->RootDirRecord.ExtentLocationL);
- DPRINT("RootSize: %lu\n", Svd->RootDirRecord.DataLengthL);
- }
-}
-
-
-static
-NTSTATUS
-CdfsGetVolumeData(
- PDEVICE_OBJECT DeviceObject,
- PCDINFO CdInfo)
-{
- PUCHAR Buffer;
- NTSTATUS Status;
- ULONG Sector;
- PVD_HEADER VdHeader;
- ULONG Size;
- ULONG Offset;
- CDROM_TOC Toc;
-
- DPRINT("CdfsGetVolumeData\n");
-
- Buffer = ExAllocatePoolWithTag(NonPagedPool, CDFS_BASIC_SECTOR, CDFS_TAG);
- if (Buffer == NULL)
- return STATUS_INSUFFICIENT_RESOURCES;
-
- Size = sizeof(Toc);
- Status = CdfsDeviceIoControl(DeviceObject,
- IOCTL_CDROM_READ_TOC,
- NULL,
- 0,
- &Toc,
- &Size,
- TRUE);
- if (NT_SUCCESS(Status))
- {
-
- DPRINT("FirstTrack %u, LastTrack %u, TrackNumber %u\n",
- Toc.FirstTrack, Toc.LastTrack, Toc.TrackData[0].TrackNumber);
-
- Offset = Toc.TrackData[0].Address[1] * 60 * 75;
- Offset += Toc.TrackData[0].Address[2] * 75;
- Offset += Toc.TrackData[0].Address[3];
- if (Offset >= 150)
- {
- /* Remove MSF numbering offset of first frame */
- /* FIXME: should be done only for real cdroms? */
- Offset -= 150;
- }
- }
- else
- {
- DPRINT1("Allowing mount of CDFS volume on non-CD device\n");
- Offset = 0;
- }
-
- CdInfo->VolumeOffset = Offset;
- DPRINT("Offset of first track in last session %u\n", Offset);
-
- CdInfo->JolietLevel = 0;
- VdHeader = (PVD_HEADER)Buffer;
- Buffer[0] = 0;
-
- for (Sector = CDFS_PRIMARY_DESCRIPTOR_LOCATION; Sector < 100 && Buffer[0]
!= 255; Sector++)
- {
- /* Read the Primary Volume Descriptor (PVD) */
- Status = CdfsReadSectors(DeviceObject,
- Sector + Offset,
- 1,
- Buffer,
- TRUE);
- if (!NT_SUCCESS(Status))
- {
- ExFreePoolWithTag(Buffer, CDFS_TAG);
- return Status;
- }
-
- if (Sector == CDFS_PRIMARY_DESCRIPTOR_LOCATION)
- {
- DPRINT("CD-identifier: [%.5s]\n", Buffer + 1);
-
- if (Buffer[0] != 1 || Buffer[1] != 'C' || Buffer[2] != 'D'
||
- Buffer[3] != '0' || Buffer[4] != '0' || Buffer[5] !=
'1')
- {
- ExFreePoolWithTag(Buffer, CDFS_TAG);
- return STATUS_UNRECOGNIZED_VOLUME;
- }
- }
-
- switch (VdHeader->VdType)
- {
- case 0:
- DPRINT("BootVolumeDescriptor found!\n");
- break;
-
- case 1:
- DPRINT("PrimaryVolumeDescriptor found!\n");
- CdfsGetPVDData(Buffer, CdInfo);
- break;
-
- case 2:
- DPRINT("SupplementaryVolumeDescriptor found!\n");
- CdfsGetSVDData(Buffer, CdInfo);
- break;
-
- case 3:
- DPRINT("VolumePartitionDescriptor found!\n");
- break;
-
- case 255:
- DPRINT("VolumeDescriptorSetTerminator found!\n");
- break;
-
- default:
- DPRINT1("Unknown volume descriptor type %u found!\n",
VdHeader->VdType);
- break;
- }
- }
-
- ExFreePoolWithTag(Buffer, CDFS_TAG);
-
- return STATUS_SUCCESS;
-}
-
-
-static
-NTSTATUS
-CdfsMountVolume(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
- PDEVICE_EXTENSION DeviceExt = NULL;
- PDEVICE_OBJECT NewDeviceObject = NULL;
- PDEVICE_OBJECT DeviceToMount;
- PIO_STACK_LOCATION Stack;
- PFCB Fcb = NULL;
- PCCB Ccb = NULL;
- PVPB Vpb;
- NTSTATUS Status;
- CDINFO CdInfo;
- DEVICE_TYPE FilesystemDeviceType;
-
- DPRINT("CdfsMountVolume() called\n");
-
- if (DeviceObject == CdfsGlobalData->CdFsDeviceObject)
- {
- FilesystemDeviceType = FILE_DEVICE_CD_ROM_FILE_SYSTEM;
- }
- else if (DeviceObject == CdfsGlobalData->HddFsDeviceObject)
- {
- FilesystemDeviceType = FILE_DEVICE_DISK_FILE_SYSTEM;
- }
- else
- {
- Status = STATUS_INVALID_DEVICE_REQUEST;
- goto ByeBye;
- }
-
- Stack = IoGetCurrentIrpStackLocation(Irp);
- DeviceToMount = Stack->Parameters.MountVolume.DeviceObject;
- Vpb = Stack->Parameters.MountVolume.Vpb;
-
- Status = CdfsGetVolumeData(DeviceToMount, &CdInfo);
- if (!NT_SUCCESS(Status))
- {
- goto ByeBye;
- }
-
- Status = IoCreateDevice(CdfsGlobalData->DriverObject,
- sizeof(DEVICE_EXTENSION),
- NULL,
- FilesystemDeviceType,
- DeviceToMount->Characteristics,
- FALSE,
- &NewDeviceObject);
- if (!NT_SUCCESS(Status))
- goto ByeBye;
-
- NewDeviceObject->Flags = NewDeviceObject->Flags | DO_DIRECT_IO;
- NewDeviceObject->Flags &= ~DO_VERIFY_VOLUME;
- DeviceExt = (PVOID)NewDeviceObject->DeviceExtension;
- RtlZeroMemory(DeviceExt,
- sizeof(DEVICE_EXTENSION));
-
- Vpb->SerialNumber = CdInfo.SerialNumber;
- Vpb->VolumeLabelLength = CdInfo.VolumeLabelLength;
- RtlCopyMemory(Vpb->VolumeLabel, CdInfo.VolumeLabel, CdInfo.VolumeLabelLength);
- RtlCopyMemory(&DeviceExt->CdInfo, &CdInfo, sizeof(CDINFO));
-
- NewDeviceObject->Vpb = DeviceToMount->Vpb;
-
- DeviceExt->VolumeDevice = NewDeviceObject;
- DeviceExt->StorageDevice = DeviceToMount;
- DeviceExt->StorageDevice->Vpb->DeviceObject = NewDeviceObject;
- DeviceExt->StorageDevice->Vpb->RealDevice = DeviceExt->StorageDevice;
- DeviceExt->StorageDevice->Vpb->Flags |= VPB_MOUNTED;
- NewDeviceObject->StackSize = DeviceExt->StorageDevice->StackSize + 1;
- NewDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
-
- /* Close (and cleanup) might be called from IoCreateStreamFileObject
- * but we use this resource from CdfsCleanup, therefore it should be
- * initialized no later than this. */
- ExInitializeResourceLite(&DeviceExt->DirResource);
-
- DeviceExt->StreamFileObject = IoCreateStreamFileObject(NULL,
- DeviceExt->StorageDevice);
-
- Fcb = CdfsCreateFCB(NULL);
- if (Fcb == NULL)
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- goto ByeBye;
- }
-
- Ccb = ExAllocatePoolWithTag(NonPagedPool, sizeof(CCB), CDFS_CCB_TAG);
- if (Ccb == NULL)
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- goto ByeBye;
- }
-
- RtlZeroMemory(Ccb,
- sizeof(CCB));
-
- DeviceExt->StreamFileObject->ReadAccess = TRUE;
- DeviceExt->StreamFileObject->WriteAccess = FALSE;
- DeviceExt->StreamFileObject->DeleteAccess = FALSE;
- DeviceExt->StreamFileObject->FsContext = Fcb;
- DeviceExt->StreamFileObject->FsContext2 = Ccb;
- DeviceExt->StreamFileObject->SectionObjectPointer =
&Fcb->SectionObjectPointers;
- DeviceExt->StreamFileObject->PrivateCacheMap = NULL;
- DeviceExt->StreamFileObject->Vpb = DeviceToMount->Vpb;
- 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 +
DeviceExt->CdInfo.VolumeOffset) * BLOCKSIZE;
- Fcb->RFCB.ValidDataLength = Fcb->RFCB.AllocationSize = Fcb->RFCB.FileSize;
-
- Fcb->Entry.ExtentLocationL = 0;
- Fcb->Entry.DataLengthL = (DeviceExt->CdInfo.VolumeSpaceSize +
DeviceExt->CdInfo.VolumeOffset) * BLOCKSIZE;
-
- _SEH2_TRY
- {
- CcInitializeCacheMap(DeviceExt->StreamFileObject,
- (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
- TRUE,
- &(CdfsGlobalData->CacheMgrCallbacks),
- Fcb);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- Status = _SEH2_GetExceptionCode();
- goto ByeBye;
- }
- _SEH2_END;
-
- ExInitializeResourceLite(&DeviceExt->VcbResource);
-
- KeInitializeSpinLock(&DeviceExt->FcbListLock);
- InitializeListHead(&DeviceExt->FcbListHead);
-
- FsRtlNotifyInitializeSync(&DeviceExt->NotifySync);
- InitializeListHead(&DeviceExt->NotifyList);
-
- Status = STATUS_SUCCESS;
-
-ByeBye:
- if (!NT_SUCCESS(Status))
- {
- /* Cleanup */
- if (DeviceExt && DeviceExt->StreamFileObject)
- ObDereferenceObject(DeviceExt->StreamFileObject);
- if (Fcb)
- ExFreePoolWithTag(Fcb, CDFS_NONPAGED_FCB_TAG);
- if (NewDeviceObject)
- IoDeleteDevice(NewDeviceObject);
- }
-
- DPRINT("CdfsMountVolume() done (Status: %lx)\n", Status);
-
- return Status;
-}
-
-
-static
-NTSTATUS
-CdfsVerifyVolume(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
- PDEVICE_EXTENSION DeviceExt;
- PIO_STACK_LOCATION Stack;
- NTSTATUS Status;
- CDINFO CdInfo;
- PLIST_ENTRY Entry;
- PFCB Fcb;
- PVPB VpbToVerify;
-
- DPRINT("CdfsVerifyVolume() called\n");
-
- DeviceExt = DeviceObject->DeviceExtension;
-
- Stack = IoGetCurrentIrpStackLocation (Irp);
- VpbToVerify = Stack->Parameters.VerifyVolume.Vpb;
-
- FsRtlEnterFileSystem();
- ExAcquireResourceExclusiveLite(&DeviceExt->VcbResource,
- TRUE);
-
- if (!(VpbToVerify->RealDevice->Flags & DO_VERIFY_VOLUME))
- {
- DPRINT1("Volume has been verified!\n");
- ExReleaseResourceLite (&DeviceExt->VcbResource);
- FsRtlExitFileSystem();
- return STATUS_SUCCESS;
- }
-
- DPRINT1("Device object %p Device to verify %p\n", DeviceObject,
VpbToVerify->RealDevice);
-
- Status = CdfsGetVolumeData(VpbToVerify->RealDevice,
- &CdInfo);
- if (NT_SUCCESS(Status) &&
- CdInfo.SerialNumber == VpbToVerify->SerialNumber &&
- CdInfo.VolumeLabelLength == VpbToVerify->VolumeLabelLength &&
- !wcsncmp(CdInfo.VolumeLabel, VpbToVerify->VolumeLabel,
CdInfo.VolumeLabelLength))
- {
- DPRINT1("Same volume!\n");
-
- /* FIXME: Flush and purge metadata */
-
- Status = STATUS_SUCCESS;
- }
- else
- {
- DPRINT1("Different volume!\n");
-
- /* FIXME: force volume dismount */
- Entry = DeviceExt->FcbListHead.Flink;
- while (Entry != &DeviceExt->FcbListHead)
- {
- Fcb = (PFCB)CONTAINING_RECORD(Entry, FCB, FcbListEntry);
- DPRINT1("OpenFile %wZ RefCount %ld\n", &Fcb->PathName,
Fcb->RefCount);
-
- Entry = Entry->Flink;
- }
-
- Status = STATUS_WRONG_VOLUME;
- }
-
- VpbToVerify->RealDevice->Flags &= ~DO_VERIFY_VOLUME;
-
- ExReleaseResourceLite(&DeviceExt->VcbResource);
- FsRtlExitFileSystem();
-
- return Status;
-}
-
-
-static
-NTSTATUS
-CdfsLockOrUnlockVolume(
- IN PCDFS_IRP_CONTEXT IrpContext,
- IN BOOLEAN LockVolume)
-{
- PFCB Fcb;
- PVPB Vpb;
- PFILE_OBJECT FileObject;
- PDEVICE_EXTENSION DeviceExt;
-
- FileObject = IrpContext->FileObject;
- Fcb = FileObject->FsContext;
- DeviceExt = IrpContext->DeviceObject->DeviceExtension;
- Vpb = DeviceExt->StreamFileObject->Vpb;
-
- /* Only allow locking with the volume open */
- if (!BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME_STREAM))
- {
- return STATUS_ACCESS_DENIED;
- }
-
- /* Bail out if it's already in the demanded state */
- if ((BooleanFlagOn(DeviceExt->Flags, VCB_VOLUME_LOCKED) && LockVolume) ||
- (!BooleanFlagOn(DeviceExt->Flags, VCB_VOLUME_LOCKED) && !LockVolume))
- {
- return STATUS_ACCESS_DENIED;
- }
-
- /* Bail out if it's already in the demanded state */
- if ((BooleanFlagOn(Vpb->Flags, VPB_LOCKED) && LockVolume) ||
- (!BooleanFlagOn(Vpb->Flags, VPB_LOCKED) && !LockVolume))
- {
- return STATUS_ACCESS_DENIED;
- }
-
- /* Deny locking if we're not alone */
- if (LockVolume && DeviceExt->OpenHandleCount != 1)
- {
- return STATUS_ACCESS_DENIED;
- }
-
- /* Finally, proceed */
- if (LockVolume)
- {
- DeviceExt->Flags |= VCB_VOLUME_LOCKED;
- Vpb->Flags |= VPB_LOCKED;
- }
- else
- {
- DeviceExt->Flags &= ~VCB_VOLUME_LOCKED;
- Vpb->Flags &= ~VPB_LOCKED;
- }
-
- return STATUS_SUCCESS;
-}
-
-
-NTSTATUS
-NTAPI
-CdfsSetCompression(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PIO_STACK_LOCATION Stack;
- USHORT CompressionState;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- Stack = IoGetCurrentIrpStackLocation(Irp);
-
- if (Stack->Parameters.DeviceIoControl.InputBufferLength !=
sizeof(CompressionState))
- return STATUS_INVALID_DEVICE_REQUEST;
-
- CompressionState = *(USHORT *)Irp->AssociatedIrp.SystemBuffer;
- if (CompressionState != COMPRESSION_FORMAT_NONE)
- return STATUS_INVALID_PARAMETER;
-
- return STATUS_SUCCESS;
-}
-
-
-NTSTATUS
-NTAPI
-CdfsFileSystemControl(
- PCDFS_IRP_CONTEXT IrpContext)
-{
- PIRP Irp;
- PDEVICE_OBJECT DeviceObject;
- PIO_STACK_LOCATION Stack;
- NTSTATUS Status;
-
- DPRINT("CdfsFileSystemControl() called\n");
-
- ASSERT(IrpContext);
-
- DeviceObject = IrpContext->DeviceObject;
- Irp = IrpContext->Irp;
- Stack = IrpContext->Stack;
-
- Irp->IoStatus.Information = 0;
-
- switch (IrpContext->MinorFunction)
- {
- case IRP_MN_KERNEL_CALL:
- case IRP_MN_USER_FS_REQUEST:
- switch (Stack->Parameters.DeviceIoControl.IoControlCode)
- {
- case FSCTL_SET_COMPRESSION:
- DPRINT("CDFS: IRP_MN_USER_FS_REQUEST /
FSCTL_SET_COMPRESSION\n");
- Status = CdfsSetCompression(DeviceObject, Irp);
- break;
-
- case FSCTL_LOCK_VOLUME:
- DPRINT("CDFS: IRP_MN_USER_FS_REQUEST /
FSCTL_LOCK_VOLUME\n");
- Status = CdfsLockOrUnlockVolume(IrpContext, TRUE);
- break;
-
- case FSCTL_UNLOCK_VOLUME:
- DPRINT("CDFS: IRP_MN_USER_FS_REQUEST /
FSCTL_UNLOCK_VOLUME\n");
- Status = CdfsLockOrUnlockVolume(IrpContext, FALSE);
- break;
-
- default:
- DPRINT1("CDFS: IRP_MN_USER_FS_REQUEST / Unknown IoControlCode
0x%x\n",
- Stack->Parameters.DeviceIoControl.IoControlCode);
- Status = STATUS_INVALID_DEVICE_REQUEST;
- }
- break;
-
- case IRP_MN_MOUNT_VOLUME:
- DPRINT("CDFS: IRP_MN_MOUNT_VOLUME\n");
- Status = CdfsMountVolume(DeviceObject, Irp);
- break;
-
- case IRP_MN_VERIFY_VOLUME:
- DPRINT1("CDFS: IRP_MN_VERIFY_VOLUME\n");
- Status = CdfsVerifyVolume(DeviceObject, Irp);
- break;
-
- default:
- DPRINT1("CDFS FSC: MinorFunction %u\n", Stack->MinorFunction);
- Status = STATUS_INVALID_DEVICE_REQUEST;
- break;
- }
-
- return Status;
-}
-
-/* EOF */
diff --git a/drivers/filesystems/cdfs/misc.c b/drivers/filesystems/cdfs/misc.c
deleted file mode 100644
index fe5d9e5388..0000000000
--- a/drivers/filesystems/cdfs/misc.c
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * ReactOS kernel
- * Copyright (C) 2002, 2004 ReactOS Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: drivers/filesystems/cdfs/misc.c
- * PURPOSE: CDROM (ISO 9660) filesystem driver
- * PROGRAMMER: Eric Kohl
- * UPDATE HISTORY:
- */
-
-/* INCLUDES *****************************************************************/
-
-#include "cdfs.h"
-
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS ****************************************************************/
-
-/*
- * FUNCTION: Used with IRP to set them to TopLevelIrp field
- * ARGUMENTS:
- * Irp = The IRP to set
- * RETURNS: TRUE if top level was null, else FALSE
- */
-BOOLEAN
-CdfsIsIrpTopLevel(
- PIRP Irp)
-{
- BOOLEAN ReturnCode = FALSE;
-
- DPRINT("CdfsIsIrpTopLevel()\n");
-
- if (IoGetTopLevelIrp() == NULL)
- {
- IoSetTopLevelIrp(Irp);
- ReturnCode = TRUE;
- }
-
- return ReturnCode;
-}
-
-
-/*
- * FUNCTION: Allocate and fill a CDFS_IRP_CONTEXT struct in order to use it for IRP
- * ARGUMENTS:
- * DeviceObject = Used to fill in struct
- * Irp = The IRP that need IRP_CONTEXT struct
- * RETURNS: NULL or PCDFS_IRP_CONTEXT
- */
-PCDFS_IRP_CONTEXT
-CdfsAllocateIrpContext(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
- PCDFS_IRP_CONTEXT IrpContext;
-
- DPRINT("CdfsAllocateIrpContext()\n");
-
- IrpContext =
(PCDFS_IRP_CONTEXT)ExAllocateFromNPagedLookasideList(&CdfsGlobalData->IrpContextLookasideList);
- if (IrpContext == NULL)
- return NULL;
-
- RtlZeroMemory(IrpContext, sizeof(CDFS_IRP_CONTEXT));
-
-// IrpContext->Identifier.Type = NTFS_TYPE_IRP_CONTEST;
-// IrpContext->Identifier.Size = sizeof(NTFS_IRP_CONTEXT);
- IrpContext->Irp = Irp;
- IrpContext->DeviceObject = DeviceObject;
- IrpContext->Stack = IoGetCurrentIrpStackLocation(Irp);
- IrpContext->MajorFunction = IrpContext->Stack->MajorFunction;
- IrpContext->MinorFunction = IrpContext->Stack->MinorFunction;
- IrpContext->FileObject = IrpContext->Stack->FileObject;
- IrpContext->IsTopLevel = (IoGetTopLevelIrp() == Irp);
- IrpContext->PriorityBoost = IO_NO_INCREMENT;
- IrpContext->Flags = IRPCONTEXT_COMPLETE;
-
- if (IrpContext->MajorFunction == IRP_MJ_FILE_SYSTEM_CONTROL ||
- IrpContext->MajorFunction == IRP_MJ_DEVICE_CONTROL ||
- IrpContext->MajorFunction == IRP_MJ_SHUTDOWN ||
- (IrpContext->MajorFunction != IRP_MJ_CLEANUP &&
- IrpContext->MajorFunction != IRP_MJ_CLOSE &&
- IoIsOperationSynchronous(Irp)))
- {
- IrpContext->Flags |= IRPCONTEXT_CANWAIT;
- }
-
- return IrpContext;
-}
-
-
-VOID
-CdfsSwapString(PWCHAR Out,
- PUCHAR In,
- ULONG Count)
-{
- PUCHAR t = (PUCHAR)Out;
- ULONG i;
-
- for (i = 0; i < Count; i += 2)
- {
- t[i] = In[i+1];
- t[i+1] = In[i];
- if (t[i+1] == 0 && t[i] == ';')
- break;
- }
- if ((i>2)&&(t[i-2] == '.'))
- {
- t[i-2] = 0;
- t[i-1] = 0;
- }
- t[i] = 0;
- t[i+1] = 0;
-}
-
-
-VOID
-CdfsDateTimeToSystemTime(PFCB Fcb,
- PLARGE_INTEGER SystemTime)
-{
- TIME_FIELDS TimeFields;
- LARGE_INTEGER LocalTime;
-
- TimeFields.Milliseconds = 0;
- TimeFields.Second = Fcb->Entry.Second;
- TimeFields.Minute = Fcb->Entry.Minute;
- TimeFields.Hour = Fcb->Entry.Hour;
-
- TimeFields.Day = Fcb->Entry.Day;
- TimeFields.Month = Fcb->Entry.Month;
- TimeFields.Year = Fcb->Entry.Year + 1900;
-
- RtlTimeFieldsToTime(&TimeFields,
- &LocalTime);
- ExLocalTimeToSystemTime(&LocalTime, SystemTime);
-}
-
-
-VOID
-CdfsFileFlagsToAttributes(PFCB Fcb,
- PULONG FileAttributes)
-{
- /* FIXME: Fix attributes */
-
- *FileAttributes = // FILE_ATTRIBUTE_READONLY |
- ((Fcb->Entry.FileFlags & FILE_FLAG_HIDDEN) ? FILE_ATTRIBUTE_HIDDEN : 0) |
- ((Fcb->Entry.FileFlags & FILE_FLAG_DIRECTORY) ? FILE_ATTRIBUTE_DIRECTORY :
0) |
- ((Fcb->Entry.FileFlags & FILE_FLAG_SYSTEM) ? FILE_ATTRIBUTE_SYSTEM : 0) |
- ((Fcb->Entry.FileFlags & FILE_FLAG_READONLY) ? FILE_ATTRIBUTE_READONLY :
0);
-}
-
-BOOLEAN
-CdfsIsNameLegalDOS8Dot3(IN UNICODE_STRING FileName
- )
-{
- ULONG i;
- STRING DbcsName;
- CHAR DbcsNameBuffer[12];
-
- /* 8dot3 filename is max 12 length */
- if (FileName.Length / sizeof(WCHAR) > 12)
- {
- return FALSE;
- }
-
- ASSERT(FileName.Length >= sizeof(WCHAR));
- for (i = 0; i < FileName.Length / sizeof(WCHAR) ; i++)
- {
- /* Don't allow spaces in FileName */
- if (FileName.Buffer[i] == L' ')
- return FALSE;
- }
-
- /* If FileName is finishing with a dot, remove it */
- if (FileName.Buffer[FileName.Length / sizeof(WCHAR) - 1] == '.')
- {
- FileName.Length -= sizeof(WCHAR);
- }
-
- /* Finally, convert the string to call the FsRtl function */
- RtlInitEmptyAnsiString(&DbcsName, DbcsNameBuffer, sizeof(DbcsNameBuffer));
- if (!NT_SUCCESS(RtlUnicodeStringToCountedOemString(&DbcsName,
- &FileName,
- FALSE)))
- {
-
- return FALSE;
- }
- return FsRtlIsFatDbcsLegal(DbcsName, FALSE, FALSE, FALSE);
-}
-
-BOOLEAN
-CdfsIsRecordValid(IN PDEVICE_EXTENSION DeviceExt,
- IN PDIR_RECORD Record)
-{
- if (Record->RecordLength < Record->FileIdLength + FIELD_OFFSET(DIR_RECORD,
FileId))
- {
- DPRINT1("Found corrupted entry! %u - %u\n", Record->RecordLength,
Record->FileIdLength + FIELD_OFFSET(DIR_RECORD, FileId));
- return FALSE;
- }
-
- if (Record->FileIdLength == 0)
- {
- DPRINT1("Found corrupted entry (null size)!\n");
- return FALSE;
- }
-
- if (DeviceExt->CdInfo.JolietLevel == 0)
- {
- if (Record->FileId[0] == ANSI_NULL && Record->FileIdLength != 1)
- {
- DPRINT1("Found corrupted entry!\n");
- return FALSE;
- }
... 709 lines suppressed ...