Index: drivers/filesystems/udfs/CMakeLists.txt =================================================================== --- drivers/filesystems/udfs/CMakeLists.txt (revision 0) +++ drivers/filesystems/udfs/CMakeLists.txt (working copy) @@ -0,0 +1,17 @@ + +include_directories(${REACTOS_SOURCE_DIR}/include/reactos/drivers) + +list(APPEND SOURCE + udfinit.c + fsctrl.c + misc.c + udfs.rc) + +add_library(udfs SHARED ${SOURCE}) + +set_module_type(udfs kernelmodedriver) +add_importlibs(udfs ntoskrnl hal) + +add_pch(udfs procs.h) + +add_cd_file(TARGET udfs DESTINATION reactos/system32/drivers NO_CAB FOR all) \ No newline at end of file Index: drivers/filesystems/udfs/fsctrl.c =================================================================== --- drivers/filesystems/udfs/fsctrl.c (revision 0) +++ drivers/filesystems/udfs/fsctrl.c (working copy) @@ -0,0 +1,77 @@ +#include "procs.h" + +NTSTATUS FsFileSysControl( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp + ) +{ + NTSTATUS Status; + PIO_STACK_LOCATION IrpStackLocation; + /*Getting parameters*/ + IrpStackLocation=IoGetCurrentIrpStackLocation(Irp); + + /*Make sure that we are not at IRQL > APC_LEVEL*/ + PAGED_CODE(); + + /*Dispaching...*/ + switch (IrpStackLocation->MinorFunction) + { + case IRP_MN_USER_FS_REQUEST: + Status=UserFsctl(IrpContext,Irp); + break; + case IRP_MN_MOUNT_VOLUME: + Status=MountVolume(IrpContext,Irp); + break; + case IRP_MN_VERIFY_VOLUME : + Status=VerifyVolume(IrpContext,Irp); + break; + default: + break; + CompleteRequest(IrpContext,Irp,STATUS_INVALID_DEVICE_REQUEST); + Status=STATUS_INVALID_DEVICE_REQUEST; + } + return Status; +} + +/************************************************************************************/ + +NTSTATUS +MountVolume ( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp + ) +{ + PVPB Vpb; + NTSTATUS Status; + BOOLEAN UdfDisable=FALSE; + ULONG InputBuffer=0; + DISK_GEOMETRY DiskGeometry; + BOOLEAN Wait=TRUE; + + IO_STATUS_BLOCK IoStatusBlock; + /*Getting parameters*/ + PIO_STACK_LOCATION IrpStackLocation=IoGetCurrentIrpStackLocation(Irp); + PDEVICE_OBJECT DeviceObject=IrpStackLocation->Parameters.MountVolume.DeviceObject; + + return STATUS_NOT_IMPLEMENTED; +} +/************************************************************************************/ + +NTSTATUS UserFsctl ( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp + ) +{ + return STATUS_NOT_IMPLEMENTED; +} + + +/************************************************************************************/ +NTSTATUS VerifyVolume ( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp + ) +{ + return STATUS_NOT_IMPLEMENTED; +} +/************************************************************************************/ Index: drivers/filesystems/udfs/misc.c =================================================================== --- drivers/filesystems/udfs/misc.c (revision 0) +++ drivers/filesystems/udfs/misc.c (working copy) @@ -0,0 +1,129 @@ +#include "procs.h" + +/************************************************************************************/ +NTSTATUS UdfDispatch + ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + NTSTATUS Status; + PIRP_CONTEXT IrpContext=NULL; + BOOLEAN Wait; + + /*Ensure that the UdfDispacth cannot be suspended*/ + FsRtlEnterFileSystem(); + + /*Set the wait flag.*/ + if (IoGetCurrentIrpStackLocation(Irp)->FileObject==NULL){ + Wait=TRUE; + }else{ + Wait=IoIsOperationSynchronous(Irp); + } + /*Creating irp context. */ + IrpContext=CreateIrpContext(Irp,Wait); + + /*Dispatching...*/ + switch (IrpContext->MajorFunction) + { + case IRP_MJ_CREATE: + //Status=FsCreate(IrpContext,Irp); + break; + case IRP_MJ_READ: + //Status=FsRead(IrpContext,Irp); + break; + case IRP_MJ_WRITE: + //Status=FsWrite(IrpContext,Irp); + break; + case IRP_MJ_CLOSE: + //Status=FsClose(IrpContext,Irp); + break; + case IRP_MJ_QUERY_INFORMATION: + //Status=FsQueryInfo(IrpContext,Irp); + break; + case IRP_MJ_SET_INFORMATION: + //Status=FsSetInfo(IrpContext,Irp); + break; + case IRP_MJ_QUERY_VOLUME_INFORMATION: + //Status=FsQueryVolInfo(IrpContext,Irp); + break; + case IRP_MJ_DIRECTORY_CONTROL: + //Status=FsDirControl(IrpContext,Irp); + break; + case IRP_MJ_PNP: + //Status=FsPnp(IrpContext,Irp); + break; + case IRP_MJ_CLEANUP: + //Status=FsCleanup(IrpContext,Irp); + break; + case IRP_MJ_LOCK_CONTROL: + //Status=FsLockControl(IrpContext,Irp); + break; + case IRP_MJ_FILE_SYSTEM_CONTROL: + Status=FsFileSysControl(IrpContext,Irp); + default: + break; + } + + /*Release the lock */ + FsRtlExitFileSystem(); + + return Status; +} + +/************************************************************************************/ +PIRP_CONTEXT CreateIrpContext( + IN PIRP Irp, + IN BOOLEAN Wait + ) +{ + PIRP_CONTEXT IrpContext=NULL; + /*Getting parameters*/ + PIO_STACK_LOCATION IrpStackLocation=IoGetCurrentIrpStackLocation(Irp); + + /*Make sure that we are not at IRQL > APC_LEVEL*/ + PAGED_CODE(); + + /*Allocate memory for IrpContext*/ + if (IrpContext==NULL){ + IrpContext=(PIRP_CONTEXT)FsRtlAllocatePoolWithTag(NonPagedPool,sizeof(IRP_CONTEXT),'IRCO'); + } + + /*Zero it*/ + RtlZeroMemory(IrpContext,sizeof(IRP_CONTEXT)); + + /*Set Irp*/ + IrpContext->Irp=Irp; + + /*Checking for a vaild FILE_OBJECT */ + if (IrpStackLocation->FileObject!=NULL){ + /*Setting the device object.*/ + IrpContext->RealDevice=IrpStackLocation->FileObject->DeviceObject; + } + + /* Is this our file system device object? */ + if (IrpStackLocation->DeviceObject!=UdfData.DeviceObjectGlobal){ + /*If it not, initialize VCB structure*/ + IrpContext->Vcb=&((PVOL_DEV_OBJ)IrpStackLocation->DeviceObject)->Vcb; + } + + /*Setting the MajorFunction and MinorFunction */ + IrpContext->MajorFunction=IrpStackLocation->MajorFunction; + IrpContext->MinorFunction=IrpStackLocation->MinorFunction; + + /*Setting the wait flag*/ + if (Wait) IrpContext->Flags|= IRPCONTEXT_CANWAIT; + + return IrpContext; +} + +/************************************************************************************/ +VOID CompleteRequest ( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp, + IN NTSTATUS Status + ) +{ + DbgPrint("CompleteRequest - Not Implemented. \n"); + return; +} Index: drivers/filesystems/udfs/procs.h =================================================================== --- drivers/filesystems/udfs/procs.h (revision 0) +++ drivers/filesystems/udfs/procs.h (working copy) @@ -0,0 +1,60 @@ +#include +#include +#include "udf.h" + + +UDF_GLOBA_DATA UdfData; +FAST_IO_DISPATCH UdfFastIoDispatch; + +NTSTATUS InitGlobalData( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT DeviceName + ); + +PIRP_CONTEXT CreateIrpContext( + IN PIRP Irp, + IN BOOLEAN CanWait + ); + +NTSTATUS UdfDispatch + ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS FsFileSysControl( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp + ); + +VOID CompleteRequest ( + IN PIRP_CONTEXT IrpContext OPTIONAL, + IN PIRP Irp OPTIONAL, + IN NTSTATUS Status + ); + +NTSTATUS MountVolume ( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp + ); + +NTSTATUS UserFsctl ( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp + ); + +NTSTATUS VerifyVolume ( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp + ); + +VOID ReleaseFromLazyWrite + ( + IN PVOID Context + ); + +BOOLEAN AcquireForLazyWrite + ( + IN PVOID Context, + IN BOOLEAN Wait + ); Index: drivers/filesystems/udfs/udf.h =================================================================== --- drivers/filesystems/udfs/udf.h (revision 0) +++ drivers/filesystems/udfs/udf.h (working copy) @@ -0,0 +1,109 @@ + +#define IRPCONTEXT_CANWAIT 0x00000001 + +typedef struct _UDF_GLOBA_DATA { + ERESOURCE Resource; + LIST_ENTRY VcbListHead; + + PDRIVER_OBJECT DriverObjectGlobal; + PDEVICE_OBJECT DeviceObjectGlobal; + + FAST_IO_DISPATCH FastIoDispatchIo; + + + NPAGED_LOOKASIDE_LIST NonPageFcbList; + NPAGED_LOOKASIDE_LIST ResourceList; + NPAGED_LOOKASIDE_LIST IrpContextList; + NPAGED_LOOKASIDE_LIST NonPageCcbList; + CACHE_MANAGER_CALLBACKS CacheMgrCallbacks; + CACHE_MANAGER_CALLBACKS CacheMgrVolCallbacks; + + LIST_ENTRY AsyncCloseQueue; + ULONG AsyncClosecount; + + LIST_ENTRY DelayedCloseQueue; + ULONG DelayedCloseCount; + + PIO_WORKITEM ColseItem; + FAST_MUTEX GlobalMutex; + +} UDF_GLOBA_DATA; +typedef UDF_GLOBA_DATA *PUDF_GLOBA_DATA; + +typedef enum _VCB_CONDITON { + VcbNotMounted=0, + VcbMountInProgress, + VcbMounted, + VcbInvalid, + VcbDismountInProgres +}VCB_CONDITON; + +typedef struct _VCB { + PVPB Vpb; + PVPB SwapVpb; + PDEVICE_OBJECT VcbDeviceObject; + PDEVICE_OBJECT TargDevObj; + struct _FCB *RootVcb; + + PFILE_LOCK VolLockFileObj; + + LIST_ENTRY VcbLinks; + + ULONG VcbState; + VCB_CONDITON VcbCondition; + + ULONG VcbCleanup; + ULONG VcbReference; + ULONG VcbUserReference; + + ERESOURCE VcbResource; +}VCB; + +typedef VCB *PVCB; + +typedef struct _IRP_CONTEXT { + PIRP Irp; + + PVCB Vcb; + ULONG Flags; + + PDEVICE_OBJECT RealDevice; + + struct _IRP_CONTEXT *TopLevel; + + UCHAR MajorFunction; + UCHAR MinorFunction; + + WORK_QUEUE_ITEM WorkQueueItem; +}IRP_CONTEXT; + +typedef IRP_CONTEXT *PIRP_CONTEXT; + +typedef struct _FCB { + FSRTL_ADVANCED_FCB_HEADER Header; + ERESOURCE MainResource; + PVCB Vcb; + struct _FCB *ParentFcb; + LIST_ENTRY FcbLinks; + ULONG FcbState; + ULONG FileAttributes; + SHARE_ACCESS ShareAccess; +}FCB; + +typedef FCB *PFCB; + +typedef struct _CCB { + ULONG Flags; + PFCB Fcb; + ULONG CurrDirOffset; + UNICODE_STRING FileName; +}CCB; +typedef CCB *PCCB; + +typedef struct _VOL_DEV_OBJ +{ + DEVICE_OBJECT DeviceObject; + VCB Vcb; +}VOL_DEV_OBJ; + +typedef VOL_DEV_OBJ *PVOL_DEV_OBJ; Index: drivers/filesystems/udfs/udfinit.c =================================================================== --- drivers/filesystems/udfs/udfinit.c (revision 0) +++ drivers/filesystems/udfs/udfinit.c (working copy) @@ -0,0 +1,158 @@ +#include "procs.h" + +#define NDEBUG +#include + +/************************************************************************************/ +NTSTATUS DriverEntry + (IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath) +{ + PDEVICE_OBJECT DeviceObject; + UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Udf"); + NTSTATUS Status; + + DPRINT("UDFS (ISO/IEC 13346)\n"); + + /*Creating the device object*/ + Status=IoCreateDevice(DriverObject, + 0, + &DeviceName, + FILE_DEVICE_DISK_FILE_SYSTEM, + 0, + FALSE, + &DeviceObject); + + /*Check if the operation was successfull*/ + if (!NT_SUCCESS(Status)){ + return Status; + } + + /*Initialize golbal data.*/ + Status=InitGlobalData(DriverObject,DeviceObject); + + /*Delete the DeviceObject if the initialization fail.*/ + if (!NT_SUCCESS(Status)){ + IoDeleteDevice(DeviceObject); + return Status; + } + + + /*Initialize DriverObject dispatch table*/ + DriverObject->MajorFunction[IRP_MJ_CREATE] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_WRITE] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_READ] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_CLOSE] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION]=(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_PNP] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_CLEANUP] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_LOCK_CONTROL] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->DriverUnload = NULL; + + /*Initialize CC callbacks*/ + UdfData.CacheMgrCallbacks.AcquireForLazyWrite=AcquireForLazyWrite; + UdfData.CacheMgrCallbacks.ReleaseFromLazyWrite=ReleaseFromLazyWrite; + UdfData.CacheMgrCallbacks.AcquireForReadAhead=AcquireForLazyWrite; + UdfData.CacheMgrCallbacks.ReleaseFromReadAhead=ReleaseFromLazyWrite; + + + + //DriverObject->FastIoDispatch=&UdfFastIoDispatch; + + + /*Adding DeviceObject in global file system queue*/ + IoRegisterFileSystem(DeviceObject); + ObReferenceObject(DeviceObject); + + return(STATUS_SUCCESS); +} +/************************************************************************************/ +BOOLEAN AcquireForLazyWrite + ( + IN PVOID Context, + IN BOOLEAN Wait + ) +{ + DbgPrint("AcquireForLazyWrite - Not Implemented.\n"); + return TRUE; +} +/************************************************************************************/ +VOID ReleaseFromLazyWrite + ( + IN PVOID Context + ) +{ + DbgPrint("ReleaseFromLazyWrite - Not Implemented.\n"); + return; +} + +/************************************************************************************/ +NTSTATUS InitGlobalData + ( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT DeviceObject + ) +{ + + //TODO: Initialize CRC + + /*Zero UdfData */ + RtlZeroMemory(&UdfData,sizeof(UDF_GLOBA_DATA)); + + /*Zero UdfFastIoDispatch */ + RtlZeroMemory(&UdfFastIoDispatch,sizeof(FAST_IO_DISPATCH)); + + /*Setting the global DriverObject and DeviceObject*/ + UdfData.DriverObjectGlobal=DriverObject; + UdfData.DeviceObjectGlobal=DeviceObject; + + + /*Initialize VCB list*/ + InitializeListHead(&UdfData.VcbListHead); + + /*Initialize ERESOURCE */ + ExInitializeResourceLite(&UdfData.Resource); + + /*Initialize FCB lookside list*/ + ExInitializeNPagedLookasideList(&UdfData.NonPageFcbList, + NULL, + NULL, + 0, + sizeof(FCB), + 'FCBL', + 0); + + /*Initialize CCB lookside list*/ + ExInitializeNPagedLookasideList(&UdfData.NonPageCcbList, + NULL, + NULL, + 0, + sizeof(CCB), + 'CCBL', + 0); + + /*Initialize IRP_CONTEXT lookside list*/ + ExInitializeNPagedLookasideList(&UdfData.IrpContextList, + NULL, + NULL, + 0, + sizeof(IRP_CONTEXT), + 'IRPC', + 0); + + /*Initialize lists*/ + InitializeListHead(&UdfData.AsyncCloseQueue); + InitializeListHead(&UdfData.DelayedCloseQueue); + + /*Alloc a work item*/ + UdfData.ColseItem=IoAllocateWorkItem(DeviceObject); + /*Initialize mutex */ + ExInitializeFastMutex(&UdfData.GlobalMutex); + + return STATUS_SUCCESS; +} Index: drivers/filesystems/udfs/udfs.rc =================================================================== --- drivers/filesystems/udfs/udfs.rc (revision 0) +++ drivers/filesystems/udfs/udfs.rc (working copy) @@ -0,0 +1,5 @@ +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "UDFS ISO/IEC 13346 Driver\0" +#define REACTOS_STR_INTERNAL_NAME "udfs\0" +#define REACTOS_STR_ORIGINAL_FILENAME "udfs.sys\0" +#include